From 89b1e33be092e80abbc9522b6146519bff6226d2 Mon Sep 17 00:00:00 2001 From: Yuichi Ohneda Date: Mon, 6 May 2024 20:07:00 -0700 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=80feat:=20Archive=20conversations=20(?= =?UTF-8?q?#2590)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🔧chore: add internationalization labels for archive feature * ✨ feat: Add function to useArchiveConversationMutation() This commit adds a new mutation function `useArchiveConversationMutation()` for archiving conversations. This function takes the ID string of the conversation to be archived and returns a mutation result object. Upon successful archiving, it removes and refreshes the conversation from the query data cache. While ChatGPT PATCHes the archived status by sending `{is_archived: true}` to the URL `/backend-api/conversation/$conversation_id`, this implementation uses the `dataService.updateConversation(payload)` with a POST method, aligning with the existing code conventions. * ✨ feat(api): add is_archived field to Conversation schema and update getConvosByPage method This commit adds a new field `is_archived` with a default value of false to the Conversation schema. It also modifies the `getConvosByPage` method within the Conversation API to adjust the query to only target conversations where `is_archived` is set to false or where the `is_archived` field does not exist. The function `getConvosQueried`, which returns conversations for a specified Conversation ID, was determined not to require consideration of whether `is_archived` is true or false, and thus was not modified. * ♻️ refactor: add className prop to DotsIcon component To enhance the versatility of the DotsIcon component, this commit introduces the ability to specify a className prop, allowing for greater customization. * ✨ feat(ui): add Edit Button to group Title change and Conversation delete buttons Added a new Edit Button to the conversations, similar to the ChatGPT UI, which groups options for editing the conversation title and deleting conversations. This grouping is accessible through a dialogue that appears when the three-dot icon is clicked. * ♻️ refactor(ui): enhance Delete Button to accept className and label options Enhanced the Delete Button component to accept a `className` for customization and an optional `appendLabel`. The DeleteButton component is used by both `Convo.tsx` and `Conversation.tsx`, but currently only `Convo.tsx` is active and `Conversation.tsx `is apparently not used; removing `Conversation.tsx` may eliminate the need for the `appendLabel` property in the future. * ♻️ refactor(ui): enhance RenameButton to accept label options Added the ability to optionally display labels; the Rename Button component is used by both `Convo.tsx` and `Conversation.tsx`, but currently only `Convo.tsx` is active and `Conversation.tsx `is apparently not used; removing `Conversation.tsx` may eliminate the need for the `appendLabel` property in the future. * 🔧 chors: additional localization labels * ♻️ refactor: change is_archived property of conversation to camelCase * Refactor the is_archived property of conversation to camelCase (isArchived) to adhere to the existing code conventions * Modify the function that retrieves conversations to accept the isArchived parameter * ♻️ refactor: add archiveConversation mutation I thought I could divert dataService.updateConversation, but added a new archiveConversation because the request types are different. It might be better to make them common, but to avoid side effects, I added a new function this time. Added process to deleteConversationMutation to delete archived conversations * ✨ feat: Add the function to hide a cancel button in DialogTemplate component The Cancel button is not needed when displaying the archive list, so I made the Cancel button optional. * ♻️ refactor: Add support for filtering archived conversations in Nav component This commit modifies the Nav component to add the ability to filter out archived conversations when fetching data. This is done by adding `isArchived: false` to the query parameters for both the `useConversationsInfiniteQuery()` and `useSearchInfiniteQuery()` hooks, effectively excluding any archived conversations from the results returned. * ♻️ refactor: add Tooltip to DeleteButton * Add Tooltip to DeleteButton component * Display Tooltip when DeleteButton only shows an Icon without text * ✨ feat(ui): add ArchiveButton component for archiving conversations To be compatible with the ChatGPT UI, no confirmation dialog is displayed when ArchiveButton is clicked. The basic behavior conforms to DeleteButton and RenameButton. * ✨ feat(ui): add Archive button to list of conversations Modify the Nav of the conversation list to include a dropdown that contains the Rename and Delete options, similar to the ChatGPT UI. Additionally, an Archive button has been added adjacent to the dropdown menu. * ✨ feat: Add ArchivedChatsTable component Adds the `ArchivedChatsTable` component, which displays a table of archived chats. It has been implemented to be as compatible with the ChatGPT UI as possible. * 🚑 fix(tooltip): increase z-index to ensure visibility over Dialog Resolve an issue where tooltips were not visible when displayed over a Dialog. The z-index of `DialogPrimitive.Portal` in `Dialog.tsx` is set to 999. Since the rationale for this value is unclear, the z-index of the tooltip has been increased to 1000 to guarantee its visibility above the Dialog component. * 🔧 chors: add internationalization labels --- api/models/Conversation.js | 12 +- api/models/schema/defaults.js | 4 + api/server/routes/convos.js | 10 +- .../Conversations/ArchiveButton.tsx | 81 +++++++++++++ client/src/components/Conversations/Convo.tsx | 45 +++++-- .../components/Conversations/DeleteButton.tsx | 54 ++++++++- .../Conversations/EditMenuButton.tsx | 54 +++++++++ .../components/Conversations/RenameButton.tsx | 14 ++- client/src/components/Nav/Nav.tsx | 4 +- .../SettingsTabs/General/ArchivedChats.tsx | 29 +++++ .../General/ArchivedChatsTable.tsx | 112 ++++++++++++++++++ .../Nav/SettingsTabs/General/General.tsx | 4 + client/src/components/svg/DotsIcon.tsx | 8 +- client/src/components/ui/DialogTemplate.tsx | 10 +- client/src/components/ui/Tooltip.tsx | 2 +- client/src/data-provider/mutations.ts | 63 +++++++++- client/src/data-provider/queries.ts | 8 +- client/src/localization/languages/Ar.ts | 13 ++ client/src/localization/languages/Br.ts | 13 ++ client/src/localization/languages/De.ts | 78 ++++++++---- client/src/localization/languages/Eng.ts | 13 ++ client/src/localization/languages/Es.ts | 13 ++ client/src/localization/languages/Fr.ts | 12 ++ client/src/localization/languages/He.ts | 13 ++ client/src/localization/languages/Id.ts | 13 ++ client/src/localization/languages/It.ts | 13 ++ client/src/localization/languages/Jp.ts | 31 +++-- client/src/localization/languages/Ko.ts | 13 ++ client/src/localization/languages/Nl.ts | 13 ++ client/src/localization/languages/Pl.ts | 13 ++ client/src/localization/languages/Ru.ts | 13 ++ client/src/localization/languages/Sv.ts | 13 ++ client/src/localization/languages/Tr.ts | 13 ++ client/src/localization/languages/Vi.ts | 6 + client/src/localization/languages/Zh.ts | 13 ++ .../localization/languages/ZhTraditional.ts | 13 ++ packages/data-provider/src/api-endpoints.ts | 4 +- packages/data-provider/src/data-service.ts | 9 +- packages/data-provider/src/keys.ts | 1 + packages/data-provider/src/types.ts | 7 ++ packages/data-provider/src/types/queries.ts | 1 + 41 files changed, 792 insertions(+), 66 deletions(-) create mode 100644 client/src/components/Conversations/ArchiveButton.tsx create mode 100644 client/src/components/Conversations/EditMenuButton.tsx create mode 100644 client/src/components/Nav/SettingsTabs/General/ArchivedChats.tsx create mode 100644 client/src/components/Nav/SettingsTabs/General/ArchivedChatsTable.tsx diff --git a/api/models/Conversation.js b/api/models/Conversation.js index 4c700425fe..2dfe8d51cd 100644 --- a/api/models/Conversation.js +++ b/api/models/Conversation.js @@ -54,11 +54,17 @@ module.exports = { throw new Error('Failed to save conversations in bulk.'); } }, - getConvosByPage: async (user, pageNumber = 1, pageSize = 25) => { + getConvosByPage: async (user, pageNumber = 1, pageSize = 25, isArchived = false) => { + const query = { user }; + if (isArchived) { + query.isArchived = true; + } else { + query.$or = [{ isArchived: false }, { isArchived: { $exists: false } }]; + } try { - const totalConvos = (await Conversation.countDocuments({ user })) || 1; + const totalConvos = (await Conversation.countDocuments(query)) || 1; const totalPages = Math.ceil(totalConvos / pageSize); - const convos = await Conversation.find({ user }) + const convos = await Conversation.find(query) .sort({ updatedAt: -1 }) .skip((pageNumber - 1) * pageSize) .limit(pageSize) diff --git a/api/models/schema/defaults.js b/api/models/schema/defaults.js index 775251d082..7e786d1c49 100644 --- a/api/models/schema/defaults.js +++ b/api/models/schema/defaults.js @@ -89,6 +89,10 @@ const conversationPreset = { type: String, }, stop: { type: [{ type: String }], default: undefined }, + isArchived: { + type: Boolean, + default: false, + }, /* UI Components */ iconURL: { type: String, diff --git a/api/server/routes/convos.js b/api/server/routes/convos.js index e478e48e5e..275f5a9755 100644 --- a/api/server/routes/convos.js +++ b/api/server/routes/convos.js @@ -24,7 +24,15 @@ router.get('/', async (req, res) => { return res.status(400).json({ error: 'Invalid page number' }); } - res.status(200).send(await getConvosByPage(req.user.id, pageNumber)); + let pageSize = req.query.pageSize || 25; + pageSize = parseInt(pageSize, 10); + + if (isNaN(pageSize) || pageSize < 1) { + return res.status(400).json({ error: 'Invalid page size' }); + } + const isArchived = req.query.isArchived === 'true'; + + res.status(200).send(await getConvosByPage(req.user.id, pageNumber, pageSize, isArchived)); }); router.get('/:conversationId', async (req, res) => { diff --git a/client/src/components/Conversations/ArchiveButton.tsx b/client/src/components/Conversations/ArchiveButton.tsx new file mode 100644 index 0000000000..ad535ca57b --- /dev/null +++ b/client/src/components/Conversations/ArchiveButton.tsx @@ -0,0 +1,81 @@ +import { TooltipProvider, Tooltip, TooltipTrigger, TooltipContent } from '~/components/ui'; +import type { MouseEvent, FocusEvent, KeyboardEvent } from 'react'; +import { useParams } from 'react-router-dom'; + +import { useArchiveConversationMutation } from '~/data-provider'; + +import { useConversations, useLocalize, useNewConvo } from '~/hooks'; +import { useToastContext } from '~/Providers'; +import { NotificationSeverity } from '~/common'; + +type ArchiveButtonProps = { + conversationId: string; + retainView: () => void; + shouldArchive: boolean; + icon: React.ReactNode; + twcss?: string; +}; +export default function ArchiveButton({ + conversationId, + retainView, + shouldArchive, + icon, + twcss = undefined, +}: ArchiveButtonProps) { + const localize = useLocalize(); + const { newConversation } = useNewConvo(); + const { showToast } = useToastContext(); + const { refreshConversations } = useConversations(); + const { conversationId: currentConvoId } = useParams(); + + const archiveConvoMutation = useArchiveConversationMutation(conversationId); + + const label = shouldArchive ? 'archive' : 'unarchive'; + const archiveHandler = ( + e: + | MouseEvent + | FocusEvent + | KeyboardEvent, + ) => { + e.preventDefault(); + archiveConvoMutation.mutate( + { conversationId, isArchived: shouldArchive }, + { + onSuccess: () => { + if (currentConvoId === conversationId) { + newConversation(); + } + refreshConversations(); + retainView(); + }, + onError: () => { + showToast({ + message: localize(`com_ui_${label}_error`), + severity: NotificationSeverity.ERROR, + showIcon: true, + }); + }, + }, + ); + }; + const classProp: { className?: string } = { + className: 'p-1 hover:text-black dark:hover:text-white', + }; + if (twcss) { + classProp.className = twcss; + } + return ( + + ); +} diff --git a/client/src/components/Conversations/Convo.tsx b/client/src/components/Conversations/Convo.tsx index 49e2f40f4f..7e4d7092e2 100644 --- a/client/src/components/Conversations/Convo.tsx +++ b/client/src/components/Conversations/Convo.tsx @@ -13,6 +13,9 @@ import { useToastContext } from '~/Providers'; import DeleteButton from './DeleteButton'; import RenameButton from './RenameButton'; import store from '~/store'; +import EditMenuButton from './EditMenuButton'; +import ArchiveButton from './ArchiveButton'; +import { Archive } from 'lucide-react'; type KeyEvent = KeyboardEvent; @@ -183,14 +186,40 @@ export default function Conversation({ conversation, retainView, toggleNav, isLa
)} {activeConvo ? ( -
- - +
+ {!renaming && ( + +
+
+ +
+
+ +
+
+
+ )} + {!renaming && ( + } + /> + )}
) : (
diff --git a/client/src/components/Conversations/DeleteButton.tsx b/client/src/components/Conversations/DeleteButton.tsx index c664fc3818..0e30fc42cd 100644 --- a/client/src/components/Conversations/DeleteButton.tsx +++ b/client/src/components/Conversations/DeleteButton.tsx @@ -4,12 +4,27 @@ import { QueryKeys } from 'librechat-data-provider'; import { useQueryClient } from '@tanstack/react-query'; import type { TMessage } from 'librechat-data-provider'; import { useDeleteConversationMutation } from '~/data-provider'; -import { Dialog, DialogTrigger, Label } from '~/components/ui'; +import { + Dialog, + DialogTrigger, + Label, + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from '~/components/ui'; import DialogTemplate from '~/components/ui/DialogTemplate'; import { TrashIcon, CrossIcon } from '~/components/svg'; import { useLocalize, useNewConvo } from '~/hooks'; -export default function DeleteButton({ conversationId, renaming, retainView, title }) { +export default function DeleteButton({ + conversationId, + renaming, + retainView, + title, + twcss, + appendLabel = false, +}) { const localize = useLocalize(); const queryClient = useQueryClient(); const { newConversation } = useNewConvo(); @@ -30,12 +45,41 @@ export default function DeleteButton({ conversationId, renaming, retainView, tit deleteConvoMutation.mutate({ conversationId, thread_id, source: 'button' }); }, [conversationId, deleteConvoMutation, queryClient]); + const classProp: { className?: string } = { + className: 'p-1 hover:text-black dark:hover:text-white', + }; + if (twcss) { + classProp.className = twcss; + } + + const renderDeleteButton = () => { + if (appendLabel) { + return ( + <> + {localize('com_ui_delete')} + + ); + } + return ( + + + + + + + + + {localize('com_ui_delete')} + + + + ); + }; + return ( - + = ({ children }: EditMenuButtonProps) => { + const localize = useLocalize(); + + return ( + + +
+ + + + + + + {localize('com_ui_more_options')} + + + +
+
+ + + {children} + + +
+ ); +}; + +export default EditMenuButton; diff --git a/client/src/components/Conversations/RenameButton.tsx b/client/src/components/Conversations/RenameButton.tsx index b18d2199fe..ddca75a964 100644 --- a/client/src/components/Conversations/RenameButton.tsx +++ b/client/src/components/Conversations/RenameButton.tsx @@ -1,11 +1,13 @@ import type { MouseEvent, ReactElement } from 'react'; import { EditIcon, CheckMark } from '~/components/svg'; +import { useLocalize } from '~/hooks'; interface RenameButtonProps { renaming: boolean; renameHandler: (e: MouseEvent) => void; onRename: (e: MouseEvent) => void; twcss?: string; + appendLabel?: boolean; } export default function RenameButton({ @@ -13,7 +15,9 @@ export default function RenameButton({ renameHandler, onRename, twcss, + appendLabel = false, }: RenameButtonProps): ReactElement { + const localize = useLocalize(); const handler = renaming ? onRename : renameHandler; const classProp: { className?: string } = { className: 'p-1 hover:text-black dark:hover:text-white', @@ -23,7 +27,15 @@ export default function RenameButton({ } return ( ); } diff --git a/client/src/components/Nav/Nav.tsx b/client/src/components/Nav/Nav.tsx index 813ac9ea35..f096622eca 100644 --- a/client/src/components/Nav/Nav.tsx +++ b/client/src/components/Nav/Nav.tsx @@ -58,12 +58,12 @@ const Nav = ({ navVisible, setNavVisible }) => { const setSearchResultMessages = useSetRecoilState(store.searchResultMessages); const { data, fetchNextPage, hasNextPage, isFetchingNextPage } = useConversationsInfiniteQuery( - { pageNumber: pageNumber.toString() }, + { pageNumber: pageNumber.toString(), isArchived: false }, { enabled: isAuthenticated }, ); const searchQueryRes = useSearchInfiniteQuery( - { pageNumber: pageNumber.toString(), searchQuery: searchQuery }, + { pageNumber: pageNumber.toString(), searchQuery: searchQuery, isArchived: false }, { enabled: isAuthenticated && !!searchQuery.length }, ); diff --git a/client/src/components/Nav/SettingsTabs/General/ArchivedChats.tsx b/client/src/components/Nav/SettingsTabs/General/ArchivedChats.tsx new file mode 100644 index 0000000000..d033e0ddb5 --- /dev/null +++ b/client/src/components/Nav/SettingsTabs/General/ArchivedChats.tsx @@ -0,0 +1,29 @@ +import { useLocalize } from '~/hooks'; +import { Dialog, DialogTrigger } from '~/components/ui'; +import DialogTemplate from '~/components/ui/DialogTemplate'; + +import ArchivedChatsTable from './ArchivedChatsTable'; + +export default function ArchivedChats() { + const localize = useLocalize(); + + return ( +
+
{localize('com_nav_archived_chats')}
+ + + + + + } + /> + +
+ ); +} diff --git a/client/src/components/Nav/SettingsTabs/General/ArchivedChatsTable.tsx b/client/src/components/Nav/SettingsTabs/General/ArchivedChatsTable.tsx new file mode 100644 index 0000000000..ea87a539d9 --- /dev/null +++ b/client/src/components/Nav/SettingsTabs/General/ArchivedChatsTable.tsx @@ -0,0 +1,112 @@ +import { useAuthContext, useLocalize, useNavScrolling } from '~/hooks'; +import { MessageCircle, ArchiveRestore, Archive } from 'lucide-react'; +import { useMemo, useState } from 'react'; +import { useConversationsInfiniteQuery } from '~/data-provider'; +import DeleteButton from '~/components/Conversations/DeleteButton'; +import { cn } from '~/utils'; +import { Spinner } from '~/components'; +import ArchiveButton from '~/components/Conversations/ArchiveButton'; + +export default function ArchivedChatsTable({ className }: { className?: string }) { + const localize = useLocalize(); + const { isAuthenticated } = useAuthContext(); + const [showLoading, setShowLoading] = useState(false); + + const { data, fetchNextPage, hasNextPage, isFetchingNextPage } = useConversationsInfiniteQuery( + { pageNumber: '1', isArchived: true }, + { enabled: isAuthenticated }, + ); + + const { containerRef, moveToTop } = useNavScrolling({ + setShowLoading, + hasNextPage: hasNextPage, + fetchNextPage: fetchNextPage, + isFetchingNextPage: isFetchingNextPage, + }); + + const conversations = useMemo( + () => data?.pages.flatMap((page) => page.conversations) || [], + [data], + ); + + const classProp: { className?: string } = { + className: 'p-1 hover:text-black dark:hover:text-white', + }; + if (className) { + classProp.className = className; + } + + if (!conversations || conversations.length === 0) { + return
{localize('com_nav_archived_chats_empty')}
; + } + + return ( +
+ + + + + + + + + {conversations.map((conversation) => ( + + + + + ))} + +
{localize('com_nav_archive_name')}{localize('com_nav_archive_created_at')}
+ + {conversation.title} + +
+
+ {new Date(conversation.createdAt).toLocaleDateString('en-US', { + month: 'long', + day: 'numeric', + year: 'numeric', + })} +
+
+ {conversation.conversationId && ( + <> + } + /> + +
+ +
+ + )} +
+
+
+ {(isFetchingNextPage || showLoading) && ( + + )} +
+ ); +} diff --git a/client/src/components/Nav/SettingsTabs/General/General.tsx b/client/src/components/Nav/SettingsTabs/General/General.tsx index 8c09cdf3d9..2c3cb643e8 100644 --- a/client/src/components/Nav/SettingsTabs/General/General.tsx +++ b/client/src/components/Nav/SettingsTabs/General/General.tsx @@ -9,6 +9,7 @@ import AutoScrollSwitch from './AutoScrollSwitch'; import { Dropdown } from '~/components/ui'; import DangerButton from '../DangerButton'; import store from '~/store'; +import ArchivedChats from './ArchivedChats'; export const ThemeSelector = ({ theme, @@ -157,6 +158,9 @@ function General() {
+
+ +
{/*
*/}
diff --git a/client/src/components/svg/DotsIcon.tsx b/client/src/components/svg/DotsIcon.tsx index 6afff1ae30..731c9be8a9 100644 --- a/client/src/components/svg/DotsIcon.tsx +++ b/client/src/components/svg/DotsIcon.tsx @@ -1,6 +1,10 @@ import React from 'react'; -export default function DotsIcon() { +export default function DotsIcon({ + className = 'h-4 w-4 flex-shrink-0 text-gray-500', +}: { + className?: string; +}) { return ( ) => { @@ -40,6 +41,7 @@ const DialogTemplate = forwardRef((props: DialogTemplateProps, ref: Ref
{leftButtons ? leftButtons : null}
- - {Cancel} - + {showCancelButton && ( + + {Cancel} + + )} {buttons ? buttons : null} {selection ? ( => { + const queryClient = useQueryClient(); + return useMutation( + (payload: t.TArchiveConversationRequest) => dataService.archiveConversation(payload), + { + onSuccess: (_data, vars) => { + if (vars.isArchived) { + queryClient.setQueryData([QueryKeys.conversation, id], null); + } else { + queryClient.setQueryData([QueryKeys.conversation, id], _data); + } + + queryClient.setQueryData([QueryKeys.allConversations], (convoData) => { + if (!convoData) { + return convoData; + } + if (vars.isArchived) { + return deleteConversation(convoData, id as string); + } else { + return addConversation(convoData, _data); + } + }); + queryClient.setQueryData( + [QueryKeys.archivedConversations], + (convoData) => { + if (!convoData) { + return convoData; + } + if (vars.isArchived) { + return addConversation(convoData, _data); + } else { + return deleteConversation(convoData, id as string); + } + }, + ); + }, + }, + ); +}; + export const useDeleteConversationMutation = ( options?: t.DeleteConversationOptions, ): UseMutationResult< @@ -87,14 +134,20 @@ export const useDeleteConversationMutation = ( if (!vars.conversationId) { return; } - queryClient.setQueryData([QueryKeys.conversation, vars.conversationId], null); - queryClient.setQueryData([QueryKeys.allConversations], (convoData) => { + + const handleDelete = (convoData) => { if (!convoData) { return convoData; } - const update = deleteConversation(convoData, vars.conversationId as string); - return update; - }); + return deleteConversation(convoData, vars.conversationId as string); + }; + + queryClient.setQueryData([QueryKeys.conversation, vars.conversationId], null); + queryClient.setQueryData([QueryKeys.allConversations], handleDelete); + queryClient.setQueryData( + [QueryKeys.archivedConversations], + handleDelete, + ); onSuccess?.(_data, vars, context); }, ...(_options || {}), diff --git a/client/src/data-provider/queries.ts b/client/src/data-provider/queries.ts index 7de2d9c2de..feb8b9227e 100644 --- a/client/src/data-provider/queries.ts +++ b/client/src/data-provider/queries.ts @@ -136,9 +136,13 @@ export const useConversationsInfiniteQuery = ( config?: UseInfiniteQueryOptions, ) => { return useInfiniteQuery( - [QueryKeys.allConversations], + params?.isArchived ? [QueryKeys.archivedConversations] : [QueryKeys.allConversations], ({ pageParam = '' }) => - dataService.listConversations({ ...params, pageNumber: pageParam?.toString() }), + dataService.listConversations({ + ...params, + pageNumber: pageParam?.toString(), + isArchived: params?.isArchived || false, + }), { getNextPageParam: (lastPage) => { const currentPageNumber = Number(lastPage.pageNumber); diff --git a/client/src/localization/languages/Ar.ts b/client/src/localization/languages/Ar.ts index 8488d503e5..0c853f9353 100644 --- a/client/src/localization/languages/Ar.ts +++ b/client/src/localization/languages/Ar.ts @@ -54,6 +54,12 @@ export default { com_ui_delete: 'حذف', com_ui_delete_conversation: 'حذف الدردشة؟', com_ui_delete_conversation_confirm: 'سيتم حذف هذا', + com_ui_rename: 'إعادة تسمية', + com_ui_archive: 'أرشفة', + com_ui_archive_error: 'فشل في أرشفة المحادثة', + com_ui_unarchive: 'إلغاء الأرشفة', + com_ui_unarchive_error: 'فشل في إلغاء الأرشفة', + com_ui_more_options: 'المزيد', com_auth_error_login: 'تعذر تسجيل الدخول باستخدام المعلومات المقدمة. يرجى التحقق من بيانات الاعتماد الخاصة بك والمحاولة مرة أخرى.', com_auth_error_login_rl: @@ -258,6 +264,13 @@ export default { com_nav_open_sidebar: 'افتح القائمة الجانبية', com_nav_log_out: 'تسجيل الخروج', com_nav_user: 'المستخدم', + com_nav_archived_chats: 'الدردشات المؤرشفة', + com_nav_archived_chats_manage: 'إدارة', + com_nav_archived_chats_empty: 'ليس لديك أي دردشات مؤرشفة.', + com_nav_archive_all_chats: 'الأرشفة على كل الدردشات', + com_nav_archive_all: 'الأرشفة على كل الدردشات', + com_nav_archive_name: 'الاسم', + com_nav_archive_created_at: 'تاريخ الإنشاء', com_nav_clear_conversation: 'مسح المحادثات', com_nav_clear_conversation_confirm_message: 'هل أنت متأكد أنك تريد مسح جميع المحادثات؟ هذا لا يمكن التراجع عنه.', diff --git a/client/src/localization/languages/Br.ts b/client/src/localization/languages/Br.ts index 9b4faaac6a..1765c22a7b 100644 --- a/client/src/localization/languages/Br.ts +++ b/client/src/localization/languages/Br.ts @@ -139,6 +139,12 @@ export default { com_ui_delete_conversation_confirm: 'Isso excluirá', com_ui_delete_assistant_confirm: 'Tem certeza de que deseja excluir este Assistente? Esta ação não pode ser desfeita.', + com_ui_rename: 'Renomear', + com_ui_archive: 'Arquivar', + com_ui_archive_error: 'Ocorreu um erro ao arquivar a conversa.', + com_ui_unarchive: 'Desarquivar', + com_ui_unarchive_error: 'Ocorreu um erro ao desarquivar a conversa.', + com_ui_more_options: 'Mais', com_ui_preview: 'Visualizar', com_ui_upload: 'Carregar', com_ui_connect: 'Conectar', @@ -425,6 +431,13 @@ export default { com_nav_send_message: 'Enviar mensagem', com_nav_log_out: 'Sair', com_nav_user: 'USUÁRIO', + com_nav_archived_chats: 'Conversas Arquivadas', + com_nav_archived_chats_manage: 'Gerenciar', + com_nav_archived_chats_empty: 'Você não tem nenhuma conversa arquivada.', + com_nav_archive_all_chats: 'Arquivar todas as conversas', + com_nav_archive_all: 'Arquivar todas', + com_nav_archive_name: 'Nome', + com_nav_archive_created_at: 'CriadoEm', com_nav_clear_conversation: 'Limpar conversas', com_nav_clear_conversation_confirm_message: 'Tem certeza de que deseja limpar todas as conversas? Isso é irreversível.', diff --git a/client/src/localization/languages/De.ts b/client/src/localization/languages/De.ts index 14ea051d05..79545fb34a 100644 --- a/client/src/localization/languages/De.ts +++ b/client/src/localization/languages/De.ts @@ -36,19 +36,23 @@ export default { com_assistants_domain_info: 'Assistent hat diese Info an {0} gesendet', com_assistants_delete_actions_success: 'Aktion vom Assistant erfolgreich gelöscht', com_assistants_update_actions_success: 'Erfolgreich erstellte oder aktualisierte Aktion', - com_assistants_update_actions_error: 'Beim Erstellen oder Aktualisieren der Aktion ist ein Fehler aufgetreten.', + com_assistants_update_actions_error: + 'Beim Erstellen oder Aktualisieren der Aktion ist ein Fehler aufgetreten.', com_assistants_delete_actions_error: 'Beim Löschen der Aktion ist ein Fehler aufgetreten.', - com_assistants_actions_info: 'Lass deinen Assistenten Informationen abrufen oder Aktionen über API\'s ausführen', + com_assistants_actions_info: + 'Lass deinen Assistenten Informationen abrufen oder Aktionen über API\'s ausführen', com_assistants_name_placeholder: 'Optional: Der Name des Assistenten', com_assistants_instructions_placeholder: 'Die Systemanweisungen, die der Assistent verwendet', com_assistants_description_placeholder: 'Optional: Beschreibe hier deinen Assistenten', - com_assistants_actions_disabled: 'Du musst einen Assistenten erstellen, bevor du Aktionen hinzufügen kannst.', + com_assistants_actions_disabled: + 'Du musst einen Assistenten erstellen, bevor du Aktionen hinzufügen kannst.', com_assistants_update_success: 'Erfolgreich aktualisiert', com_assistants_update_error: 'Beim Aktualisieren deines Assistenten ist ein Fehler aufgetreten.', com_assistants_create_success: 'Erfolgreich erstellt', com_assistants_create_error: 'Bei der Erstellung deines Assistenten ist ein Fehler aufgetreten.', com_ui_field_required: 'Dieses Feld ist erforderlich', - com_ui_download_error: 'Fehler beim Herunterladen der Datei. Die Datei wurde möglicherweise gelöscht.', + com_ui_download_error: + 'Fehler beim Herunterladen der Datei. Die Datei wurde möglicherweise gelöscht.', com_ui_attach_error_type: 'Nicht unterstützter Dateityp für Endpunkt:', com_ui_attach_error_size: 'Dateigrößenlimit für den Endpunkt überschritten:', com_ui_attach_error: @@ -57,10 +61,12 @@ export default { com_ui_new_chat: 'Neuer Chat', com_ui_happy_birthday: 'Es ist mein 1. Geburtstag!', com_ui_example_quantum_computing: 'Erkläre Quantencomputing in einfachen Worten', - com_ui_example_10_year_old_b_day: 'Hast du eine kreative Idee für den Geburtstag eines 10-Jährigen?', + com_ui_example_10_year_old_b_day: + 'Hast du eine kreative Idee für den Geburtstag eines 10-Jährigen?', com_ui_example_http_in_js: 'Wie stelle ich eine HTTP-Anfrage in Javascript?', com_ui_capabilities: 'Funktionen', - com_ui_capability_remember: 'Erinnert sich daran, was der Benutzer zu einem früheren Zeitpunkt in der Konversation gesagt hat', + com_ui_capability_remember: + 'Erinnert sich daran, was der Benutzer zu einem früheren Zeitpunkt in der Konversation gesagt hat', com_ui_capability_correction: 'Ermöglicht es dem Benutzer, nachträgliche Korrekturen vorzunehmen', com_ui_capability_decline_requests: 'Ermöglicht es, unangemessene Anfragen abzulehnen', com_ui_limitations: 'Limitationen', @@ -110,7 +116,8 @@ export default { com_ui_submit: 'Abschicken', com_ui_upload_success: 'Erfolgreich hochgeladene Datei', com_ui_upload_error: 'Beim Hochladen deiner Datei ist ein Fehler aufgetreten', - com_ui_upload_invalid: 'Ungültige Datei zum Hochladen. Muss ein Bild sein, das nicht größer als 2 MB ist', + com_ui_upload_invalid: + 'Ungültige Datei zum Hochladen. Muss ein Bild sein, das nicht größer als 2 MB ist', com_ui_cancel: 'Abbrechen', com_ui_save: 'Speichern', com_ui_save_submit: 'Speichern & Absenden', @@ -145,6 +152,12 @@ export default { com_ui_delete_conversation_confirm: 'Damit wird gelöscht', com_ui_delete_assistant_confirm: 'Bist du sicher, dass du diesen Assistenten löschen willst? Dies kann nicht rückgängig gemacht werden.', + com_ui_rename: 'Umbenennen', + com_ui_archive: 'Archiv', + com_ui_archive_error: 'Fehler beim Archivieren der Konversation', + com_ui_unarchive: 'Entarchivieren', + com_ui_unarchive_error: 'Fehler beim Entarchivieren der Konversation', + com_ui_more_options: 'Mehr', com_ui_preview: 'Vorschau', com_ui_upload: 'Hochladen', com_ui_connect: 'Verbinden', @@ -240,7 +253,8 @@ export default { com_endpoint_google_maxoutputtokens: ' Maximale Anzahl von Token, die in der Antwort erzeugt werden können. Gib einen niedrigeren Wert für kürzere Antworten und einen höheren Wert für längere Antworten an.', com_endpoint_google_custom_name_placeholder: 'Setze einen benutzerdefinierten Namen für Google', - com_endpoint_prompt_prefix_placeholder: 'Setze benutzerdefinierte Anweisungen oder Kontext. Ignoriert, wenn leer.', + com_endpoint_prompt_prefix_placeholder: + 'Setze benutzerdefinierte Anweisungen oder Kontext. Ignoriert, wenn leer.', com_endpoint_instructions_assistants_placeholder: 'Setzt die Anweisungen des Assistenten außer Kraft. Dies ist nützlich, um das Verhalten pro Lauf zu ändern.', com_endpoint_prompt_prefix_assistants_placeholder: @@ -294,13 +308,18 @@ export default { com_endpoint_plug_set_custom_instructions_for_gpt_placeholder: 'Setzt benutzerdefinierte Anweisungen, die in die Systemaufforderung aufgenommen werden. Standard: keine', com_endpoint_import: 'Importieren', - com_endpoint_set_custom_name: 'Lege einen benutzerdefinierten Namen fest, für den Fall, dass du diese Vorgabe finden kannst', + com_endpoint_set_custom_name: + 'Lege einen benutzerdefinierten Namen fest, für den Fall, dass du diese Vorgabe finden kannst', com_endpoint_preset_delete_confirm: 'Bist du sicher, dass du diese Vorgabe löschen willst?', - com_endpoint_preset_clear_all_confirm: 'Bist du sicher, dass du alle deine Voreinstellungen löschen willst?', + com_endpoint_preset_clear_all_confirm: + 'Bist du sicher, dass du alle deine Voreinstellungen löschen willst?', com_endpoint_preset_import: 'Voreinstellung importiert!', - com_endpoint_preset_import_error: 'Beim Import deiner Voreinstellung ist ein Fehler aufgetreten. Bitte versuche es erneut.', - com_endpoint_preset_save_error: 'Es ist ein Fehler beim Speichern deiner Voreinstellung aufgetreten. Bitte versuche es noch einmal.', - com_endpoint_preset_delete_error: 'Beim Löschen deiner Voreinstellung ist ein Fehler aufgetreten. Bitte versuche es noch einmal.', + com_endpoint_preset_import_error: + 'Beim Import deiner Voreinstellung ist ein Fehler aufgetreten. Bitte versuche es erneut.', + com_endpoint_preset_save_error: + 'Es ist ein Fehler beim Speichern deiner Voreinstellung aufgetreten. Bitte versuche es noch einmal.', + com_endpoint_preset_delete_error: + 'Beim Löschen deiner Voreinstellung ist ein Fehler aufgetreten. Bitte versuche es noch einmal.', com_endpoint_preset_default_removed: 'ist nicht mehr die Standardvorgabe.', com_endpoint_preset_default_item: 'Standard:', com_endpoint_preset_default_none: 'Keine Standardvoreinstellung aktiv.', @@ -328,7 +347,8 @@ export default { com_endpoint_presets_clear_warning: 'Bist du sicher, dass du alle Voreinstellungen löschen willst? Dies ist nicht umkehrbar.', com_endpoint_not_implemented: 'Nicht implementiert', - com_endpoint_no_presets: 'Es gibt noch keine Voreinstellungen, verwende die Schaltfläche Einstellungen, um eine zu erstellen', + com_endpoint_no_presets: + 'Es gibt noch keine Voreinstellungen, verwende die Schaltfläche Einstellungen, um eine zu erstellen', com_endpoint_not_available: 'Kein Endpunkt verfügbar', com_endpoint_view_options: 'Ansichtsoptionen', com_endpoint_save_convo_as_preset: 'Konversation als Voreinstellung speichern', @@ -339,7 +359,8 @@ export default { com_endpoint_skip_hover: 'Aktiviere das Überspringen des Abschlussschritts, der die endgültige Antwort und die generierten Schritte überprüft', com_endpoint_config_key: 'API-Schlüssel festlegen', - com_endpoint_assistant_placeholder: 'Bitte wähle einen Assistenten aus dem rechter Seitenleiste aus', + com_endpoint_assistant_placeholder: + 'Bitte wähle einen Assistenten aus dem rechter Seitenleiste aus', com_endpoint_config_placeholder: 'Setze deinen Schlüssel im Header-Menü ein, um zu chatten.', com_endpoint_config_key_for: 'Setze den API-Schlüssel für', com_endpoint_config_key_name: 'Schlüssel', @@ -352,17 +373,22 @@ export default { com_endpoint_config_google_cloud_platform: '(von Google Cloud Platform)', com_endpoint_config_google_api_key: 'Google API Key', com_endpoint_config_google_gemini_api: '(Gemini API)', - com_endpoint_config_google_api_info: 'Um deinen Generative Language API-Schlüssel (für Gemini) zu erhalten,', + com_endpoint_config_google_api_info: + 'Um deinen Generative Language API-Schlüssel (für Gemini) zu erhalten,', com_endpoint_config_key_import_json_key: 'Import Service Account JSON Key.', - com_endpoint_config_key_import_json_key_success: 'Erfolgreich importierter Service Account JSON Key', + com_endpoint_config_key_import_json_key_success: + 'Erfolgreich importierter Service Account JSON Key', com_endpoint_config_key_import_json_key_invalid: 'Ungültiger Service Account JSON Key, Hast du die richtige Datei importiert?', - com_endpoint_config_key_get_edge_key: 'Um dein Access Token für Bing zu erhalten, melde dich an bei', + com_endpoint_config_key_get_edge_key: + 'Um dein Access Token für Bing zu erhalten, melde dich an bei', com_endpoint_config_key_get_edge_key_dev_tool: 'Verwende Dev-Tools oder eine Erweiterung, während du auf der Website angemeldet bist, um den Inhalt des _U-Cookies zu kopieren. Wenn dies fehlschlägt, befolge die folgenden Anweisungen', com_endpoint_config_key_edge_instructions: 'Anweisungen', - com_endpoint_config_key_edge_full_key_string: 'um die vollständigen Cookie-Strings bereitzustellen.', - com_endpoint_config_key_chatgpt: 'Um dein Zugangstoken für ChatGPT \'Free Version\' zu erhalten, melde dich bei', + com_endpoint_config_key_edge_full_key_string: + 'um die vollständigen Cookie-Strings bereitzustellen.', + com_endpoint_config_key_chatgpt: + 'Um dein Zugangstoken für ChatGPT \'Free Version\' zu erhalten, melde dich bei', com_endpoint_config_key_chatgpt_then_visit: 'dann besuche', com_endpoint_config_key_chatgpt_copy_token: 'Kopiere das Zugangstoken.', com_endpoint_config_key_google_need_to: 'Du musst', @@ -385,7 +411,8 @@ export default { com_nav_tool_add: 'Hinzufügen', com_nav_tool_remove: 'Löschen', com_nav_tool_dialog: 'Assistententools', - com_nav_tool_dialog_description: 'Der Assistent muss gespeichert werden, um die Werkzeugauswahl beizubehalten.', + com_nav_tool_dialog_description: + 'Der Assistent muss gespeichert werden, um die Werkzeugauswahl beizubehalten.', com_show_agent_settings: 'Agent-Einstellungen anzeigen', com_show_completion_settings: 'Fertigstellungseinstellungen anzeigen', com_hide_examples: 'Beispiele ausblenden', @@ -418,6 +445,13 @@ export default { com_nav_send_message: 'Nachricht senden', com_nav_log_out: 'Abmelden', com_nav_user: 'NUTZER', + com_nav_archived_chats: 'Archivierte Chats', + com_nav_archived_chats_manage: 'Verwalten', + com_nav_archived_chats_empty: 'Keine archivierten Chats', + com_nav_archive_all_chats: 'Alle Chats archivieren', + com_nav_archive_all: 'Archivieren', + com_nav_archive_name: 'Name', + com_nav_archive_created_at: 'ErstelltAm', com_nav_clear_conversation: 'Unterhaltungen löschen', com_nav_clear_conversation_confirm_message: 'Bist du sicher, dass du alle Unterhaltungen löschen willst? Dies ist unumkehrbar.', @@ -429,4 +463,4 @@ export default { com_nav_setting_data: 'Datenkontrollen', com_nav_setting_account: 'Konto', com_nav_language: 'Sprache', -}; \ No newline at end of file +}; diff --git a/client/src/localization/languages/Eng.ts b/client/src/localization/languages/Eng.ts index 792a7ecb64..6bdd2257a5 100644 --- a/client/src/localization/languages/Eng.ts +++ b/client/src/localization/languages/Eng.ts @@ -183,6 +183,12 @@ export default { com_ui_delete_conversation_confirm: 'This will delete', com_ui_delete_assistant_confirm: 'Are you sure you want to delete this Assistant? This cannot be undone.', + com_ui_rename: 'Rename', + com_ui_archive: 'Archive', + com_ui_archive_error: 'Failed to archive conversation', + com_ui_unarchive: 'Unarchive', + com_ui_unarchive_error: 'Failed to unarchive conversation', + com_ui_more_options: 'More', com_ui_preview: 'Preview', com_ui_upload: 'Upload', com_ui_connect: 'Connect', @@ -463,6 +469,13 @@ export default { com_nav_send_message: 'Send message', com_nav_log_out: 'Log out', com_nav_user: 'USER', + com_nav_archived_chats: 'Archived chats', + com_nav_archived_chats_manage: 'Manage', + com_nav_archived_chats_empty: 'You have no archived conversations.', + com_nav_archive_all_chats: 'Archive all chats', + com_nav_archive_all: 'Archive all', + com_nav_archive_name: 'Name', + com_nav_archive_created_at: 'DateCreated', com_nav_clear_conversation: 'Clear conversations', com_nav_clear_conversation_confirm_message: 'Are you sure you want to clear all conversations? This is irreversible.', diff --git a/client/src/localization/languages/Es.ts b/client/src/localization/languages/Es.ts index 19e87ba540..01b423745d 100644 --- a/client/src/localization/languages/Es.ts +++ b/client/src/localization/languages/Es.ts @@ -141,6 +141,12 @@ export default { com_ui_delete_conversation_confirm: 'Esto eliminará', com_ui_delete_assistant_confirm: '¿Está seguro de que desea eliminar este Asistente? Esta acción no se puede deshacer.', + com_ui_rename: 'Renombrar', + com_ui_archive: 'Archivar', + com_ui_archive_error: 'Error al archivar la conversación', + com_ui_unarchive: 'Desarchivar', + com_ui_unarchive_error: 'Error al desarchivar la conversación', + com_ui_more_options: 'Más', com_ui_preview: 'Previsualizar', com_ui_upload: 'Subir', com_ui_connect: 'Conectar', @@ -431,6 +437,13 @@ export default { com_nav_send_message: 'Enviar mensaje', com_nav_log_out: 'Cerrar sesión', com_nav_user: 'USUARIO', + com_nav_archived_chats: 'Archivadas', + com_nav_archived_chats_manage: 'Gestionar', + com_nav_archived_chats_empty: 'No tienes conversaciones archivadas.', + com_nav_archive_all_chats: 'Archivar todas las conversaciones', + com_nav_archive_all: 'Archivar todas', + com_nav_archive_name: 'Nombre', + com_nav_archive_created_at: 'CreadoEn', com_nav_clear_conversation: 'Borrar conversaciones', com_nav_clear_conversation_confirm_message: '¿Estás seguro de que quieres borrar todas las conversaciones? Esta acción es irreversible.', diff --git a/client/src/localization/languages/Fr.ts b/client/src/localization/languages/Fr.ts index 56a6a3aef8..a2a99c1884 100644 --- a/client/src/localization/languages/Fr.ts +++ b/client/src/localization/languages/Fr.ts @@ -68,6 +68,12 @@ export default { com_ui_delete: 'Supprimer', com_ui_delete_conversation: 'Supprimer la discussions?', com_ui_delete_conversation_confirm: 'Cela supprimera', + com_ui_rename: 'Renombrar', + com_ui_archive: 'Archiver', + com_ui_archive_error: 'échec de l\'archivage de la conversation', + com_ui_unarchive: 'Désarchiver', + com_ui_unarchive_error: 'Échec de la désarchivage de la conversation', + com_ui_more_options: 'Plus', com_ui_preview: 'Aperçu', com_ui_upload: 'Téléverser', com_ui_connect: 'Connecter', @@ -324,6 +330,12 @@ export default { com_nav_send_message: 'Envoyer un message', com_nav_log_out: 'Se déconnecter', com_nav_user: 'UTILISATEUR', + com_nav_archived_chats: 'Conversations archivées', + com_nav_archived_chats_manage: 'Gérer', + com_nav_archive_all_chats: 'Archiver toutes les conversations', + com_nav_archive_all: 'Archiver tout', + com_nav_archive_name: 'Nom', + com_nav_archive_created_at: 'CréééLe', com_nav_clear_conversation: 'Effacer les conversations', com_nav_clear_conversation_confirm_message: 'Êtes-vous sûr de vouloir effacer toutes les conversations ? Ceci est irréversible.', diff --git a/client/src/localization/languages/He.ts b/client/src/localization/languages/He.ts index c8a16c6b06..849a4f96c6 100644 --- a/client/src/localization/languages/He.ts +++ b/client/src/localization/languages/He.ts @@ -95,6 +95,12 @@ export default { com_ui_delete_conversation_confirm: 'זה ימחק', com_ui_delete_assistant_confirm: 'האם אתה בטוח שאתה רוצה למחוק את הסייען הזה? אי אפשר לבטל את זה.', + com_ui_rename: 'שם מחדש', + com_ui_archive: 'ארכיון', + com_ui_archive_error: 'אירעה שגיאה בארכיון השיחה', + com_ui_unarchive: 'לארכיון', + com_ui_unarchive_error: 'אירעה שגיאה בארכיון השיחה', + com_ui_more_options: 'עוד', _ui_preview: 'תצוגה מקדימה', com_ui_upload: 'העלה', com_ui_connect: 'התחבר', @@ -351,6 +357,13 @@ export default { com_nav_send_message: 'שלח הודעה', com_nav_log_out: 'צא', com_nav_user: 'USER', + com_nav_archived_chats: 'שיחות מארכיון', + com_nav_archived_chats_manage: 'ניהול', + com_nav_archived_chats_empty: 'אין שיחות מארכיון.', + com_nav_archive_all_chats: 'ארכין כל השיחות', + com_nav_archive_all: 'ארכין כל', + com_nav_archive_name: 'שם', + com_nav_archive_created_at: 'תאריך יצרן', com_nav_clear_conversation: 'נקה שיחות', com_nav_clear_conversation_confirm_message: 'אתה בטוח שאתה רוצה לנקות את כל השיחות? זה בלתי הפיך.', diff --git a/client/src/localization/languages/Id.ts b/client/src/localization/languages/Id.ts index d86f95885b..39e61ce7fd 100644 --- a/client/src/localization/languages/Id.ts +++ b/client/src/localization/languages/Id.ts @@ -64,6 +64,12 @@ export default { com_ui_delete: 'Hapus', com_ui_delete_conversation: 'Hapus chat?', com_ui_delete_conversation_confirm: 'Ini akan menghapus', + com_ui_rename: 'Renombrar', + com_ui_archive: 'Arsip', + com_ui_archive_error: 'Gagal mengarsipkan percakapan', + com_ui_unarchive: 'Buka Arsip', + com_ui_unarchive_error: 'Gagal membuka arsip', + com_ui_more_options: 'Lebih', com_ui_preview: 'Pratinjau', com_ui_upload: 'Unggah', com_ui_connect: 'Hubungkan', @@ -310,6 +316,13 @@ export default { com_nav_send_message: 'Kirim pesan', com_nav_log_out: 'Keluar', com_nav_user: 'PENGGUNA', + com_nav_archived_chats: 'Percakapan Arsip', + com_nav_archived_chats_manage: 'Pengelolaan', + com_nav_archived_chats_empty: 'Tidak ada percakapan yang diarsipkan.', + com_nav_archive_all_chats: 'Arsipkan semua percakapan', + com_nav_archive_all: 'Arsipkan semua', + com_nav_archive_name: 'Nama', + com_nav_archive_created_at: 'TanggalDibuat', com_nav_clear_conversation: 'Hapus percakapan', com_nav_clear_conversation_confirm_message: 'Anda yakin ingin menghapus semua percakapan? Ini tidak dapat dibatalkan.', diff --git a/client/src/localization/languages/It.ts b/client/src/localization/languages/It.ts index 8ec6d6b7d9..522782bdfc 100644 --- a/client/src/localization/languages/It.ts +++ b/client/src/localization/languages/It.ts @@ -190,6 +190,12 @@ export default { com_ui_create: 'Crea', com_ui_delete_conversation: 'Eliminare la chat?', com_ui_delete_conversation_confirm: 'Questo eliminerà', + com_ui_rename: 'Rinominare', + com_ui_archive: 'Arsip', + com_ui_archive_error: 'Errore durante l\'archiviazione della conversazione', + com_ui_unarchive: 'Disarchivia', + com_ui_unarchive_error: 'Impossibile disarchiviare la conversazione', + com_ui_more_options: 'Pi', com_ui_delete_assistant_confirm: 'Sei sicuro di voler eliminare questo Assistente? Questa operazione non può essere annullata.', com_ui_preview: 'Anteprima', @@ -484,6 +490,13 @@ export default { com_nav_send_message: 'Invia messaggio', com_nav_log_out: 'Disconnetti', com_nav_user: 'UTENTE', + com_nav_archived_chats: 'Chat archiviate', + com_nav_archived_chats_manage: 'Gestisci', + com_nav_archived_chats_empty: 'Non hai chat archiviate.', + com_nav_archive_all_chats: 'Archivia tutte le chat', + com_nav_archive_all: 'Archivia tutto', + com_nav_archive_name: 'Nome', + com_nav_archive_created_at: 'DateCreated', com_nav_clear_conversation: 'Cancella conversazioni', com_nav_clear_conversation_confirm_message: 'Sei sicuro di voler cancellare tutte le conversazioni? Questa azione è irreversibile.', diff --git a/client/src/localization/languages/Jp.ts b/client/src/localization/languages/Jp.ts index 27454691ed..d6bc148de4 100644 --- a/client/src/localization/languages/Jp.ts +++ b/client/src/localization/languages/Jp.ts @@ -26,8 +26,7 @@ export default { 'ファイルをナレッジとしてアップロードする前に、アシスタントを作成し、Code InterpreterまたはRetrievalを有効にして保存する必要があります。', com_assistants_image_vision: 'Image Vision', com_assistants_code_interpreter: 'Code Interpreter', - com_assistants_code_interpreter_files: - '次のファイルはCode Interpreterでのみ使用できます。', + com_assistants_code_interpreter_files: '次のファイルはCode Interpreterでのみ使用できます。', com_assistants_retrieval: 'Retrieval', com_assistants_search_name: 'Assistantの名前で検索', com_assistants_tools: 'Tools', @@ -44,7 +43,8 @@ export default { com_assistants_update_actions_success: 'アクションが作成または更新されました', com_assistants_update_actions_error: 'アクションの作成または更新中にエラーが発生しました。', com_assistants_delete_actions_error: 'アクションの削除中にエラーが発生しました。', - com_assistants_actions_info: 'アシスタントが API を介して情報を取得したり、アクションを実行したりできるようにします\'s', + com_assistants_actions_info: + 'アシスタントが API を介して情報を取得したり、アクションを実行したりできるようにします\'s', com_assistants_name_placeholder: 'オプション: アシスタントの名前', com_assistants_instructions_placeholder: 'アシスタントが使用するシステム指示', com_assistants_description_placeholder: 'オプション: ここにアシスタントについて説明します', @@ -54,7 +54,8 @@ export default { com_assistants_create_success: 'アシスタントが正常に作成されました。', com_assistants_create_error: 'アシスタントの作成中にエラーが発生しました。', com_ui_field_required: '必須入力項目です', - com_ui_download_error: 'ファイルのダウンロード中にエラーが発生しました。ファイルが削除された可能性があります。', + com_ui_download_error: + 'ファイルのダウンロード中にエラーが発生しました。ファイルが削除された可能性があります。', com_ui_attach_error_type: 'エンドポイントでサポートされていないファイル タイプ:', com_ui_attach_error_size: 'エンドポイントのファイル サイズ制限を超えました:', com_ui_attach_error: @@ -148,8 +149,13 @@ export default { com_ui_create: '作成', com_ui_delete_conversation: 'チャットを削除しますか?', com_ui_delete_conversation_confirm: 'このチャットは削除されます。', - com_ui_delete_assistant_confirm: - 'このアシスタントを削除しますか? この操作は元に戻せません。', + com_ui_delete_assistant_confirm: 'このアシスタントを削除しますか? この操作は元に戻せません。', + com_ui_rename: 'タイトル変更', + com_ui_archive: 'アーカイブ', + com_ui_archive_error: 'アーカイブに失敗しました。', + com_ui_unarchive: 'アーカイブ解除', + com_ui_unarchive_error: 'アーカイブ解除に失敗しました。', + com_ui_more_options: 'More', com_ui_preview: 'プレビュー', com_ui_upload: 'アップロード', com_ui_connect: '接続', @@ -344,7 +350,8 @@ export default { 'コンプリーションのステップをスキップする。(最終的な回答と生成されたステップをレビューする機能)', com_endpoint_stop: 'シーケンスを停止', com_endpoint_stop_placeholder: 'Enterキー押下で値を区切ります', - com_endpoint_openai_stop: 'APIがさらにトークンを生成するのを止めるため、最大で4つのシーケンスを設定可能', + com_endpoint_openai_stop: + 'APIがさらにトークンを生成するのを止めるため、最大で4つのシーケンスを設定可能', com_endpoint_config_key: 'API Keyを設定', com_endpoint_assistant_placeholder: '右側のサイドパネルからアシスタントを選択してください', com_endpoint_config_placeholder: 'ヘッダーメニューからAPI Keyを設定してください。', @@ -395,7 +402,8 @@ export default { com_nav_plugin_uninstall: 'アンインストール', com_nav_tool_add: '追加', com_nav_tool_dialog: 'アシスタントツール', - com_nav_tool_dialog_description: 'ツールの選択を維持するには、アシスタントを保存する必要があります。', + com_nav_tool_dialog_description: + 'ツールの選択を維持するには、アシスタントを保存する必要があります。', com_nav_tool_remove: '削除', com_nav_tool_search: 'ツールを検索', com_show_agent_settings: 'エージェント設定を表示', @@ -429,6 +437,13 @@ export default { com_nav_send_message: 'メッセージを送信する', com_nav_log_out: 'ログアウト', com_nav_user: 'ユーザー', + com_nav_archived_chats: 'アーカイブされたチャット', + com_nav_archived_chats_manage: '管理', + com_nav_archived_chats_empty: 'アーカイブされたチャットはありません', + com_nav_archive_all_chats: 'すべてのチャットをアーカイブ', + com_nav_archive_all: 'すべてアーカイブする', + com_nav_archive_name: '名前', + com_nav_archive_created_at: '作成日', com_nav_clear_conversation: '会話を削除する', com_nav_clear_conversation_confirm_message: '本当にすべての会話を削除しますか? この操作は取り消せません。', diff --git a/client/src/localization/languages/Ko.ts b/client/src/localization/languages/Ko.ts index a76d62b0b8..b545e3e676 100644 --- a/client/src/localization/languages/Ko.ts +++ b/client/src/localization/languages/Ko.ts @@ -53,6 +53,12 @@ export default { com_ui_delete: '삭제', com_ui_delete_conversation: '채팅을 삭제하시겠습니까?', com_ui_delete_conversation_confirm: '이 채팅이 삭제됩니다', + com_ui_rename: '이름 바꾸기', + com_ui_archive: '아카이브', + com_ui_archive_error: '대화 아카이브 실패', + com_ui_unarchive: '아카이브 해제', + com_ui_unarchive_error: '대화 아카이브 해제 실패', + com_ui_more_options: '더 보기', com_auth_error_login: '제공된 정보로 로그인할 수 없습니다. 자격 증명을 확인하고 다시 시도하세요.', com_auth_no_account: '계정이 없으신가요?', com_auth_sign_up: '가입하기', @@ -239,6 +245,13 @@ export default { com_nav_send_message: '메시지 보내기', com_nav_log_out: '로그아웃', com_nav_user: '사용자', + com_nav_archived_chats: '아카이브된 채팅', + com_nav_archived_chats_manage: '관리', + com_nav_archived_chats_empty: '아카이브된 채팅이 없습니다', + com_nav_archive_all_chats: '모든 채팅 아카이브', + com_nav_archive_all: '모든 채팅 아카이브', + com_nav_archive_name: '이름', + com_nav_archive_created_at: '생성 날짜', com_nav_clear_conversation: '대화 지우기', com_nav_clear_conversation_confirm_message: '모든 대화를 지우시겠습니까? 이 작업은 되돌릴 수 없습니다.', diff --git a/client/src/localization/languages/Nl.ts b/client/src/localization/languages/Nl.ts index 50cc8da858..4f723a5664 100644 --- a/client/src/localization/languages/Nl.ts +++ b/client/src/localization/languages/Nl.ts @@ -57,6 +57,12 @@ export default { com_ui_delete: 'Verwijderen', com_ui_delete_conversation: 'Chat verwijderen?', com_ui_delete_conversation_confirm: 'Hiermee wordt', + com_ui_rename: 'Hernoemen', + com_ui_archive: 'Archiveren', + com_ui_archive_error: 'Kan conversatie niet archiveren', + com_ui_unarchive: 'Uit archiveren', + com_ui_unarchive_error: 'Kan conversatie niet uit archiveren', + com_ui_more_options: 'Meer', com_auth_error_login: 'Kan niet inloggen met de verstrekte informatie. Controleer uw referenties en probeer het opnieuw.', com_auth_error_login_rl: 'Te veel inlogpogingen in een korte tijd. Probeer het later nog eens.', @@ -266,6 +272,13 @@ export default { com_nav_send_message: 'Bericht verzenden', com_nav_log_out: 'Uitloggen', com_nav_user: 'GEBRUIKER', + com_nav_archived_chats: 'Gearchiveerde chats', + com_nav_archived_chats_manage: 'Beheren', + com_nav_archived_chats_empty: 'Geen gearchiveerde chats', + com_nav_archive_all_chats: 'Alle chats archiveren', + com_nav_archive_all: 'Alle archiveren', + com_nav_archive_name: 'Naam', + com_nav_archive_created_at: 'Gemaakt op', com_nav_clear_conversation: 'Conversaties wissen', com_nav_clear_conversation_confirm_message: 'Weet u zeker dat u alle conversaties wilt wissen? Dit is onomkeerbaar.', diff --git a/client/src/localization/languages/Pl.ts b/client/src/localization/languages/Pl.ts index 6743664579..61deaaca1e 100644 --- a/client/src/localization/languages/Pl.ts +++ b/client/src/localization/languages/Pl.ts @@ -30,6 +30,12 @@ export default { com_ui_entries: 'wpisów', com_ui_pay_per_call: 'Wszystkie rozmowy z AI w jednym miejscu. Płatność za połączenie, a nie za miesiąc', + com_ui_rename: 'Zmień nazwę', + com_ui_archive: 'Archiwum', + com_ui_archive_error: 'Nie udało się archiwizować rozmowy', + com_ui_unarchive: 'Przywróć z archiwum', + com_ui_unarchive_error: 'Nie udało się odtworzyć rozmowy z archiwum', + com_ui_more_options: 'Więcej', com_auth_error_login: 'Nie udało się zalogować przy użyciu podanych danych. Sprawdź swoje dane logowania i spróbuj ponownie.', com_auth_no_account: 'Nie masz konta?', @@ -198,6 +204,13 @@ export default { com_nav_send_message: 'Wyślij wiadomość', com_nav_log_out: 'Wyloguj', com_nav_user: 'Użytkownik', + com_nav_archived_chats: 'Zarchiwizowane rozmowy', + com_nav_archived_chats_manage: 'Zarządzaj', + com_nav_archived_chats_empty: 'Nie masz żadnych zarchiwizowanych rozmów.', + com_nav_archive_all_chats: 'Archiwizuj wszystkie rozmowy', + com_nav_archive_all: 'Archiwizuj wszystkie', + com_nav_archive_name: 'Nazwa', + com_nav_archive_created_at: 'Utworzono', com_nav_clear_conversation: 'Wyczyść rozmowę', com_nav_clear_conversation_confirm_message: 'Czy na pewno chcesz usunąć wszystkie konwersacje? Tej operacji nie można cofnąć.', diff --git a/client/src/localization/languages/Ru.ts b/client/src/localization/languages/Ru.ts index 5ae0a3d7c9..cefe577ba9 100644 --- a/client/src/localization/languages/Ru.ts +++ b/client/src/localization/languages/Ru.ts @@ -68,6 +68,12 @@ export default { com_ui_connect: 'Подключить', com_ui_delete_conversation: 'Удалить чат?', com_ui_delete_conversation_confirm: 'Будет удален следующий чат: ', + com_ui_rename: 'Переименовать', + com_ui_archive: 'Архивировать', + com_ui_archive_error: 'Nie udało się archiwizować rozmowy', + com_ui_unarchive: 'разархивировать', + com_ui_unarchive_error: 'Nie udało się odtworzyć rozmowy z archiwum', + com_ui_more_options: 'Еще', com_auth_error_login: 'Не удалось войти с предоставленной информацией. Пожалуйста, проверьте ваши учетные данные и попробуйте снова.', com_auth_error_login_rl: @@ -315,6 +321,13 @@ export default { com_nav_send_message: 'Отправить сообщение', com_nav_log_out: 'Выйти', com_nav_user: 'ПОЛЬЗОВАТЕЛЬ', + com_nav_archived_chats: 'Архивированные чаты', + com_nav_archived_chats_manage: 'Управление', + com_nav_archived_chats_empty: 'У вас нет архивированных разговоров.', + com_nav_archive_all_chats: 'Архивировать все чаты', + com_nav_archive_all: 'Архивировать все', + com_nav_archive_name: 'Имя', + com_nav_archive_created_at: 'Дата создания', com_nav_clear_conversation: 'Удалить разговоры', com_nav_clear_conversation_confirm_message: 'Вы уверены, что хотите удалить все разговоры? Это действие нельзя отменить.', diff --git a/client/src/localization/languages/Sv.ts b/client/src/localization/languages/Sv.ts index c4fbe36862..d08db64412 100644 --- a/client/src/localization/languages/Sv.ts +++ b/client/src/localization/languages/Sv.ts @@ -54,6 +54,12 @@ export default { com_ui_delete: 'Radera', com_ui_delete_conversation: 'Radera chatt?', com_ui_delete_conversation_confirm: 'Detta kommer att radera', + com_ui_rename: 'byta namn på', + com_ui_archive: 'Arkiv', + com_ui_archive_error: 'Kunde inte arkivera chatt', + com_ui_unarchive: 'Avarkivera', + com_ui_unarchive_error: 'Kunde inte avarkivera chatt', + com_ui_more_options: 'Mer', com_auth_error_login: 'Kunde inte logga in med den angivna informationen. Kontrollera dina uppgifter och försök igen.', com_auth_error_login_rl: @@ -254,6 +260,13 @@ export default { com_nav_send_message: 'Skicka meddelande', com_nav_log_out: 'Logga ut', com_nav_user: 'ANVÄNDARE', + com_nav_archived_chats: 'Arkiverade chattar', + com_nav_archived_chats_manage: 'Hantera', + com_nav_archived_chats_empty: 'Du har inga arkiverade chattar.', + com_nav_archive_all_chats: 'Arkivera alla chattar', + com_nav_archive_all: 'Arkivera alla', + com_nav_archive_name: 'Namn', + com_nav_archive_created_at: 'Skapad', com_nav_clear_conversation: 'Rensa konversationer', com_nav_clear_conversation_confirm_message: 'Är du säker på att du vill rensa alla konversationer? Detta går inte att ångra.', diff --git a/client/src/localization/languages/Tr.ts b/client/src/localization/languages/Tr.ts index 3c9da3c0bf..b4dd07f9cc 100644 --- a/client/src/localization/languages/Tr.ts +++ b/client/src/localization/languages/Tr.ts @@ -56,6 +56,12 @@ export default { com_ui_delete: 'Sil', com_ui_delete_conversation: 'Sohbet silinecek?', com_ui_delete_conversation_confirm: 'Bu silinecek', + com_ui_rename: 'Yeniden adlandır', + com_ui_archive: 'Arşivle', + com_ui_archive_error: 'Sohbet arşivlemeye çalışırken bir hata oluştu', + com_ui_unarchive: 'Arşivden Çıkar', + com_ui_unarchive_error: 'Sohbet arşivden çıkarılamadı', + com_ui_more_options: 'Daha fazla', com_auth_error_login: 'Sağlanan bilgilerle giriş yapılamıyor. Lütfen kimlik bilgilerinizi kontrol edip tekrar deneyin.', com_auth_error_login_rl: @@ -282,6 +288,13 @@ export default { com_nav_send_message: 'Mesaj gönder', com_nav_log_out: 'Çıkış yap', com_nav_user: 'KULLANICI', + com_nav_archived_chats: 'Arşivlenmiş Sohbetler', + com_nav_archived_chats_manage: 'Ynetmek', + com_nav_archived_chats_empty: 'Sizin hiçbir arşivlenmiş sohbetiniz yok.', + com_nav_archive_all_chats: 'Tm sohbetleri arşivle', + com_nav_archive_all: 'Tmn arşivle', + com_nav_archive_name: 'İsim', + com_nav_archive_created_at: 'DateCreated', com_nav_clear_conversation: 'Sohbetleri Temizle', com_nav_clear_conversation_confirm_message: 'Tüm sohbetleri temizlemek istediğinizden emin misiniz? Bu geri alınamaz.', diff --git a/client/src/localization/languages/Vi.ts b/client/src/localization/languages/Vi.ts index 013b7c3891..b600400d04 100644 --- a/client/src/localization/languages/Vi.ts +++ b/client/src/localization/languages/Vi.ts @@ -56,6 +56,12 @@ export default { com_ui_delete: 'Xóa', com_ui_delete_conversation: 'Xóa cuộc trò chuyện?', com_ui_delete_conversation_confirm: 'Điều này sẽ xóa', + com_ui_rename: 'Đổi tên', + com_ui_archive: 'Lưu trữ', + com_ui_archive_error: 'Không thể lưu trữ cuộc trò chuyện', + com_ui_unarchive: 'Bỏ lưu trữ', + com_ui_unarchive_error: 'Không thể bỏ lưu trữ cuộc trò chuyện', + com_ui_more_options: 'Thêm', com_auth_error_login: 'Không thể đăng nhập với thông tin được cung cấp. Vui lòng kiểm tra thông tin đăng nhập và thử lại.', com_auth_error_login_rl: diff --git a/client/src/localization/languages/Zh.ts b/client/src/localization/languages/Zh.ts index 2109841ff5..da2722dfb1 100644 --- a/client/src/localization/languages/Zh.ts +++ b/client/src/localization/languages/Zh.ts @@ -135,6 +135,12 @@ export default { com_ui_delete_conversation: '删除对话?', com_ui_delete_conversation_confirm: '这将删除', com_ui_delete_assistant_confirm: '确定要删除此助手吗?该操作无法撤销。', + com_ui_rename: '重命名', + com_ui_archive: '归档', + com_ui_archive_error: '归档对话失败', + com_ui_unarchive: '取消归档', + com_ui_unarchive_error: '取消归档对话失败', + com_ui_more_options: '更多', com_ui_preview: '预览', com_ui_upload: '上传', com_ui_connect: '连接', @@ -394,6 +400,13 @@ export default { com_nav_send_message: '发送消息', com_nav_log_out: '注销', com_nav_user: '默认用户', + com_nav_archived_chats: '归档的对话', + com_nav_archived_chats_manage: '管理', + com_nav_archived_chats_empty: '您没有归档的对话。', + com_nav_archive_all_chats: '归档所有对话', + com_nav_archive_all: '归档所有', + com_nav_archive_name: '名称', + com_nav_archive_created_at: '创建时间', com_nav_clear_conversation: '清空对话', com_nav_clear_conversation_confirm_message: '请是否清空所有对话?该操作无法撤销', com_nav_help_faq: '帮助', diff --git a/client/src/localization/languages/ZhTraditional.ts b/client/src/localization/languages/ZhTraditional.ts index 73c2f215fc..b9ab42185a 100644 --- a/client/src/localization/languages/ZhTraditional.ts +++ b/client/src/localization/languages/ZhTraditional.ts @@ -53,6 +53,12 @@ export default { com_ui_delete: '刪除', com_ui_delete_conversation: '刪除對話?', com_ui_delete_conversation_confirm: '這將刪除', + com_ui_rename: '重新命名', + com_ui_archive: '封存', + com_ui_archive_error: '封存對話時發生錯誤', + com_ui_unarchive: '取消封存', + com_ui_unarchive_error: '取消封存對話時發生錯誤', + com_ui_more_options: '更多', com_auth_error_login: '無法使用提供的資訊登入。請檢查您的登入資訊後重試。', com_auth_error_login_rl: '短時間內嘗試登入的次數過多。請稍後再試。', com_auth_error_login_ban: '由於違反我們的服務條款,您的帳號已被暫時停用。', @@ -245,6 +251,13 @@ export default { com_nav_send_message: '傳送訊息', com_nav_log_out: '登出', com_nav_user: '使用者', + com_nav_archived_chats: '封存的對話', + com_nav_archived_chats_manage: '管理', + com_nav_archived_chats_empty: '您沒有任何封存的對話。', + com_nav_archive_all_chats: '封存所有對話', + com_nav_archive_all: '封存所有', + com_nav_archive_name: '名稱', + com_nav_archive_created_at: '建立時間', com_nav_clear_conversation: '清除對話', com_nav_clear_conversation_confirm_message: '您確定要清除所有對話嗎?此操作無法復原。', com_nav_help_faq: '說明與常見問題', diff --git a/packages/data-provider/src/api-endpoints.ts b/packages/data-provider/src/api-endpoints.ts index 9b0b41a8f5..2e56efb8d0 100644 --- a/packages/data-provider/src/api-endpoints.ts +++ b/packages/data-provider/src/api-endpoints.ts @@ -21,8 +21,8 @@ export const abortRequest = (endpoint: string) => `/api/ask/${endpoint}/abort`; export const conversationsRoot = '/api/convos'; -export const conversations = (pageNumber: string) => - `${conversationsRoot}?pageNumber=${pageNumber}`; +export const conversations = (pageNumber: string, isArchived?: boolean) => + `${conversationsRoot}?pageNumber=${pageNumber}${isArchived ? '&isArchived=true' : ''}`; export const conversationById = (id: string) => `${conversationsRoot}/${id}`; diff --git a/packages/data-provider/src/data-service.ts b/packages/data-provider/src/data-service.ts index af6a6ba4c7..b334619096 100644 --- a/packages/data-provider/src/data-service.ts +++ b/packages/data-provider/src/data-service.ts @@ -279,7 +279,8 @@ export const listConversations = ( ): Promise => { // Assuming params has a pageNumber property const pageNumber = params?.pageNumber || '1'; // Default to page 1 if not provided - return request.get(endpoints.conversations(pageNumber)); + const isArchived = params?.isArchived || false; // Default to false if not provided + return request.get(endpoints.conversations(pageNumber, isArchived)); }; export const listConversationsByQuery = ( @@ -316,6 +317,12 @@ export function updateConversation( return request.post(endpoints.updateConversation(), { arg: payload }); } +export function archiveConversation( + payload: t.TArchiveConversationRequest, +): Promise { + return request.post(endpoints.updateConversation(), { arg: payload }); +} + export function genTitle(payload: m.TGenTitleRequest): Promise { return request.post(endpoints.genTitle(), payload); } diff --git a/packages/data-provider/src/keys.ts b/packages/data-provider/src/keys.ts index abb46c2dfb..aa664f8c39 100644 --- a/packages/data-provider/src/keys.ts +++ b/packages/data-provider/src/keys.ts @@ -1,6 +1,7 @@ export enum QueryKeys { messages = 'messages', allConversations = 'allConversations', + archivedConversations = 'archivedConversations', searchConversations = 'searchConversations', conversation = 'conversation', searchEnabled = 'searchEnabled', diff --git a/packages/data-provider/src/types.ts b/packages/data-provider/src/types.ts index a6c0b9a98a..901730336d 100644 --- a/packages/data-provider/src/types.ts +++ b/packages/data-provider/src/types.ts @@ -125,6 +125,13 @@ export type TDeleteConversationResponse = { }; }; +export type TArchiveConversationRequest = { + conversationId: string; + isArchived: boolean; +}; + +export type TArchiveConversationResponse = TConversation; + export type TForkConvoRequest = { messageId: string; conversationId: string; diff --git a/packages/data-provider/src/types/queries.ts b/packages/data-provider/src/types/queries.ts index 81196f00e4..18e56ecca1 100644 --- a/packages/data-provider/src/types/queries.ts +++ b/packages/data-provider/src/types/queries.ts @@ -16,6 +16,7 @@ export type ConversationListParams = { order?: 'asc' | 'desc'; pageNumber: string; // Add this line conversationId?: string; + isArchived: boolean; }; // Type for the response from the conversation list API