mirror of
https://github.com/penpot/penpot.git
synced 2026-10-01 00:06:17 +00:00
Drop 277 keys nothing references from en.po (verified against frontend/src and common/src) and let sync propagate the deletions to every locale. Clear all 10 fuzzy entries: fill the 5 empty translations, keep the 4 valid ones, and drop the duplicated max-quote-reached in favor of max-quota-reached (the backend code stays, the UI maps it to the quota text). Recover 22 used-but-missing keys with translations: the 19 shortcuts section/subsection labels plus connected-to, pixel-grid-color and tokens.add-set. Make the rest statically visible to rehash instead: :label fns on shortcut commands, sections and subsections (one debug-only and one colorpicker-local id exempt); case branches in place of dm/str-built keys (export modal, text decoration and transform, undo history with raw-key fallback); hoist conditionals out of tr calls; pre-translate modal props and role labels; replace the lone (i18n/tr ...) site with tr. Turn static :error/code data into eager :error/fn calls in the common schemas and the auth/password forms. Rename the two keys containing spaces and point team leave at max-quota-reached. Backend-driven keys stay dynamic by design, declared with (tr ...) comments: the five weak-password details, team and organization notifications. Tooling: rehash also scans common/src and no longer treats a missing -l as no locale; new clj-kondo tr-dynamic warning flags non-literal tr args (lint scripts use --fail-level error so it never fails CI); tr docstring states the literal-only rule. Tests cover the shortcut label wiring, the undo-history fallback and the :error/fn schemas. Translations memory rewritten to match; es check word list gains three entries. Rebased onto develop: adopt the register field-error UX (the weak-password declarations move onto the :options code), keep develop's newer keys (connection-error, account-locked, save-retrying, tokens-source strings) with fresh references, and reword the shortcuts.cljs prose comment so rehash does not invent a "literal" key. AI-assisted-by: muse-spark-1.3-contributor
108 lines
3.0 KiB
Clojure
108 lines
3.0 KiB
Clojure
;; 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 SUBSIDIARY SL
|
|
|
|
(ns app.common.schema.messages
|
|
(:require
|
|
[app.common.data :as d]
|
|
[app.common.i18n :as i18n :refer [tr]]
|
|
[app.common.schema :as sm]
|
|
[malli.core :as m]))
|
|
|
|
;; --- Handlers Helpers
|
|
|
|
(defn- translate-code
|
|
[code]
|
|
;; validation codes are dynamic by design
|
|
#_{:clj-kondo/ignore [:penpot/tr-dynamic]}
|
|
(if (vector? code)
|
|
(tr (nth code 0) (i18n/c (nth code 1)))
|
|
(tr code)))
|
|
|
|
(defn- handle-error-fn
|
|
[props problem]
|
|
(let [v-fn (:error/fn props)
|
|
result (v-fn problem)]
|
|
(if (string? result)
|
|
{:message result}
|
|
{:message (or (some-> (get result :code)
|
|
(translate-code))
|
|
(get result :message)
|
|
(tr "errors.invalid-data"))})))
|
|
|
|
(defn- handle-error-message
|
|
[props]
|
|
{:message (get props :error/message)})
|
|
|
|
(defn- handle-error-code
|
|
[props]
|
|
(let [code (get props :error/code)]
|
|
{:message (translate-code code)}))
|
|
|
|
(defn interpret-schema-problem
|
|
[acc {:keys [schema in value type] :as problem}]
|
|
(let [props (m/properties schema)
|
|
tprops (m/type-properties schema)
|
|
field (or (:error/field props)
|
|
in)
|
|
field (if (vector? field)
|
|
field
|
|
[field])]
|
|
|
|
(if (and (= 1 (count field))
|
|
(contains? acc (first field)))
|
|
acc
|
|
(cond
|
|
(or (nil? field)
|
|
(empty? field))
|
|
acc
|
|
|
|
(or (= type :malli.core/missing-key)
|
|
(nil? value))
|
|
(assoc-in acc field {:message (tr "errors.field-missing")})
|
|
|
|
;; --- CHECK on schema props
|
|
(contains? props :error/fn)
|
|
(assoc-in acc field (handle-error-fn props problem))
|
|
|
|
(contains? props :error/message)
|
|
(assoc-in acc field (handle-error-message props))
|
|
|
|
(contains? props :error/code)
|
|
(assoc-in acc field (handle-error-code props))
|
|
|
|
;; --- CHECK on type props
|
|
(contains? tprops :error/fn)
|
|
(assoc-in acc field (handle-error-fn tprops problem))
|
|
|
|
(contains? tprops :error/message)
|
|
(assoc-in acc field (handle-error-message tprops))
|
|
|
|
(contains? tprops :error/code)
|
|
(assoc-in acc field (handle-error-code tprops))
|
|
|
|
:else
|
|
(assoc-in acc field {:message (tr "errors.invalid-data")})))))
|
|
|
|
|
|
|
|
(defn- apply-validators
|
|
[validators state errors]
|
|
(reduce (fn [errors validator-fn]
|
|
(merge errors (validator-fn errors (:data state))))
|
|
errors
|
|
validators))
|
|
|
|
(defn collect-schema-errors
|
|
[schema validators state]
|
|
(let [explain (sm/explain schema (:data state))
|
|
errors (->> (reduce interpret-schema-problem {} (:errors explain))
|
|
(apply-validators validators state))]
|
|
|
|
(-> (:errors state)
|
|
(merge errors)
|
|
(d/without-nils)
|
|
(not-empty))))
|