🐛 Fix some errors from reviews (#7421)

* 🐛 Fix errors con colorpicker

* 🐛 Fix modal size

* 🐛 Fix form padding

* 🐛 Fix edit modal title

* 🐛 Fix resolved value message

* 🐛 Fix CI
This commit is contained in:
Eva Marco 2025-10-03 11:25:56 +02:00 committed by GitHub
parent 44f6c2f83c
commit fc8029abf7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
22 changed files with 67 additions and 110 deletions

View File

@ -627,14 +627,17 @@
(map (fn [[group grouped-sets]] (map (fn [[group grouped-sets]]
(if group (if group
{:group group {:group group
:sets (map #(last (str/split (:set %) #"/")) grouped-sets) :sets (map (fn [{:keys [id set]}]
{:id id
:name (last (str/split set #"/"))})
grouped-sets)
:tokens (->> grouped-sets :tokens (->> grouped-sets
(mapcat :tokens) (mapcat :tokens)
(map :name) (map :name)
distinct)} distinct)}
(map (fn [{:keys [set tokens]}] (map (fn [{:keys [id set tokens]}]
{:group nil {:group nil
:sets [set] :sets [{:id id :name set}]
:tokens (map :name tokens)}) :tokens (map :name tokens)})
grouped-sets)))) grouped-sets))))
flatten)) flatten))
@ -694,6 +697,7 @@
[sets] [sets]
(map (fn [s] (map (fn [s]
{:set (ctob/get-name s) {:set (ctob/get-name s)
:id (ctob/get-id s)
:tokens (vals (ctob/get-tokens- s))}) ;; TODO: this function should be moved to common.logic and refactored :tokens (vals (ctob/get-tokens- s))}) ;; TODO: this function should be moved to common.logic and refactored
sets)) sets))

View File

