0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-04-01 09:31:26 -05:00

Merge pull request #2477 from penpot/palba-cleanup-translations

Cleanup translations
This commit is contained in:
Andrey Antukh 2022-10-19 16:32:07 +02:00 committed by GitHub
commit 5463671db1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 317 additions and 296 deletions

View file

@ -21,6 +21,7 @@
"watch-main": "shadow-cljs watch main",
"watch-test": "clojure -M:dev:shadow-cljs watch test",
"validate-translations": "node ./scripts/validate-translations.js",
"find-unused-translations": "node ./scripts/find-unused-translations.js",
"test-e2e": "cypress run",
"test-e2e-gui": "cypress open"
},

View file

@ -0,0 +1,90 @@
const fs = require('fs').promises;
const gt = require("gettext-parser");
const path = require('path');
const util = require('node:util');
const execFile = util.promisify(require('node:child_process').execFile);
async function processMsgId(msgId){
return execFile('grep', ['-r', '-o', msgId, './src'])
.catch(()=> { return msgId})
}
async function processFile(f) {
const content = await fs.readFile(f);
const data = gt.po.parse(content, "utf-8")
const translations = data.translations[''];
const badIds = [];
for (const property in translations) {
const data = await processMsgId(translations[property].msgid);
if (data!=null && data.stdout === undefined){
badIds.push(data)
}
}
return badIds;
}
async function cleanFile(f, badIds) {
console.log ("\n\nDoing automatic cleanup")
const content = await fs.readFile(f);
const data = gt.po.parse(content, "utf-8");
const translations = data.translations[''];
const keys = Object.keys(translations);
for (const key of keys) {
property = translations[key];
if (badIds.includes(property.msgid)){
console.log ('----> deleting', property.msgid)
delete data.translations[''][key];
}
}
const buff = gt.po.compile(data, {sort: true});
await fs.writeFile(f, buff);
}
async function findExecutionTimeTranslations() {
const { stdout } = await execFile('grep', ['-r', '-h', '-F', '(tr (', './src']);
console.log(stdout);
}
async function welcome() {
console.log ('####################################################################')
console.log ('# UNUSED TRANSLATIONS FINDER #')
console.log ('####################################################################')
console.log ('\n');
console.log ('DISCLAIMER: Some translations are only available at execution time.')
console.log (' This finder can\'t process them, so there can be')
console.log (' false positives.\n')
console.log (' If you want to do an automatic clean anyway,')
console.log (' call the script with:')
console.log (' npm run find-unused-translations -- --clean')
console.log (' For example:');
console.log ('--------------------------------------------------------------------');
await findExecutionTimeTranslations();
console.log ('--------------------------------------------------------------------');
}
const doCleanup = process.argv.slice(2)[0] == "--clean";
;(async () => {
await welcome();
const target = path.normalize("./translations/en.po");
const badIds = await processFile(target);
if (doCleanup){
cleanFile(target, badIds);
} else {
for (const badId of badIds){
console.log(badId);
}
}
})()

View file

@ -122,6 +122,13 @@
(let [selected? (= @selected-option type)]
[:div.export-option {:class (when selected? "selected")}
[:label.option-container
;; Execution time translation strings:
;; dashboard.export.options.all.message
;; dashboard.export.options.all.title
;; dashboard.export.options.detach.message
;; dashboard.export.options.detach.title
;; dashboard.export.options.merge.message
;; dashboard.export.options.merge.title
[:h3 (tr (str "dashboard.export.options." (d/name type) ".title"))]
[:p (tr (str "dashboard.export.options." (d/name type) ".message"))]
[:input {:type "radio"

View file

@ -67,7 +67,16 @@
[:div.attributes-stroke-row
[:div.attributes-label (tr "handoff.attributes.stroke.width")]
[:div.attributes-value (:stroke-width shape) "px"]
;; Execution time translation strings:
;; handoff.attributes.stroke.style.dotted
;; handoff.attributes.stroke.style.mixed
;; handoff.attributes.stroke.style.none
;; handoff.attributes.stroke.style.solid
[:div.attributes-value (->> stroke-style d/name (str "handoff.attributes.stroke.style.") (tr))]
;; Execution time translation strings:
;; handoff.attributes.stroke.alignment.center
;; handoff.attributes.stroke.alignment.inner
;; handoff.attributes.stroke.alignment.outer
[:div.attributes-label (->> stroke-alignment d/name (str "handoff.attributes.stroke.alignment.") (tr))]
[:& copy-button {:data (copy-stroke-data shape)}]])]))

View file

@ -142,12 +142,21 @@
(when (:text-decoration style)
[:div.attributes-unit-row
[:div.attributes-label (tr "handoff.attributes.typography.text-decoration")]
;; Execution time translation strings:
;; handoff.attributes.typography.text-decoration.none
;; handoff.attributes.typography.text-decoration.strikethrough
;; handoff.attributes.typography.text-decoration.underline
[:div.attributes-value (->> style :text-decoration (str "handoff.attributes.typography.text-decoration.") (tr))]
[:& copy-button {:data (copy-style-data style :text-decoration)}]])
(when (:text-transform style)
[:div.attributes-unit-row
[:div.attributes-label (tr "handoff.attributes.typography.text-transform")]
;; Execution time translation strings:
;; handoff.attributes.typography.text-transform.lowercase
;; handoff.attributes.typography.text-transform.none
;; handoff.attributes.typography.text-transform.titlecase
;; handoff.attributes.typography.text-transform.uppercase
[:div.attributes-value (->> style :text-transform (str "handoff.attributes.typography.text-transform.") (tr))]
[:& copy-button {:data (copy-style-data style :text-transform)}]])]))

