feat(desktop): improve file comments in session timeline (#36845)
Co-authored-by: LukeParkerDev <10430890+Hona@users.noreply.github.com>
This commit is contained in:
@@ -133,10 +133,6 @@
|
|||||||
align-items: flex-end;
|
align-items: flex-end;
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-slot="user-message-attachments"] + [data-slot="user-message-body"] {
|
|
||||||
margin-top: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
[data-slot="user-message-text"] {
|
[data-slot="user-message-text"] {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
white-space: pre-wrap;
|
white-space: pre-wrap;
|
||||||
@@ -1324,10 +1320,61 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body[data-new-layout] [data-component="user-message"] {
|
||||||
|
font-weight: 440;
|
||||||
|
|
||||||
|
[data-slot="user-message-text"] {
|
||||||
|
background: var(--v2-background-bg-layer-01);
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-slot="user-message-comments"] {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: flex-start;
|
||||||
|
gap: 8px;
|
||||||
|
width: min(320px, 82%);
|
||||||
|
margin-left: auto;
|
||||||
|
|
||||||
|
&[data-bounded] {
|
||||||
|
width: 318px;
|
||||||
|
max-width: 100%;
|
||||||
|
margin-top: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-component="tooltip-v2-trigger"] {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-component="button-v2"] {
|
||||||
|
font-family: var(--v2-font-family-sans, "Inter", sans-serif);
|
||||||
|
font-weight: 530;
|
||||||
|
font-variation-settings: "wght" 530, "slnt" 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-slot="user-message-body"] + [data-slot="user-message-attachments"],
|
||||||
|
[data-slot="user-message-comments"] + [data-slot="user-message-attachments"] {
|
||||||
|
margin-top: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-slot="user-message-text"][data-comments] {
|
||||||
|
width: 342px;
|
||||||
|
padding-bottom: 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-color-scheme="light"] body[data-new-layout] [data-component="user-message"] [data-slot="user-message-text"] {
|
||||||
|
background: var(--v2-background-bg-layer-02);
|
||||||
|
}
|
||||||
|
|
||||||
body:not([data-new-layout]) {
|
body:not([data-new-layout]) {
|
||||||
[data-component="user-message"] {
|
[data-component="user-message"] {
|
||||||
color: var(--text-strong);
|
color: var(--text-strong);
|
||||||
|
|
||||||
|
[data-slot="user-message-attachments"] + [data-slot="user-message-body"] {
|
||||||
|
margin-top: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
[data-slot="user-message-attachment"] {
|
[data-slot="user-message-attachment"] {
|
||||||
background: var(--surface-weak);
|
background: var(--surface-weak);
|
||||||
border: 1px solid var(--border-weak-base);
|
border: 1px solid var(--border-weak-base);
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ import { Tooltip } from "@opencode-ai/ui/tooltip"
|
|||||||
import { IconButton } from "@opencode-ai/ui/icon-button"
|
import { IconButton } from "@opencode-ai/ui/icon-button"
|
||||||
import { Icon as IconV2 } from "@opencode-ai/ui/v2/icon"
|
import { Icon as IconV2 } from "@opencode-ai/ui/v2/icon"
|
||||||
import { IconButtonV2 } from "@opencode-ai/ui/v2/icon-button-v2"
|
import { IconButtonV2 } from "@opencode-ai/ui/v2/icon-button-v2"
|
||||||
|
import { ButtonV2 } from "@opencode-ai/ui/v2/button-v2"
|
||||||
import { TooltipV2 } from "@opencode-ai/ui/v2/tooltip-v2"
|
import { TooltipV2 } from "@opencode-ai/ui/v2/tooltip-v2"
|
||||||
import { Spinner } from "@opencode-ai/ui/spinner"
|
import { Spinner } from "@opencode-ai/ui/spinner"
|
||||||
import { TextShimmer } from "@opencode-ai/ui/text-shimmer"
|
import { TextShimmer } from "@opencode-ai/ui/text-shimmer"
|
||||||
@@ -1172,6 +1173,36 @@ export function ContextToolGroup(props: {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function UserMessageComments(props: { comments: UserMessageComment[]; bounded: boolean }) {
|
||||||
|
const i18n = useI18n()
|
||||||
|
const [state, setState] = createStore({ expanded: false })
|
||||||
|
const comments = createMemo(() =>
|
||||||
|
props.bounded && !state.expanded ? props.comments.slice(0, 5) : props.comments,
|
||||||
|
)
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div data-slot="user-message-comments" data-bounded={props.bounded ? "true" : undefined}>
|
||||||
|
<For each={comments()}>
|
||||||
|
{(comment) => (
|
||||||
|
<CommentCardV2
|
||||||
|
comment={comment.comment}
|
||||||
|
path={comment.path}
|
||||||
|
selection={comment.selection}
|
||||||
|
title={comment.comment}
|
||||||
|
tooltip
|
||||||
|
wide
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
</For>
|
||||||
|
<Show when={props.bounded && props.comments.length > 5 && !state.expanded}>
|
||||||
|
<ButtonV2 size="small" variant="ghost-muted" onClick={() => setState("expanded", true)}>
|
||||||
|
{i18n.t("ui.common.showMore")}
|
||||||
|
</ButtonV2>
|
||||||
|
</Show>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
export function UserMessageDisplay(props: {
|
export function UserMessageDisplay(props: {
|
||||||
message: UserMessage
|
message: UserMessage
|
||||||
parts: PartType[]
|
parts: PartType[]
|
||||||
@@ -1255,107 +1286,114 @@ export function UserMessageDisplay(props: {
|
|||||||
.finally(() => setState("busy", false))
|
.finally(() => setState("busy", false))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const renderAttachments = () => (
|
||||||
|
<Show when={attachments().length > 0}>
|
||||||
|
<div data-slot="user-message-attachments">
|
||||||
|
<For each={attachments()}>
|
||||||
|
{(file) => {
|
||||||
|
const type = kind(file)
|
||||||
|
const name = file.filename ?? i18n.t("ui.message.attachment.alt")
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Show
|
||||||
|
when={newLayout() && type === "file"}
|
||||||
|
fallback={
|
||||||
|
<div
|
||||||
|
data-slot="user-message-attachment"
|
||||||
|
data-type={type}
|
||||||
|
data-clickable={type === "image" ? "true" : undefined}
|
||||||
|
title={type === "file" ? name : undefined}
|
||||||
|
onClick={() => {
|
||||||
|
if (type === "image") openImagePreview(file.url, name)
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Show
|
||||||
|
when={type === "image"}
|
||||||
|
fallback={
|
||||||
|
<div data-slot="user-message-attachment-file">
|
||||||
|
<FileIcon node={{ path: name, type: "file" }} />
|
||||||
|
<span data-slot="user-message-attachment-name">{name}</span>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
>
|
||||||
|
<img data-slot="user-message-attachment-image" src={file.url} alt={name} />
|
||||||
|
</Show>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
>
|
||||||
|
<AttachmentCardV2
|
||||||
|
title={getFilename(name)}
|
||||||
|
hover={name}
|
||||||
|
clickable={!!props.actions?.openAttachment}
|
||||||
|
onClick={() => props.actions?.openAttachment?.(file)}
|
||||||
|
>
|
||||||
|
{typeLabel(name, file.mime)}
|
||||||
|
</AttachmentCardV2>
|
||||||
|
</Show>
|
||||||
|
)
|
||||||
|
}}
|
||||||
|
</For>
|
||||||
|
</div>
|
||||||
|
</Show>
|
||||||
|
)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div data-component="user-message" data-timeline-part-id={textPart()?.id}>
|
<div data-component="user-message" data-timeline-part-id={textPart()?.id}>
|
||||||
<Show when={attachments().length > 0 || messageComments().length > 0}>
|
<Show when={!props.useV2Actions}>{renderAttachments()}</Show>
|
||||||
<div data-slot="user-message-attachments">
|
<Show
|
||||||
<For each={messageComments()}>
|
when={text()}
|
||||||
{(comment) => (
|
fallback={
|
||||||
<CommentCardV2
|
<Show when={messageComments().length > 0}>
|
||||||
comment={comment.comment}
|
<UserMessageComments comments={messageComments()} bounded={false} />
|
||||||
path={comment.path}
|
</Show>
|
||||||
selection={comment.selection}
|
}
|
||||||
title={comment.comment}
|
>
|
||||||
/>
|
<div data-slot="user-message-body">
|
||||||
)}
|
<div data-slot="user-message-text" data-comments={messageComments().length > 0 ? "true" : undefined}>
|
||||||
</For>
|
<HighlightedText text={text()} references={inlineFiles()} agents={agents()} />
|
||||||
<For each={attachments()}>
|
<Show when={messageComments().length > 0}>
|
||||||
{(file) => {
|
<UserMessageComments comments={messageComments()} bounded />
|
||||||
const type = kind(file)
|
</Show>
|
||||||
const name = file.filename ?? i18n.t("ui.message.attachment.alt")
|
</div>
|
||||||
|
|
||||||
return (
|
|
||||||
<Show
|
|
||||||
when={newLayout() && type === "file"}
|
|
||||||
fallback={
|
|
||||||
<div
|
|
||||||
data-slot="user-message-attachment"
|
|
||||||
data-type={type}
|
|
||||||
data-clickable={type === "image" ? "true" : undefined}
|
|
||||||
title={type === "file" ? name : undefined}
|
|
||||||
onClick={() => {
|
|
||||||
if (type === "image") openImagePreview(file.url, name)
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Show
|
|
||||||
when={type === "image"}
|
|
||||||
fallback={
|
|
||||||
<div data-slot="user-message-attachment-file">
|
|
||||||
<FileIcon node={{ path: name, type: "file" }} />
|
|
||||||
<span data-slot="user-message-attachment-name">{name}</span>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
>
|
|
||||||
<img data-slot="user-message-attachment-image" src={file.url} alt={name} />
|
|
||||||
</Show>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
>
|
|
||||||
<AttachmentCardV2
|
|
||||||
title={getFilename(name)}
|
|
||||||
hover={name}
|
|
||||||
clickable={!!props.actions?.openAttachment}
|
|
||||||
onClick={() => props.actions?.openAttachment?.(file)}
|
|
||||||
>
|
|
||||||
{typeLabel(name, file.mime)}
|
|
||||||
</AttachmentCardV2>
|
|
||||||
</Show>
|
|
||||||
)
|
|
||||||
}}
|
|
||||||
</For>
|
|
||||||
</div>
|
</div>
|
||||||
</Show>
|
</Show>
|
||||||
<Show when={text()}>
|
<Show when={props.useV2Actions}>{renderAttachments()}</Show>
|
||||||
<>
|
<Show when={text() || (props.useV2Actions && messageComments().length > 0)}>
|
||||||
<div data-slot="user-message-body">
|
<div data-slot="user-message-copy-wrapper">
|
||||||
<div data-slot="user-message-text">
|
<Show when={metaHead() || metaTail()}>
|
||||||
<HighlightedText text={text()} references={inlineFiles()} agents={agents()} />
|
<span data-slot="user-message-meta-wrap">
|
||||||
</div>
|
<Show when={metaHead()}>
|
||||||
</div>
|
<span data-slot="user-message-meta" class="text-12-regular text-text-weak cursor-default">
|
||||||
<div data-slot="user-message-copy-wrapper">
|
{metaHead()}
|
||||||
<Show when={metaHead() || metaTail()}>
|
</span>
|
||||||
<span data-slot="user-message-meta-wrap">
|
</Show>
|
||||||
<Show when={metaHead()}>
|
<Show when={metaHead() && metaTail()}>
|
||||||
<span data-slot="user-message-meta" class="text-12-regular text-text-weak cursor-default">
|
<span data-slot="user-message-meta-sep" class="text-12-regular text-text-weak cursor-default">
|
||||||
{metaHead()}
|
{"\u00A0\u00B7\u00A0"}
|
||||||
</span>
|
</span>
|
||||||
</Show>
|
</Show>
|
||||||
<Show when={metaHead() && metaTail()}>
|
<Show when={metaTail()}>
|
||||||
<span data-slot="user-message-meta-sep" class="text-12-regular text-text-weak cursor-default">
|
<span data-slot="user-message-meta-tail" class="text-12-regular text-text-weak cursor-default">
|
||||||
{"\u00A0\u00B7\u00A0"}
|
{metaTail()}
|
||||||
</span>
|
</span>
|
||||||
</Show>
|
</Show>
|
||||||
<Show when={metaTail()}>
|
</span>
|
||||||
<span data-slot="user-message-meta-tail" class="text-12-regular text-text-weak cursor-default">
|
</Show>
|
||||||
{metaTail()}
|
<Show when={props.actions?.revert}>
|
||||||
</span>
|
<MessageActionButton
|
||||||
</Show>
|
icon="reset"
|
||||||
</span>
|
label={i18n.t("ui.message.revertMessage")}
|
||||||
</Show>
|
useV2={props.useV2Actions}
|
||||||
<Show when={props.actions?.revert}>
|
disabled={!!busy()}
|
||||||
<MessageActionButton
|
onMouseDown={(event) => event.preventDefault()}
|
||||||
icon="reset"
|
onClick={(event) => {
|
||||||
label={i18n.t("ui.message.revertMessage")}
|
event.stopPropagation()
|
||||||
useV2={props.useV2Actions}
|
revert()
|
||||||
disabled={!!busy()}
|
}}
|
||||||
onMouseDown={(event) => event.preventDefault()}
|
aria-label={i18n.t("ui.message.revertMessage")}
|
||||||
onClick={(event) => {
|
/>
|
||||||
event.stopPropagation()
|
</Show>
|
||||||
revert()
|
<Show when={text()}>
|
||||||
}}
|
|
||||||
aria-label={i18n.t("ui.message.revertMessage")}
|
|
||||||
/>
|
|
||||||
</Show>
|
|
||||||
<MessageActionButton
|
<MessageActionButton
|
||||||
icon={copied() ? "check" : "copy"}
|
icon={copied() ? "check" : "copy"}
|
||||||
label={copied() ? i18n.t("ui.message.copied") : i18n.t("ui.message.copyMessage")}
|
label={copied() ? i18n.t("ui.message.copied") : i18n.t("ui.message.copyMessage")}
|
||||||
@@ -1367,8 +1405,8 @@ export function UserMessageDisplay(props: {
|
|||||||
}}
|
}}
|
||||||
aria-label={copied() ? i18n.t("ui.message.copied") : i18n.t("ui.message.copyMessage")}
|
aria-label={copied() ? i18n.t("ui.message.copied") : i18n.t("ui.message.copyMessage")}
|
||||||
/>
|
/>
|
||||||
</div>
|
</Show>
|
||||||
</>
|
</div>
|
||||||
</Show>
|
</Show>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -12,6 +12,16 @@
|
|||||||
box-shadow: inset 0 0 0 0.5px var(--v2-border-border-base);
|
box-shadow: inset 0 0 0 0.5px var(--v2-border-border-base);
|
||||||
cursor: default;
|
cursor: default;
|
||||||
|
|
||||||
|
&[data-wide] {
|
||||||
|
width: 100%;
|
||||||
|
min-width: 0;
|
||||||
|
max-width: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&[data-surface="base"] {
|
||||||
|
background: var(--v2-background-bg-base);
|
||||||
|
}
|
||||||
|
|
||||||
&[data-active] {
|
&[data-active] {
|
||||||
box-shadow: inset 0 0 0 0.5px var(--v2-border-border-strong);
|
box-shadow: inset 0 0 0 0.5px var(--v2-border-border-strong);
|
||||||
}
|
}
|
||||||
@@ -32,6 +42,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
[data-slot="attachment-card-v2-title"] {
|
[data-slot="attachment-card-v2-title"] {
|
||||||
|
width: 100%;
|
||||||
|
min-width: 0;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
|||||||
@@ -6,8 +6,11 @@ export function AttachmentCardV2(props: {
|
|||||||
title: string
|
title: string
|
||||||
active?: boolean
|
active?: boolean
|
||||||
clickable?: boolean
|
clickable?: boolean
|
||||||
|
wide?: boolean
|
||||||
|
surface?: "base"
|
||||||
/** native title attribute */
|
/** native title attribute */
|
||||||
hover?: string
|
hover?: string
|
||||||
|
titleRef?: (element: HTMLSpanElement) => void
|
||||||
onClick?: () => void
|
onClick?: () => void
|
||||||
children: JSX.Element
|
children: JSX.Element
|
||||||
}) {
|
}) {
|
||||||
@@ -16,10 +19,14 @@ export function AttachmentCardV2(props: {
|
|||||||
data-component="attachment-card-v2"
|
data-component="attachment-card-v2"
|
||||||
data-active={props.active ? "true" : undefined}
|
data-active={props.active ? "true" : undefined}
|
||||||
data-clickable={props.clickable ? "true" : undefined}
|
data-clickable={props.clickable ? "true" : undefined}
|
||||||
|
data-wide={props.wide ? "true" : undefined}
|
||||||
|
data-surface={props.surface}
|
||||||
title={props.hover}
|
title={props.hover}
|
||||||
onClick={() => props.onClick?.()}
|
onClick={() => props.onClick?.()}
|
||||||
>
|
>
|
||||||
<span data-slot="attachment-card-v2-title">{props.title}</span>
|
<span ref={(element) => props.titleRef?.(element)} data-slot="attachment-card-v2-title">
|
||||||
|
{props.title}
|
||||||
|
</span>
|
||||||
<span data-slot="attachment-card-v2-subtitle">{props.children}</span>
|
<span data-slot="attachment-card-v2-subtitle">{props.children}</span>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { Show } from "solid-js"
|
import { createSignal, onCleanup, onMount, Show } from "solid-js"
|
||||||
import { FileIcon } from "@opencode-ai/ui/file-icon"
|
import { FileIcon } from "@opencode-ai/ui/file-icon"
|
||||||
import { getFilenameTruncated } from "@opencode-ai/core/util/path"
|
import { getFilenameTruncated } from "@opencode-ai/core/util/path"
|
||||||
|
import { TooltipV2 } from "@opencode-ai/ui/v2/tooltip-v2"
|
||||||
import { AttachmentCardV2 } from "./attachment-card-v2"
|
import { AttachmentCardV2 } from "./attachment-card-v2"
|
||||||
|
|
||||||
export function CommentCardV2(props: {
|
export function CommentCardV2(props: {
|
||||||
@@ -9,19 +10,55 @@ export function CommentCardV2(props: {
|
|||||||
selection?: { startLine: number; endLine: number }
|
selection?: { startLine: number; endLine: number }
|
||||||
active?: boolean
|
active?: boolean
|
||||||
title?: string
|
title?: string
|
||||||
|
tooltip?: boolean
|
||||||
|
wide?: boolean
|
||||||
onClick?: () => void
|
onClick?: () => void
|
||||||
}) {
|
}) {
|
||||||
|
let title: HTMLSpanElement | undefined
|
||||||
|
const [truncated, setTruncated] = createSignal(false)
|
||||||
|
|
||||||
|
onMount(() => {
|
||||||
|
const element = title
|
||||||
|
if (!element) return
|
||||||
|
const sync = () => setTruncated(element.scrollWidth > element.clientWidth)
|
||||||
|
const measure = () => requestAnimationFrame(sync)
|
||||||
|
const observer = new ResizeObserver(sync)
|
||||||
|
observer.observe(element)
|
||||||
|
measure()
|
||||||
|
void document.fonts?.ready.then(measure)
|
||||||
|
onCleanup(() => observer.disconnect())
|
||||||
|
})
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<AttachmentCardV2 title={props.comment} active={props.active} hover={props.title} onClick={props.onClick}>
|
<TooltipV2
|
||||||
<FileIcon node={{ path: props.path, type: "file" }} />
|
placement="top"
|
||||||
<span>
|
openDelay={1000}
|
||||||
{getFilenameTruncated(props.path, 14)}
|
value={props.title ?? props.comment}
|
||||||
<Show when={props.selection}>
|
disabled={!props.tooltip || !truncated()}
|
||||||
{(sel) =>
|
class={props.wide ? "w-full" : undefined}
|
||||||
sel().startLine === sel().endLine ? `:${sel().startLine}` : `:${sel().startLine}-${sel().endLine}`
|
contentStyle={{ "max-width": "320px", "white-space": "pre-wrap" }}
|
||||||
}
|
>
|
||||||
</Show>
|
<AttachmentCardV2
|
||||||
</span>
|
title={props.comment}
|
||||||
</AttachmentCardV2>
|
active={props.active}
|
||||||
|
clickable={!!props.onClick}
|
||||||
|
wide={props.wide}
|
||||||
|
surface="base"
|
||||||
|
titleRef={(element) => {
|
||||||
|
title = element
|
||||||
|
}}
|
||||||
|
onClick={props.onClick}
|
||||||
|
>
|
||||||
|
<FileIcon node={{ path: props.path, type: "file" }} />
|
||||||
|
<span>
|
||||||
|
{getFilenameTruncated(props.path, 14)}
|
||||||
|
<Show when={props.selection}>
|
||||||
|
{(sel) =>
|
||||||
|
sel().startLine === sel().endLine ? `:${sel().startLine}` : `:${sel().startLine}-${sel().endLine}`
|
||||||
|
}
|
||||||
|
</Show>
|
||||||
|
</span>
|
||||||
|
</AttachmentCardV2>
|
||||||
|
</TooltipV2>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -149,6 +149,7 @@ export const dict = {
|
|||||||
"ui.common.close": "إغلاق",
|
"ui.common.close": "إغلاق",
|
||||||
"ui.common.next": "التالي",
|
"ui.common.next": "التالي",
|
||||||
"ui.common.submit": "إرسال",
|
"ui.common.submit": "إرسال",
|
||||||
|
"ui.common.showMore": "عرض المزيد",
|
||||||
|
|
||||||
"ui.permission.deny": "رفض",
|
"ui.permission.deny": "رفض",
|
||||||
"ui.permission.allowAlways": "السماح دائمًا",
|
"ui.permission.allowAlways": "السماح دائمًا",
|
||||||
|
|||||||
@@ -149,6 +149,7 @@ export const dict = {
|
|||||||
"ui.common.close": "Fechar",
|
"ui.common.close": "Fechar",
|
||||||
"ui.common.next": "Próximo",
|
"ui.common.next": "Próximo",
|
||||||
"ui.common.submit": "Enviar",
|
"ui.common.submit": "Enviar",
|
||||||
|
"ui.common.showMore": "Mostrar mais",
|
||||||
|
|
||||||
"ui.permission.deny": "Negar",
|
"ui.permission.deny": "Negar",
|
||||||
"ui.permission.allowAlways": "Permitir sempre",
|
"ui.permission.allowAlways": "Permitir sempre",
|
||||||
|
|||||||
@@ -153,6 +153,7 @@ export const dict = {
|
|||||||
"ui.common.close": "Zatvori",
|
"ui.common.close": "Zatvori",
|
||||||
"ui.common.next": "Dalje",
|
"ui.common.next": "Dalje",
|
||||||
"ui.common.submit": "Pošalji",
|
"ui.common.submit": "Pošalji",
|
||||||
|
"ui.common.showMore": "Prikaži više",
|
||||||
|
|
||||||
"ui.permission.deny": "Zabrani",
|
"ui.permission.deny": "Zabrani",
|
||||||
"ui.permission.allowAlways": "Uvijek dozvoli",
|
"ui.permission.allowAlways": "Uvijek dozvoli",
|
||||||
|
|||||||
@@ -148,6 +148,7 @@ export const dict = {
|
|||||||
"ui.common.close": "Luk",
|
"ui.common.close": "Luk",
|
||||||
"ui.common.next": "Næste",
|
"ui.common.next": "Næste",
|
||||||
"ui.common.submit": "Indsend",
|
"ui.common.submit": "Indsend",
|
||||||
|
"ui.common.showMore": "Vis mere",
|
||||||
|
|
||||||
"ui.permission.deny": "Afvis",
|
"ui.permission.deny": "Afvis",
|
||||||
"ui.permission.allowAlways": "Tillad altid",
|
"ui.permission.allowAlways": "Tillad altid",
|
||||||
|
|||||||
@@ -155,6 +155,7 @@ export const dict = {
|
|||||||
"ui.common.close": "Schließen",
|
"ui.common.close": "Schließen",
|
||||||
"ui.common.next": "Weiter",
|
"ui.common.next": "Weiter",
|
||||||
"ui.common.submit": "Absenden",
|
"ui.common.submit": "Absenden",
|
||||||
|
"ui.common.showMore": "Mehr anzeigen",
|
||||||
|
|
||||||
"ui.permission.deny": "Verweigern",
|
"ui.permission.deny": "Verweigern",
|
||||||
"ui.permission.allowAlways": "Immer erlauben",
|
"ui.permission.allowAlways": "Immer erlauben",
|
||||||
|
|||||||
@@ -162,6 +162,7 @@ export const dict: Record<string, string> = {
|
|||||||
"ui.common.close": "Close",
|
"ui.common.close": "Close",
|
||||||
"ui.common.next": "Next",
|
"ui.common.next": "Next",
|
||||||
"ui.common.submit": "Submit",
|
"ui.common.submit": "Submit",
|
||||||
|
"ui.common.showMore": "Show more",
|
||||||
|
|
||||||
"ui.permission.deny": "Deny",
|
"ui.permission.deny": "Deny",
|
||||||
"ui.permission.allowAlways": "Allow always",
|
"ui.permission.allowAlways": "Allow always",
|
||||||
|
|||||||
@@ -149,6 +149,7 @@ export const dict = {
|
|||||||
"ui.common.close": "Cerrar",
|
"ui.common.close": "Cerrar",
|
||||||
"ui.common.next": "Siguiente",
|
"ui.common.next": "Siguiente",
|
||||||
"ui.common.submit": "Enviar",
|
"ui.common.submit": "Enviar",
|
||||||
|
"ui.common.showMore": "Mostrar más",
|
||||||
|
|
||||||
"ui.permission.deny": "Denegar",
|
"ui.permission.deny": "Denegar",
|
||||||
"ui.permission.allowAlways": "Permitir siempre",
|
"ui.permission.allowAlways": "Permitir siempre",
|
||||||
|
|||||||
@@ -149,6 +149,7 @@ export const dict = {
|
|||||||
"ui.common.close": "Fermer",
|
"ui.common.close": "Fermer",
|
||||||
"ui.common.next": "Suivant",
|
"ui.common.next": "Suivant",
|
||||||
"ui.common.submit": "Soumettre",
|
"ui.common.submit": "Soumettre",
|
||||||
|
"ui.common.showMore": "Afficher plus",
|
||||||
|
|
||||||
"ui.permission.deny": "Refuser",
|
"ui.permission.deny": "Refuser",
|
||||||
"ui.permission.allowAlways": "Toujours autoriser",
|
"ui.permission.allowAlways": "Toujours autoriser",
|
||||||
|
|||||||
@@ -148,6 +148,7 @@ export const dict = {
|
|||||||
"ui.common.close": "閉じる",
|
"ui.common.close": "閉じる",
|
||||||
"ui.common.next": "次へ",
|
"ui.common.next": "次へ",
|
||||||
"ui.common.submit": "送信",
|
"ui.common.submit": "送信",
|
||||||
|
"ui.common.showMore": "さらに表示",
|
||||||
|
|
||||||
"ui.permission.deny": "拒否",
|
"ui.permission.deny": "拒否",
|
||||||
"ui.permission.allowAlways": "常に許可",
|
"ui.permission.allowAlways": "常に許可",
|
||||||
|
|||||||
@@ -125,6 +125,7 @@ export const dict = {
|
|||||||
"ui.common.close": "닫기",
|
"ui.common.close": "닫기",
|
||||||
"ui.common.next": "다음",
|
"ui.common.next": "다음",
|
||||||
"ui.common.submit": "제출",
|
"ui.common.submit": "제출",
|
||||||
|
"ui.common.showMore": "더 보기",
|
||||||
|
|
||||||
"ui.permission.deny": "거부",
|
"ui.permission.deny": "거부",
|
||||||
"ui.permission.allowAlways": "항상 허용",
|
"ui.permission.allowAlways": "항상 허용",
|
||||||
|
|||||||
@@ -128,6 +128,7 @@ export const dict: Record<Keys, string> = {
|
|||||||
"ui.common.close": "Lukk",
|
"ui.common.close": "Lukk",
|
||||||
"ui.common.next": "Neste",
|
"ui.common.next": "Neste",
|
||||||
"ui.common.submit": "Send inn",
|
"ui.common.submit": "Send inn",
|
||||||
|
"ui.common.showMore": "Vis mer",
|
||||||
|
|
||||||
"ui.permission.deny": "Avslå",
|
"ui.permission.deny": "Avslå",
|
||||||
"ui.permission.allowAlways": "Tillat alltid",
|
"ui.permission.allowAlways": "Tillat alltid",
|
||||||
|
|||||||
@@ -148,6 +148,7 @@ export const dict = {
|
|||||||
"ui.common.close": "Zamknij",
|
"ui.common.close": "Zamknij",
|
||||||
"ui.common.next": "Dalej",
|
"ui.common.next": "Dalej",
|
||||||
"ui.common.submit": "Prześlij",
|
"ui.common.submit": "Prześlij",
|
||||||
|
"ui.common.showMore": "Pokaż więcej",
|
||||||
|
|
||||||
"ui.permission.deny": "Odmów",
|
"ui.permission.deny": "Odmów",
|
||||||
"ui.permission.allowAlways": "Zezwalaj zawsze",
|
"ui.permission.allowAlways": "Zezwalaj zawsze",
|
||||||
|
|||||||
@@ -148,6 +148,7 @@ export const dict = {
|
|||||||
"ui.common.close": "Закрыть",
|
"ui.common.close": "Закрыть",
|
||||||
"ui.common.next": "Далее",
|
"ui.common.next": "Далее",
|
||||||
"ui.common.submit": "Отправить",
|
"ui.common.submit": "Отправить",
|
||||||
|
"ui.common.showMore": "Показать ещё",
|
||||||
|
|
||||||
"ui.permission.deny": "Запретить",
|
"ui.permission.deny": "Запретить",
|
||||||
"ui.permission.allowAlways": "Разрешить всегда",
|
"ui.permission.allowAlways": "Разрешить всегда",
|
||||||
|
|||||||
@@ -150,6 +150,7 @@ export const dict = {
|
|||||||
"ui.common.close": "ปิด",
|
"ui.common.close": "ปิด",
|
||||||
"ui.common.next": "ถัดไป",
|
"ui.common.next": "ถัดไป",
|
||||||
"ui.common.submit": "ส่ง",
|
"ui.common.submit": "ส่ง",
|
||||||
|
"ui.common.showMore": "แสดงเพิ่มเติม",
|
||||||
|
|
||||||
"ui.permission.deny": "ปฏิเสธ",
|
"ui.permission.deny": "ปฏิเสธ",
|
||||||
"ui.permission.allowAlways": "อนุญาตเสมอ",
|
"ui.permission.allowAlways": "อนุญาตเสมอ",
|
||||||
|
|||||||
@@ -155,6 +155,7 @@ export const dict = {
|
|||||||
"ui.common.close": "Kapat",
|
"ui.common.close": "Kapat",
|
||||||
"ui.common.next": "İleri",
|
"ui.common.next": "İleri",
|
||||||
"ui.common.submit": "Gönder",
|
"ui.common.submit": "Gönder",
|
||||||
|
"ui.common.showMore": "Daha fazla göster",
|
||||||
|
|
||||||
"ui.permission.deny": "Reddet",
|
"ui.permission.deny": "Reddet",
|
||||||
"ui.permission.allowAlways": "Her zaman izin ver",
|
"ui.permission.allowAlways": "Her zaman izin ver",
|
||||||
|
|||||||
@@ -162,6 +162,7 @@ export const dict: Record<string, string> = {
|
|||||||
"ui.common.close": "Закрити",
|
"ui.common.close": "Закрити",
|
||||||
"ui.common.next": "Далі",
|
"ui.common.next": "Далі",
|
||||||
"ui.common.submit": "Надіслати",
|
"ui.common.submit": "Надіслати",
|
||||||
|
"ui.common.showMore": "Показати більше",
|
||||||
|
|
||||||
"ui.permission.deny": "Заборонити",
|
"ui.permission.deny": "Заборонити",
|
||||||
"ui.permission.allowAlways": "Дозволяти завжди",
|
"ui.permission.allowAlways": "Дозволяти завжди",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@ export const dict = {
|
|||||||
"ui.common.close": "关闭",
|
"ui.common.close": "关闭",
|
||||||
"ui.common.next": "下一步",
|
"ui.common.next": "下一步",
|
||||||
"ui.common.submit": "提交",
|
"ui.common.submit": "提交",
|
||||||
|
"ui.common.showMore": "显示更多",
|
||||||
|
|
||||||
"ui.permission.deny": "拒绝",
|
"ui.permission.deny": "拒绝",
|
||||||
"ui.permission.allowAlways": "始终允许",
|
"ui.permission.allowAlways": "始终允许",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@ export const dict = {
|
|||||||
"ui.common.close": "關閉",
|
"ui.common.close": "關閉",
|
||||||
"ui.common.next": "下一步",
|
"ui.common.next": "下一步",
|
||||||
"ui.common.submit": "提交",
|
"ui.common.submit": "提交",
|
||||||
|
"ui.common.showMore": "顯示更多",
|
||||||
|
|
||||||
"ui.permission.deny": "拒絕",
|
"ui.permission.deny": "拒絕",
|
||||||
"ui.permission.allowAlways": "永遠允許",
|
"ui.permission.allowAlways": "永遠允許",
|
||||||
|
|||||||
Reference in New Issue
Block a user