@ -9,7 +9,6 @@
(:require (:require
[app.common.data :as d] [app.common.data :as d]
[app.common.data.macros :as dm] [app.common.data.macros :as dm]
[app.common.types.tokens-lib :as ctob]
[app.main.constants :refer [max-input-length]] [app.main.constants :refer [max-input-length]]
[app.main.data.common :as dcm] [app.main.data.common :as dcm]
[app.main.data.event :as-alias ev] [app.main.data.event :as-alias ev]
@ -104,7 +103,7 @@
(mf/defc set-section* (mf/defc set-section*
{::mf/private true} {::mf/private true}
[{:keys [collapsed toggle-sets-open set name color-origin on-token-change] :rest props}] [{:keys [collapsed toggle-sets-open group-or-set name color-origin on-token-change] :rest props}]
(let [list-style* (mf/use-state :list) (let [list-style* (mf/use-state :list)
list-style (deref list-style*) list-style (deref list-style*)
@ -143,14 +142,16 @@
create-token-on-set create-token-on-set
(mf/use-fn (mf/use-fn
(mf/deps set) (mf/deps group-or-set)
(fn [_] (fn [_]
(let [;; We want to create a token on the first set (let [;; We want to create a token on the first set
;; if there are many in this group ;; if there are many in this group
path-set (group->paths set)] path-set (group->paths group-or-set)
id (:id (first (:sets group-or-set)))]
(st/emit! (dcm/go-to-workspace :layout :tokens) (st/emit! (dcm/go-to-workspace :layout :tokens)
(ptk/data-event :expand-token-sets {:paths path-set}) (when path-set
(dwtl/set-selected-token-set-id (ctob/get-id set)) (ptk/data-event :expand-token-sets {:paths path-set}))
(dwtl/set-selected-token-set-id id)
(dwtl/set-token-type-section-open :color true) (dwtl/set-token-type-section-open :color true)
(let [{:keys [modal title]} (get dwta/token-properties :color) (let [{:keys [modal title]} (get dwta/token-properties :color)
window-size (dom/get-window-size) window-size (dom/get-window-size)
@ -202,7 +203,7 @@
:list-view (= list-style :list) :list-view (= list-style :list)
:grid-view (= list-style :grid))} :grid-view (= list-style :grid))}
(for [token (:tokens set)] (for [token (:tokens group-or-set)]
(let [selected? (if (= color-origin :fill) (let [selected? (if (= color-origin :fill)
(= has-color-tokens? (:name token)) (= has-color-tokens? (:name token))
(= has-stroke-tokens? (:name token)))] (= has-stroke-tokens? (:name token)))]
@ -218,8 +219,8 @@
(defn- label-group-or-set [{:keys [group sets]}] (defn- label-group-or-set [{:keys [group sets]}]
(if group (if group
(str group " (" (str/join ", " sets) ")") (str group " (" (str/join ", " (map :name sets)) ")")
(first sets))) (:name (first sets))))
(defn- filter-combined-tokens (defn- filter-combined-tokens
"Filters the combined-tokens structure by token name. "Filters the combined-tokens structure by token name.
@ -307,7 +308,7 @@
:color-origin color-origin :color-origin color-origin
:on-token-change on-token-change :on-token-change on-token-change
:name name :name name
:set combined-sets}]))] :group-or-set combined-sets}]))]
[:> token-empty-state*])] [:> token-empty-state*])]
[:> token-empty-state*]))) [:> token-empty-state*])))

View File

@ -23,10 +23,10 @@
grid-template-columns: auto 1fr auto; grid-template-columns: auto 1fr auto;
align-items: center; align-items: center;
gap: var(--sp-xs); gap: var(--sp-xs);
width: 100%; inline-size: 100%;
border-radius: $br-8; border-radius: $br-8;
padding: var(--sp-xs); padding: var(--sp-xs);
height: var(--sp-xxl); block-size: $sz-28;
border: none; border: none;
cursor: pointer; cursor: pointer;
&:hover { &:hover {
@ -48,7 +48,7 @@
.color-token-selected-grid { .color-token-selected-grid {
border: $b-1 solid var(--color-accent-primary); border: $b-1 solid var(--color-accent-primary);
border-radius: $br-4; border-radius: $br-4;
width: fit-content; inline-size: fit-content;
} }
.token-selected-icon { .token-selected-icon {
@ -63,7 +63,7 @@
} }
.color-tokens-section { .color-tokens-section {
max-height: $sz-430; max-block-size: $sz-430;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: var(--sp-s); gap: var(--sp-s);
@ -98,7 +98,7 @@
text-transform: none; text-transform: none;
display: flex; display: flex;
overflow: hidden; overflow: hidden;
min-height: var(--sp-xxxl); min-block-size: var(--sp-xxxl);
padding-block-start: var(--sp-xs); padding-block-start: var(--sp-xs);
} }
@ -120,7 +120,7 @@
.set-title-icon { .set-title-icon {
color: var(--arrow-color); color: var(--arrow-color);
height: $sz-28; block-size: $sz-28;
padding-block-start: var(--sp-xxs); padding-block-start: var(--sp-xxs);
} }

View File

@ -266,17 +266,17 @@
(mf/defc form* (mf/defc form*
"Form component to edit or create a token of any token type. "Form component to edit or create a token of any token type.
Callback props: Callback props:
validate-token: Function to validate and resolve an editing token, see `default-validate-token`. validate-token: Function to validate and resolve an editing token, see `default-validate-token`.
on-value-resolve: Will be called when a token value is resolved on-value-resolve: Will be called when a token value is resolved
Used to sync external state (like color picker) Used to sync external state (like color picker)
on-get-token-value: Custom function to get the input value from the dom on-get-token-value: Custom function to get the input value from the dom
(As there might be multiple inputs passed for `custom-input-token-value`) (As there might be multiple inputs passed for `custom-input-token-value`)
Can also be used to manipulate the value (E.g.: Auto-prepending # for hex colors) Can also be used to manipulate the value (E.g.: Auto-prepending # for hex colors)
Custom component props: Custom component props:
custom-input-token-value: Custom component for editing/displaying the token value custom-input-token-value: Custom component for editing/displaying the token value
custom-input-token-value-props: Custom props passed to the custom-input-token-value merged with the default props" custom-input-token-value-props: Custom props passed to the custom-input-token-value merged with the default props"
[{:keys [is-create [{:keys [is-create
token token
token-type token-type
@ -378,7 +378,7 @@ custom-input-token-value-props: Custom props passed to the custom-input-token-va
value-ref (mf/use-ref (:value token)) value-ref (mf/use-ref (:value token))
token-resolve-result* (mf/use-state (get resolved-tokens (cft/token-identifier token))) token-resolve-result* (mf/use-state (get resolved-tokens (cft/token-identifier token)))
token-resolve-result (deref token-resolve-result*) token-resolve-result (deref token-resolve-result*)
clear-resolve-value clear-resolve-value
(mf/use-fn (mf/use-fn
@ -1060,14 +1060,19 @@ custom-input-token-value-props: Custom props passed to the custom-input-token-va
typography-inputs (mf/use-memo typography-inputs) typography-inputs (mf/use-memo typography-inputs)
errors-by-key (sd/collect-typography-errors token-resolve-result)] errors-by-key (sd/collect-typography-errors token-resolve-result)]
[:div {:class (stl/css :nested-input-row)} [:div {:class (stl/css :nested-input-row)}
(for [[k {:keys [label placeholder icon]}] typography-inputs] (for [[token-type {:keys [label placeholder icon]}] typography-inputs]
(let [value (get default-value k) (let [value (get default-value token-type)
token-resolve-result resolved (get-in token-resolve-result [:resolved-value token-type])
(when composite-token? errors (get errors-by-key token-type)
(-> {:resolved-value (let [v (get-in token-resolve-result [:resolved-value k])]
(when-not (str/empty? v) v)) should-show? (or (and (some? resolved)
:errors (get errors-by-key k)} (not= value (str resolved)))
(d/without-nils))) (seq errors))
token-prop (when (and composite-token? should-show?)
(d/without-nils
{:resolved-value (when-not (str/empty? resolved) resolved)
:errors errors}))
input-ref (mf/use-ref) input-ref (mf/use-ref)
@ -1075,21 +1080,22 @@ custom-input-token-value-props: Custom props passed to the custom-input-token-va
(mf/use-fn (mf/use-fn
(mf/deps on-update-value) (mf/deps on-update-value)
(fn [next-value] (fn [next-value]
(let [el (mf/ref-val input-ref)] (let [element (mf/ref-val input-ref)]
(dom/set-value! el next-value) (dom/set-value! element next-value)
(on-update-value #js {:target el (on-update-value #js {:target element
:tokenType :font-family})))) :tokenType :font-family}))))
on-change on-change
(mf/use-fn (mf/use-fn
(mf/deps token-type)
;; Passing token-type via event to prevent deep function adapting & passing of type ;; Passing token-type via event to prevent deep function adapting & passing of type
(fn [e] (fn [event]
(-> (obj/set! e "tokenType" k) (-> (obj/set! event "tokenType" token-type)
(on-update-value))))] (on-update-value))))]
[:div {:key (str k) [:div {:key (str token-type)
:class (stl/css :input-row)} :class (stl/css :input-row)}
(case k (case token-type
:font-family :font-family
[:> font-picker-combobox* [:> font-picker-combobox*
{:aria-label label {:aria-label label
@ -1099,7 +1105,7 @@ custom-input-token-value-props: Custom props passed to the custom-input-token-va
:on-blur on-blur :on-blur on-blur
:on-update-value on-change :on-update-value on-change
:on-external-update-value on-external-update-value :on-external-update-value on-external-update-value
:token-resolve-result (when (seq token-resolve-result) token-resolve-result)}] :token-resolve-result token-prop}]
[:> input-token* [:> input-token*
{:aria-label label {:aria-label label
:placeholder placeholder :placeholder placeholder
@ -1107,7 +1113,7 @@ custom-input-token-value-props: Custom props passed to the custom-input-token-va
:on-blur on-blur :on-blur on-blur
:icon icon :icon icon
:on-change on-change :on-change on-change
:token-resolve-result (when (seq token-resolve-result) token-resolve-result)}])]))])) :token-resolve-result token-prop}])]))]))
(mf/defc typography-form* (mf/defc typography-form*
[{:keys [token] :rest props}] [{:keys [token] :rest props}]
@ -1145,8 +1151,10 @@ custom-input-token-value-props: Custom props passed to the custom-input-token-va
:update-composite-backup-value update-composite-backup-value})])) :update-composite-backup-value update-composite-backup-value})]))
(mf/defc form-wrapper* (mf/defc form-wrapper*
[{:keys [token token-type] :as props}] [{:keys [token token-type] :rest props}]
(let [token-type' (or (:type token) token-type)] (let [token-type' (or (:type token) token-type)
props (mf/spread-props props {:token-type token-type'
:token token})]
(case token-type' (case token-type'
:color [:> color-form* props] :color [:> color-form* props]
:typography [:> typography-form* props] :typography [:> typography-form* props]
@ -1154,4 +1162,4 @@ custom-input-token-value-props: Custom props passed to the custom-input-token-va
:text-case [:> text-case-form* props] :text-case [:> text-case-form* props]
:text-decoration [:> text-decoration-form* props] :text-decoration [:> text-decoration-form* props]
:font-weight [:> font-weight-form* props] :font-weight [:> font-weight-form* props]
[:> form* props]))) [:> form* props])))

