mirror of
https://github.com/penpot/penpot.git
synced 2025-02-13 02:28:18 -05:00
Merge remote-tracking branch 'origin/main' into develop
This commit is contained in:
commit
5b0cd974ac
17 changed files with 135 additions and 43 deletions
20
CHANGES.md
20
CHANGES.md
|
@ -1,6 +1,5 @@
|
||||||
# CHANGELOG #
|
# CHANGELOG #
|
||||||
|
|
||||||
|
|
||||||
## :rocket: Next
|
## :rocket: Next
|
||||||
|
|
||||||
### :sparkles: New features
|
### :sparkles: New features
|
||||||
|
@ -15,6 +14,25 @@
|
||||||
### :boom: Breaking changes
|
### :boom: Breaking changes
|
||||||
### :heart: Community contributions by (Thank you!)
|
### :heart: Community contributions by (Thank you!)
|
||||||
|
|
||||||
|
## 1.6.4-alpha
|
||||||
|
|
||||||
|
### :sparkles: Minor improvements
|
||||||
|
|
||||||
|
- Decrease default bulk buffers on storage tasks.
|
||||||
|
- Reduce file_change preserve interval to 24h.
|
||||||
|
|
||||||
|
### :bug: Bugs fixed
|
||||||
|
|
||||||
|
- Don't allow rename drafts project.
|
||||||
|
- Fix custom font deletion task.
|
||||||
|
- Fix custom font rendering on exporting shapes.
|
||||||
|
- Fix font loading on viewer app.
|
||||||
|
- Fix problem when moving files with drag & drop.
|
||||||
|
- Fix unexpected exception on searching without term.
|
||||||
|
- Properly handle nil values on `update-shapes` function.
|
||||||
|
- Replace frame term usage by artboard on viewer app.
|
||||||
|
|
||||||
|
|
||||||
## 1.6.3-alpha
|
## 1.6.3-alpha
|
||||||
|
|
||||||
### :bug: Bugs fixed
|
### :bug: Bugs fixed
|
||||||
|
|
|
@ -245,7 +245,7 @@
|
||||||
|
|
||||||
:app.tasks.file-xlog-gc/handler
|
:app.tasks.file-xlog-gc/handler
|
||||||
{:pool (ig/ref :app.db/pool)
|
{:pool (ig/ref :app.db/pool)
|
||||||
:max-age (dt/duration {:hours 48})}
|
:max-age (dt/duration {:hours 24})}
|
||||||
|
|
||||||
:app.tasks.telemetry/handler
|
:app.tasks.telemetry/handler
|
||||||
{:pool (ig/ref :app.db/pool)
|
{:pool (ig/ref :app.db/pool)
|
||||||
|
|
|
@ -112,14 +112,16 @@
|
||||||
order by f.created_at asc")
|
order by f.created_at asc")
|
||||||
|
|
||||||
(s/def ::search-files
|
(s/def ::search-files
|
||||||
(s/keys :req-un [::profile-id ::team-id ::search-term]))
|
(s/keys :req-un [::profile-id ::team-id]
|
||||||
|
:opt-un [::search-term]))
|
||||||
|
|
||||||
(sv/defmethod ::search-files
|
(sv/defmethod ::search-files
|
||||||
[{:keys [pool] :as cfg} {:keys [profile-id team-id search-term] :as params}]
|
[{:keys [pool] :as cfg} {:keys [profile-id team-id search-term] :as params}]
|
||||||
(db/exec! pool [sql:search-files
|
(when search-term
|
||||||
profile-id team-id
|
(db/exec! pool [sql:search-files
|
||||||
profile-id team-id
|
profile-id team-id
|
||||||
search-term]))
|
profile-id team-id
|
||||||
|
search-term])))
|
||||||
|
|
||||||
|
|
||||||
;; --- Query: Files
|
;; --- Query: Files
|
||||||
|
|
|
@ -8,12 +8,16 @@
|
||||||
(:require
|
(:require
|
||||||
[app.common.spec :as us]
|
[app.common.spec :as us]
|
||||||
[app.db :as db]
|
[app.db :as db]
|
||||||
|
[app.rpc.queries.files :as files]
|
||||||
|
[app.rpc.queries.projects :as projects]
|
||||||
[app.rpc.queries.teams :as teams]
|
[app.rpc.queries.teams :as teams]
|
||||||
[app.util.services :as sv]
|
[app.util.services :as sv]
|
||||||
[clojure.spec.alpha :as s]))
|
[clojure.spec.alpha :as s]))
|
||||||
|
|
||||||
;; --- Query: Team Font Variants
|
;; --- Query: Team Font Variants
|
||||||
|
|
||||||
|
;; TODO: deprecated, should be removed on 1.7.x
|
||||||
|
|
||||||
(s/def ::team-id ::us/uuid)
|
(s/def ::team-id ::us/uuid)
|
||||||
(s/def ::profile-id ::us/uuid)
|
(s/def ::profile-id ::us/uuid)
|
||||||
(s/def ::team-font-variants
|
(s/def ::team-font-variants
|
||||||
|
@ -27,3 +31,43 @@
|
||||||
{:team-id team-id
|
{:team-id team-id
|
||||||
:deleted-at nil})))
|
:deleted-at nil})))
|
||||||
|
|
||||||
|
;; --- Query: Font Variants
|
||||||
|
|
||||||
|
(s/def ::file-id ::us/uuid)
|
||||||
|
(s/def ::project-id ::us/uuid)
|
||||||
|
(s/def ::font-variants
|
||||||
|
(s/and
|
||||||
|
(s/keys :req-un [::profile-id]
|
||||||
|
:opt-un [::team-id
|
||||||
|
::file-id
|
||||||
|
::project-id])
|
||||||
|
(fn [o]
|
||||||
|
(or (contains? o :team-id)
|
||||||
|
(contains? o :file-id)
|
||||||
|
(contains? o :project-id)))))
|
||||||
|
|
||||||
|
(sv/defmethod ::font-variants
|
||||||
|
[{:keys [pool] :as cfg} {:keys [profile-id team-id file-id project-id] :as params}]
|
||||||
|
(with-open [conn (db/open pool)]
|
||||||
|
(cond
|
||||||
|
(uuid? team-id)
|
||||||
|
(do
|
||||||
|
(teams/check-read-permissions! conn profile-id team-id)
|
||||||
|
(db/query conn :team-font-variant
|
||||||
|
{:team-id team-id
|
||||||
|
:deleted-at nil}))
|
||||||
|
|
||||||
|
(uuid? project-id)
|
||||||
|
(let [project (db/get-by-id conn :project project-id {:columns [:id :team-id]})]
|
||||||
|
(projects/check-read-permissions! conn profile-id project-id)
|
||||||
|
(db/query conn :team-font-variant
|
||||||
|
{:team-id (:team-id project)
|
||||||
|
:deleted-at nil}))
|
||||||
|
|
||||||
|
(uuid? file-id)
|
||||||
|
(let [file (db/get-by-id conn :file file-id {:columns [:id :project-id]})
|
||||||
|
project (db/get-by-id conn :project (:project-id file) {:columns [:id :team-id]})]
|
||||||
|
(files/check-read-permissions! conn profile-id file-id)
|
||||||
|
(db/query conn :team-font-variant
|
||||||
|
{:team-id (:team-id project)
|
||||||
|
:deleted-at nil})))))
|
||||||
|
|
|
@ -50,9 +50,14 @@
|
||||||
libs (files/retrieve-file-libraries conn false file-id)
|
libs (files/retrieve-file-libraries conn false file-id)
|
||||||
users (teams/retrieve-users conn (:team-id project))
|
users (teams/retrieve-users conn (:team-id project))
|
||||||
|
|
||||||
|
fonts (db/query conn :team-font-variant
|
||||||
|
{:team-id (:team-id project)
|
||||||
|
:deleted-at nil})
|
||||||
|
|
||||||
bundle {:file file
|
bundle {:file file
|
||||||
:page page
|
:page page
|
||||||
:users users
|
:users users
|
||||||
|
:fonts fonts
|
||||||
:project project
|
:project project
|
||||||
:libraries libs}]
|
:libraries libs}]
|
||||||
|
|
||||||
|
|
|
@ -319,7 +319,7 @@
|
||||||
where s.deleted_at is not null
|
where s.deleted_at is not null
|
||||||
and s.deleted_at < (now() - ?::interval)
|
and s.deleted_at < (now() - ?::interval)
|
||||||
order by s.deleted_at
|
order by s.deleted_at
|
||||||
limit 500
|
limit 100
|
||||||
)
|
)
|
||||||
delete from storage_object
|
delete from storage_object
|
||||||
where id in (select id from items_part)
|
where id in (select id from items_part)
|
||||||
|
@ -396,7 +396,7 @@
|
||||||
from storage_object as so
|
from storage_object as so
|
||||||
where so.touched_at is not null
|
where so.touched_at is not null
|
||||||
order by so.touched_at
|
order by so.touched_at
|
||||||
limit 500;")
|
limit 100;")
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; Recheck Stalled Task
|
;; Recheck Stalled Task
|
||||||
|
|
|
@ -350,8 +350,8 @@
|
||||||
|
|
||||||
([shape {:keys [round-coords?]
|
([shape {:keys [round-coords?]
|
||||||
:or {round-coords? true}}]
|
:or {round-coords? true}}]
|
||||||
(let [shape (apply-displacement shape)
|
(let [shape (apply-displacement shape)
|
||||||
center (gco/center-shape shape)
|
center (gco/center-shape shape)
|
||||||
modifiers (:modifiers shape)]
|
modifiers (:modifiers shape)]
|
||||||
(if (and modifiers center)
|
(if (and modifiers center)
|
||||||
(let [transform (modifiers->transform center modifiers)]
|
(let [transform (modifiers->transform center modifiers)]
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
;; General purpose events & IMPL
|
;; General purpose events & IMPL
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
(defn team-fonts-loaded
|
(defn fonts-fetched
|
||||||
[fonts]
|
[fonts]
|
||||||
(letfn [;; Prepare font to the internal font database format.
|
(letfn [;; Prepare font to the internal font database format.
|
||||||
(prepare-font [[id [item :as items]]]
|
(prepare-font [[id [item :as items]]]
|
||||||
|
@ -74,8 +74,8 @@
|
||||||
(ptk/reify ::load-team-fonts
|
(ptk/reify ::load-team-fonts
|
||||||
ptk/WatchEvent
|
ptk/WatchEvent
|
||||||
(watch [_ state stream]
|
(watch [_ state stream]
|
||||||
(->> (rp/query :team-font-variants {:team-id team-id})
|
(->> (rp/query :font-variants {:team-id team-id})
|
||||||
(rx/map team-fonts-loaded)))))
|
(rx/map fonts-fetched)))))
|
||||||
|
|
||||||
(defn process-upload
|
(defn process-upload
|
||||||
"Given a seq of blobs and the team id, creates a ready-to-use fonts
|
"Given a seq of blobs and the team id, creates a ready-to-use fonts
|
||||||
|
|
|
@ -12,9 +12,10 @@
|
||||||
[app.common.spec :as us]
|
[app.common.spec :as us]
|
||||||
[app.common.uuid :as uuid]
|
[app.common.uuid :as uuid]
|
||||||
[app.main.constants :as c]
|
[app.main.constants :as c]
|
||||||
|
[app.main.data.comments :as dcm]
|
||||||
|
[app.main.data.fonts :as df]
|
||||||
[app.main.repo :as rp]
|
[app.main.repo :as rp]
|
||||||
[app.main.store :as st]
|
[app.main.store :as st]
|
||||||
[app.main.data.comments :as dcm]
|
|
||||||
[app.util.avatars :as avatars]
|
[app.util.avatars :as avatars]
|
||||||
[app.util.router :as rt]
|
[app.util.router :as rt]
|
||||||
[beicon.core :as rx]
|
[beicon.core :as rx]
|
||||||
|
@ -97,7 +98,10 @@
|
||||||
:file-id file-id}
|
:file-id file-id}
|
||||||
(string? token) (assoc :token token))]
|
(string? token) (assoc :token token))]
|
||||||
(->> (rp/query :viewer-bundle params)
|
(->> (rp/query :viewer-bundle params)
|
||||||
(rx/map bundle-fetched))))))
|
(rx/mapcat
|
||||||
|
(fn [{:keys [fonts] :as bundle}]
|
||||||
|
(rx/of (df/fonts-fetched fonts)
|
||||||
|
(bundle-fetched bundle)))))))))
|
||||||
|
|
||||||
(defn- extract-frames
|
(defn- extract-frames
|
||||||
[objects]
|
[objects]
|
||||||
|
|
|
@ -7,27 +7,27 @@
|
||||||
(ns app.main.exports
|
(ns app.main.exports
|
||||||
"The main logic for SVG export functionality."
|
"The main logic for SVG export functionality."
|
||||||
(:require
|
(:require
|
||||||
[rumext.alpha :as mf]
|
|
||||||
[cuerdas.core :as str]
|
|
||||||
[app.common.uuid :as uuid]
|
|
||||||
[app.common.pages :as cp]
|
|
||||||
[app.common.math :as mth]
|
|
||||||
[app.common.geom.shapes :as gsh]
|
|
||||||
[app.common.geom.align :as gal]
|
[app.common.geom.align :as gal]
|
||||||
[app.common.geom.point :as gpt]
|
|
||||||
[app.common.geom.matrix :as gmt]
|
[app.common.geom.matrix :as gmt]
|
||||||
[app.util.timers :as ts]
|
[app.common.geom.point :as gpt]
|
||||||
|
[app.common.geom.shapes :as gsh]
|
||||||
|
[app.common.math :as mth]
|
||||||
|
[app.common.pages :as cp]
|
||||||
|
[app.common.uuid :as uuid]
|
||||||
|
[app.main.ui.shapes.circle :as circle]
|
||||||
|
[app.main.ui.shapes.embed :as embed]
|
||||||
[app.main.ui.shapes.filters :as filters]
|
[app.main.ui.shapes.filters :as filters]
|
||||||
[app.main.ui.shapes.frame :as frame]
|
[app.main.ui.shapes.frame :as frame]
|
||||||
[app.main.ui.shapes.circle :as circle]
|
[app.main.ui.shapes.group :as group]
|
||||||
[app.main.ui.shapes.image :as image]
|
[app.main.ui.shapes.image :as image]
|
||||||
[app.main.ui.shapes.path :as path]
|
[app.main.ui.shapes.path :as path]
|
||||||
[app.main.ui.shapes.rect :as rect]
|
[app.main.ui.shapes.rect :as rect]
|
||||||
[app.main.ui.shapes.text :as text]
|
|
||||||
[app.main.ui.shapes.group :as group]
|
|
||||||
[app.main.ui.shapes.svg-raw :as svg-raw]
|
|
||||||
[app.main.ui.shapes.shape :refer [shape-container]]
|
[app.main.ui.shapes.shape :refer [shape-container]]
|
||||||
[app.main.ui.shapes.embed :as embed]))
|
[app.main.ui.shapes.svg-raw :as svg-raw]
|
||||||
|
[app.main.ui.shapes.text :as text]
|
||||||
|
[app.util.timers :as ts]
|
||||||
|
[cuerdas.core :as str]
|
||||||
|
[rumext.alpha :as mf]))
|
||||||
|
|
||||||
(def ^:private default-color "#E8E9EA") ;; $color-canvas
|
(def ^:private default-color "#E8E9EA") ;; $color-canvas
|
||||||
|
|
||||||
|
@ -231,4 +231,3 @@
|
||||||
:xmlnsXlink "http://www.w3.org/1999/xlink"
|
:xmlnsXlink "http://www.w3.org/1999/xlink"
|
||||||
:xmlns "http://www.w3.org/2000/svg"}
|
:xmlns "http://www.w3.org/2000/svg"}
|
||||||
[:& wrapper {:shape group :view-box vbox}]]))
|
[:& wrapper {:shape group :view-box vbox}]]))
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
(cond
|
(cond
|
||||||
(= 204 status)
|
(= 204 status)
|
||||||
;; We need to send "something" so the streams listening downstream can act
|
;; We need to send "something" so the streams listening downstream can act
|
||||||
(rx/of :empty)
|
(rx/of nil)
|
||||||
|
|
||||||
(= 502 status)
|
(= 502 status)
|
||||||
(rx/throw {:type :bad-gateway})
|
(rx/throw {:type :bad-gateway})
|
||||||
|
|
|
@ -329,7 +329,7 @@
|
||||||
(fn [e]
|
(fn [e]
|
||||||
(reset! dragging? false)
|
(reset! dragging? false)
|
||||||
(when (not= selected-project project-id)
|
(when (not= selected-project project-id)
|
||||||
(let [data {:ids selected-files
|
(let [data {:ids (into #{} (keys selected-files))
|
||||||
:project-id project-id}
|
:project-id project-id}
|
||||||
mdata {:on-success on-drop-success}]
|
mdata {:on-success on-drop-success}]
|
||||||
(st/emit! (dd/move-files (with-meta data mdata)))))))]
|
(st/emit! (dd/move-files (with-meta data mdata)))))))]
|
||||||
|
|
|
@ -79,7 +79,8 @@
|
||||||
:min-width? true
|
:min-width? true
|
||||||
:top top
|
:top top
|
||||||
:left left
|
:left left
|
||||||
:options [[(tr "labels.rename") on-edit]
|
:options [(when-not (:is-default project)
|
||||||
|
[(tr "labels.rename") on-edit])
|
||||||
[(tr "dashboard.duplicate") on-duplicate]
|
[(tr "dashboard.duplicate") on-duplicate]
|
||||||
[(tr "dashboard.pin-unpin") toggle-pin]
|
[(tr "dashboard.pin-unpin") toggle-pin]
|
||||||
(when (seq teams)
|
(when (seq teams)
|
||||||
|
|
|
@ -12,8 +12,10 @@
|
||||||
[app.common.math :as mth]
|
[app.common.math :as mth]
|
||||||
[app.common.pages :as cp]
|
[app.common.pages :as cp]
|
||||||
[app.common.uuid :as uuid]
|
[app.common.uuid :as uuid]
|
||||||
|
[app.main.data.fonts :as df]
|
||||||
[app.main.exports :as exports]
|
[app.main.exports :as exports]
|
||||||
[app.main.repo :as repo]
|
[app.main.repo :as repo]
|
||||||
|
[app.main.store :as st]
|
||||||
[app.main.ui.shapes.embed :as embed]
|
[app.main.ui.shapes.embed :as embed]
|
||||||
[app.main.ui.shapes.filters :as filters]
|
[app.main.ui.shapes.filters :as filters]
|
||||||
[app.main.ui.shapes.shape :refer [shape-container]]
|
[app.main.ui.shapes.shape :refer [shape-container]]
|
||||||
|
@ -42,7 +44,6 @@
|
||||||
objects (reduce updt-fn objects mod-ids)
|
objects (reduce updt-fn objects mod-ids)
|
||||||
object (get objects object-id)
|
object (get objects object-id)
|
||||||
|
|
||||||
|
|
||||||
{:keys [width height]} (gsh/points->selrect (:points object))
|
{:keys [width height]} (gsh/points->selrect (:points object))
|
||||||
|
|
||||||
;; We need to get the shadows/blurs paddings to create the viewbox properly
|
;; We need to get the shadows/blurs paddings to create the viewbox properly
|
||||||
|
@ -80,6 +81,7 @@
|
||||||
:xmlnsXlink "http://www.w3.org/1999/xlink"
|
:xmlnsXlink "http://www.w3.org/1999/xlink"
|
||||||
:xmlns "http://www.w3.org/2000/svg"
|
:xmlns "http://www.w3.org/2000/svg"
|
||||||
:xmlns:penpot "https://penpot.app/xmlns"}
|
:xmlns:penpot "https://penpot.app/xmlns"}
|
||||||
|
|
||||||
(case (:type object)
|
(case (:type object)
|
||||||
:frame [:& frame-wrapper {:shape object :view-box vbox}]
|
:frame [:& frame-wrapper {:shape object :view-box vbox}]
|
||||||
:group [:> shape-container {:shape object}
|
:group [:> shape-container {:shape object}
|
||||||
|
@ -107,12 +109,19 @@
|
||||||
[{:keys [file-id page-id object-id] :as props}]
|
[{:keys [file-id page-id object-id] :as props}]
|
||||||
(let [objects (mf/use-state nil)]
|
(let [objects (mf/use-state nil)]
|
||||||
(mf/use-effect
|
(mf/use-effect
|
||||||
#(let [subs (->> (repo/query! :file {:id file-id})
|
(mf/deps file-id page-id object-id)
|
||||||
(rx/subs (fn [{:keys [data]}]
|
(fn []
|
||||||
(let [objs (get-in data [:pages-index page-id :objects])
|
(->> (rx/zip
|
||||||
objs (adapt-root-frame objs object-id)]
|
(repo/query! :font-variants {:file-id file-id})
|
||||||
(reset! objects objs)))))]
|
(repo/query! :file {:id file-id}))
|
||||||
(fn [] (rx/dispose! subs))))
|
(rx/subs
|
||||||
|
(fn [[fonts {:keys [data]} :as kaka]]
|
||||||
|
(when (seq fonts)
|
||||||
|
(st/emit! (df/fonts-fetched fonts)))
|
||||||
|
(let [objs (get-in data [:pages-index page-id :objects])
|
||||||
|
objs (adapt-root-frame objs object-id)]
|
||||||
|
(reset! objects objs)))))
|
||||||
|
(constantly nil)))
|
||||||
|
|
||||||
(when @objects
|
(when @objects
|
||||||
[:& object-svg {:objects @objects
|
[:& object-svg {:objects @objects
|
||||||
|
|
|
@ -75,7 +75,7 @@
|
||||||
(mf/defc thumbnails-summary
|
(mf/defc thumbnails-summary
|
||||||
[{:keys [on-toggle-expand on-close total] :as props}]
|
[{:keys [on-toggle-expand on-close total] :as props}]
|
||||||
[:div.thumbnails-summary
|
[:div.thumbnails-summary
|
||||||
[:span.counter (str total " frames")]
|
[:span.counter (tr "labels.num-of-frames" (i18n/c total))]
|
||||||
[:span.buttons
|
[:span.buttons
|
||||||
[:span.btn-expand {:on-click on-toggle-expand} i/arrow-down]
|
[:span.btn-expand {:on-click on-toggle-expand} i/arrow-down]
|
||||||
[:span.btn-close {:on-click on-close} i/close]]])
|
[:span.btn-close {:on-click on-close} i/close]]])
|
||||||
|
|
|
@ -981,6 +981,11 @@ msgid_plural "labels.num-of-files"
|
||||||
msgstr[0] "1 file"
|
msgstr[0] "1 file"
|
||||||
msgstr[1] "%s files"
|
msgstr[1] "%s files"
|
||||||
|
|
||||||
|
msgid "labels.num-of-frames"
|
||||||
|
msgid_plural "labels.num-of-frames"
|
||||||
|
msgstr[0] "1 artboard"
|
||||||
|
msgstr[1] "%s artboards"
|
||||||
|
|
||||||
#: src/app/main/ui/dashboard/team.cljs
|
#: src/app/main/ui/dashboard/team.cljs
|
||||||
msgid "labels.num-of-projects"
|
msgid "labels.num-of-projects"
|
||||||
msgid_plural "labels.num-of-projects"
|
msgid_plural "labels.num-of-projects"
|
||||||
|
@ -1438,11 +1443,11 @@ msgstr "%s - Penpot"
|
||||||
|
|
||||||
#: src/app/main/ui/handoff.cljs, src/app/main/ui/viewer.cljs
|
#: src/app/main/ui/handoff.cljs, src/app/main/ui/viewer.cljs
|
||||||
msgid "viewer.empty-state"
|
msgid "viewer.empty-state"
|
||||||
msgstr "No frames found on the page."
|
msgstr "No artboards found on the page."
|
||||||
|
|
||||||
#: src/app/main/ui/handoff.cljs, src/app/main/ui/viewer.cljs
|
#: src/app/main/ui/handoff.cljs, src/app/main/ui/viewer.cljs
|
||||||
msgid "viewer.frame-not-found"
|
msgid "viewer.frame-not-found"
|
||||||
msgstr "Frame not found."
|
msgstr "Artboard not found."
|
||||||
|
|
||||||
#: src/app/main/ui/viewer/header.cljs
|
#: src/app/main/ui/viewer/header.cljs
|
||||||
msgid "viewer.header.dont-show-interactions"
|
msgid "viewer.header.dont-show-interactions"
|
||||||
|
|
|
@ -983,6 +983,11 @@ msgid_plural "labels.num-of-files"
|
||||||
msgstr[0] "1 archivo"
|
msgstr[0] "1 archivo"
|
||||||
msgstr[1] "%s archivos"
|
msgstr[1] "%s archivos"
|
||||||
|
|
||||||
|
msgid "labels.num-of-frames"
|
||||||
|
msgid_plural "labels.num-of-frames"
|
||||||
|
msgstr[0] "1 tablero"
|
||||||
|
msgstr[1] "%s tableros"
|
||||||
|
|
||||||
#: src/app/main/ui/dashboard/team.cljs
|
#: src/app/main/ui/dashboard/team.cljs
|
||||||
msgid "labels.num-of-projects"
|
msgid "labels.num-of-projects"
|
||||||
msgid_plural "labels.num-of-projects"
|
msgid_plural "labels.num-of-projects"
|
||||||
|
|
Loading…
Add table
Reference in a new issue