View file

@ -45,6 +45,18 @@
[:*
[:span.tool-window-bar-icon
[:& si/element-icon {:shape first-shape}]]
;; Execution time translation strings:
;; handoff.tabs.code.selected.circle
;; handoff.tabs.code.selected.component
;; handoff.tabs.code.selected.curve
;; handoff.tabs.code.selected.frame
;; handoff.tabs.code.selected.group
;; handoff.tabs.code.selected.image
;; handoff.tabs.code.selected.mask
;; handoff.tabs.code.selected.path
;; handoff.tabs.code.selected.rect
;; handoff.tabs.code.selected.svg-raw
;; handoff.tabs.code.selected.text
[:span.tool-window-bar-title (->> selected-type d/name (str "handoff.tabs.code.selected.") (tr))]])]
[:div.tool-window-content
[:& tab-container {:on-change-tab #(do

View file

@ -103,6 +103,36 @@
[locale type multiple?]
(let [arity (if multiple? "multiple" "single")
attribute (name (or type :multiple))]
;; Execution time translation strings:
;; workspace.undo.entry.multiple.circle
;; workspace.undo.entry.multiple.color
;; workspace.undo.entry.multiple.component
;; workspace.undo.entry.multiple.curve
;; workspace.undo.entry.multiple.frame
;; workspace.undo.entry.multiple.group
;; workspace.undo.entry.multiple.media
;; workspace.undo.entry.multiple.multiple
;; workspace.undo.entry.multiple.page
;; workspace.undo.entry.multiple.path
;; workspace.undo.entry.multiple.rect
;; workspace.undo.entry.multiple.shape
;; workspace.undo.entry.multiple.text
;; workspace.undo.entry.multiple.typography
;; workspace.undo.entry.single.circle
;; workspace.undo.entry.single.color
;; workspace.undo.entry.single.component
;; workspace.undo.entry.single.curve
;; workspace.undo.entry.single.frame
;; workspace.undo.entry.single.group
;; workspace.undo.entry.single.image
;; workspace.undo.entry.single.media
;; workspace.undo.entry.single.multiple
;; workspace.undo.entry.single.page
;; workspace.undo.entry.single.path
;; workspace.undo.entry.single.rect
;; workspace.undo.entry.single.shape
;; workspace.undo.entry.single.text
;; workspace.undo.entry.single.typography
(t locale (str/format "workspace.undo.entry.%s.%s" arity attribute))))
(defn entry->message [locale entry]

View file

@ -77,6 +77,11 @@
:top (= :top dir)
:bottom (= :bottom dir))
:key (dm/str "direction-" dir)
;; Execution time translation strings:
;; workspace.options.layout.direction.bottom
;; workspace.options.layout.direction.left
;; workspace.options.layout.direction.right
;; workspace.options.layout.direction.top
:alt (tr (dm/str "workspace.options.layout.direction." (d/name dir)))
:on-click handle-on-click}
i/auto-direction]))
@ -220,7 +225,7 @@
set-gap
(fn [gap]
(st/emit! (dwsl/update-layout ids {:layout-gap gap})))
change-padding-style
(fn [type]
(st/emit! (dwsl/update-layout ids {:layout-padding-type type})))
@ -267,6 +272,13 @@
orientation
(if (= type :packed)
;; Execution time translation strings:
;; workspace.options.layout.h.center
;; workspace.options.layout.h.left
;; workspace.options.layout.h.right
;; workspace.options.layout.v.bottom
;; workspace.options.layout.v.center
;; workspace.options.layout.v.top
(dm/str (tr (dm/str "workspace.options.layout.v." (d/name v))) ", "
(tr (dm/str "workspace.options.layout.h." (d/name h))) ", ")

View file

@ -170,6 +170,15 @@
(for [item [:layout-max-h :layout-min-h :layout-max-w :layout-min-w]]
[:div.input-element
{:key (d/name item)
;; Execution time translation strings:
;; workspace.options.layout-item.layout-max-h
;; workspace.options.layout-item.layout-max-w
;; workspace.options.layout-item.layout-min-h
;; workspace.options.layout-item.layout-min-w
;; workspace.options.layout-item.title.layout-max-h
;; workspace.options.layout-item.title.layout-max-w
;; workspace.options.layout-item.title.layout-min-h
;; workspace.options.layout-item.title.layout-min-w
:alt (tr (dm/str "workspace.options.layout-item." (d/name item)))
:title (tr (dm/str "workspace.options.layout-item." (d/name item)))
:class (dom/classnames "maxH" (= item :layout-max-h)

View file

@ -49,10 +49,142 @@
(defn translation-keyname
[type keyname]
;; Execution time translation strings:
;; shortcut-subsection.alignment
;; shortcut-subsection.edit
;; shortcut-subsection.general-dashboard
;; shortcut-subsection.general-viewer
;; shortcut-subsection.main-menu
;; shortcut-subsection.modify-layers
;; shortcut-subsection.navigation-dashboard
;; shortcut-subsection.navigation-viewer
;; shortcut-subsection.navigation-workspace
;; shortcut-subsection.panels
;; shortcut-subsection.path-editor
;; shortcut-subsection.shape
;; shortcut-subsection.tools
;; shortcut-subsection.zoom-viewer
;; shortcut-subsection.zoom-workspace
;; shortcuts.add-comment
;; shortcuts.add-node
;; shortcuts.align-bottom
;; shortcuts.align-hcenter
;; shortcuts.align-left
;; shortcuts.align-right
;; shortcuts.align-top
;; shortcuts.align-vcenter
;; shortcuts.artboard-selection
;; shortcuts.bool-difference
;; shortcuts.bool-exclude
;; shortcuts.bool-intersection
;; shortcuts.bool-union
;; shortcuts.bring-back
;; shortcuts.bring-backward
;; shortcuts.bring-forward
;; shortcuts.bring-front
;; shortcuts.clear-undo
;; shortcuts.copy
;; shortcuts.create-component
;; shortcuts.create-new-project
;; shortcuts.cut
;; shortcuts.decrease-zoom
;; shortcuts.delete
;; shortcuts.delete-node
;; shortcuts.detach-component
;; shortcuts.draw-curve
;; shortcuts.draw-ellipse
;; shortcuts.draw-frame
;; shortcuts.draw-nodes
;; shortcuts.draw-path
;; shortcuts.draw-rect
;; shortcuts.draw-text
;; shortcuts.duplicate
;; shortcuts.escape
;; shortcuts.export-shapes
;; shortcuts.fit-all
;; shortcuts.flip-horizontal
;; shortcuts.flip-vertical
;; shortcuts.go-to-drafts
;; shortcuts.go-to-libs
;; shortcuts.go-to-search
;; shortcuts.group
;; shortcuts.h-distribute
;; shortcuts.hide-ui
;; shortcuts.increase-zoom
;; shortcuts.insert-image
;; shortcuts.join-nodes
;; shortcuts.make-corner
;; shortcuts.make-curve
;; shortcuts.mask
;; shortcuts.merge-nodes
;; shortcuts.move
;; shortcuts.move-fast-down
;; shortcuts.move-fast-left
;; shortcuts.move-fast-right
;; shortcuts.move-fast-up
;; shortcuts.move-nodes
;; shortcuts.move-unit-down
;; shortcuts.move-unit-left
;; shortcuts.move-unit-right
;; shortcuts.move-unit-up
;; shortcuts.next-frame
;; shortcuts.opacity-0
;; shortcuts.opacity-1
;; shortcuts.opacity-2
;; shortcuts.opacity-3
;; shortcuts.opacity-4
;; shortcuts.opacity-5
;; shortcuts.opacity-6
;; shortcuts.opacity-7
;; shortcuts.opacity-8
;; shortcuts.opacity-9
;; shortcuts.open-color-picker
;; shortcuts.open-comments
;; shortcuts.open-dashboard
;; shortcuts.open-handoff
;; shortcuts.open-interactions
;; shortcuts.open-viewer
;; shortcuts.open-workspace
;; shortcuts.paste
;; shortcuts.prev-frame
;; shortcuts.redo
;; shortcuts.reset-zoom
;; shortcuts.select-all
;; shortcuts.separate-nodes
;; shortcuts.show-pixel-grid
;; shortcuts.show-shortcuts
;; shortcuts.snap-nodes
;; shortcuts.snap-pixel-grid
;; shortcuts.start-editing
;; shortcuts.start-measure
;; shortcuts.stop-measure
;; shortcuts.thumbnail-set
;; shortcuts.toggle-alignment
;; shortcuts.toggle-assets
;; shortcuts.toggle-colorpalette
;; shortcuts.toggle-focus-mode
;; shortcuts.toggle-grid
;; shortcuts.toggle-history
;; shortcuts.toggle-layers
;; shortcuts.toggle-lock
;; shortcuts.toggle-lock-size
;; shortcuts.toggle-rules
;; shortcuts.toggle-scale-text
;; shortcuts.toggle-snap-grid
;; shortcuts.toggle-snap-guide
;; shortcuts.toggle-textpalette
;; shortcuts.toggle-visibility
;; shortcuts.toggle-zoom-style
;; shortcuts.toogle-fullscreen
;; shortcuts.undo
;; shortcuts.ungroup
;; shortcuts.unmask
;; shortcuts.v-distribute
;; shortcuts.zoom-selected
(let [translat-pre (case type
:sc "shortcuts."
:sec "shortcut-section."
:sub-sec "shortcut-subsection.")]
:sc "shortcuts."
:sec "shortcut-section."
:sub-sec "shortcut-subsection.")]
(tr (str translat-pre (d/name keyname)))))
(defn add-translation
@ -60,7 +192,7 @@
(map (fn [[k v]] [k (assoc v :translation (translation-keyname type k))]) item))
(defn shortcuts->subsections
"A function to obtain the list of subsections and their
"A function to obtain the list of subsections and their
associated shortcus from the general map of shortcuts"
[shortcuts]
(let [subsections (into #{} (mapcat :subsections) (vals shortcuts))

View file

@ -85,10 +85,6 @@ msgstr "OpenID"
msgid "auth.new-password"
msgstr "Type a new password"
#: src/app/main/ui/auth/register.cljs
msgid "auth.newsletter-subscription"
msgstr "I agree to subscribe to the Penpot mailing list."
#: src/app/main/ui/auth/recovery.cljs
msgid "auth.notifications.invalid-token-error"
msgstr "The recovery token is invalid."
@ -192,9 +188,6 @@ msgstr "Get link"
msgid "common.share-link.link-copied-success"
msgstr "Link copied successfully"
msgid "common.share-link.link-deleted-success"
msgstr "Link deleted successfully"
msgid "common.share-link.manage-ops"
msgstr "Manage permissions"
@ -300,9 +293,6 @@ msgstr "Download Penpot file (.penpot)"
msgid "dashboard.download-standard-file"
msgstr "Download standard file (.svg + .json)"
msgid "dashboard.draft-title"
msgstr "Draft"
#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs
msgid "dashboard.duplicate"
msgstr "Duplicate"
@ -311,10 +301,6 @@ msgstr "Duplicate"
msgid "dashboard.duplicate-multi"
msgstr "Duplicate %s files"
#: src/app/main/ui/dashboard/grid.cljs
msgid "dashboard.empty-files"
msgstr "You still have no files here"
#: src/app/main/ui/dashboard/grid.cljs
#, markdown
msgid "dashboard.empty-placeholder-drafts"
@ -361,9 +347,6 @@ msgstr "There are no elements with export settings."
msgid "dashboard.export-shapes.title"
msgstr "Export selection"
msgid "dashboard.export-single"
msgstr "Export Penpot file"
msgid "dashboard.export-standard-multi"
msgstr "Download %s standard files (.svg + .json)"
@ -531,14 +514,6 @@ msgstr "+ New project"
msgid "dashboard.new-project-prefix"
msgstr "New Project"
#: src/app/main/ui/settings/profile.cljs
msgid "dashboard.newsletter-msg"
msgstr "Send me news, product updates and recommendations about Penpot."
#: src/app/main/ui/settings/profile.cljs
msgid "dashboard.newsletter-title"
msgstr "Newsletter subscription"
#: src/app/main/ui/dashboard/search.cljs
msgid "dashboard.no-matches-for"
msgstr "No matches found for “%s“"
@ -714,10 +689,6 @@ msgstr "Ok"
msgid "ds.confirm-title"
msgstr "Are you sure?"
#: src/app/main/ui/dashboard/grid.cljs
msgid "ds.updated-at"
msgstr "Updated: %s"
#: src/app/main/ui/auth/login.cljs
msgid "errors.auth-provider-not-configured"
msgstr "Authentication provider not configured."
@ -765,10 +736,6 @@ msgstr "The email «%s» has been reported as spam or permanently bounce."
msgid "errors.generic"
msgstr "Something wrong has happened."
#: src/app/main/ui/auth/login.cljs
msgid "errors.google-auth-not-enabled"
msgstr "Authentication with google disabled on backend"
#: src/app/main/ui/components/color_input.cljs
msgid "errors.invalid-color"
msgstr "Invalid color"
@ -784,9 +751,6 @@ msgstr "This invite might be canceled or may be expired."
msgid "errors.ldap-disabled"
msgstr "LDAP authentication is disabled."
msgid "errors.media-format-unsupported"
msgstr "The image format is not supported (must be svg, jpg or png)."
#: src/app/main/data/workspace/persistence.cljs
msgid "errors.media-too-large"
msgstr "The image is too large to be inserted."
@ -803,9 +767,6 @@ msgstr "Seems that this is not a valid image."
msgid "errors.member-is-muted"
msgstr "The profile you inviting has emails muted (spam reports or high bounces)."
msgid "errors.network"
msgstr "Unable to connect to backend server."
#: src/app/main/ui/settings/password.cljs
msgid "errors.password-invalid-confirmation"
msgstr "Confirmation password must match"
@ -834,9 +795,6 @@ msgstr "The member you try to assign does not exist."
msgid "errors.team-leave.owner-cant-leave"
msgstr "Owner can't leave team, you must reassign the owner role."
msgid "errors.terms-privacy-agreement-invalid"
msgstr "You must accept our terms of service and privacy policy."
#: src/app/main/data/media.cljs, src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/handoff/exports.cljs
msgid "errors.unexpected-error"
msgstr "An unexpected error occurred."
@ -853,14 +811,6 @@ msgstr "Username or password seems to be wrong."
msgid "errors.wrong-old-password"
msgstr "Old password is incorrect"
#: src/app/main/ui/settings/feedback.cljs
msgid "feedback.chat-start"
msgstr "Join the chat"
#: src/app/main/ui/settings/feedback.cljs
msgid "feedback.chat-subtitle"
msgstr "Feeling like talking? Chat with us at Gitter"
#: src/app/main/ui/settings/feedback.cljs
msgid "feedback.description"
msgstr "Description"
@ -977,22 +927,6 @@ msgstr "Width"
msgid "handoff.attributes.shadow"
msgstr "Shadow"
#: src/app/main/ui/handoff/attributes/shadow.cljs
msgid "handoff.attributes.shadow.shorthand.blur"
msgstr "B"
#: src/app/main/ui/handoff/attributes/shadow.cljs
msgid "handoff.attributes.shadow.shorthand.offset-x"
msgstr "X"
#: src/app/main/ui/handoff/attributes/shadow.cljs
msgid "handoff.attributes.shadow.shorthand.offset-y"
msgstr "Y"
#: src/app/main/ui/handoff/attributes/shadow.cljs
msgid "handoff.attributes.shadow.shorthand.spread"
msgstr "S"
#: src/app/main/ui/handoff/attributes/stroke.cljs
msgid "handoff.attributes.stroke"
msgstr "Stroke"
@ -1123,17 +1057,10 @@ msgstr "Text"
msgid "handoff.tabs.info"
msgstr "Info"
msgid "history.alert-message"
msgstr "You are seeing version %s"
#: src/app/main/ui/workspace/header.cljs
msgid "label.shortcuts"
msgstr "Shortcuts"
#: src/app/main/ui/dashboard/sidebar.cljs
msgid "labels.about-penpot"
msgstr "About Penpot"
msgid "labels.accept"
msgstr "Accept"
@ -1168,9 +1095,6 @@ msgstr "Bad Gateway"
msgid "labels.cancel"
msgstr "Cancel"
msgid "labels.centered"
msgstr "Center"
msgid "labels.close"
msgstr "Close"
@ -1186,9 +1110,6 @@ msgstr "Community"
msgid "labels.confirm-password"
msgstr "Confirm password"
msgid "labels.content"
msgstr "Content"
msgid "labels.continue"
msgstr "Continue"
@ -1217,9 +1138,6 @@ msgstr "Custom fonts"
msgid "labels.dashboard"
msgstr "Dashboard"
msgid "labels.default"
msgstr "default"
#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs
msgid "labels.delete"
msgstr "Delete"
@ -1255,10 +1173,6 @@ msgstr "Edit file"
msgid "labels.editor"
msgstr "Editor"
#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs
msgid "labels.email"
msgstr "Email"
#: src/app/main/ui/dashboard/team.cljs
msgid "labels.expired-invitation"
msgstr "Expired"
@ -1305,12 +1219,6 @@ msgstr "Help Center"
msgid "labels.hide-resolved-comments"
msgstr "Hide resolved comments"
msgid "labels.icons"
msgstr "Icons"
msgid "labels.images"
msgstr "Images"
msgid "labels.installed-fonts"
msgstr "Installed fonts"
@ -1336,9 +1244,6 @@ msgstr "Language"
msgid "labels.libraries-and-templates"
msgstr "Libraries & Templates"
msgid "labels.link"
msgstr "Link"
msgid "labels.log-or-sign"
msgstr "Log in or sign up"
@ -1346,9 +1251,6 @@ msgstr "Log in or sign up"
msgid "labels.logout"
msgstr "Logout"
msgid "labels.manage-fonts"
msgstr "Manage fonts"
#: 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 "Member"
@ -1357,17 +1259,10 @@ msgstr "Member"
msgid "labels.members"
msgstr "Members"
#: src/app/main/ui/dashboard/team.cljs
msgid "labels.name"
msgstr "Name"
#: src/app/main/ui/settings/password.cljs
msgid "labels.new-password"
msgstr "New password"
msgid "labels.next"
msgstr "Next"
#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/dashboard/comments.cljs
msgid "labels.no-comments-available"
msgstr "You have no pending comment notifications"
@ -1380,10 +1275,6 @@ msgstr "There are no invitations."
msgid "labels.no-invitations-hint"
msgstr "Press the button \"Invite to team\" to invite more members to this team."
#: src/app/main/ui/static.cljs
msgid "labels.not-found.auth-info"
msgstr "Youre signed in as"
#: src/app/main/ui/static.cljs
msgid "labels.not-found.desc-message"
msgstr "This page might not exist or you dont have permissions to access to it."
@ -1432,10 +1323,6 @@ msgstr "Password"
msgid "labels.pending-invitation"
msgstr "Pending"
#: src/app/main/ui/dashboard/team.cljs
msgid "labels.permissions"
msgstr "Permissions"
#: src/app/main/ui/settings/sidebar.cljs
msgid "labels.profile"
msgstr "Profile"
@ -1444,9 +1331,6 @@ msgstr "Profile"
msgid "labels.projects"
msgstr "Projects"
msgid "labels.recent"
msgstr "Recent"
#: src/app/main/ui/settings/sidebar.cljs
msgid "labels.release-notes"
msgstr "Release notes"
@ -1523,16 +1407,6 @@ msgstr "Show comments list"
msgid "labels.show-your-comments"
msgstr "Show only your comments"
#: src/app/main/ui/static.cljs
msgid "labels.sign-out"
msgstr "Sign out"
msgid "labels.skip"
msgstr "Skip"
msgid "labels.start"
msgstr "Start"
#: src/app/main/ui/dashboard/team.cljs
msgid "labels.status"
msgstr "Status"
@ -1562,9 +1436,6 @@ msgstr "Uploading…"
msgid "labels.viewer"
msgstr "Viewer"
msgid "labels.workspace"
msgstr "Workspace"
#: src/app/main/ui/comments.cljs
msgid "labels.write-new-comment"
msgstr "Write new comment"
@ -1619,12 +1490,6 @@ msgstr "Change email"
msgid "modals.change-email.title"
msgstr "Change your email"
#: src/app/main/ui/dashboard/sidebar.cljs
msgid "modals.change-owner-and-leave-confirm.message"
msgstr ""
"You are the owner of this team. Please select another member to promote to "
"owner before you leave."
#: src/app/main/ui/settings/delete_account.cljs
msgid "modals.delete-account.cancel"
msgstr "Cancel and keep my account"
@ -1745,10 +1610,6 @@ msgid_plural "modals.delete-shared-confirm.title"
msgstr[0] "Deleting file"
msgstr[1] "Deleting files"
#: src/app/main/ui/delete_shared.cljs
msgid "modals.delete-shared.title"
msgstr "Deleting file"
#: src/app/main/ui/dashboard/sidebar.cljs
msgid "modals.delete-team-confirm.accept"
msgstr "Delete team"
@ -2040,29 +1901,6 @@ msgstr "Create team and send invites"
msgid "onboarding.choice.team-up.roles"
msgstr "Invite with the role:"
msgid "onboarding.choice.title"
msgstr "Welcome to Penpot"
msgid "onboarding.contrib.alt"
msgstr "Open Source"
msgid "onboarding.contrib.desc1"
msgstr ""
"Penpot is Open Source, made by and for the community. If you want to "
"collaborate, you are more than welcome!"
msgid "onboarding.contrib.desc2.1"
msgstr "You can access the"
msgid "onboarding.contrib.desc2.2"
msgstr "and follow the contribution instructions :)"
msgid "onboarding.contrib.link"
msgstr "project on github"
msgid "onboarding.contrib.title"
msgstr "Open Source Contributor?"
msgid "onboarding.newsletter.accept"
msgstr "Yes, subscribe"
@ -2071,68 +1909,12 @@ msgstr ""
"Your subscription request has been sent, we will send you an email to "
"confirm it."
msgid "onboarding.newsletter.decline"
msgstr "No, thanks"
msgid "onboarding.newsletter.policy"
msgstr "Privacy Policy."
msgid "onboarding.newsletter.title"
msgstr "Want to receive Penpot news?"
msgid "onboarding.slide.0.alt"
msgstr "Create designs"
msgid "onboarding.slide.0.desc1"
msgstr "Create beautiful user interfaces in collaboration with all team members."
msgid "onboarding.slide.0.desc2"
msgstr "Maintain consistency at scale with components, libraries and design systems."
msgid "onboarding.slide.0.title"
msgstr "Design libraries, styles and components"
msgid "onboarding.slide.1.alt"
msgstr "Interactive prototypes"
msgid "onboarding.slide.1.desc1"
msgstr "Create rich interactions to mimic the product behaviour."
msgid "onboarding.slide.1.desc2"
msgstr ""
"Share to stakeholders, present proposals to your team and start user "
"testing with your designs, all in one place."
msgid "onboarding.slide.1.title"
msgstr "Bring your designs to life with interactions"
msgid "onboarding.slide.2.alt"
msgstr "Get feedback"
msgid "onboarding.slide.2.desc1"
msgstr ""
"All team members working simultaneously with real time design multiplayer "
"and centralised comments, ideas and feedback right over the designs."
msgid "onboarding.slide.2.title"
msgstr "Get feedback, present and share your work"
msgid "onboarding.slide.3.alt"
msgstr "Handoff and lowcode"
msgid "onboarding.slide.3.desc1"
msgstr ""
"Sync the design and code of all your components and styles and get code "
"snippets."
msgid "onboarding.slide.3.desc2"
msgstr ""
"Get and provide code specifications like markup (SVG, HTML) or styles (CSS, "
"Less, Stylus…)."
msgid "onboarding.slide.3.title"
msgstr "One shared source of truth"
msgid "onboarding.team-modal.create-team"
msgstr "Create a team"
@ -2165,9 +1947,6 @@ msgstr "Start designing"
msgid "onboarding.welcome.alt"
msgstr "Penpot"
msgid "onboarding.welcome.title"
msgstr "Welcome to Penpot"
#: src/app/main/ui/auth/recovery.cljs
msgid "profile.recovery.go-to-login"
msgstr "Go to login"
@ -2701,22 +2480,6 @@ msgstr "Interactions (%s)"
msgid "viewer.header.share.copy-link"
msgstr "Copy link"
#: src/app/main/ui/viewer/header.cljs
msgid "viewer.header.share.create-link"
msgstr "Create link"
#: src/app/main/ui/viewer/header.cljs
msgid "viewer.header.share.placeholder"
msgstr "Share link will appear here"
#: src/app/main/ui/viewer/header.cljs
msgid "viewer.header.share.remove-link"
msgstr "Remove link"
#: src/app/main/ui/viewer/header.cljs
msgid "viewer.header.share.subtitle"
msgstr "Anyone with the link will have access"
#: src/app/main/ui/viewer/header.cljs
msgid "viewer.header.show-interactions"
msgstr "Show interactions"
@ -2769,9 +2532,6 @@ msgstr "Assets"
msgid "workspace.assets.box-filter-all"
msgstr "All assets"
msgid "workspace.assets.box-filter-graphics"
msgstr "Graphics"
#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs
msgid "workspace.assets.colors"
msgstr "Colors"
@ -3065,10 +2825,6 @@ msgstr "Add"
msgid "workspace.libraries.colors"
msgstr "%s colors"
#: src/app/main/ui/workspace/colorpalette.cljs
msgid "workspace.libraries.colors.big-thumbnails"
msgstr "Big thumbnails"
#: src/app/main/ui/workspace/colorpicker/libraries.cljs, src/app/main/ui/workspace/colorpalette.cljs
msgid "workspace.libraries.colors.file-library"
msgstr "File library"
@ -3093,10 +2849,6 @@ msgstr "RGBA"
msgid "workspace.libraries.colors.save-color"
msgstr "Save color style"
#: src/app/main/ui/workspace/colorpalette.cljs
msgid "workspace.libraries.colors.small-thumbnails"
msgstr "Small thumbnails"
#: src/app/main/ui/workspace/libraries.cljs
msgid "workspace.libraries.components"
msgstr "%s components"
@ -3161,28 +2913,10 @@ msgstr "Update"
msgid "workspace.libraries.updates"
msgstr "UPDATES"
msgid "workspace.library.all"
msgstr "All libraries"
msgid "workspace.library.libraries"
msgstr "Libraries"
msgid "workspace.library.own"
msgstr "My libraries"
msgid "workspace.library.store"
msgstr "Store libraries"
#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs
msgid "workspace.options.add-interaction"
msgstr "Click the + button to add interactions."
msgid "workspace.options.blur-options.background-blur"
msgstr "Background"
msgid "workspace.options.blur-options.layer-blur"
msgstr "Layer"
#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs
msgid "workspace.options.blur-options.title"
msgstr "Blur"
@ -3878,10 +3612,6 @@ msgstr "Search font"
msgid "workspace.options.select-a-shape"
msgstr "Select a shape, board or group to drag a connection to other board."
#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs
msgid "workspace.options.select-artboard"
msgstr "Select board"
#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs
msgid "workspace.options.selection-color"
msgstr "Selected colors"
@ -4046,9 +3776,6 @@ msgstr "Align right"
msgid "workspace.options.text-options.align-top"
msgstr "Align top"
msgid "workspace.options.text-options.decoration"
msgstr "Decoration"
#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs
msgid "workspace.options.text-options.direction-ltr"
msgstr "LTR"
@ -4057,10 +3784,6 @@ msgstr "LTR"
msgid "workspace.options.text-options.direction-rtl"
msgstr "RTL"
#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs
msgid "workspace.options.text-options.google"
msgstr "Google"
#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs
msgid "workspace.options.text-options.grow-auto-height"
msgstr "Auto height"
@ -4089,17 +3812,10 @@ msgstr "Lowercase"
msgid "workspace.options.text-options.none"
msgstr "None"
#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs
msgid "workspace.options.text-options.preset"
msgstr "Preset"
#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs
msgid "workspace.options.text-options.strikethrough"
msgstr "Strikethrough"
msgid "workspace.options.text-options.text-case"
msgstr "Case"
#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs
msgid "workspace.options.text-options.title"
msgstr "Text"
@ -4124,9 +3840,6 @@ msgstr "Underline"
msgid "workspace.options.text-options.uppercase"
msgstr "Uppercase"
msgid "workspace.options.text-options.vertical-align"
msgstr "Vertical align"
#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs
msgid "workspace.options.use-play-button"
msgstr "Use the play button at the header to run the prototype view."
@ -4562,7 +4275,4 @@ msgstr "There are updates in shared libraries"
#: src/app/main/data/workspace/libraries.cljs
msgid "workspace.updates.update"
msgstr "Update"
msgid "workspace.viewport.click-to-close-path"
msgstr "Click to close the path"
msgstr "Update"