View File

@ -55,7 +55,7 @@
.typography-inputs { .typography-inputs {
border-inline-start: $b-1 solid var(--color-accent-primary-muted); border-inline-start: $b-1 solid var(--color-accent-primary-muted);
padding-inline-start: var(--sp-l); padding-inline-start: var(--sp-m);
} }
.title-bar { .title-bar {

View File

@ -16,7 +16,7 @@
overflow-y: auto; overflow-y: auto;
overflow-x: hidden; overflow-x: hidden;
&.token-modal-large { &.token-modal-large {
min-block-size: 38rem; max-block-size: 95vh;
} }
} }

View File

@ -6395,10 +6395,6 @@ msgstr "Upravit motiv"
msgid "workspace.tokens.edit-themes" msgid "workspace.tokens.edit-themes"
msgstr "Upravit motivy" msgstr "Upravit motivy"
#: src/app/main/ui/workspace/tokens/management/create/form.cljs:533
msgid "workspace.tokens.edit-token"
msgstr "Upravit token"
#: src/app/main/ui/workspace/tokens/management/create/form.cljs:540 #: src/app/main/ui/workspace/tokens/management/create/form.cljs:540
msgid "workspace.tokens.enter-token-name" msgid "workspace.tokens.enter-token-name"
msgstr "Zadejte název tokenu %s" msgstr "Zadejte název tokenu %s"

