mirror of
https://github.com/langgenius/dify.git
synced 2026-05-06 02:18:08 +08:00
Merge branch 'main' into feat/rag-2
# Conflicts: # api/core/app/entities/queue_entities.py # api/core/workflow/graph_engine/entities/event.py
This commit is contained in:
@ -5,6 +5,9 @@ LABEL maintainer="takatost@gmail.com"
|
||||
# if you located in China, you can use aliyun mirror to speed up
|
||||
# RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
|
||||
|
||||
# if you located in China, you can use taobao registry to speed up
|
||||
# RUN npm config set registry https://registry.npmmirror.com
|
||||
|
||||
RUN apk add --no-cache tzdata
|
||||
RUN corepack enable
|
||||
ENV PNPM_HOME="/pnpm"
|
||||
@ -22,9 +25,6 @@ COPY pnpm-lock.yaml .
|
||||
# Use packageManager from package.json
|
||||
RUN corepack install
|
||||
|
||||
# if you located in China, you can use taobao registry to speed up
|
||||
# RUN pnpm install --frozen-lockfile --registry https://registry.npmmirror.com/
|
||||
|
||||
RUN pnpm install --frozen-lockfile
|
||||
|
||||
# build resources
|
||||
|
||||
@ -407,9 +407,13 @@ export const useChatWithHistory = (installedAppInfo?: InstalledApp) => {
|
||||
currentChatInstanceRef.current.handleStop()
|
||||
setShowNewConversationItemInList(true)
|
||||
handleChangeConversation('')
|
||||
handleNewConversationInputsChange(await getRawInputsFromUrlParams())
|
||||
const conversationInputs: Record<string, any> = {}
|
||||
inputsForms.forEach((item: any) => {
|
||||
conversationInputs[item.variable] = item.default || null
|
||||
})
|
||||
handleNewConversationInputsChange(conversationInputs)
|
||||
setClearChatList(true)
|
||||
}, [handleChangeConversation, setShowNewConversationItemInList, handleNewConversationInputsChange, setClearChatList])
|
||||
}, [handleChangeConversation, setShowNewConversationItemInList, handleNewConversationInputsChange, setClearChatList, inputsForms])
|
||||
const handleUpdateConversationList = useCallback(() => {
|
||||
mutateAppConversationData()
|
||||
mutateAppPinnedConversationData()
|
||||
|
||||
@ -137,24 +137,14 @@ const Answer: FC<AnswerProps> = ({
|
||||
/>
|
||||
)
|
||||
}
|
||||
{/** Render the normal steps */}
|
||||
{/** Render workflow process */}
|
||||
{
|
||||
workflowProcess && !hideProcessDetail && (
|
||||
workflowProcess && (
|
||||
<WorkflowProcessItem
|
||||
data={workflowProcess}
|
||||
item={item}
|
||||
hideProcessDetail={hideProcessDetail}
|
||||
/>
|
||||
)
|
||||
}
|
||||
{/** Hide workflow steps by it's settings in siteInfo */}
|
||||
{
|
||||
workflowProcess && hideProcessDetail && appData && (
|
||||
<WorkflowProcessItem
|
||||
data={workflowProcess}
|
||||
item={item}
|
||||
hideProcessDetail={hideProcessDetail}
|
||||
readonly={!appData.site.show_workflow_steps}
|
||||
readonly={hideProcessDetail && appData ? !appData.site.show_workflow_steps : undefined}
|
||||
/>
|
||||
)
|
||||
}
|
||||
|
||||
@ -39,6 +39,8 @@ const WorkflowProcessItem = ({
|
||||
setCollapse(!expand)
|
||||
}, [expand])
|
||||
|
||||
if (readonly) return null
|
||||
|
||||
return (
|
||||
<div
|
||||
className={cn(
|
||||
@ -51,8 +53,8 @@ const WorkflowProcessItem = ({
|
||||
)}
|
||||
>
|
||||
<div
|
||||
className={cn('flex cursor-pointer items-center', !collapse && 'px-1.5', readonly && 'cursor-default')}
|
||||
onClick={() => !readonly && setCollapse(!collapse)}
|
||||
className={cn('flex cursor-pointer items-center', !collapse && 'px-1.5')}
|
||||
onClick={() => setCollapse(!collapse)}
|
||||
>
|
||||
{
|
||||
running && (
|
||||
@ -72,10 +74,10 @@ const WorkflowProcessItem = ({
|
||||
<div className={cn('system-xs-medium text-text-secondary', !collapse && 'grow')}>
|
||||
{t('workflow.common.workflowProcess')}
|
||||
</div>
|
||||
{!readonly && <RiArrowRightSLine className={cn('ml-1 h-4 w-4 text-text-tertiary', !collapse && 'rotate-90')} />}
|
||||
<RiArrowRightSLine className={cn('ml-1 h-4 w-4 text-text-tertiary', !collapse && 'rotate-90')} />
|
||||
</div>
|
||||
{
|
||||
!collapse && !readonly && (
|
||||
!collapse && (
|
||||
<div className='mt-1.5'>
|
||||
{
|
||||
<TracingPanel
|
||||
|
||||
@ -53,11 +53,18 @@ The text generation application offers non-session support and is ideal for tran
|
||||
The rules are defined by the developer and need to ensure that the user identifier is unique within the application. The Service API does not share conversations created by the WebApp.
|
||||
</Property>
|
||||
<Property name='files' type='array[object]' key='files'>
|
||||
File list, suitable for inputting files (images) combined with text understanding and answering questions, available only when the model supports Vision capability.
|
||||
- `type` (string) Supported type: `image` (currently only supports image type)
|
||||
- `transfer_method` (string) Transfer method, `remote_url` for image URL / `local_file` for file upload
|
||||
- `url` (string) Image URL (when the transfer method is `remote_url`)
|
||||
- `upload_file_id` (string) Uploaded file ID, which must be obtained by uploading through the File Upload API in advance (when the transfer method is `local_file`)
|
||||
File list, suitable for inputting files combined with text understanding and answering questions, available only when the model supports Vision/Video capability.
|
||||
- `type` (string) Supported type:
|
||||
- `document` Supported types include: 'TXT', 'MD', 'MARKDOWN', 'MDX', 'PDF', 'HTML', 'XLSX', 'XLS', 'VTT', 'PROPERTIES', 'DOC', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB'
|
||||
- `image` Supported types include: 'JPG', 'JPEG', 'PNG', 'GIF', 'WEBP', 'SVG'
|
||||
- `audio` Supported types include: 'MP3', 'M4A', 'WAV', 'WEBM', 'MPGA'
|
||||
- `video` Supported types include: 'MP4', 'MOV', 'MPEG', 'WEBM'
|
||||
- `custom` Supported types include: other file types
|
||||
- `transfer_method` (string) Transfer method:
|
||||
- `remote_url`: File URL.
|
||||
- `local_file`: Upload file.
|
||||
- `url` File URL. (Only when transfer method is `remote_url`).
|
||||
- `upload_file_id` Upload file ID. (Only when transfer method is `local_file`).
|
||||
</Property>
|
||||
</Properties>
|
||||
|
||||
|
||||
@ -53,11 +53,18 @@ import { Row, Col, Properties, Property, Heading, SubProperty, Paragraph } from
|
||||
アプリケーション内で開発者が一意に定義する必要があります。
|
||||
</Property>
|
||||
<Property name='files' type='array[object]' key='files'>
|
||||
ファイルリスト、モデルがVision機能をサポートしている場合のみ、テキスト理解と質問応答を組み合わせたファイル(画像)の入力に適しています。
|
||||
- `type` (string) サポートされるタイプ:`image`(現在は画像タイプのみサポート)
|
||||
- `transfer_method` (string) 転送方法、画像URLの場合は`remote_url` / ファイルアップロードの場合は`local_file`
|
||||
- `url` (string) 画像URL(転送方法が`remote_url`の場合)
|
||||
- `upload_file_id` (string) アップロードされたファイルID、事前にファイルアップロードAPIを通じてアップロードする必要があります(転送方法が`local_file`の場合)
|
||||
ファイルリスト、モデルが Vision/Video 機能をサポートしている場合に限り、ファイルをテキスト理解および質問応答に組み合わせて入力するのに適しています。
|
||||
- `type` (string) サポートされるタイプ:
|
||||
- `document` サポートされるタイプには以下が含まれます:'TXT', 'MD', 'MARKDOWN', 'MDX', 'PDF', 'HTML', 'XLSX', 'XLS', 'VTT', 'PROPERTIES', 'DOC', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB'
|
||||
- `image` サポートされるタイプには以下が含まれます:'JPG', 'JPEG', 'PNG', 'GIF', 'WEBP', 'SVG'
|
||||
- `audio` サポートされるタイプには以下が含まれます:'MP3', 'M4A', 'WAV', 'WEBM', 'MPGA'
|
||||
- `video` サポートされるタイプには以下が含まれます:'MP4', 'MOV', 'MPEG', 'WEBM'
|
||||
- `custom` サポートされるタイプには以下が含まれます:その他のファイルタイプ
|
||||
- `transfer_method` (string) 転送方法:
|
||||
- `remote_url`: ファイルのURL。
|
||||
- `local_file`: ファイルをアップロード。
|
||||
- `url` ファイルのURL。(転送方法が `remote_url` の場合のみ)。
|
||||
- `upload_file_id` アップロードされたファイルID。(転送方法が `local_file` の場合のみ)。
|
||||
</Property>
|
||||
</Properties>
|
||||
|
||||
|
||||
@ -51,12 +51,17 @@ import { Row, Col, Properties, Property, Heading, SubProperty } from '../md.tsx'
|
||||
由开发者定义规则,需保证用户标识在应用内唯一。
|
||||
</Property>
|
||||
<Property name='files' type='array[object]' key='files'>
|
||||
上传的文件。
|
||||
- `type` (string) 支持类型:图片 `image`(目前仅支持图片格式) 。
|
||||
- `transfer_method` (string) 传递方式:
|
||||
- `remote_url`: 图片地址。
|
||||
文件列表,适用于传入文件结合文本理解并回答问题,仅当模型支持 Vision/Video 能力时可用。
|
||||
- `type` (string) 支持类型:
|
||||
- `document` 具体类型包含:'TXT', 'MD', 'MARKDOWN', 'MDX', 'PDF', 'HTML', 'XLSX', 'XLS', 'VTT', 'PROPERTIES', 'DOC', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB'
|
||||
- `image` 具体类型包含:'JPG', 'JPEG', 'PNG', 'GIF', 'WEBP', 'SVG'
|
||||
- `audio` 具体类型包含:'MP3', 'M4A', 'WAV', 'WEBM', 'MPGA'
|
||||
- `video` 具体类型包含:'MP4', 'MOV', 'MPEG', 'WEBM'
|
||||
- `custom` 具体类型包含:其他文件类型
|
||||
- `transfer_method` (string) 传递方式:
|
||||
- `remote_url`: 文件地址。
|
||||
- `local_file`: 上传文件。
|
||||
- `url` 图片地址。(仅当传递方式为 `remote_url` 时)。
|
||||
- `url` 文件地址。(仅当传递方式为 `remote_url` 时)。
|
||||
- `upload_file_id` 上传文件 ID。(仅当传递方式为 `local_file `时)。
|
||||
</Property>
|
||||
</Properties>
|
||||
|
||||
@ -57,16 +57,18 @@ Chat applications support session persistence, allowing previous chat history to
|
||||
Conversation ID, to continue the conversation based on previous chat records, it is necessary to pass the previous message's conversation_id.
|
||||
</Property>
|
||||
<Property name='files' type='array[object]' key='files'>
|
||||
File list, suitable for inputting files combined with text understanding and answering questions, available only when the model supports Vision capability.
|
||||
File list, suitable for inputting files combined with text understanding and answering questions, available only when the model supports Vision/Video capability.
|
||||
- `type` (string) Supported type:
|
||||
- `document` ('TXT', 'MD', 'MARKDOWN', 'PDF', 'HTML', 'XLSX', 'XLS', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB')
|
||||
- `image` ('JPG', 'JPEG', 'PNG', 'GIF', 'WEBP', 'SVG')
|
||||
- `audio` ('MP3', 'M4A', 'WAV', 'WEBM', 'AMR')
|
||||
- `video` ('MP4', 'MOV', 'MPEG', 'MPGA')
|
||||
- `custom` (Other file types)
|
||||
- `transfer_method` (string) Transfer method, `remote_url` for image URL / `local_file` for file upload
|
||||
- `url` (string) Image URL (when the transfer method is `remote_url`)
|
||||
- `upload_file_id` (string) Uploaded file ID, which must be obtained by uploading through the File Upload API in advance (when the transfer method is `local_file`)
|
||||
- `document` Supported types include: 'TXT', 'MD', 'MARKDOWN', 'MDX', 'PDF', 'HTML', 'XLSX', 'XLS', 'VTT', 'PROPERTIES', 'DOC', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB'
|
||||
- `image` Supported types include: 'JPG', 'JPEG', 'PNG', 'GIF', 'WEBP', 'SVG'
|
||||
- `audio` Supported types include: 'MP3', 'M4A', 'WAV', 'WEBM', 'MPGA'
|
||||
- `video` Supported types include: 'MP4', 'MOV', 'MPEG', 'WEBM'
|
||||
- `custom` Supported types include: other file types
|
||||
- `transfer_method` (string) Transfer method:
|
||||
- `remote_url`: File URL.
|
||||
- `local_file`: Upload file.
|
||||
- `url` File URL. (Only when transfer method is `remote_url`).
|
||||
- `upload_file_id` Upload file ID. (Only when transfer method is `local_file`).
|
||||
</Property>
|
||||
<Property name='auto_generate_name' type='bool' key='auto_generate_name'>
|
||||
Auto-generate title, default is `true`.
|
||||
|
||||
@ -57,16 +57,18 @@ import { Row, Col, Properties, Property, Heading, SubProperty, Paragraph } from
|
||||
会話ID、以前のチャット記録に基づいて会話を続けるには、以前のメッセージのconversation_idを渡す必要があります。
|
||||
</Property>
|
||||
<Property name='files' type='array[object]' key='files'>
|
||||
ファイルリスト、テキストの理解と質問への回答を組み合わせたファイルの入力に適しており、モデルがビジョン機能をサポートしている場合にのみ利用可能です。
|
||||
- `type` (string) サポートされているタイプ:
|
||||
- `document` ('TXT', 'MD', 'MARKDOWN', 'PDF', 'HTML', 'XLSX', 'XLS', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB')
|
||||
- `image` ('JPG', 'JPEG', 'PNG', 'GIF', 'WEBP', 'SVG')
|
||||
- `audio` ('MP3', 'M4A', 'WAV', 'WEBM', 'AMR')
|
||||
- `video` ('MP4', 'MOV', 'MPEG', 'MPGA')
|
||||
- `custom` (他のファイルタイプ)
|
||||
- `transfer_method` (string) 転送方法、画像URLの場合は`remote_url` / ファイルアップロードの場合は`local_file`
|
||||
- `url` (string) 画像URL(転送方法が`remote_url`の場合)
|
||||
- `upload_file_id` (string) アップロードされたファイルID、事前にファイルアップロードAPIを通じて取得する必要があります(転送方法が`local_file`の場合)
|
||||
ファイルリスト、モデルが Vision/Video 機能をサポートしている場合に限り、ファイルをテキスト理解および質問応答に組み合わせて入力するのに適しています。
|
||||
- `type` (string) サポートされるタイプ:
|
||||
- `document` サポートされるタイプには以下が含まれます:'TXT', 'MD', 'MARKDOWN', 'MDX', 'PDF', 'HTML', 'XLSX', 'XLS', 'VTT', 'PROPERTIES', 'DOC', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB'
|
||||
- `image` サポートされるタイプには以下が含まれます:'JPG', 'JPEG', 'PNG', 'GIF', 'WEBP', 'SVG'
|
||||
- `audio` サポートされるタイプには以下が含まれます:'MP3', 'M4A', 'WAV', 'WEBM', 'MPGA'
|
||||
- `video` サポートされるタイプには以下が含まれます:'MP4', 'MOV', 'MPEG', 'WEBM'
|
||||
- `custom` サポートされるタイプには以下が含まれます:その他のファイルタイプ
|
||||
- `transfer_method` (string) 転送方法:
|
||||
- `remote_url`: ファイルのURL。
|
||||
- `local_file`: ファイルをアップロード。
|
||||
- `url` ファイルのURL。(転送方法が `remote_url` の場合のみ)。
|
||||
- `upload_file_id` アップロードされたファイルID。(転送方法が `local_file` の場合のみ)。
|
||||
</Property>
|
||||
<Property name='auto_generate_name' type='bool' key='auto_generate_name'>
|
||||
タイトルを自動生成、デフォルトは`true`。
|
||||
|
||||
@ -55,17 +55,17 @@ import { Row, Col, Properties, Property, Heading, SubProperty } from '../md.tsx'
|
||||
(选填)会话 ID,需要基于之前的聊天记录继续对话,必须传之前消息的 conversation_id。
|
||||
</Property>
|
||||
<Property name='files' type='array[object]' key='files'>
|
||||
文件列表,适用于传入文件结合文本理解并回答问题,仅当模型支持 Vision 能力时可用。
|
||||
文件列表,适用于传入文件结合文本理解并回答问题,仅当模型支持 Vision/Video 能力时可用。
|
||||
- `type` (string) 支持类型:
|
||||
- `document` 具体类型包含:'TXT', 'MD', 'MARKDOWN', 'PDF', 'HTML', 'XLSX', 'XLS', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB'
|
||||
- `document` 具体类型包含:'TXT', 'MD', 'MARKDOWN', 'MDX', 'PDF', 'HTML', 'XLSX', 'XLS', 'VTT', 'PROPERTIES', 'DOC', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB'
|
||||
- `image` 具体类型包含:'JPG', 'JPEG', 'PNG', 'GIF', 'WEBP', 'SVG'
|
||||
- `audio` 具体类型包含:'MP3', 'M4A', 'WAV', 'WEBM', 'AMR'
|
||||
- `video` 具体类型包含:'MP4', 'MOV', 'MPEG', 'MPGA'
|
||||
- `audio` 具体类型包含:'MP3', 'M4A', 'WAV', 'WEBM', 'MPGA'
|
||||
- `video` 具体类型包含:'MP4', 'MOV', 'MPEG', 'WEBM'
|
||||
- `custom` 具体类型包含:其他文件类型
|
||||
- `transfer_method` (string) 传递方式:
|
||||
- `remote_url`: 图片地址。
|
||||
- `remote_url`: 文件地址。
|
||||
- `local_file`: 上传文件。
|
||||
- `url` 图片地址。(仅当传递方式为 `remote_url` 时)。
|
||||
- `url` 文件地址。(仅当传递方式为 `remote_url` 时)。
|
||||
- `upload_file_id` 上传文件 ID。(仅当传递方式为 `local_file `时)。
|
||||
</Property>
|
||||
<Property name='auto_generate_name' type='bool' key='auto_generate_name'>
|
||||
|
||||
@ -56,11 +56,18 @@ Chat applications support session persistence, allowing previous chat history to
|
||||
Conversation ID, to continue the conversation based on previous chat records, it is necessary to pass the previous message's conversation_id.
|
||||
</Property>
|
||||
<Property name='files' type='array[object]' key='files'>
|
||||
File list, suitable for inputting files (images) combined with text understanding and answering questions, available only when the model supports Vision capability.
|
||||
- `type` (string) Supported type: `image` (currently only supports image type)
|
||||
- `transfer_method` (string) Transfer method, `remote_url` for image URL / `local_file` for file upload
|
||||
- `url` (string) Image URL (when the transfer method is `remote_url`)
|
||||
- `upload_file_id` (string) Uploaded file ID, which must be obtained by uploading through the File Upload API in advance (when the transfer method is `local_file`)
|
||||
File list, suitable for inputting files combined with text understanding and answering questions, available only when the model supports Vision/Video capability.
|
||||
- `type` (string) Supported type:
|
||||
- `document` Supported types include: 'TXT', 'MD', 'MARKDOWN', 'MDX', 'PDF', 'HTML', 'XLSX', 'XLS', 'VTT', 'PROPERTIES', 'DOC', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB'
|
||||
- `image` Supported types include: 'JPG', 'JPEG', 'PNG', 'GIF', 'WEBP', 'SVG'
|
||||
- `audio` Supported types include: 'MP3', 'M4A', 'WAV', 'WEBM', 'MPGA'
|
||||
- `video` Supported types include: 'MP4', 'MOV', 'MPEG', 'WEBM'
|
||||
- `custom` Supported types include: other file types
|
||||
- `transfer_method` (string) Transfer method:
|
||||
- `remote_url`: File URL.
|
||||
- `local_file`: Upload file.
|
||||
- `url` File URL. (Only when transfer method is `remote_url`).
|
||||
- `upload_file_id` Upload file ID. (Only when transfer method is `local_file`).
|
||||
</Property>
|
||||
<Property name='auto_generate_name' type='bool' key='auto_generate_name'>
|
||||
Auto-generate title, default is `true`.
|
||||
|
||||
@ -56,11 +56,18 @@ import { Row, Col, Properties, Property, Heading, SubProperty, Paragraph } from
|
||||
会話ID、以前のチャット記録に基づいて会話を続けるには、前のメッセージのconversation_idを渡す必要があります。
|
||||
</Property>
|
||||
<Property name='files' type='array[object]' key='files'>
|
||||
ファイルリスト、テキストの理解と質問への回答を組み合わせたファイル(画像)の入力に適しており、モデルがビジョン機能をサポートしている場合にのみ利用可能です。
|
||||
- `type` (string) サポートされているタイプ:`image`(現在は画像タイプのみサポート)
|
||||
- `transfer_method` (string) 転送方法、画像URLの場合は`remote_url` / ファイルアップロードの場合は`local_file`
|
||||
- `url` (string) 画像URL(転送方法が`remote_url`の場合)
|
||||
- `upload_file_id` (string) アップロードされたファイルID、事前にファイルアップロードAPIを通じて取得する必要があります(転送方法が`local_file`の場合)
|
||||
ファイルリスト、モデルが Vision/Video 機能をサポートしている場合に限り、ファイルをテキスト理解および質問応答に組み合わせて入力するのに適しています。
|
||||
- `type` (string) サポートされるタイプ:
|
||||
- `document` サポートされるタイプには以下が含まれます:'TXT', 'MD', 'MARKDOWN', 'MDX', 'PDF', 'HTML', 'XLSX', 'XLS', 'VTT', 'PROPERTIES', 'DOC', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB'
|
||||
- `image` サポートされるタイプには以下が含まれます:'JPG', 'JPEG', 'PNG', 'GIF', 'WEBP', 'SVG'
|
||||
- `audio` サポートされるタイプには以下が含まれます:'MP3', 'M4A', 'WAV', 'WEBM', 'MPGA'
|
||||
- `video` サポートされるタイプには以下が含まれます:'MP4', 'MOV', 'MPEG', 'WEBM'
|
||||
- `custom` サポートされるタイプには以下が含まれます:その他のファイルタイプ
|
||||
- `transfer_method` (string) 転送方法:
|
||||
- `remote_url`: ファイルのURL。
|
||||
- `local_file`: ファイルをアップロード。
|
||||
- `url` ファイルのURL。(転送方法が `remote_url` の場合のみ)。
|
||||
- `upload_file_id` アップロードされたファイルID。(転送方法が `local_file` の場合のみ)。
|
||||
</Property>
|
||||
<Property name='auto_generate_name' type='bool' key='auto_generate_name'>
|
||||
タイトルを自動生成します。デフォルトは`true`です。
|
||||
|
||||
@ -55,12 +55,17 @@ import { Row, Col, Properties, Property, Heading, SubProperty } from '../md.tsx'
|
||||
(选填)会话 ID,需要基于之前的聊天记录继续对话,必须传之前消息的 conversation_id。
|
||||
</Property>
|
||||
<Property name='files' type='array[object]' key='files'>
|
||||
上传的文件。
|
||||
- `type` (string) 支持类型:图片 `image`(目前仅支持图片格式) 。
|
||||
文件列表,适用于传入文件结合文本理解并回答问题,仅当模型支持 Vision/Video 能力时可用。
|
||||
- `type` (string) 支持类型:
|
||||
- `document` 具体类型包含:'TXT', 'MD', 'MARKDOWN', 'MDX', 'PDF', 'HTML', 'XLSX', 'XLS', 'VTT', 'PROPERTIES', 'DOC', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB'
|
||||
- `image` 具体类型包含:'JPG', 'JPEG', 'PNG', 'GIF', 'WEBP', 'SVG'
|
||||
- `audio` 具体类型包含:'MP3', 'M4A', 'WAV', 'WEBM', 'MPGA'
|
||||
- `video` 具体类型包含:'MP4', 'MOV', 'MPEG', 'WEBM'
|
||||
- `custom` 具体类型包含:其他文件类型
|
||||
- `transfer_method` (string) 传递方式:
|
||||
- `remote_url`: 图片地址。
|
||||
- `remote_url`: 文件地址。
|
||||
- `local_file`: 上传文件。
|
||||
- `url` 图片地址。(仅当传递方式为 `remote_url` 时)。
|
||||
- `url` 文件地址。(仅当传递方式为 `remote_url` 时)。
|
||||
- `upload_file_id` 上传文件 ID。(仅当传递方式为 `local_file `时)。
|
||||
</Property>
|
||||
<Property name='auto_generate_name' type='bool' key='auto_generate_name'>
|
||||
|
||||
@ -39,14 +39,16 @@ Workflow applications offers non-session support and is ideal for translation, a
|
||||
File Array type variable is suitable for inputting files combined with text understanding and answering questions, available only when the model supports file parsing and understanding capability.
|
||||
If the variable is of File Array type, the corresponding value should be a list whose elements contain following attributions:
|
||||
- `type` (string) Supported type:
|
||||
- `document` ('TXT', 'MD', 'MARKDOWN', 'PDF', 'HTML', 'XLSX', 'XLS', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB')
|
||||
- `image` ('JPG', 'JPEG', 'PNG', 'GIF', 'WEBP', 'SVG')
|
||||
- `audio` ('MP3', 'M4A', 'WAV', 'WEBM', 'AMR')
|
||||
- `video` ('MP4', 'MOV', 'MPEG', 'MPGA')
|
||||
- `custom` (Other file types)
|
||||
- `transfer_method` (string) Transfer method, `remote_url` for image URL / `local_file` for file upload
|
||||
- `url` (string) Image URL (when the transfer method is `remote_url`)
|
||||
- `upload_file_id` (string) Uploaded file ID, which must be obtained by uploading through the File Upload API in advance (when the transfer method is `local_file`)
|
||||
- `document` Supported types include: 'TXT', 'MD', 'MARKDOWN', 'MDX', 'PDF', 'HTML', 'XLSX', 'XLS', 'VTT', 'PROPERTIES', 'DOC', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB'
|
||||
- `image` Supported types include: 'JPG', 'JPEG', 'PNG', 'GIF', 'WEBP', 'SVG'
|
||||
- `audio` Supported types include: 'MP3', 'M4A', 'WAV', 'WEBM', 'MPGA'
|
||||
- `video` Supported types include: 'MP4', 'MOV', 'MPEG', 'WEBM'
|
||||
- `custom` Supported types include: other file types
|
||||
- `transfer_method` (string) Transfer method:
|
||||
- `remote_url`: File URL.
|
||||
- `local_file`: Upload file.
|
||||
- `url` File URL. (Only when transfer method is `remote_url`).
|
||||
- `upload_file_id` Upload file ID. (Only when transfer method is `local_file`).
|
||||
|
||||
- `response_mode` (string) Required
|
||||
The mode of response return, supporting:
|
||||
|
||||
@ -39,16 +39,18 @@ import { Row, Col, Properties, Property, Heading, SubProperty, Paragraph } from
|
||||
ファイルリストは、テキスト理解と質問への回答を組み合わせたファイルの入力に適しています。モデルがファイルの解析と理解機能をサポートしている場合にのみ使用できます。
|
||||
|
||||
変数がファイルリストの場合、リストの各要素は以下の属性を持つ必要があります。
|
||||
- `type` (string) サポートされているタイプ:
|
||||
- `document` ('TXT', 'MD', 'MARKDOWN', 'PDF', 'HTML', 'XLSX', 'XLS', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB')
|
||||
- `image` ('JPG', 'JPEG', 'PNG', 'GIF', 'WEBP', 'SVG')
|
||||
- `audio` ('MP3', 'M4A', 'WAV', 'WEBM', 'AMR')
|
||||
- `video` ('MP4', 'MOV', 'MPEG', 'MPGA')
|
||||
- `custom` (他のファイルタイプ)
|
||||
- `transfer_method` (string) 転送方法、画像URLの場合は`remote_url` / ファイルアップロードの場合は`local_file`
|
||||
- `url` (string) 画像URL(転送方法が`remote_url`の場合)
|
||||
- `upload_file_id` (string) アップロードされたファイルID、事前にファイルアップロードAPIを通じて取得する必要があります(転送方法が`local_file`の場合)
|
||||
|
||||
- `type` (string) サポートされるタイプ:
|
||||
- `document` サポートされるタイプには以下が含まれます:'TXT', 'MD', 'MARKDOWN', 'MDX', 'PDF', 'HTML', 'XLSX', 'XLS', 'VTT', 'PROPERTIES', 'DOC', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB'
|
||||
- `image` サポートされるタイプには以下が含まれます:'JPG', 'JPEG', 'PNG', 'GIF', 'WEBP', 'SVG'
|
||||
- `audio` サポートされるタイプには以下が含まれます:'MP3', 'M4A', 'WAV', 'WEBM', 'MPGA'
|
||||
- `video` サポートされるタイプには以下が含まれます:'MP4', 'MOV', 'MPEG', 'WEBM'
|
||||
- `custom` サポートされるタイプには以下が含まれます:その他のファイルタイプ
|
||||
- `transfer_method` (string) 転送方法:
|
||||
- `remote_url`: ファイルのURL。
|
||||
- `local_file`: ファイルをアップロード。
|
||||
- `url` ファイルのURL。(転送方法が `remote_url` の場合のみ)。
|
||||
- `upload_file_id` アップロードされたファイルID。(転送方法が `local_file` の場合のみ)。
|
||||
|
||||
- `response_mode` (string) 必須
|
||||
応答の返却モードを指定します。サポートされているモード:
|
||||
- `streaming` ストリーミングモード(推奨)、SSE([Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events))を通じてタイプライターのような出力を実装します。
|
||||
|
||||
@ -342,14 +342,17 @@ Workflow 应用无会话支持,适合用于翻译/文章写作/总结 AI 等
|
||||
inputs 参数包含了多组键值对(Key/Value pairs),每组的键对应一个特定变量,每组的值则是该变量的具体值。变量可以是文件列表类型。
|
||||
文件列表类型变量适用于传入文件结合文本理解并回答问题,仅当模型支持该类型文件解析能力时可用。如果该变量是文件列表类型,该变量对应的值应是列表格式,其中每个元素应包含以下内容:
|
||||
- `type` (string) 支持类型:
|
||||
- `document` 具体类型包含:'TXT', 'MD', 'MARKDOWN', 'PDF', 'HTML', 'XLSX', 'XLS', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB'
|
||||
- `document` 具体类型包含:'TXT', 'MD', 'MARKDOWN', 'MDX', 'PDF', 'HTML', 'XLSX', 'XLS', 'VTT', 'PROPERTIES', 'DOC', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB'
|
||||
- `image` 具体类型包含:'JPG', 'JPEG', 'PNG', 'GIF', 'WEBP', 'SVG'
|
||||
- `audio` 具体类型包含:'MP3', 'M4A', 'WAV', 'WEBM', 'AMR'
|
||||
- `video` 具体类型包含:'MP4', 'MOV', 'MPEG', 'MPGA'
|
||||
- `audio` 具体类型包含:'MP3', 'M4A', 'WAV', 'WEBM', 'MPGA'
|
||||
- `video` 具体类型包含:'MP4', 'MOV', 'MPEG', 'WEBM'
|
||||
- `custom` 具体类型包含:其他文件类型
|
||||
- `transfer_method` (string) 传递方式,`remote_url` 图片地址 / `local_file` 上传文件
|
||||
- `url` (string) 图片地址(仅当传递方式为 `remote_url` 时)
|
||||
- `upload_file_id` (string) 上传文件 ID(仅当传递方式为 `local_file` 时)
|
||||
- `transfer_method` (string) 传递方式:
|
||||
- `remote_url`: 文件地址。
|
||||
- `local_file`: 上传文件。
|
||||
- `url` 文件地址。(仅当传递方式为 `remote_url` 时)。
|
||||
- `upload_file_id` 上传文件 ID。(仅当传递方式为 `local_file `时)。
|
||||
|
||||
- `response_mode` (string) Required
|
||||
返回响应模式,支持:
|
||||
- `streaming` 流式模式(推荐)。基于 SSE(**[Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events)**)实现类似打字机输出方式的流式返回。
|
||||
|
||||
@ -0,0 +1,44 @@
|
||||
import type { SlashCommandHandler } from './types'
|
||||
import React from 'react'
|
||||
import { RiUser3Line } from '@remixicon/react'
|
||||
import i18n from '@/i18n-config/i18next-config'
|
||||
import { registerCommands, unregisterCommands } from './command-bus'
|
||||
|
||||
// Account command dependency types - no external dependencies needed
|
||||
type AccountDeps = Record<string, never>
|
||||
|
||||
/**
|
||||
* Account command - Navigates to account page
|
||||
*/
|
||||
export const accountCommand: SlashCommandHandler<AccountDeps> = {
|
||||
name: 'account',
|
||||
description: 'Navigate to account page',
|
||||
|
||||
async search(args: string, locale: string = 'en') {
|
||||
return [{
|
||||
id: 'account',
|
||||
title: i18n.t('common.account.account', { lng: locale }),
|
||||
description: i18n.t('app.gotoAnything.actions.accountDesc', { lng: locale }),
|
||||
type: 'command' as const,
|
||||
icon: (
|
||||
<div className='flex h-6 w-6 items-center justify-center rounded-md border-[0.5px] border-divider-regular bg-components-panel-bg'>
|
||||
<RiUser3Line className='h-4 w-4 text-text-tertiary' />
|
||||
</div>
|
||||
),
|
||||
data: { command: 'navigation.account', args: {} },
|
||||
}]
|
||||
},
|
||||
|
||||
register(_deps: AccountDeps) {
|
||||
registerCommands({
|
||||
'navigation.account': async (_args) => {
|
||||
// Navigate to account page
|
||||
window.location.href = '/account'
|
||||
},
|
||||
})
|
||||
},
|
||||
|
||||
unregister() {
|
||||
unregisterCommands(['navigation.account'])
|
||||
},
|
||||
}
|
||||
@ -0,0 +1,43 @@
|
||||
import type { SlashCommandHandler } from './types'
|
||||
import React from 'react'
|
||||
import { RiDiscordLine } from '@remixicon/react'
|
||||
import i18n from '@/i18n-config/i18next-config'
|
||||
import { registerCommands, unregisterCommands } from './command-bus'
|
||||
|
||||
// Community command dependency types
|
||||
type CommunityDeps = Record<string, never>
|
||||
|
||||
/**
|
||||
* Community command - Opens Discord community
|
||||
*/
|
||||
export const communityCommand: SlashCommandHandler<CommunityDeps> = {
|
||||
name: 'community',
|
||||
description: 'Open community Discord',
|
||||
async search(args: string, locale: string = 'en') {
|
||||
return [{
|
||||
id: 'community',
|
||||
title: i18n.t('common.userProfile.community', { lng: locale }),
|
||||
description: i18n.t('app.gotoAnything.actions.communityDesc', { lng: locale }) || 'Open Discord community',
|
||||
type: 'command' as const,
|
||||
icon: (
|
||||
<div className='flex h-6 w-6 items-center justify-center rounded-md border-[0.5px] border-divider-regular bg-components-panel-bg'>
|
||||
<RiDiscordLine className='h-4 w-4 text-text-tertiary' />
|
||||
</div>
|
||||
),
|
||||
data: { command: 'navigation.community', args: { url: 'https://discord.gg/5AEfbxcd9k' } },
|
||||
}]
|
||||
},
|
||||
|
||||
register(_deps: CommunityDeps) {
|
||||
registerCommands({
|
||||
'navigation.community': async (args) => {
|
||||
const url = args?.url || 'https://discord.gg/5AEfbxcd9k'
|
||||
window.open(url, '_blank', 'noopener,noreferrer')
|
||||
},
|
||||
})
|
||||
},
|
||||
|
||||
unregister() {
|
||||
unregisterCommands(['navigation.community'])
|
||||
},
|
||||
}
|
||||
44
web/app/components/goto-anything/actions/commands/doc.tsx
Normal file
44
web/app/components/goto-anything/actions/commands/doc.tsx
Normal file
@ -0,0 +1,44 @@
|
||||
import type { SlashCommandHandler } from './types'
|
||||
import React from 'react'
|
||||
import { RiBookOpenLine } from '@remixicon/react'
|
||||
import i18n from '@/i18n-config/i18next-config'
|
||||
import { registerCommands, unregisterCommands } from './command-bus'
|
||||
import { defaultDocBaseUrl } from '@/context/i18n'
|
||||
|
||||
// Documentation command dependency types - no external dependencies needed
|
||||
type DocDeps = Record<string, never>
|
||||
|
||||
/**
|
||||
* Documentation command - Opens help documentation
|
||||
*/
|
||||
export const docCommand: SlashCommandHandler<DocDeps> = {
|
||||
name: 'doc',
|
||||
description: 'Open documentation',
|
||||
async search(args: string, locale: string = 'en') {
|
||||
return [{
|
||||
id: 'doc',
|
||||
title: i18n.t('common.userProfile.helpCenter', { lng: locale }),
|
||||
description: i18n.t('app.gotoAnything.actions.docDesc', { lng: locale }) || 'Open help documentation',
|
||||
type: 'command' as const,
|
||||
icon: (
|
||||
<div className='flex h-6 w-6 items-center justify-center rounded-md border-[0.5px] border-divider-regular bg-components-panel-bg'>
|
||||
<RiBookOpenLine className='h-4 w-4 text-text-tertiary' />
|
||||
</div>
|
||||
),
|
||||
data: { command: 'navigation.doc', args: {} },
|
||||
}]
|
||||
},
|
||||
|
||||
register(_deps: DocDeps) {
|
||||
registerCommands({
|
||||
'navigation.doc': async (_args) => {
|
||||
const url = `${defaultDocBaseUrl}`
|
||||
window.open(url, '_blank', 'noopener,noreferrer')
|
||||
},
|
||||
})
|
||||
},
|
||||
|
||||
unregister() {
|
||||
unregisterCommands(['navigation.doc'])
|
||||
},
|
||||
}
|
||||
@ -0,0 +1,43 @@
|
||||
import type { SlashCommandHandler } from './types'
|
||||
import React from 'react'
|
||||
import { RiFeedbackLine } from '@remixicon/react'
|
||||
import i18n from '@/i18n-config/i18next-config'
|
||||
import { registerCommands, unregisterCommands } from './command-bus'
|
||||
|
||||
// Feedback command dependency types
|
||||
type FeedbackDeps = Record<string, never>
|
||||
|
||||
/**
|
||||
* Feedback command - Opens GitHub feedback discussions
|
||||
*/
|
||||
export const feedbackCommand: SlashCommandHandler<FeedbackDeps> = {
|
||||
name: 'feedback',
|
||||
description: 'Open feedback discussions',
|
||||
async search(args: string, locale: string = 'en') {
|
||||
return [{
|
||||
id: 'feedback',
|
||||
title: i18n.t('common.userProfile.communityFeedback', { lng: locale }),
|
||||
description: i18n.t('app.gotoAnything.actions.feedbackDesc', { lng: locale }) || 'Open community feedback discussions',
|
||||
type: 'command' as const,
|
||||
icon: (
|
||||
<div className='flex h-6 w-6 items-center justify-center rounded-md border-[0.5px] border-divider-regular bg-components-panel-bg'>
|
||||
<RiFeedbackLine className='h-4 w-4 text-text-tertiary' />
|
||||
</div>
|
||||
),
|
||||
data: { command: 'navigation.feedback', args: { url: 'https://github.com/langgenius/dify/discussions/categories/feedbacks' } },
|
||||
}]
|
||||
},
|
||||
|
||||
register(_deps: FeedbackDeps) {
|
||||
registerCommands({
|
||||
'navigation.feedback': async (args) => {
|
||||
const url = args?.url || 'https://github.com/langgenius/dify/discussions/categories/feedbacks'
|
||||
window.open(url, '_blank', 'noopener,noreferrer')
|
||||
},
|
||||
})
|
||||
},
|
||||
|
||||
unregister() {
|
||||
unregisterCommands(['navigation.feedback'])
|
||||
},
|
||||
}
|
||||
@ -7,6 +7,10 @@ import { useTheme } from 'next-themes'
|
||||
import { setLocaleOnClient } from '@/i18n-config'
|
||||
import { themeCommand } from './theme'
|
||||
import { languageCommand } from './language'
|
||||
import { feedbackCommand } from './feedback'
|
||||
import { docCommand } from './doc'
|
||||
import { communityCommand } from './community'
|
||||
import { accountCommand } from './account'
|
||||
import i18n from '@/i18n-config/i18next-config'
|
||||
|
||||
export const slashAction: ActionItem = {
|
||||
@ -30,12 +34,20 @@ export const registerSlashCommands = (deps: Record<string, any>) => {
|
||||
// Register command handlers to the registry system with their respective dependencies
|
||||
slashCommandRegistry.register(themeCommand, { setTheme: deps.setTheme })
|
||||
slashCommandRegistry.register(languageCommand, { setLocale: deps.setLocale })
|
||||
slashCommandRegistry.register(feedbackCommand, {})
|
||||
slashCommandRegistry.register(docCommand, {})
|
||||
slashCommandRegistry.register(communityCommand, {})
|
||||
slashCommandRegistry.register(accountCommand, {})
|
||||
}
|
||||
|
||||
export const unregisterSlashCommands = () => {
|
||||
// Remove command handlers from registry system (automatically calls each command's unregister method)
|
||||
slashCommandRegistry.unregister('theme')
|
||||
slashCommandRegistry.unregister('language')
|
||||
slashCommandRegistry.unregister('feedback')
|
||||
slashCommandRegistry.unregister('doc')
|
||||
slashCommandRegistry.unregister('community')
|
||||
slashCommandRegistry.unregister('account')
|
||||
}
|
||||
|
||||
export const SlashCommandProvider = () => {
|
||||
|
||||
@ -1,8 +1,9 @@
|
||||
import type { FC } from 'react'
|
||||
import { useEffect } from 'react'
|
||||
import { useEffect, useMemo } from 'react'
|
||||
import { Command } from 'cmdk'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import type { ActionItem } from './actions/types'
|
||||
import { slashCommandRegistry } from './actions/commands/registry'
|
||||
|
||||
type Props = {
|
||||
actions: Record<string, ActionItem>
|
||||
@ -10,27 +11,57 @@ type Props = {
|
||||
searchFilter?: string
|
||||
commandValue?: string
|
||||
onCommandValueChange?: (value: string) => void
|
||||
originalQuery?: string
|
||||
}
|
||||
|
||||
const CommandSelector: FC<Props> = ({ actions, onCommandSelect, searchFilter, commandValue, onCommandValueChange }) => {
|
||||
const CommandSelector: FC<Props> = ({ actions, onCommandSelect, searchFilter, commandValue, onCommandValueChange, originalQuery }) => {
|
||||
const { t } = useTranslation()
|
||||
|
||||
const filteredActions = Object.values(actions).filter((action) => {
|
||||
if (!searchFilter)
|
||||
return true
|
||||
const filterLower = searchFilter.toLowerCase()
|
||||
return action.shortcut.toLowerCase().includes(filterLower)
|
||||
})
|
||||
// Check if we're in slash command mode
|
||||
const isSlashMode = originalQuery?.trim().startsWith('/') || false
|
||||
|
||||
// Get slash commands from registry
|
||||
const slashCommands = useMemo(() => {
|
||||
if (!isSlashMode) return []
|
||||
|
||||
const allCommands = slashCommandRegistry.getAllCommands()
|
||||
const filter = searchFilter?.toLowerCase() || '' // searchFilter already has '/' removed
|
||||
|
||||
return allCommands.filter((cmd) => {
|
||||
if (!filter) return true
|
||||
return cmd.name.toLowerCase().includes(filter)
|
||||
}).map(cmd => ({
|
||||
key: `/${cmd.name}`,
|
||||
shortcut: `/${cmd.name}`,
|
||||
title: cmd.name,
|
||||
description: cmd.description,
|
||||
}))
|
||||
}, [isSlashMode, searchFilter])
|
||||
|
||||
const filteredActions = useMemo(() => {
|
||||
if (isSlashMode) return []
|
||||
|
||||
return Object.values(actions).filter((action) => {
|
||||
// Exclude slash action when in @ mode
|
||||
if (action.key === '/') return false
|
||||
if (!searchFilter)
|
||||
return true
|
||||
const filterLower = searchFilter.toLowerCase()
|
||||
return action.shortcut.toLowerCase().includes(filterLower)
|
||||
})
|
||||
}, [actions, searchFilter, isSlashMode])
|
||||
|
||||
const allItems = isSlashMode ? slashCommands : filteredActions
|
||||
|
||||
useEffect(() => {
|
||||
if (filteredActions.length > 0 && onCommandValueChange) {
|
||||
const currentValueExists = filteredActions.some(action => action.shortcut === commandValue)
|
||||
if (allItems.length > 0 && onCommandValueChange) {
|
||||
const currentValueExists = allItems.some(item => item.shortcut === commandValue)
|
||||
if (!currentValueExists)
|
||||
onCommandValueChange(filteredActions[0].shortcut)
|
||||
onCommandValueChange(allItems[0].shortcut)
|
||||
}
|
||||
}, [searchFilter, filteredActions.length])
|
||||
}, [searchFilter, allItems.length])
|
||||
|
||||
if (filteredActions.length === 0) {
|
||||
if (allItems.length === 0) {
|
||||
return (
|
||||
<div className="p-4">
|
||||
<div className="flex items-center justify-center py-8 text-center text-text-tertiary">
|
||||
@ -50,33 +81,46 @@ const CommandSelector: FC<Props> = ({ actions, onCommandSelect, searchFilter, co
|
||||
return (
|
||||
<div className="p-4">
|
||||
<div className="mb-3 text-left text-sm font-medium text-text-secondary">
|
||||
{t('app.gotoAnything.selectSearchType')}
|
||||
{isSlashMode ? t('app.gotoAnything.groups.commands') : t('app.gotoAnything.selectSearchType')}
|
||||
</div>
|
||||
<Command.Group className="space-y-1">
|
||||
{filteredActions.map(action => (
|
||||
{allItems.map(item => (
|
||||
<Command.Item
|
||||
key={action.key}
|
||||
value={action.shortcut}
|
||||
key={item.key}
|
||||
value={item.shortcut}
|
||||
className="flex cursor-pointer items-center rounded-md
|
||||
p-2.5
|
||||
transition-all
|
||||
duration-150 hover:bg-state-base-hover aria-[selected=true]:bg-state-base-hover-alt"
|
||||
onSelect={() => onCommandSelect(action.shortcut)}
|
||||
onSelect={() => onCommandSelect(item.shortcut)}
|
||||
>
|
||||
<span className="min-w-[4.5rem] text-left font-mono text-xs text-text-tertiary">
|
||||
{action.shortcut}
|
||||
{item.shortcut}
|
||||
</span>
|
||||
<span className="ml-3 text-sm text-text-secondary">
|
||||
{(() => {
|
||||
const keyMap: Record<string, string> = {
|
||||
'/': 'app.gotoAnything.actions.slashDesc',
|
||||
'@app': 'app.gotoAnything.actions.searchApplicationsDesc',
|
||||
'@plugin': 'app.gotoAnything.actions.searchPluginsDesc',
|
||||
'@knowledge': 'app.gotoAnything.actions.searchKnowledgeBasesDesc',
|
||||
'@node': 'app.gotoAnything.actions.searchWorkflowNodesDesc',
|
||||
}
|
||||
return t(keyMap[action.key])
|
||||
})()}
|
||||
{isSlashMode ? (
|
||||
(() => {
|
||||
const slashKeyMap: Record<string, string> = {
|
||||
'/theme': 'app.gotoAnything.actions.themeCategoryDesc',
|
||||
'/language': 'app.gotoAnything.actions.languageChangeDesc',
|
||||
'/account': 'app.gotoAnything.actions.accountDesc',
|
||||
'/feedback': 'app.gotoAnything.actions.feedbackDesc',
|
||||
'/doc': 'app.gotoAnything.actions.docDesc',
|
||||
'/community': 'app.gotoAnything.actions.communityDesc',
|
||||
}
|
||||
return t(slashKeyMap[item.key] || item.description)
|
||||
})()
|
||||
) : (
|
||||
(() => {
|
||||
const keyMap: Record<string, string> = {
|
||||
'@app': 'app.gotoAnything.actions.searchApplicationsDesc',
|
||||
'@plugin': 'app.gotoAnything.actions.searchPluginsDesc',
|
||||
'@knowledge': 'app.gotoAnything.actions.searchKnowledgeBasesDesc',
|
||||
'@node': 'app.gotoAnything.actions.searchWorkflowNodesDesc',
|
||||
}
|
||||
return t(keyMap[item.key])
|
||||
})()
|
||||
)}
|
||||
</span>
|
||||
</Command.Item>
|
||||
))}
|
||||
|
||||
@ -226,6 +226,7 @@ const GotoAnything: FC<Props> = ({
|
||||
<div className='mt-3 space-y-1 text-xs text-text-quaternary'>
|
||||
<div>{t('app.gotoAnything.searchHint')}</div>
|
||||
<div>{t('app.gotoAnything.commandHint')}</div>
|
||||
<div>{t('app.gotoAnything.slashHint')}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>)
|
||||
@ -321,6 +322,7 @@ const GotoAnything: FC<Props> = ({
|
||||
searchFilter={searchQuery.trim().substring(1)}
|
||||
commandValue={cmdVal}
|
||||
onCommandValueChange={setCmdVal}
|
||||
originalQuery={searchQuery.trim()}
|
||||
/>
|
||||
) : (
|
||||
Object.entries(groupedResults).map(([type, results], groupIndex) => (
|
||||
|
||||
@ -133,7 +133,7 @@ const RunPanel: FC<RunProps> = ({
|
||||
>{t('runLog.tracing')}</div>
|
||||
</div>
|
||||
{/* panel detail */}
|
||||
<div ref={ref} className={cn('relative h-0 grow overflow-y-auto rounded-b-2xl bg-components-panel-bg')}>
|
||||
<div ref={ref} className={cn('relative h-0 grow overflow-y-auto rounded-b-xl bg-components-panel-bg')}>
|
||||
{loading && (
|
||||
<div className='flex h-full items-center justify-center bg-components-panel-bg'>
|
||||
<Loading />
|
||||
|
||||
@ -32,7 +32,7 @@ export const useGetPricingPageLanguage = () => {
|
||||
return getPricingPageLanguage(locale)
|
||||
}
|
||||
|
||||
const defaultDocBaseUrl = 'https://docs.dify.ai'
|
||||
export const defaultDocBaseUrl = 'https://docs.dify.ai'
|
||||
export const useDocLink = (baseUrl?: string): ((path?: string, pathMap?: { [index: string]: string }) => string) => {
|
||||
let baseDocUrl = baseUrl || defaultDocBaseUrl
|
||||
baseDocUrl = (baseDocUrl.endsWith('/')) ? baseDocUrl.slice(0, -1) : baseDocUrl
|
||||
|
||||
@ -279,6 +279,10 @@ const translation = {
|
||||
runDesc: 'Führen Sie schnelle Befehle aus (Thema, Sprache, ...)',
|
||||
themeCategoryTitle: 'Thema',
|
||||
slashDesc: 'Führen Sie Befehle wie /theme, /lang aus',
|
||||
accountDesc: 'Gehe zur Kontoseite',
|
||||
feedbackDesc: 'Offene Diskussionen zum Feedback der Gemeinschaft',
|
||||
communityDesc: 'Offene Discord-Community',
|
||||
docDesc: 'Öffnen Sie die Hilfedokumentation',
|
||||
},
|
||||
emptyState: {
|
||||
noPluginsFound: 'Keine Plugins gefunden',
|
||||
@ -313,6 +317,7 @@ const translation = {
|
||||
inScope: 'in {{scope}}s',
|
||||
noMatchingCommands: 'Keine übereinstimmenden Befehle gefunden',
|
||||
tryDifferentSearch: 'Versuchen Sie es mit einem anderen Suchbegriff',
|
||||
slashHint: 'Geben Sie / ein, um alle verfügbaren Befehle anzuzeigen.',
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@ -270,6 +270,7 @@ const translation = {
|
||||
selectSearchType: 'Choose what to search for',
|
||||
searchHint: 'Start typing to search everything instantly',
|
||||
commandHint: 'Type @ to browse by category',
|
||||
slashHint: 'Type / to see all available commands',
|
||||
actions: {
|
||||
searchApplications: 'Search Applications',
|
||||
searchApplicationsDesc: 'Search and navigate to your applications',
|
||||
@ -293,7 +294,11 @@ const translation = {
|
||||
languageCategoryTitle: 'Language',
|
||||
languageCategoryDesc: 'Switch interface language',
|
||||
languageChangeDesc: 'Change UI language',
|
||||
slashDesc: 'Execute commands like /theme, /lang',
|
||||
slashDesc: 'Execute commands (type / to see all available commands)',
|
||||
accountDesc: 'Navigate to account page',
|
||||
communityDesc: 'Open Discord community',
|
||||
docDesc: 'Open help documentation',
|
||||
feedbackDesc: 'Open community feedback discussions',
|
||||
},
|
||||
emptyState: {
|
||||
noAppsFound: 'No apps found',
|
||||
|
||||
@ -277,6 +277,10 @@ const translation = {
|
||||
languageCategoryDesc: 'Cambiar el idioma de la interfaz',
|
||||
themeCategoryDesc: 'Cambiar el tema de la aplicación',
|
||||
slashDesc: 'Ejecuta comandos como /tema, /idioma',
|
||||
accountDesc: 'Navegar a la página de cuenta',
|
||||
communityDesc: 'Abrir comunidad de Discord',
|
||||
feedbackDesc: 'Discusiones de retroalimentación de la comunidad abierta',
|
||||
docDesc: 'Abrir la documentación de ayuda',
|
||||
},
|
||||
emptyState: {
|
||||
noAppsFound: 'No se encontraron aplicaciones',
|
||||
@ -311,6 +315,7 @@ const translation = {
|
||||
inScope: 'en {{scope}}s',
|
||||
tryDifferentSearch: 'Prueba con un término de búsqueda diferente',
|
||||
noMatchingCommands: 'No se encontraron comandos coincidentes',
|
||||
slashHint: 'Escribe / para ver todos los comandos disponibles',
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@ -277,6 +277,10 @@ const translation = {
|
||||
themeSystemDesc: 'به ظاهر سیستمعامل خود پایبند باشید',
|
||||
runDesc: 'دستورات سریع اجرا کنید (موضوع، زبان، ...)',
|
||||
slashDesc: 'دستورات را مانند /theme، /lang اجرا کنید',
|
||||
feedbackDesc: 'بحثهای باز بازخورد جامعه',
|
||||
accountDesc: 'به صفحه حساب کاربری بروید',
|
||||
communityDesc: 'جامعه دیسکورد باز',
|
||||
docDesc: 'مستندات کمک را باز کنید',
|
||||
},
|
||||
emptyState: {
|
||||
noKnowledgeBasesFound: 'هیچ پایگاه دانش یافت نشد',
|
||||
@ -311,6 +315,7 @@ const translation = {
|
||||
inScope: 'در {{scope}}s',
|
||||
noMatchingCommands: 'هیچ دستوری منطبق یافت نشد',
|
||||
tryDifferentSearch: 'عبارت جستجوی دیگری را امتحان کنید',
|
||||
slashHint: 'برای مشاهده تمام دستورات موجود / را تایپ کنید',
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@ -277,6 +277,10 @@ const translation = {
|
||||
languageCategoryDesc: 'Changer la langue de l\'interface',
|
||||
runDesc: 'Exécuter des commandes rapides (thème, langue, ...)',
|
||||
slashDesc: 'Exécutez des commandes telles que /theme, /lang',
|
||||
communityDesc: 'Ouvrir la communauté Discord',
|
||||
docDesc: 'Ouvrir la documentation d\'aide',
|
||||
accountDesc: 'Accédez à la page de compte',
|
||||
feedbackDesc: 'Discussions de rétroaction de la communauté ouverte',
|
||||
},
|
||||
emptyState: {
|
||||
noKnowledgeBasesFound: 'Aucune base de connaissances trouvée',
|
||||
@ -311,6 +315,7 @@ const translation = {
|
||||
inScope: 'dans {{scope}}s',
|
||||
noMatchingCommands: 'Aucune commande correspondante n’a été trouvée',
|
||||
tryDifferentSearch: 'Essayez un autre terme de recherche',
|
||||
slashHint: 'Tapez / pour voir toutes les commandes disponibles',
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@ -277,6 +277,10 @@ const translation = {
|
||||
themeSystemDesc: 'अपने ऑपरेटिंग सिस्टम की उपस्थिति का पालन करें',
|
||||
runDesc: 'त्वरित कमांड चलाएँ (थीम, भाषा, ...)',
|
||||
slashDesc: 'कमांड्स चलाएं जैसे /theme, /lang',
|
||||
accountDesc: 'खाता पृष्ठ पर जाएं',
|
||||
docDesc: 'सहायता दस्तावेज़ खोलें',
|
||||
communityDesc: 'ओपन डिस्कॉर्ड समुदाय',
|
||||
feedbackDesc: 'खुले समुदाय की फीडबैक चर्चाएँ',
|
||||
},
|
||||
emptyState: {
|
||||
noPluginsFound: 'कोई प्लगइन नहीं मिले',
|
||||
@ -311,6 +315,7 @@ const translation = {
|
||||
inScope: '{{scope}}s में',
|
||||
tryDifferentSearch: 'एक अलग खोज शब्द आजमाएँ',
|
||||
noMatchingCommands: 'कोई मिलती-जुलती कमांड्स नहीं मिलीं',
|
||||
slashHint: 'सभी उपलब्ध कमांड देखने के लिए टाइप करें /',
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@ -283,6 +283,10 @@ const translation = {
|
||||
runDesc: 'Esegui comandi rapidi (tema, lingua, ...)',
|
||||
themeSystemDesc: 'Segui l\'aspetto del tuo sistema operativo',
|
||||
slashDesc: 'Esegui comandi come /theme, /lang',
|
||||
communityDesc: 'Apri la community di Discord',
|
||||
accountDesc: 'Vai alla pagina dell\'account',
|
||||
feedbackDesc: 'Discussioni di feedback della comunità aperta',
|
||||
docDesc: 'Apri la documentazione di aiuto',
|
||||
},
|
||||
emptyState: {
|
||||
noKnowledgeBasesFound: 'Nessuna base di conoscenza trovata',
|
||||
@ -317,6 +321,7 @@ const translation = {
|
||||
inScope: 'in {{scope}}s',
|
||||
tryDifferentSearch: 'Prova un termine di ricerca diverso',
|
||||
noMatchingCommands: 'Nessun comando corrispondente trovato',
|
||||
slashHint: 'Digita / per vedere tutti i comandi disponibili',
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@ -292,6 +292,10 @@ const translation = {
|
||||
themeCategoryDesc: 'アプリケーションのテーマを切り替える',
|
||||
runDesc: 'クイックコマンドを実行する(テーマ、言語、...)',
|
||||
slashDesc: 'コマンドを実行します、例えば /theme や /lang のように',
|
||||
accountDesc: 'アカウントページに移動する',
|
||||
docDesc: 'ヘルプドキュメントを開く',
|
||||
communityDesc: 'オープンDiscordコミュニティ',
|
||||
feedbackDesc: 'オープンなコミュニティフィードバックディスカッション',
|
||||
},
|
||||
emptyState: {
|
||||
noAppsFound: 'アプリが見つかりません',
|
||||
@ -310,6 +314,7 @@ const translation = {
|
||||
},
|
||||
noMatchingCommands: '一致するコマンドが見つかりません',
|
||||
tryDifferentSearch: '別の検索語句をお試しください',
|
||||
slashHint: '/を入力して、利用可能なすべてのコマンドを表示します。',
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@ -297,6 +297,10 @@ const translation = {
|
||||
runDesc: '빠른 명령 실행 (테마, 언어 등...)',
|
||||
themeSystemDesc: '운영 체제의 외관을 따르세요',
|
||||
slashDesc: '/theme, /lang와 같은 명령어를 실행하십시오.',
|
||||
communityDesc: '오픈 디스코드 커뮤니티',
|
||||
feedbackDesc: '공개 커뮤니티 피드백 토론',
|
||||
docDesc: '도움 문서 열기',
|
||||
accountDesc: '계정 페이지로 이동',
|
||||
},
|
||||
emptyState: {
|
||||
noAppsFound: '앱을 찾을 수 없습니다.',
|
||||
@ -331,6 +335,7 @@ const translation = {
|
||||
inScope: '{{scope}}s 내에서',
|
||||
tryDifferentSearch: '다른 검색어 사용해 보기',
|
||||
noMatchingCommands: '일치하는 명령을 찾을 수 없습니다.',
|
||||
slashHint: '모든 사용 가능한 명령을 보려면 /를 입력하세요.',
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@ -278,6 +278,10 @@ const translation = {
|
||||
themeSystemDesc: 'Podążaj za wyglądem swojego systemu operacyjnego',
|
||||
runDesc: 'Uruchom szybkie polecenia (motyw, język, ...)',
|
||||
slashDesc: 'Wykonuj polecenia takie jak /theme, /lang',
|
||||
communityDesc: 'Otwarta społeczność Discord',
|
||||
docDesc: 'Otwórz dokumentację pomocy',
|
||||
accountDesc: 'Przejdź do strony konta',
|
||||
feedbackDesc: 'Otwarte dyskusje na temat opinii społeczności',
|
||||
},
|
||||
emptyState: {
|
||||
noAppsFound: 'Nie znaleziono aplikacji',
|
||||
@ -312,6 +316,7 @@ const translation = {
|
||||
inScope: 'w {{scope}}s',
|
||||
noMatchingCommands: 'Nie znaleziono pasujących poleceń',
|
||||
tryDifferentSearch: 'Spróbuj użyć innego hasła',
|
||||
slashHint: 'Wpisz / aby zobaczyć wszystkie dostępne polecenia',
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@ -277,6 +277,10 @@ const translation = {
|
||||
themeSystemDesc: 'Siga a aparência do seu sistema operacional',
|
||||
languageCategoryDesc: 'Mudar o idioma da interface',
|
||||
slashDesc: 'Execute comandos como /tema, /idioma',
|
||||
accountDesc: 'Navegue até a página da conta',
|
||||
communityDesc: 'Comunidade do Discord aberta',
|
||||
feedbackDesc: 'Discussões de feedback da comunidade aberta',
|
||||
docDesc: 'Abra a documentação de ajuda',
|
||||
},
|
||||
emptyState: {
|
||||
noAppsFound: 'Nenhum aplicativo encontrado',
|
||||
@ -311,6 +315,7 @@ const translation = {
|
||||
inScope: 'em {{scope}}s',
|
||||
noMatchingCommands: 'Nenhum comando correspondente encontrado',
|
||||
tryDifferentSearch: 'Tente um termo de pesquisa diferente',
|
||||
slashHint: 'Digite / para ver todos os comandos disponíveis',
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@ -277,6 +277,10 @@ const translation = {
|
||||
languageCategoryDesc: 'Schimbați limba interfeței',
|
||||
themeSystemDesc: 'Urmăriți aspectul sistemului de operare',
|
||||
slashDesc: 'Execută comenzi precum /theme, /lang',
|
||||
feedbackDesc: 'Discuții de feedback deschis pentru comunitate',
|
||||
docDesc: 'Deschide documentația de ajutor',
|
||||
communityDesc: 'Deschide comunitatea Discord',
|
||||
accountDesc: 'Navigați la pagina de cont',
|
||||
},
|
||||
emptyState: {
|
||||
noAppsFound: 'Nu s-au găsit aplicații',
|
||||
@ -311,6 +315,7 @@ const translation = {
|
||||
inScope: 'în {{scope}}s',
|
||||
noMatchingCommands: 'Nu s-au găsit comenzi potrivite',
|
||||
tryDifferentSearch: 'Încercați un alt termen de căutare',
|
||||
slashHint: 'Tastați / pentru a vedea toate comenzile disponibile',
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@ -277,6 +277,10 @@ const translation = {
|
||||
themeLightDesc: 'Используйте светлый внешний вид',
|
||||
themeSystemDesc: 'Следуйте внешнему виду вашей операционной системы',
|
||||
slashDesc: 'Выполняйте команды, такие как /theme, /lang',
|
||||
accountDesc: 'Перейдите на страницу учетной записи',
|
||||
feedbackDesc: 'Обсуждения обратной связи с открытым сообществом',
|
||||
docDesc: 'Откройте справочную документацию',
|
||||
communityDesc: 'Открытое сообщество Discord',
|
||||
},
|
||||
emptyState: {
|
||||
noPluginsFound: 'Плагины не найдены',
|
||||
@ -311,6 +315,7 @@ const translation = {
|
||||
inScope: 'в {{scope}}s',
|
||||
noMatchingCommands: 'Соответствующие команды не найдены',
|
||||
tryDifferentSearch: 'Попробуйте использовать другой поисковый запрос',
|
||||
slashHint: 'Введите / чтобы увидеть все доступные команды',
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@ -277,6 +277,10 @@ const translation = {
|
||||
runDesc: 'Zaženi hitre ukaze (teme, jezik, ...)',
|
||||
languageChangeDesc: 'Spremeni jezik vmesnika',
|
||||
slashDesc: 'Izvedi ukaze kot so /tema, /jezik',
|
||||
accountDesc: 'Pojdite na stran računa',
|
||||
docDesc: 'Odprite pomoč dokumentacijo',
|
||||
feedbackDesc: 'Razprave o povratnih informacijah odprte skupnosti',
|
||||
communityDesc: 'Odpri Discord skupnost',
|
||||
},
|
||||
emptyState: {
|
||||
noPluginsFound: 'Vtičnikov ni mogoče najti',
|
||||
@ -311,6 +315,7 @@ const translation = {
|
||||
inScope: 'v {{scope}}s',
|
||||
tryDifferentSearch: 'Poskusite uporabiti drug iskalni izraz',
|
||||
noMatchingCommands: 'Ujemajoči se ukazi niso našli',
|
||||
slashHint: 'Vnesite / za ogled vseh razpoložljivih ukazov',
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@ -273,6 +273,10 @@ const translation = {
|
||||
themeLightDesc: 'ใช้รูปลักษณ์ที่มีความสว่าง',
|
||||
themeSystemDesc: 'ติดตามรูปลักษณ์ของระบบปฏิบัติการของคุณ',
|
||||
slashDesc: 'ใช้คำสั่งเช่น /theme, /lang',
|
||||
feedbackDesc: 'การอภิปรายข้อเสนอแนะแบบเปิดในชุมชน',
|
||||
accountDesc: 'ไปที่หน้าบัญชี',
|
||||
docDesc: 'เปิดเอกสารช่วยเหลือ',
|
||||
communityDesc: 'เปิดชุมชน Discord',
|
||||
},
|
||||
emptyState: {
|
||||
noPluginsFound: 'ไม่พบปลั๊กอิน',
|
||||
@ -307,6 +311,7 @@ const translation = {
|
||||
inScope: 'ใน {{scope}}s',
|
||||
noMatchingCommands: 'ไม่พบคำสั่งที่ตรงกัน',
|
||||
tryDifferentSearch: 'ลองใช้ข้อความค้นหาอื่น',
|
||||
slashHint: 'พิมพ์ / เพื่อดูคำสั่งที่มีให้ทั้งหมด',
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@ -273,6 +273,10 @@ const translation = {
|
||||
runDesc: 'Hızlı komutlar çalıştır (tema, dil, ...)',
|
||||
searchPluginsDesc: 'Eklentilerinizi arayın ve gezinin',
|
||||
slashDesc: '/tema, /dil gibi komutları çalıştırın',
|
||||
communityDesc: 'Açık Discord topluluğu',
|
||||
accountDesc: 'Hesap sayfasına gidin',
|
||||
feedbackDesc: 'Açık topluluk geri bildirim tartışmaları',
|
||||
docDesc: 'Yardım belgelerini aç',
|
||||
},
|
||||
emptyState: {
|
||||
noAppsFound: 'Uygulama bulunamadı',
|
||||
@ -307,6 +311,7 @@ const translation = {
|
||||
inScope: '{{scope}}s içinde',
|
||||
tryDifferentSearch: 'Farklı bir arama terimi deneyin',
|
||||
noMatchingCommands: 'Eşleşen komut bulunamadı',
|
||||
slashHint: 'Tüm mevcut komutları görmek için / yazın',
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@ -277,6 +277,10 @@ const translation = {
|
||||
themeSystemDesc: 'Дотримуйтесь зовнішнього вигляду вашої операційної системи',
|
||||
languageCategoryDesc: 'Переключити мову інтерфейсу',
|
||||
slashDesc: 'Виконуйте команди, такі як /theme, /lang',
|
||||
feedbackDesc: 'Відкриті обговорення відгуків громади',
|
||||
docDesc: 'Відкрийте документацію допомоги',
|
||||
accountDesc: 'Перейдіть на сторінку облікового запису',
|
||||
communityDesc: 'Відкрита Discord-спільнота',
|
||||
},
|
||||
emptyState: {
|
||||
noPluginsFound: 'Плагінів не знайдено',
|
||||
@ -311,6 +315,7 @@ const translation = {
|
||||
inScope: 'у {{scope}}s',
|
||||
noMatchingCommands: 'Відповідних команд не знайдено',
|
||||
tryDifferentSearch: 'Спробуйте інший пошуковий термін',
|
||||
slashHint: 'Наберіть / , щоб побачити всі доступні команди',
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@ -277,6 +277,10 @@ const translation = {
|
||||
runDesc: 'Chạy các lệnh nhanh (chủ đề, ngôn ngữ, ... )',
|
||||
themeCategoryDesc: 'Chuyển đổi giao diện ứng dụng',
|
||||
slashDesc: 'Thực hiện các lệnh như /theme, /lang',
|
||||
feedbackDesc: 'Thảo luận phản hồi cộng đồng mở',
|
||||
accountDesc: 'Đi đến trang tài khoản',
|
||||
docDesc: 'Mở tài liệu trợ giúp',
|
||||
communityDesc: 'Mở cộng đồng Discord',
|
||||
},
|
||||
emptyState: {
|
||||
noWorkflowNodesFound: 'Không tìm thấy nút quy trình làm việc',
|
||||
@ -311,6 +315,7 @@ const translation = {
|
||||
inScope: 'trong {{scope}}s',
|
||||
tryDifferentSearch: 'Thử một cụm từ tìm kiếm khác',
|
||||
noMatchingCommands: 'Không tìm thấy lệnh phù hợp',
|
||||
slashHint: 'Gõ / để xem tất cả các lệnh có sẵn',
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@ -269,6 +269,7 @@ const translation = {
|
||||
selectSearchType: '选择搜索内容',
|
||||
searchHint: '开始输入即可立即搜索所有内容',
|
||||
commandHint: '输入 @ 按类别浏览',
|
||||
slashHint: '输入 / 查看所有可用命令',
|
||||
actions: {
|
||||
searchApplications: '搜索应用程序',
|
||||
searchApplicationsDesc: '搜索并导航到您的应用程序',
|
||||
@ -292,7 +293,11 @@ const translation = {
|
||||
languageCategoryTitle: '语言',
|
||||
languageCategoryDesc: '切换界面语言',
|
||||
languageChangeDesc: '更改界面语言',
|
||||
slashDesc: '执行诸如 /theme、/lang 等命令',
|
||||
slashDesc: '执行命令(输入 / 查看所有可用命令)',
|
||||
accountDesc: '导航到账户页面',
|
||||
communityDesc: '打开 Discord 社区',
|
||||
docDesc: '打开帮助文档',
|
||||
feedbackDesc: '打开社区反馈讨论',
|
||||
},
|
||||
emptyState: {
|
||||
noAppsFound: '未找到应用',
|
||||
|
||||
@ -276,6 +276,10 @@ const translation = {
|
||||
languageChangeDesc: '更改 UI 語言',
|
||||
runDesc: '執行快速命令(主題、語言等...)',
|
||||
slashDesc: '執行命令如 /theme, /lang',
|
||||
communityDesc: '開放的 Discord 社區',
|
||||
accountDesc: '導航到帳戶頁面',
|
||||
feedbackDesc: '開放社區反饋討論',
|
||||
docDesc: '開啟幫助文件',
|
||||
},
|
||||
emptyState: {
|
||||
noAppsFound: '未找到應用',
|
||||
@ -310,6 +314,7 @@ const translation = {
|
||||
inScope: '在 {{scope}}s 中',
|
||||
noMatchingCommands: '未找到匹配的命令',
|
||||
tryDifferentSearch: '嘗試其他搜尋字詞',
|
||||
slashHint: '輸入 / 以查看所有可用的指令',
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user