feat: add marketplace home catalog filters

This commit is contained in:
CodingOnStar 2026-07-24 17:10:12 +08:00
parent 7872c168b4
commit 744e5bb39b
29 changed files with 225 additions and 14 deletions

View File

@ -1,4 +1,4 @@
import type { ReactNode } from 'react'
import type { ComponentProps, ReactNode } from 'react'
import { render, screen, waitFor } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
import { Provider as JotaiProvider } from 'jotai'
@ -13,7 +13,7 @@ vi.mock('#i18n', async () => {
}
})
const renderSwitch = (searchParams = '') => {
const renderSwitch = (searchParams = '', props?: ComponentProps<typeof PluginTypeSwitch>) => {
const { wrapper: NuqsWrapper, onUrlUpdate } = createNuqsTestWrapper({ searchParams })
const Wrapper = ({ children }: { children: ReactNode }) => (
<JotaiProvider>
@ -21,7 +21,7 @@ const renderSwitch = (searchParams = '') => {
</JotaiProvider>
)
return { ...render(<PluginTypeSwitch />, { wrapper: Wrapper }), onUrlUpdate }
return { ...render(<PluginTypeSwitch {...props} />, { wrapper: Wrapper }), onUrlUpdate }
}
describe('PluginTypeSwitch', () => {
@ -56,4 +56,21 @@ describe('PluginTypeSwitch', () => {
expect(onUrlUpdate.mock.calls.at(-1)?.[0].searchParams.get('category')).toBe('model')
expect(modelsButton).toHaveAttribute('aria-pressed', 'true')
})
it('exposes the selected category and updates the URL in the home variant', async () => {
const user = userEvent.setup()
const { onUrlUpdate } = renderSwitch('?category=all', { variant: 'home' })
expect(screen.getByRole('button', { name: 'category.all' })).toHaveAttribute(
'aria-pressed',
'true',
)
expect(screen.getByRole('button', { name: 'categorySingle.datasource' })).toBeInTheDocument()
expect(screen.getByRole('button', { name: 'categorySingle.agent' })).toBeInTheDocument()
await user.click(screen.getByRole('button', { name: 'category.models' }))
await waitFor(() => expect(onUrlUpdate).toHaveBeenCalled())
expect(onUrlUpdate.mock.calls.at(-1)?.[0].searchParams.get('category')).toBe('model')
})
})

View File

@ -0,0 +1,12 @@
# Marketplace Home
The redesigned Marketplace homepage composes the header, hero, search, trending, catalog navigation, and existing plugin list.
## Internal Modules
- `marketplace/list/list-wrapper`
- `marketplace/plugin-type-switch`
## External Modules
None.

View File

@ -0,0 +1,47 @@
import { render, screen } from '@testing-library/react'
import { describe, expect, it, vi } from 'vitest'
import HomeCatalogNavigation from '../home-catalog-navigation'
vi.mock('#i18n', async () => {
const { withSelectorKey } = await import('@/test/i18n-mock')
return {
useTranslation: () => ({
t: withSelectorKey((key: string, options?: { ns?: string }) =>
options?.ns ? `${options.ns}.${key}` : key,
),
}),
}
})
vi.mock('../../plugin-type-switch', () => ({
default: ({ variant }: { variant?: string }) => (
<div data-testid="plugin-type-switch" data-variant={variant} />
),
}))
vi.mock('@/utils/var', () => ({
getMarketplaceUrl: (path: string) => `https://marketplace.dify.ai${path}?source=console`,
}))
describe('HomeCatalogNavigation', () => {
it('keeps template navigation inside the Marketplace platform', () => {
render(<HomeCatalogNavigation isMarketplacePlatform />)
expect(screen.getByText('plugin.marketplace.home.plugins')).toHaveAttribute(
'aria-current',
'page',
)
expect(
screen.getByRole('link', { name: /plugin\.marketplace\.home\.templates/ }),
).toHaveAttribute('href', '/templates')
expect(screen.getByTestId('plugin-type-switch')).toHaveAttribute('data-variant', 'home')
})
it('links Dify users to the hosted Marketplace templates page', () => {
render(<HomeCatalogNavigation isMarketplacePlatform={false} />)
expect(
screen.getByRole('link', { name: /plugin\.marketplace\.home\.templates/ }),
).toHaveAttribute('href', 'https://marketplace.dify.ai/templates?source=console')
})
})

View File

@ -0,0 +1,54 @@
'use client'
import { cn } from '@langgenius/dify-ui/cn'
import { useTranslation } from '#i18n'
import Link from '@/next/link'
import { getMarketplaceUrl } from '@/utils/var'
import PluginTypeSwitch from '../plugin-type-switch'
type HomeCatalogNavigationProps = {
isMarketplacePlatform: boolean
}
function HomeCatalogNavigation({ isMarketplacePlatform }: HomeCatalogNavigationProps) {
const { t } = useTranslation()
const templatesHref = isMarketplacePlatform ? '/templates' : getMarketplaceUrl('/templates')
return (
<section
aria-label={t(($) => $['mainNav.marketplace'], { ns: 'common' })}
className="w-full shrink-0 bg-background-default px-8 pt-6 pb-4"
>
<div
className={cn(
'mx-auto w-full',
isMarketplacePlatform ? 'max-w-[1200px]' : 'max-w-[1188px]',
)}
>
<nav
aria-label={t(($) => $['mainNav.marketplace'], { ns: 'common' })}
className="-ml-2 flex h-8 items-center gap-1"
>
<span
aria-current="page"
className="relative flex h-8 items-start px-[9px] pt-2 body-sm-medium text-text-accent after:absolute after:bottom-0 after:left-1/2 after:h-0.5 after:w-[21px] after:-translate-x-1/2 after:rounded-full after:bg-text-accent"
>
{t(($) => $['marketplace.home.plugins'], { ns: 'plugin' })}
</span>
<Link
href={templatesHref}
className="flex h-8 items-center gap-2 rounded-[10px] p-2 body-sm-regular text-text-primary outline-hidden hover:bg-state-base-hover focus-visible:ring-2 focus-visible:ring-state-accent-solid"
>
<span>{t(($) => $['marketplace.home.templates'], { ns: 'plugin' })}</span>
<span className="flex items-center rounded-full bg-saas-dify-blue-accessible px-[5px] py-0.5 system-2xs-regular text-text-primary-on-surface uppercase">
{t(($) => $['marketplace.home.new'], { ns: 'plugin' })}
</span>
</Link>
</nav>
<PluginTypeSwitch className="mt-4" variant="home" />
</div>
</section>
)
}
export default HomeCatalogNavigation

View File

@ -1,6 +1,7 @@
import type { BannerRecommend } from './banners'
import { cn } from '@langgenius/dify-ui/cn'
import ListWrapper from '../list/list-wrapper'
import HomeCatalogNavigation from './home-catalog-navigation'
import HomeHeader from './home-header'
import HomeHero from './home-hero'
import HomeSearch from './home-search'
@ -37,10 +38,8 @@ const MarketplaceHome = ({
aria-hidden="true"
className={cn('shrink-0', isMarketplacePlatform ? 'h-6' : 'h-12')}
/>
<HomeTrending
banners={banners}
isMarketplacePlatform={isMarketplacePlatform}
/>
<HomeTrending banners={banners} isMarketplacePlatform={isMarketplacePlatform} />
<HomeCatalogNavigation isMarketplacePlatform={isMarketplacePlatform} />
<div className="contents [&>div]:bg-background-default!">
<ListWrapper
showInstallButton={showInstallButton}

View File

@ -19,13 +19,14 @@ import { PLUGIN_CATEGORY_WITH_COLLECTIONS, PLUGIN_TYPE_SEARCH_MAP } from './cons
type PluginTypeSwitchProps = {
className?: string
variant?: 'default' | 'hero'
variant?: 'default' | 'hero' | 'home'
}
const PluginTypeSwitch = ({ className, variant = 'default' }: PluginTypeSwitchProps) => {
const { t } = useTranslation()
const [activePluginType, handleActivePluginTypeChange] = useActivePluginType()
const setSearchMode = useSetAtom(searchModeAtom)
const isHero = variant === 'hero'
const isHome = variant === 'home'
const iconClassName = 'mr-1.5 size-4'
const options: Array<{
@ -38,7 +39,7 @@ const PluginTypeSwitch = ({ className, variant = 'default' }: PluginTypeSwitchPr
text: isHero
? t(($) => $['marketplace.allPlugins'], { ns: 'plugin' })
: t(($) => $['category.all'], { ns: 'plugin' }),
icon: isHero ? <PluginIcon className={iconClassName} /> : null,
icon: isHero || isHome ? <PluginIcon className={iconClassName} /> : null,
},
{
value: PLUGIN_TYPE_SEARCH_MAP.model,
@ -52,12 +53,14 @@ const PluginTypeSwitch = ({ className, variant = 'default' }: PluginTypeSwitchPr
},
{
value: PLUGIN_TYPE_SEARCH_MAP.datasource,
text: t(($) => $['category.datasources'], { ns: 'plugin' }),
text: t(($) => $[isHome ? 'categorySingle.datasource' : 'category.datasources'], {
ns: 'plugin',
}),
icon: <RiDatabase2Line className={iconClassName} />,
},
{
value: PLUGIN_TYPE_SEARCH_MAP.agent,
text: t(($) => $['category.agents'], { ns: 'plugin' }),
text: t(($) => $[isHome ? 'categorySingle.agent' : 'category.agents'], { ns: 'plugin' }),
icon: <RiSpeakAiLine className={iconClassName} />,
},
{
@ -82,9 +85,13 @@ const PluginTypeSwitch = ({ className, variant = 'default' }: PluginTypeSwitchPr
className={cn(
isHero
? 'flex shrink-0 items-center gap-1 overflow-x-auto'
: 'flex shrink-0 items-center justify-center space-x-2 bg-background-body py-3',
: isHome
? 'flex shrink-0 items-center gap-1 overflow-x-auto'
: 'flex shrink-0 items-center justify-center space-x-2 bg-background-body py-3',
className,
)}
role="group"
aria-label={t(($) => $['marketplace.allPlugins'], { ns: 'plugin' })}
>
{options.map((option, index) => {
const isActive = activePluginType === option.value
@ -96,7 +103,11 @@ const PluginTypeSwitch = ({ className, variant = 'default' }: PluginTypeSwitchPr
aria-pressed={isActive}
className={cn(
'flex h-8 cursor-pointer appearance-none items-center rounded-lg border border-transparent px-2.5 system-md-medium whitespace-nowrap outline-hidden focus-visible:ring-2 focus-visible:ring-state-accent-solid',
isHero ? 'text-text-primary-on-surface' : 'text-text-tertiary',
isHero
? 'text-text-primary-on-surface'
: isHome
? 'min-w-12 justify-center text-text-tertiary'
: 'text-text-tertiary',
!isActive &&
(isHero
? 'hover:bg-white/20'
@ -104,7 +115,9 @@ const PluginTypeSwitch = ({ className, variant = 'default' }: PluginTypeSwitchPr
isActive &&
(isHero
? 'border-white/95 bg-components-main-nav-nav-button-bg-active text-saas-dify-blue-inverted shadow-md backdrop-blur-[5px]'
: 'border-components-main-nav-nav-button-border bg-components-main-nav-nav-button-bg-active! text-components-main-nav-nav-button-text-active! shadow-xs'),
: isHome
? 'bg-background-interaction-from-bg-2 text-saas-dify-blue-inverted'
: 'border-components-main-nav-nav-button-border bg-components-main-nav-nav-button-bg-active! text-components-main-nav-nav-button-text-active! shadow-xs'),
)}
onClick={() => {
handleActivePluginTypeChange(option.value)

View File

@ -228,7 +228,10 @@
"marketplace.empower": "تمكين تطوير الذكاء الاصطناعي الخاص بك",
"marketplace.home.heroSubtitle": "Build with safer, more reliable plugins from the Dify Marketplace.",
"marketplace.home.heroTitle": "Discover. Extend. Build",
"marketplace.home.new": "جديد",
"marketplace.home.plugins": "المكونات الإضافية",
"marketplace.home.searchPlaceholder": "Search plugins or templates",
"marketplace.home.templates": "قوالب",
"marketplace.home.trendingByCreator": "by {{creator}}",
"marketplace.home.trendingDescription": "Top picks by real usage, refreshed every two weeks. Ranked by actual runs across workspaces — no paid placement, no editorial picks.",
"marketplace.home.trendingEyebrow": "Trending Now",

View File

@ -228,7 +228,10 @@
"marketplace.empower": "Unterstützen Sie Ihre KI-Entwicklung",
"marketplace.home.heroSubtitle": "Build with safer, more reliable plugins from the Dify Marketplace.",
"marketplace.home.heroTitle": "Discover. Extend. Build",
"marketplace.home.new": "Neu",
"marketplace.home.plugins": "Plugins",
"marketplace.home.searchPlaceholder": "Search plugins or templates",
"marketplace.home.templates": "Vorlagen",
"marketplace.home.trendingByCreator": "by {{creator}}",
"marketplace.home.trendingDescription": "Top picks by real usage, refreshed every two weeks. Ranked by actual runs across workspaces — no paid placement, no editorial picks.",
"marketplace.home.trendingEyebrow": "Trending Now",

View File

@ -228,7 +228,10 @@
"marketplace.empower": "Empower your AI development",
"marketplace.home.heroSubtitle": "Build with safer, more reliable plugins from the Dify Marketplace.",
"marketplace.home.heroTitle": "Discover. Extend. Build",
"marketplace.home.new": "New",
"marketplace.home.plugins": "Plugins",
"marketplace.home.searchPlaceholder": "Search plugins or templates",
"marketplace.home.templates": "Templates",
"marketplace.home.trendingByCreator": "by {{creator}}",
"marketplace.home.trendingDescription": "Top picks by real usage, refreshed every two weeks. Ranked by actual runs across workspaces — no paid placement, no editorial picks.",
"marketplace.home.trendingEyebrow": "Trending Now",

View File

@ -228,7 +228,10 @@
"marketplace.empower": "Potencie su desarrollo de IA",
"marketplace.home.heroSubtitle": "Build with safer, more reliable plugins from the Dify Marketplace.",
"marketplace.home.heroTitle": "Discover. Extend. Build",
"marketplace.home.new": "Nuevo",
"marketplace.home.plugins": "Plugins",
"marketplace.home.searchPlaceholder": "Search plugins or templates",
"marketplace.home.templates": "Plantillas",
"marketplace.home.trendingByCreator": "by {{creator}}",
"marketplace.home.trendingDescription": "Top picks by real usage, refreshed every two weeks. Ranked by actual runs across workspaces — no paid placement, no editorial picks.",
"marketplace.home.trendingEyebrow": "Trending Now",

View File

@ -228,7 +228,10 @@
"marketplace.empower": "توسعه هوش مصنوعی خود را توانمند کنید",
"marketplace.home.heroSubtitle": "Build with safer, more reliable plugins from the Dify Marketplace.",
"marketplace.home.heroTitle": "Discover. Extend. Build",
"marketplace.home.new": "جدید",
"marketplace.home.plugins": "افزونه‌ها",
"marketplace.home.searchPlaceholder": "Search plugins or templates",
"marketplace.home.templates": "الگوها",
"marketplace.home.trendingByCreator": "by {{creator}}",
"marketplace.home.trendingDescription": "Top picks by real usage, refreshed every two weeks. Ranked by actual runs across workspaces — no paid placement, no editorial picks.",
"marketplace.home.trendingEyebrow": "Trending Now",

View File

@ -228,7 +228,10 @@
"marketplace.empower": "Renforcez le développement de votre IA",
"marketplace.home.heroSubtitle": "Build with safer, more reliable plugins from the Dify Marketplace.",
"marketplace.home.heroTitle": "Discover. Extend. Build",
"marketplace.home.new": "Nouveau",
"marketplace.home.plugins": "Plugins",
"marketplace.home.searchPlaceholder": "Search plugins or templates",
"marketplace.home.templates": "Modèles",
"marketplace.home.trendingByCreator": "by {{creator}}",
"marketplace.home.trendingDescription": "Top picks by real usage, refreshed every two weeks. Ranked by actual runs across workspaces — no paid placement, no editorial picks.",
"marketplace.home.trendingEyebrow": "Trending Now",

View File

@ -228,7 +228,10 @@
"marketplace.empower": "अपने एआई विकास को सशक्त बनाएं",
"marketplace.home.heroSubtitle": "Build with safer, more reliable plugins from the Dify Marketplace.",
"marketplace.home.heroTitle": "Discover. Extend. Build",
"marketplace.home.new": "नया",
"marketplace.home.plugins": "एकीकरण",
"marketplace.home.searchPlaceholder": "Search plugins or templates",
"marketplace.home.templates": "टेम्पलेट",
"marketplace.home.trendingByCreator": "by {{creator}}",
"marketplace.home.trendingDescription": "Top picks by real usage, refreshed every two weeks. Ranked by actual runs across workspaces — no paid placement, no editorial picks.",
"marketplace.home.trendingEyebrow": "Trending Now",

View File

@ -228,7 +228,10 @@
"marketplace.empower": "Berdayakan pengembangan AI Anda",
"marketplace.home.heroSubtitle": "Build with safer, more reliable plugins from the Dify Marketplace.",
"marketplace.home.heroTitle": "Discover. Extend. Build",
"marketplace.home.new": "Baru",
"marketplace.home.plugins": "Plugin",
"marketplace.home.searchPlaceholder": "Search plugins or templates",
"marketplace.home.templates": "Templat",
"marketplace.home.trendingByCreator": "by {{creator}}",
"marketplace.home.trendingDescription": "Top picks by real usage, refreshed every two weeks. Ranked by actual runs across workspaces — no paid placement, no editorial picks.",
"marketplace.home.trendingEyebrow": "Trending Now",

View File

@ -228,7 +228,10 @@
"marketplace.empower": "Potenzia lo sviluppo dell'intelligenza artificiale",
"marketplace.home.heroSubtitle": "Build with safer, more reliable plugins from the Dify Marketplace.",
"marketplace.home.heroTitle": "Discover. Extend. Build",
"marketplace.home.new": "Nuovo",
"marketplace.home.plugins": "Plugin",
"marketplace.home.searchPlaceholder": "Search plugins or templates",
"marketplace.home.templates": "Modelli",
"marketplace.home.trendingByCreator": "by {{creator}}",
"marketplace.home.trendingDescription": "Top picks by real usage, refreshed every two weeks. Ranked by actual runs across workspaces — no paid placement, no editorial picks.",
"marketplace.home.trendingEyebrow": "Trending Now",

View File

@ -228,7 +228,10 @@
"marketplace.empower": "AI 開発をサポートする",
"marketplace.home.heroSubtitle": "Dify Marketplace で、より安全で信頼性の高いプラグインを見つけましょう。",
"marketplace.home.heroTitle": "Discover. Extend. Build",
"marketplace.home.new": "新着",
"marketplace.home.plugins": "プラグイン",
"marketplace.home.searchPlaceholder": "プラグインまたはテンプレートを検索",
"marketplace.home.templates": "テンプレート",
"marketplace.home.trendingByCreator": "{{creator}} 作成",
"marketplace.home.trendingDescription": "実際の利用状況に基づく人気プラグインを2週間ごとに更新。ワークスペースでの実行数によるランキングで、有料掲載や編集部による選定はありません。",
"marketplace.home.trendingEyebrow": "トレンド",

View File

@ -228,7 +228,10 @@
"marketplace.empower": "AI 개발 역량 강화",
"marketplace.home.heroSubtitle": "Build with safer, more reliable plugins from the Dify Marketplace.",
"marketplace.home.heroTitle": "Discover. Extend. Build",
"marketplace.home.new": "신규",
"marketplace.home.plugins": "플러그인",
"marketplace.home.searchPlaceholder": "Search plugins or templates",
"marketplace.home.templates": "템플릿",
"marketplace.home.trendingByCreator": "by {{creator}}",
"marketplace.home.trendingDescription": "Top picks by real usage, refreshed every two weeks. Ranked by actual runs across workspaces — no paid placement, no editorial picks.",
"marketplace.home.trendingEyebrow": "Trending Now",

View File

@ -228,7 +228,10 @@
"marketplace.empower": "Empower your AI development",
"marketplace.home.heroSubtitle": "Build with safer, more reliable plugins from the Dify Marketplace.",
"marketplace.home.heroTitle": "Discover. Extend. Build",
"marketplace.home.new": "Nieuw",
"marketplace.home.plugins": "Plugins",
"marketplace.home.searchPlaceholder": "Search plugins or templates",
"marketplace.home.templates": "Sjablonen",
"marketplace.home.trendingByCreator": "by {{creator}}",
"marketplace.home.trendingDescription": "Top picks by real usage, refreshed every two weeks. Ranked by actual runs across workspaces — no paid placement, no editorial picks.",
"marketplace.home.trendingEyebrow": "Trending Now",

View File

@ -228,7 +228,10 @@
"marketplace.empower": "Zwiększ możliwości rozwoju sztucznej inteligencji",
"marketplace.home.heroSubtitle": "Build with safer, more reliable plugins from the Dify Marketplace.",
"marketplace.home.heroTitle": "Discover. Extend. Build",
"marketplace.home.new": "Nowość",
"marketplace.home.plugins": "Integracje",
"marketplace.home.searchPlaceholder": "Search plugins or templates",
"marketplace.home.templates": "Szablony",
"marketplace.home.trendingByCreator": "by {{creator}}",
"marketplace.home.trendingDescription": "Top picks by real usage, refreshed every two weeks. Ranked by actual runs across workspaces — no paid placement, no editorial picks.",
"marketplace.home.trendingEyebrow": "Trending Now",

View File

@ -228,7 +228,10 @@
"marketplace.empower": "Capacite seu desenvolvimento de IA",
"marketplace.home.heroSubtitle": "Crie com plugins mais seguros e confiáveis do Dify Marketplace.",
"marketplace.home.heroTitle": "Discover. Extend. Build",
"marketplace.home.new": "Novo",
"marketplace.home.plugins": "Plugins",
"marketplace.home.searchPlaceholder": "Buscar plugins ou modelos",
"marketplace.home.templates": "Modelos",
"marketplace.home.trendingByCreator": "por {{creator}}",
"marketplace.home.trendingDescription": "Destaques por uso real, atualizados a cada duas semanas. Classificados pelas execuções reais nos espaços de trabalho — sem promoção paga ou seleção editorial.",
"marketplace.home.trendingEyebrow": "Em alta agora",

View File

@ -228,7 +228,10 @@
"marketplace.empower": "Îmbunătățește-ți dezvoltarea AI",
"marketplace.home.heroSubtitle": "Build with safer, more reliable plugins from the Dify Marketplace.",
"marketplace.home.heroTitle": "Discover. Extend. Build",
"marketplace.home.new": "Nou",
"marketplace.home.plugins": "Plugin-uri",
"marketplace.home.searchPlaceholder": "Search plugins or templates",
"marketplace.home.templates": "Șabloane",
"marketplace.home.trendingByCreator": "by {{creator}}",
"marketplace.home.trendingDescription": "Top picks by real usage, refreshed every two weeks. Ranked by actual runs across workspaces — no paid placement, no editorial picks.",
"marketplace.home.trendingEyebrow": "Trending Now",

View File

@ -228,7 +228,10 @@
"marketplace.empower": "Расширьте возможности разработки ИИ",
"marketplace.home.heroSubtitle": "Build with safer, more reliable plugins from the Dify Marketplace.",
"marketplace.home.heroTitle": "Discover. Extend. Build",
"marketplace.home.new": "Новое",
"marketplace.home.plugins": "Интеграции",
"marketplace.home.searchPlaceholder": "Search plugins or templates",
"marketplace.home.templates": "Шаблоны",
"marketplace.home.trendingByCreator": "by {{creator}}",
"marketplace.home.trendingDescription": "Top picks by real usage, refreshed every two weeks. Ranked by actual runs across workspaces — no paid placement, no editorial picks.",
"marketplace.home.trendingEyebrow": "Trending Now",

View File

@ -228,7 +228,10 @@
"marketplace.empower": "Okrepite svoj razvoj AI",
"marketplace.home.heroSubtitle": "Build with safer, more reliable plugins from the Dify Marketplace.",
"marketplace.home.heroTitle": "Discover. Extend. Build",
"marketplace.home.new": "Novo",
"marketplace.home.plugins": "Integracije",
"marketplace.home.searchPlaceholder": "Search plugins or templates",
"marketplace.home.templates": "Predloge",
"marketplace.home.trendingByCreator": "by {{creator}}",
"marketplace.home.trendingDescription": "Top picks by real usage, refreshed every two weeks. Ranked by actual runs across workspaces — no paid placement, no editorial picks.",
"marketplace.home.trendingEyebrow": "Trending Now",

View File

@ -228,7 +228,10 @@
"marketplace.empower": "เพิ่มศักยภาพในการพัฒนา AI ของคุณ",
"marketplace.home.heroSubtitle": "Build with safer, more reliable plugins from the Dify Marketplace.",
"marketplace.home.heroTitle": "Discover. Extend. Build",
"marketplace.home.new": "ใหม่",
"marketplace.home.plugins": "ปลั๊กอิน",
"marketplace.home.searchPlaceholder": "Search plugins or templates",
"marketplace.home.templates": "เทมเพลต",
"marketplace.home.trendingByCreator": "by {{creator}}",
"marketplace.home.trendingDescription": "Top picks by real usage, refreshed every two weeks. Ranked by actual runs across workspaces — no paid placement, no editorial picks.",
"marketplace.home.trendingEyebrow": "Trending Now",

View File

@ -228,7 +228,10 @@
"marketplace.empower": "Yapay zeka geliştirmenizi güçlendirin",
"marketplace.home.heroSubtitle": "Build with safer, more reliable plugins from the Dify Marketplace.",
"marketplace.home.heroTitle": "Discover. Extend. Build",
"marketplace.home.new": "Yeni",
"marketplace.home.plugins": "Eklentiler",
"marketplace.home.searchPlaceholder": "Search plugins or templates",
"marketplace.home.templates": "Şablonlar",
"marketplace.home.trendingByCreator": "by {{creator}}",
"marketplace.home.trendingDescription": "Top picks by real usage, refreshed every two weeks. Ranked by actual runs across workspaces — no paid placement, no editorial picks.",
"marketplace.home.trendingEyebrow": "Trending Now",

View File

@ -228,7 +228,10 @@
"marketplace.empower": "Розширюйте можливості розробки штучного інтелекту",
"marketplace.home.heroSubtitle": "Build with safer, more reliable plugins from the Dify Marketplace.",
"marketplace.home.heroTitle": "Discover. Extend. Build",
"marketplace.home.new": "Нове",
"marketplace.home.plugins": "Інтеграції",
"marketplace.home.searchPlaceholder": "Search plugins or templates",
"marketplace.home.templates": "Шаблони",
"marketplace.home.trendingByCreator": "by {{creator}}",
"marketplace.home.trendingDescription": "Top picks by real usage, refreshed every two weeks. Ranked by actual runs across workspaces — no paid placement, no editorial picks.",
"marketplace.home.trendingEyebrow": "Trending Now",

View File

@ -228,7 +228,10 @@
"marketplace.empower": "Hỗ trợ phát triển AI của bạn",
"marketplace.home.heroSubtitle": "Build with safer, more reliable plugins from the Dify Marketplace.",
"marketplace.home.heroTitle": "Discover. Extend. Build",
"marketplace.home.new": "Mới",
"marketplace.home.plugins": "Plugin",
"marketplace.home.searchPlaceholder": "Search plugins or templates",
"marketplace.home.templates": "Mẫu",
"marketplace.home.trendingByCreator": "by {{creator}}",
"marketplace.home.trendingDescription": "Top picks by real usage, refreshed every two weeks. Ranked by actual runs across workspaces — no paid placement, no editorial picks.",
"marketplace.home.trendingEyebrow": "Trending Now",

View File

@ -228,7 +228,10 @@
"marketplace.empower": "助力您的 AI 开发",
"marketplace.home.heroSubtitle": "在 Dify Marketplace 探索更安全、更可靠的插件。",
"marketplace.home.heroTitle": "Discover. Extend. Build",
"marketplace.home.new": "新",
"marketplace.home.plugins": "插件",
"marketplace.home.searchPlaceholder": "搜索插件或模板",
"marketplace.home.templates": "模板",
"marketplace.home.trendingByCreator": "由 {{creator}} 发布",
"marketplace.home.trendingDescription": "基于真实使用情况选出的热门插件,每两周更新一次。榜单按各工作区的实际运行次数排序,不含付费推广或编辑推荐。",
"marketplace.home.trendingEyebrow": "当前热门",

View File

@ -228,7 +228,10 @@
"marketplace.empower": "為您的 AI 開發提供支援",
"marketplace.home.heroSubtitle": "在 Dify Marketplace 探索更安全、更可靠的外掛程式。",
"marketplace.home.heroTitle": "Discover. Extend. Build",
"marketplace.home.new": "新",
"marketplace.home.plugins": "外掛",
"marketplace.home.searchPlaceholder": "搜尋外掛程式或範本",
"marketplace.home.templates": "範本",
"marketplace.home.trendingByCreator": "由 {{creator}} 發布",
"marketplace.home.trendingDescription": "根據真實使用情況選出的熱門外掛程式,每兩週更新一次。榜單按各工作區的實際執行次數排序,不含付費推廣或編輯推薦。",
"marketplace.home.trendingEyebrow": "目前熱門",