View File

@ -6829,10 +6829,6 @@ msgstr "Theme bearbeiten"
msgid "workspace.tokens.edit-themes" msgid "workspace.tokens.edit-themes"
msgstr "Themes bearbeiten" msgstr "Themes bearbeiten"
#: src/app/main/ui/workspace/tokens/management/create/form.cljs:533
msgid "workspace.tokens.edit-token"
msgstr "Token bearbeiten"
#: src/app/main/ui/workspace/tokens/management/create/form.cljs:540 #: src/app/main/ui/workspace/tokens/management/create/form.cljs:540
msgid "workspace.tokens.enter-token-name" msgid "workspace.tokens.enter-token-name"
msgstr "%s Token-Name eingeben" msgstr "%s Token-Name eingeben"

View File

@ -7428,7 +7428,7 @@ msgstr "Edit themes"
#: src/app/main/ui/workspace/tokens/management/create/form.cljs:533 #: src/app/main/ui/workspace/tokens/management/create/form.cljs:533
msgid "workspace.tokens.edit-token" msgid "workspace.tokens.edit-token"
msgstr "Edit token" msgstr "Edit token %s"
#: src/app/main/data/workspace/tokens/errors.cljs:41 #: src/app/main/data/workspace/tokens/errors.cljs:41
msgid "workspace.tokens.empty-input" msgid "workspace.tokens.empty-input"

View File

@ -7411,7 +7411,7 @@ msgstr "Editar temas"
#: src/app/main/ui/workspace/tokens/management/create/form.cljs:533 #: src/app/main/ui/workspace/tokens/management/create/form.cljs:533
msgid "workspace.tokens.edit-token" msgid "workspace.tokens.edit-token"
msgstr "Editar token" msgstr "Editar token de %s"
#: src/app/main/data/workspace/tokens/errors.cljs:41 #: src/app/main/data/workspace/tokens/errors.cljs:41
msgid "workspace.tokens.empty-input" msgid "workspace.tokens.empty-input"

View File

@ -7176,10 +7176,6 @@ msgstr "Modifier le thème"
msgid "workspace.tokens.edit-themes" msgid "workspace.tokens.edit-themes"
msgstr "Modifier les thèmes" msgstr "Modifier les thèmes"
#: src/app/main/ui/workspace/tokens/management/create/form.cljs:533
msgid "workspace.tokens.edit-token"
msgstr "Modifier l'unité de style"
#: src/app/main/data/workspace/tokens/errors.cljs:41 #: src/app/main/data/workspace/tokens/errors.cljs:41
msgid "workspace.tokens.empty-input" msgid "workspace.tokens.empty-input"
msgstr "La valeur du token doit être renseignée" msgstr "La valeur du token doit être renseignée"

