@@ -181,24 +208,27 @@ export function BumperLinesEditor({
})}
-
{/* Палитра: клик вставляет плейсхолдер в фокусированное поле, подсказка показывает образец. */}
- {PLACEHOLDERS.map((placeholder) => (
- insert(placeholder.token)}
- className="rounded border border-border px-1.5 py-0.5 font-mono text-[11px] text-muted-foreground hover:border-primary hover:text-foreground"
- >
- {`{${placeholder.token}}`}
-
- ))}
+ {PLACEHOLDERS.map((placeholder) => {
+ const description = t(`admin.bumpers.tokens.${placeholder.token}`)
+ return (
+ insert(placeholder.token)}
+ className="rounded border border-border px-1.5 py-0.5 font-mono text-[11px] text-muted-foreground hover:border-primary hover:text-foreground"
+ >
+ {`{${placeholder.token}}`}
+
+ )
+ })}
)
diff --git a/frontend/src/features/admin/junctions/components/JunctionChain.tsx b/frontend/src/features/admin/junctions/components/JunctionChain.tsx
index 0341b89..1a73f8c 100644
--- a/frontend/src/features/admin/junctions/components/JunctionChain.tsx
+++ b/frontend/src/features/admin/junctions/components/JunctionChain.tsx
@@ -300,14 +300,17 @@ export function JunctionChain({
{/* Линейка: доля каждого звена в стыке. Пустые (без источника) в неё не попадают. */}
{total > 0 && (
- {steps.map((step, index) => (
-
- ))}
+ {steps.map((step, index) => {
+ const kind = t(`admin.junctions.kinds.${step.elements[0].kind}`)
+ return (
+
+ )
+ })}
)}
diff --git a/frontend/src/features/admin/storage/StoragePanel.tsx b/frontend/src/features/admin/storage/StoragePanel.tsx
index f115d26..6ca1dfb 100644
--- a/frontend/src/features/admin/storage/StoragePanel.tsx
+++ b/frontend/src/features/admin/storage/StoragePanel.tsx
@@ -163,14 +163,17 @@ export function StoragePanel() {
{/* Полоса состава хранилища — доли областей друг относительно друга. */}
{storage > 0 && (
- {areas.map((area) => (
-
- ))}
+ {areas.map((area) => {
+ const name = t(`admin.storage.areas.${area.area}`)
+ return (
+
+ )
+ })}
)}