mirror of
https://github.com/langgenius/dify.git
synced 2025-12-19 17:27:16 -05:00
chore: time from now i18n support (#26328)
This commit is contained in:
@@ -11,9 +11,6 @@ import cn from '@/utils/classnames'
|
|||||||
import { useHover } from 'ahooks'
|
import { useHover } from 'ahooks'
|
||||||
import { RiFileTextFill, RiMoreFill, RiRobot2Fill } from '@remixicon/react'
|
import { RiFileTextFill, RiMoreFill, RiRobot2Fill } from '@remixicon/react'
|
||||||
import Tooltip from '@/app/components/base/tooltip'
|
import Tooltip from '@/app/components/base/tooltip'
|
||||||
import { useGetLanguage } from '@/context/i18n'
|
|
||||||
import dayjs from 'dayjs'
|
|
||||||
import relativeTime from 'dayjs/plugin/relativeTime'
|
|
||||||
import { checkIsUsedInApp, deleteDataset } from '@/service/datasets'
|
import { checkIsUsedInApp, deleteDataset } from '@/service/datasets'
|
||||||
import RenameDatasetModal from '../../rename-modal'
|
import RenameDatasetModal from '../../rename-modal'
|
||||||
import Confirm from '@/app/components/base/confirm'
|
import Confirm from '@/app/components/base/confirm'
|
||||||
@@ -24,7 +21,7 @@ import AppIcon from '@/app/components/base/app-icon'
|
|||||||
import CornerLabel from '@/app/components/base/corner-label'
|
import CornerLabel from '@/app/components/base/corner-label'
|
||||||
import { DOC_FORM_ICON_WITH_BG, DOC_FORM_TEXT } from '@/models/datasets'
|
import { DOC_FORM_ICON_WITH_BG, DOC_FORM_TEXT } from '@/models/datasets'
|
||||||
import { useExportPipelineDSL } from '@/service/use-pipeline'
|
import { useExportPipelineDSL } from '@/service/use-pipeline'
|
||||||
dayjs.extend(relativeTime)
|
import { useFormatTimeFromNow } from '@/hooks/use-format-time-from-now'
|
||||||
|
|
||||||
const EXTERNAL_PROVIDER = 'external'
|
const EXTERNAL_PROVIDER = 'external'
|
||||||
|
|
||||||
@@ -87,10 +84,7 @@ const DatasetCard = ({
|
|||||||
return t('dataset.partialEnabled', { count: dataset.document_count, num: availableDocCount })
|
return t('dataset.partialEnabled', { count: dataset.document_count, num: availableDocCount })
|
||||||
}, [t, dataset.document_count, dataset.total_available_documents])
|
}, [t, dataset.document_count, dataset.total_available_documents])
|
||||||
|
|
||||||
const language = useGetLanguage()
|
const { formatTimeFromNow } = useFormatTimeFromNow()
|
||||||
const formatTimeFromNow = useCallback((time: number) => {
|
|
||||||
return dayjs(time * 1_000).locale(language === 'zh_Hans' ? 'zh-cn' : language.replace('_', '-')).fromNow()
|
|
||||||
}, [language])
|
|
||||||
|
|
||||||
const openRenameModal = useCallback(() => {
|
const openRenameModal = useCallback(() => {
|
||||||
setShowRenameModal(true)
|
setShowRenameModal(true)
|
||||||
@@ -269,7 +263,7 @@ const DatasetCard = ({
|
|||||||
</Tooltip>
|
</Tooltip>
|
||||||
)}
|
)}
|
||||||
<span className='system-xs-regular text-divider-deep'>/</span>
|
<span className='system-xs-regular text-divider-deep'>/</span>
|
||||||
<span className='system-xs-regular'>{`${t('dataset.updated')} ${formatTimeFromNow(dataset.updated_at)}`}</span>
|
<span className='system-xs-regular'>{`${t('dataset.updated')} ${formatTimeFromNow(dataset.updated_at * 1000)}`}</span>
|
||||||
</div>
|
</div>
|
||||||
<div className='absolute right-2 top-2 z-[5] hidden group-hover:block'>
|
<div className='absolute right-2 top-2 z-[5] hidden group-hover:block'>
|
||||||
<CustomPopover
|
<CustomPopover
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import {
|
|||||||
import Button from '@/app/components/base/button'
|
import Button from '@/app/components/base/button'
|
||||||
import {
|
import {
|
||||||
useChecklistBeforePublish,
|
useChecklistBeforePublish,
|
||||||
useFormatTimeFromNow,
|
|
||||||
} from '@/app/components/workflow/hooks'
|
} from '@/app/components/workflow/hooks'
|
||||||
import Divider from '@/app/components/base/divider'
|
import Divider from '@/app/components/base/divider'
|
||||||
import { getKeyboardKeyCodeBySystem, getKeyboardKeyNameBySystem } from '@/app/components/workflow/utils'
|
import { getKeyboardKeyCodeBySystem, getKeyboardKeyNameBySystem } from '@/app/components/workflow/utils'
|
||||||
@@ -47,6 +46,7 @@ import { SparklesSoft } from '@/app/components/base/icons/src/public/common'
|
|||||||
import { useModalContextSelector } from '@/context/modal-context'
|
import { useModalContextSelector } from '@/context/modal-context'
|
||||||
import Link from 'next/link'
|
import Link from 'next/link'
|
||||||
import { useDatasetApiAccessUrl } from '@/hooks/use-api-access-url'
|
import { useDatasetApiAccessUrl } from '@/hooks/use-api-access-url'
|
||||||
|
import { useFormatTimeFromNow } from '@/hooks/use-format-time-from-now'
|
||||||
|
|
||||||
const PUBLISH_SHORTCUT = ['ctrl', '⇧', 'P']
|
const PUBLISH_SHORTCUT = ['ctrl', '⇧', 'P']
|
||||||
|
|
||||||
|
|||||||
@@ -22,4 +22,3 @@ export * from './use-DSL'
|
|||||||
export * from './use-inspect-vars-crud'
|
export * from './use-inspect-vars-crud'
|
||||||
export * from './use-set-workflow-vars-with-value'
|
export * from './use-set-workflow-vars-with-value'
|
||||||
export * from './use-workflow-search'
|
export * from './use-workflow-search'
|
||||||
export * from './use-format-time-from-now'
|
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
import dayjs from 'dayjs'
|
|
||||||
import { useCallback } from 'react'
|
|
||||||
import { useI18N } from '@/context/i18n'
|
|
||||||
|
|
||||||
export const useFormatTimeFromNow = () => {
|
|
||||||
const { locale } = useI18N()
|
|
||||||
const formatTimeFromNow = useCallback((time: number) => {
|
|
||||||
return dayjs(time).locale(locale === 'zh-Hans' ? 'zh-cn' : locale).fromNow()
|
|
||||||
}, [locale])
|
|
||||||
|
|
||||||
return { formatTimeFromNow }
|
|
||||||
}
|
|
||||||
@@ -2,14 +2,59 @@ import dayjs from 'dayjs'
|
|||||||
import relativeTime from 'dayjs/plugin/relativeTime'
|
import relativeTime from 'dayjs/plugin/relativeTime'
|
||||||
import { useCallback } from 'react'
|
import { useCallback } from 'react'
|
||||||
import { useI18N } from '@/context/i18n'
|
import { useI18N } from '@/context/i18n'
|
||||||
|
import type { Locale } from '@/i18n-config'
|
||||||
|
import 'dayjs/locale/de'
|
||||||
|
import 'dayjs/locale/es'
|
||||||
|
import 'dayjs/locale/fa'
|
||||||
|
import 'dayjs/locale/fr'
|
||||||
|
import 'dayjs/locale/hi'
|
||||||
|
import 'dayjs/locale/id'
|
||||||
|
import 'dayjs/locale/it'
|
||||||
|
import 'dayjs/locale/ja'
|
||||||
|
import 'dayjs/locale/ko'
|
||||||
|
import 'dayjs/locale/pl'
|
||||||
|
import 'dayjs/locale/pt-br'
|
||||||
|
import 'dayjs/locale/ro'
|
||||||
|
import 'dayjs/locale/ru'
|
||||||
|
import 'dayjs/locale/sl'
|
||||||
|
import 'dayjs/locale/th'
|
||||||
|
import 'dayjs/locale/tr'
|
||||||
|
import 'dayjs/locale/uk'
|
||||||
|
import 'dayjs/locale/vi'
|
||||||
import 'dayjs/locale/zh-cn'
|
import 'dayjs/locale/zh-cn'
|
||||||
|
import 'dayjs/locale/zh-tw'
|
||||||
|
|
||||||
dayjs.extend(relativeTime)
|
dayjs.extend(relativeTime)
|
||||||
|
|
||||||
|
const localeMap: Record<Locale, string> = {
|
||||||
|
'en-US': 'en',
|
||||||
|
'zh-Hans': 'zh-cn',
|
||||||
|
'zh-Hant': 'zh-tw',
|
||||||
|
'pt-BR': 'pt-br',
|
||||||
|
'es-ES': 'es',
|
||||||
|
'fr-FR': 'fr',
|
||||||
|
'de-DE': 'de',
|
||||||
|
'ja-JP': 'ja',
|
||||||
|
'ko-KR': 'ko',
|
||||||
|
'ru-RU': 'ru',
|
||||||
|
'it-IT': 'it',
|
||||||
|
'th-TH': 'th',
|
||||||
|
'id-ID': 'id',
|
||||||
|
'uk-UA': 'uk',
|
||||||
|
'vi-VN': 'vi',
|
||||||
|
'ro-RO': 'ro',
|
||||||
|
'pl-PL': 'pl',
|
||||||
|
'hi-IN': 'hi',
|
||||||
|
'tr-TR': 'tr',
|
||||||
|
'fa-IR': 'fa',
|
||||||
|
'sl-SI': 'sl',
|
||||||
|
}
|
||||||
|
|
||||||
export const useFormatTimeFromNow = () => {
|
export const useFormatTimeFromNow = () => {
|
||||||
const { locale } = useI18N()
|
const { locale } = useI18N()
|
||||||
const formatTimeFromNow = useCallback((time: number) => {
|
const formatTimeFromNow = useCallback((time: number) => {
|
||||||
return dayjs(time).locale(locale === 'zh-Hans' ? 'zh-cn' : locale).fromNow()
|
const dayjsLocale = localeMap[locale] ?? 'en'
|
||||||
|
return dayjs(time).locale(dayjsLocale).fromNow()
|
||||||
}, [locale])
|
}, [locale])
|
||||||
|
|
||||||
return { formatTimeFromNow }
|
return { formatTimeFromNow }
|
||||||
|
|||||||
Reference in New Issue
Block a user