View File

@ -7136,10 +7136,6 @@ msgstr "עריכת ערכת עיצוב"
msgid "workspace.tokens.edit-themes" msgid "workspace.tokens.edit-themes"
msgstr "עריכת ערכות עיצוב" msgstr "עריכת ערכות עיצוב"
#: src/app/main/ui/workspace/tokens/management/create/form.cljs:533
msgid "workspace.tokens.edit-token"
msgstr "עריכת אסימון"
#: src/app/main/data/workspace/tokens/errors.cljs:41 #: src/app/main/data/workspace/tokens/errors.cljs:41
msgid "workspace.tokens.empty-input" msgid "workspace.tokens.empty-input"
msgstr "ערך האסימון לא יכול להישאר ריק" msgstr "ערך האסימון לא יכול להישאר ריק"

View File

@ -7029,10 +7029,6 @@ msgstr "थीम संपादित करें"
msgid "workspace.tokens.edit-themes" msgid "workspace.tokens.edit-themes"
msgstr "थीम्स संपादित करें" msgstr "थीम्स संपादित करें"
#: src/app/main/ui/workspace/tokens/management/create/form.cljs:533
msgid "workspace.tokens.edit-token"
msgstr "टोकन संपादित करें"
#: src/app/main/data/workspace/tokens/errors.cljs:41 #: src/app/main/data/workspace/tokens/errors.cljs:41
msgid "workspace.tokens.empty-input" msgid "workspace.tokens.empty-input"
msgstr "टोकन मान रिक्त नहीं हो सकता" msgstr "टोकन मान रिक्त नहीं हो सकता"

View File

@ -6416,10 +6416,6 @@ msgstr "Uredite temu"
msgid "workspace.tokens.edit-themes" msgid "workspace.tokens.edit-themes"
msgstr "Uredite teme" msgstr "Uredite teme"
#: src/app/main/ui/workspace/tokens/management/create/form.cljs:533
msgid "workspace.tokens.edit-token"
msgstr "Uredite token"
#: src/app/main/ui/workspace/tokens/management/create/form.cljs:540 #: src/app/main/ui/workspace/tokens/management/create/form.cljs:540
msgid "workspace.tokens.enter-token-name" msgid "workspace.tokens.enter-token-name"
msgstr "Unesite %s naziv tokena" msgstr "Unesite %s naziv tokena"

View File

@ -6670,10 +6670,6 @@ msgstr "Sunting tema"
msgid "workspace.tokens.edit-themes" msgid "workspace.tokens.edit-themes"
msgstr "Sunting tema" msgstr "Sunting tema"
#: src/app/main/ui/workspace/tokens/management/create/form.cljs:533
msgid "workspace.tokens.edit-token"
msgstr "Sunting token"
#: src/app/main/ui/workspace/tokens/management/create/form.cljs:540 #: src/app/main/ui/workspace/tokens/management/create/form.cljs:540
msgid "workspace.tokens.enter-token-name" msgid "workspace.tokens.enter-token-name"
msgstr "Masukkan nama token %s" msgstr "Masukkan nama token %s"

View File

@ -7079,10 +7079,6 @@ msgstr "Modifica tema"
msgid "workspace.tokens.edit-themes" msgid "workspace.tokens.edit-themes"
msgstr "Modifica temi" msgstr "Modifica temi"
#: src/app/main/ui/workspace/tokens/management/create/form.cljs:533
msgid "workspace.tokens.edit-token"
msgstr "Modifica token"
#: src/app/main/data/workspace/tokens/errors.cljs:41 #: src/app/main/data/workspace/tokens/errors.cljs:41
msgid "workspace.tokens.empty-input" msgid "workspace.tokens.empty-input"
msgstr "Il valore del token non può essere vuoto" msgstr "Il valore del token non può essere vuoto"

View File

@ -7167,10 +7167,6 @@ msgstr "Labot izskatu"
msgid "workspace.tokens.edit-themes" msgid "workspace.tokens.edit-themes"
msgstr "Labot izskatus" msgstr "Labot izskatus"
#: src/app/main/ui/workspace/tokens/management/create/form.cljs:533
msgid "workspace.tokens.edit-token"
msgstr "Labot tekstvienību"
#: src/app/main/data/workspace/tokens/errors.cljs:41 #: src/app/main/data/workspace/tokens/errors.cljs:41
msgid "workspace.tokens.empty-input" msgid "workspace.tokens.empty-input"
msgstr "Tekstvienības vērtība nevar būt tukša" msgstr "Tekstvienības vērtība nevar būt tukša"

View File

@ -7231,10 +7231,6 @@ msgstr "Thema bewerken"
msgid "workspace.tokens.edit-themes" msgid "workspace.tokens.edit-themes"
msgstr "Thema's bewerken" msgstr "Thema's bewerken"
#: src/app/main/ui/workspace/tokens/management/create/form.cljs:533
msgid "workspace.tokens.edit-token"
msgstr "Token bewerken"
#: src/app/main/data/workspace/tokens/errors.cljs:41 #: src/app/main/data/workspace/tokens/errors.cljs:41
msgid "workspace.tokens.empty-input" msgid "workspace.tokens.empty-input"
msgstr "De tokenwaarde mag niet leeg zijn" msgstr "De tokenwaarde mag niet leeg zijn"

View File

@ -6395,10 +6395,6 @@ msgstr "Redigera tema"
msgid "workspace.tokens.edit-themes" msgid "workspace.tokens.edit-themes"
msgstr "Redigera teman" msgstr "Redigera teman"
#: src/app/main/ui/workspace/tokens/management/create/form.cljs:533
msgid "workspace.tokens.edit-token"
msgstr "Redigera token"
#: src/app/main/ui/workspace/tokens/management/create/form.cljs:540 #: src/app/main/ui/workspace/tokens/management/create/form.cljs:540
msgid "workspace.tokens.enter-token-name" msgid "workspace.tokens.enter-token-name"
msgstr "Ange %s tokennamn" msgstr "Ange %s tokennamn"

View File

@ -7163,10 +7163,6 @@ msgstr "Редагувати тему"
msgid "workspace.tokens.edit-themes" msgid "workspace.tokens.edit-themes"
msgstr "Редагувати теми" msgstr "Редагувати теми"
#: src/app/main/ui/workspace/tokens/management/create/form.cljs:533
msgid "workspace.tokens.edit-token"
msgstr "Редагувати токен"
#: src/app/main/data/workspace/tokens/errors.cljs:41 #: src/app/main/data/workspace/tokens/errors.cljs:41
msgid "workspace.tokens.empty-input" msgid "workspace.tokens.empty-input"
msgstr "Значення токену не може бути порожнім" msgstr "Значення токену не може бути порожнім"

View File

@ -6783,10 +6783,6 @@ msgstr "编辑主题"
msgid "workspace.tokens.edit-themes" msgid "workspace.tokens.edit-themes"
msgstr "编辑主题" msgstr "编辑主题"
#: src/app/main/ui/workspace/tokens/management/create/form.cljs:533
msgid "workspace.tokens.edit-token"
msgstr "编辑 token"
#: src/app/main/data/workspace/tokens/errors.cljs:15 #: src/app/main/data/workspace/tokens/errors.cljs:15
msgid "workspace.tokens.error-parse" msgid "workspace.tokens.error-parse"
msgstr "导入错误:不能解析 JSON。" msgstr "导入错误:不能解析 JSON。"

View File

@ -6234,10 +6234,6 @@ msgstr "編輯主題"
msgid "workspace.tokens.edit-themes" msgid "workspace.tokens.edit-themes"
msgstr "編輯主題" msgstr "編輯主題"
#: src/app/main/ui/workspace/tokens/management/create/form.cljs:533
msgid "workspace.tokens.edit-token"
msgstr "編輯權杖(token)"
#: src/app/main/ui/workspace/tokens/management/create/form.cljs:540 #: src/app/main/ui/workspace/tokens/management/create/form.cljs:540
msgid "workspace.tokens.enter-token-name" msgid "workspace.tokens.enter-token-name"
msgstr "輸入 %s 權杖(token)名稱" msgstr "輸入 %s 權杖(token)名稱"