+
+
-
+ {contentHtml ? (
+
+ ) : null}
)
}
diff --git a/src/app/(frontend)/[locale]/contact/page.tsx b/src/app/(frontend)/[locale]/contact/page.tsx
new file mode 100644
index 0000000..fcf3162
--- /dev/null
+++ b/src/app/(frontend)/[locale]/contact/page.tsx
@@ -0,0 +1,291 @@
+import type { Metadata } from 'next'
+import Link from 'next/link'
+import { setRequestLocale } from 'next-intl/server'
+import type { Locale } from '@/i18n/config'
+import { AboutContactTabs } from '@/components/site/about-contact-tabs'
+import { PageHero } from '@/components/site/page-hero'
+import { getPayloadClient } from '@/lib/payload'
+import { buildAbsoluteUrl, buildLocaleAlternates } from '@/lib/seo'
+import { normalizeUploadUrl } from '@/lib/upload-url'
+import { DealerPartnershipForms } from '../dealers/dealer-partnership-forms'
+
+export const dynamic = 'force-dynamic'
+export const revalidate = 0
+
+type ContactItem = {
+ href?: string
+ label: string
+ value: string
+}
+
+type ContactGroup = {
+ body?: string
+ items: ContactItem[]
+ title: string
+}
+
+function getDefaultContactGroups(locale: Locale): ContactGroup[] {
+ if (locale === 'zh') {
+ return [
+ {
+ title: 'Eversolo 中国办公室',
+ items: [
+ {
+ label: '地址',
+ value: "深圳市宝安区西乡街道龙腾社区汇智研发中心 BC 栋 C1401",
+ },
+ { href: 'tel:+8675523500280', label: '电话', value: '+86 755 23500280' },
+ { label: '传真', value: '+86 755 23500292' },
+ { href: 'mailto:sales@eversolo.com', label: '邮箱', value: 'sales@eversolo.com' },
+ ],
+ },
+ {
+ title: '销售与渠道合作',
+ items: [
+ { label: 'Sales Skype', value: 'cathy@zidoo.tv' },
+ { href: 'mailto:sales@eversolo.com', label: '销售邮箱', value: 'sales@eversolo.com' },
+ { href: '#partnership-forms', label: '经销商申请', value: '填写经销合作表单' },
+ { href: 'mailto:myq@eversolo.com', label: 'OEM/ODM', value: 'myq@eversolo.com' },
+ { href: '#partnership-forms', label: 'OEM 需求', value: '填写 OEM 需求表单' },
+ ],
+ },
+ {
+ title: '支持团队',
+ body: '如遇到安装、升级或常见设置问题,建议先查看 FAQ 与下载中心;仍需协助时,可通过售后支持入口或邮件继续联系。',
+ items: [
+ { href: `/${locale}/support/faq`, label: 'FAQ', value: '常见问题' },
+ { href: 'mailto:service@eversolo.com', label: '支持邮箱', value: 'service@eversolo.com' },
+ { href: `/${locale}/support/contact`, label: '售后支持', value: '提交售后请求' },
+ ],
+ },
+ ]
+ }
+
+ return [
+ {
+ title: 'Eversolo Audio China Office',
+ items: [
+ {
+ label: 'Address',
+ value: "C1401, Building BC, Huizhi R&D Center, Longteng Community, Xixiang Street, Bao'an District, Shenzhen",
+ },
+ { href: 'tel:+8675523500280', label: 'Tel', value: '+86 755 23500280' },
+ { label: 'Fax', value: '+86 755 23500292' },
+ { href: 'mailto:sales@eversolo.com', label: 'Email', value: 'sales@eversolo.com' },
+ ],
+ },
+ {
+ title: 'Sales & Channel Partnership',
+ items: [
+ { label: 'Sales Skype', value: 'cathy@zidoo.tv' },
+ { href: 'mailto:sales@eversolo.com', label: 'Sales Email', value: 'sales@eversolo.com' },
+ { href: '#partnership-forms', label: 'Become A Distributor', value: 'Submit distributor request' },
+ { href: 'mailto:myq@eversolo.com', label: 'OEM/ODM', value: 'myq@eversolo.com' },
+ { href: '#partnership-forms', label: 'OEM Requirements', value: 'Submit OEM inquiry' },
+ ],
+ },
+ {
+ title: 'Support Team',
+ body: 'For setup, firmware, or common usage questions, start with FAQ and downloads. If you still need help, contact the support team by email or submit an after-service request.',
+ items: [
+ { href: `/${locale}/support/faq`, label: 'FAQ', value: 'Support FAQ' },
+ { href: 'mailto:service@eversolo.com', label: 'Support Email', value: 'service@eversolo.com' },
+ { href: `/${locale}/support/contact`, label: 'After Service', value: 'Submit support request' },
+ ],
+ },
+ ]
+}
+
+function getDefaultHero(locale: Locale) {
+ return locale === 'zh'
+ ? {
+ description: '经销合作、OEM/ODM 项目需求、销售与支持联系方式集中放在这里,方便更快找到对应团队。',
+ eyebrow: '商务与支持联系',
+ imageUrl: 'https://www.eversolo.com/Public/home/images/about_us.jpg',
+ title: '联系我们',
+ }
+ : {
+ description: 'Distributor requests, OEM/ODM inquiries, sales contacts, and support channels in one focused page.',
+ eyebrow: 'Business & Support Contact',
+ imageUrl: 'https://www.eversolo.com/Public/home/images/about_us.jpg',
+ title: 'Contact Eversolo',
+ }
+}
+
+function getDefaultFormIntro(locale: Locale) {
+ return locale === 'zh'
+ ? {
+ description: '如果您计划成为区域经销商,或需要面向项目与系统方案的 OEM 合作支持,可以直接从这里提交申请。',
+ eyebrow: '合作申请',
+ title: '经销与 OEM 合作入口',
+ }
+ : {
+ description: 'If you are exploring regional distribution or need OEM support for projects and systems, submit your request here.',
+ eyebrow: 'Partnership Requests',
+ title: 'Dealer & OEM Entry Points',
+ }
+}
+
+function normalizeContactGroups(groups: unknown, locale: Locale) {
+ if (!Array.isArray(groups)) return getDefaultContactGroups(locale)
+
+ const normalized: ContactGroup[] = []
+
+ for (const group of groups) {
+ if (!group || typeof group !== 'object') continue
+ const record = group as {
+ body?: string | null
+ items?: Array<{ href?: string | null; label?: string | null; value?: string | null }> | null
+ title?: string | null
+ }
+ const title = record.title?.trim()
+ const items = (record.items || [])
+ .map((item) => ({
+ href: item.href?.trim() || undefined,
+ label: item.label?.trim() || '',
+ value: item.value?.trim() || '',
+ }))
+ .filter((item) => item.label && item.value)
+
+ if (!title || items.length === 0) continue
+
+ normalized.push({
+ body: record.body?.trim() || undefined,
+ items,
+ title,
+ })
+ }
+
+ return normalized.length > 0 ? normalized : getDefaultContactGroups(locale)
+}
+
+async function getContactUsPageData(locale: Locale) {
+ const payload = await getPayloadClient()
+
+ return payload.findGlobal({
+ depth: 1,
+ locale,
+ slug: 'contactUsPage' as any,
+ })
+}
+
+export async function generateMetadata({
+ params,
+}: {
+ params: Promise<{ locale: Locale }>
+}): Promise
{
+ const { locale } = await params
+ const page = await getContactUsPageData(locale)
+ const defaultHero = getDefaultHero(locale)
+ const hero = (page as {
+ hero?: {
+ description?: string | null
+ title?: string | null
+ } | null
+ }).hero
+
+ return {
+ alternates: buildLocaleAlternates('/contact', locale),
+ description: hero?.description?.trim() || defaultHero.description,
+ title: hero?.title?.trim() || defaultHero.title,
+ }
+}
+
+export default async function ContactPage({
+ params,
+}: {
+ params: Promise<{ locale: Locale }>
+}) {
+ const { locale } = await params
+ setRequestLocale(locale)
+
+ const page = await getContactUsPageData(locale) as {
+ contactGroups?: unknown
+ formIntro?: { description?: string | null; eyebrow?: string | null; title?: string | null } | null
+ hero?: {
+ description?: string | null
+ eyebrow?: string | null
+ image?: { thumbnailURL?: string | null; url?: string | null } | number | null
+ title?: string | null
+ } | null
+ }
+ const defaultHero = getDefaultHero(locale)
+ const defaultFormIntro = getDefaultFormIntro(locale)
+ const heroImage =
+ page.hero?.image && typeof page.hero.image !== 'number'
+ ? normalizeUploadUrl(page.hero.image.url ?? page.hero.image.thumbnailURL ?? null)
+ : null
+ const contactGroups = normalizeContactGroups(page.contactGroups, locale)
+ const formIntro = {
+ description: page.formIntro?.description?.trim() || defaultFormIntro.description,
+ eyebrow: page.formIntro?.eyebrow?.trim() || defaultFormIntro.eyebrow,
+ title: page.formIntro?.title?.trim() || defaultFormIntro.title,
+ }
+
+ return (
+
+
+
+
+
+
+
+ {contactGroups.map((group) => (
+
+ {group.title}
+ {group.body ? (
+ {group.body}
+ ) : null}
+
+ {group.items.map((item) => (
+
+
+ {item.label}
+
+
+ {item.href ? (
+ item.href.startsWith('/') ? (
+
+ {item.value}
+
+ ) : (
+
+ {item.value}
+
+ )
+ ) : (
+ item.value
+ )}
+
+
+ ))}
+
+
+ ))}
+
+
+
+
+
+
+ )
+}
diff --git a/src/app/(frontend)/[locale]/dealers/dealer-partnership-forms.tsx b/src/app/(frontend)/[locale]/dealers/dealer-partnership-forms.tsx
index 1d8f9e4..2c104f6 100644
--- a/src/app/(frontend)/[locale]/dealers/dealer-partnership-forms.tsx
+++ b/src/app/(frontend)/[locale]/dealers/dealer-partnership-forms.tsx
@@ -49,7 +49,19 @@ const INITIAL_OEM_FORM: OemFormState = {
website: '',
}
-export function DealerPartnershipForms({ locale }: { locale: Locale }) {
+type PartnershipFormIntro = {
+ description?: string | null
+ eyebrow?: string | null
+ title?: string | null
+}
+
+export function DealerPartnershipForms({
+ intro,
+ locale,
+}: {
+ intro?: PartnershipFormIntro
+ locale: Locale
+}) {
const [activeForm, setActiveForm] = useState<'distributor' | 'oem'>('distributor')
const [distributorForm, setDistributorForm] =
useState(INITIAL_DISTRIBUTOR_FORM)
@@ -118,15 +130,16 @@ export function DealerPartnershipForms({ locale }: { locale: Locale }) {
- {locale === 'zh' ? '合作申请' : 'Partnership Requests'}
+ {intro?.eyebrow || (locale === 'zh' ? '合作申请' : 'Partnership Requests')}
- {locale === 'zh' ? '经销与 OEM 合作入口' : 'Dealer & OEM Entry Points'}
+ {intro?.title || (locale === 'zh' ? '经销与 OEM 合作入口' : 'Dealer & OEM Entry Points')}
- {locale === 'zh'
- ? '如果您计划成为区域经销商,或需要面向项目与系统方案的 OEM 合作支持,可以直接从这里提交申请。'
- : 'If you are exploring regional distribution or need OEM support for projects and systems, submit your request here.'}
+ {intro?.description ||
+ (locale === 'zh'
+ ? '如果您计划成为区域经销商,或需要面向项目与系统方案的 OEM 合作支持,可以直接从这里提交申请。'
+ : 'If you are exploring regional distribution or need OEM support for projects and systems, submit your request here.')}
diff --git a/src/app/(frontend)/[locale]/dealers/page.tsx b/src/app/(frontend)/[locale]/dealers/page.tsx
index 2d0fdc6..272e11e 100644
--- a/src/app/(frontend)/[locale]/dealers/page.tsx
+++ b/src/app/(frontend)/[locale]/dealers/page.tsx
@@ -1,4 +1,5 @@
import type { Metadata } from 'next'
+import Link from 'next/link'
import { setRequestLocale } from 'next-intl/server'
import type { Locale } from '@/i18n/config'
import { PageHero } from '@/components/site/page-hero'
@@ -6,11 +7,86 @@ import { getPayloadClient } from '@/lib/payload'
import { buildAbsoluteUrl, buildLocaleAlternates } from '@/lib/seo'
import { normalizeUploadUrl } from '@/lib/upload-url'
import type { Dealer } from '@/payload-types'
-import { DealerPartnershipForms } from './dealer-partnership-forms'
export const dynamic = 'force-dynamic'
export const revalidate = 0
+const DEALERS_PAGE_DEFAULTS = {
+ en: {
+ businessContact: {
+ ctaHref: '/en/contact',
+ ctaLabel: 'Open Contact',
+ eyebrow: 'Business Contact',
+ title: 'Distributor and OEM requests now live on the contact page',
+ },
+ emptyState: {
+ message: 'Authorized dealer information is being updated.',
+ },
+ hero: {
+ description:
+ 'Browse the Eversolo dealer network. For regional distribution or OEM partnership requests, visit the contact page.',
+ eyebrow: 'Sales Network',
+ imageUrl: 'https://www.eversolo.com/Public/home/images/nav_show.jpg',
+ title: 'Dealers & Partners',
+ },
+ },
+ zh: {
+ businessContact: {
+ ctaHref: '/zh/contact',
+ ctaLabel: '前往联系我们',
+ eyebrow: '商务合作',
+ title: '经销申请与 OEM 需求已移至联系我们页面',
+ },
+ emptyState: {
+ message: '授权经销商信息正在同步中。',
+ },
+ hero: {
+ description:
+ '查看 Eversolo 授权销售网络;如需提交区域经销或 OEM 合作需求,可前往联系我们页面。',
+ eyebrow: '销售网络',
+ imageUrl: 'https://www.eversolo.com/Public/home/images/nav_show.jpg',
+ title: '经销商与合作伙伴',
+ },
+ },
+} satisfies Record
+
+async function getDealersPageSettings(locale: Locale) {
+ const payload = await getPayloadClient()
+
+ try {
+ const settings = await payload.findGlobal({
+ depth: 1,
+ locale,
+ slug: 'dealersPage',
+ })
+ const defaults = DEALERS_PAGE_DEFAULTS[locale]
+
+ return {
+ businessContact: {
+ ctaHref: settings.businessContact?.ctaHref || defaults.businessContact.ctaHref,
+ ctaLabel: settings.businessContact?.ctaLabel || defaults.businessContact.ctaLabel,
+ eyebrow: settings.businessContact?.eyebrow || defaults.businessContact.eyebrow,
+ title: settings.businessContact?.title || defaults.businessContact.title,
+ },
+ emptyState: {
+ message: settings.emptyState?.message || defaults.emptyState.message,
+ },
+ hero: {
+ description: settings.hero?.description || defaults.hero.description,
+ eyebrow: settings.hero?.eyebrow || defaults.hero.eyebrow,
+ imageUrl: settings.hero?.imageUrl || defaults.hero.imageUrl,
+ title: settings.hero?.title || defaults.hero.title,
+ },
+ }
+ } catch {
+ return DEALERS_PAGE_DEFAULTS[locale]
+ }
+}
+
async function getDealersPageData(locale: Locale) {
const payload = await getPayloadClient()
const result = await payload.find({
@@ -56,14 +132,12 @@ export async function generateMetadata({
params: Promise<{ locale: Locale }>
}): Promise {
const { locale } = await params
+ const settings = await getDealersPageSettings(locale)
return {
alternates: buildLocaleAlternates('/dealers', locale),
- description:
- locale === 'zh'
- ? '查看 Eversolo 授权经销商网络与区域联系方式。'
- : 'Browse the Eversolo authorized dealer network and regional contacts.',
- title: locale === 'zh' ? '经销商网络' : 'Dealer Network',
+ description: settings.hero.description,
+ title: settings.hero.title,
}
}
@@ -76,6 +150,7 @@ export default async function DealersPage({
setRequestLocale(locale)
const groups = await getDealersPageData(locale)
+ const settings = await getDealersPageSettings(locale)
const dealerItems = groups.flatMap((group) =>
group.dealers.map((dealer) => ({
'@type': 'Organization',
@@ -89,7 +164,7 @@ export default async function DealersPage({
)
return (
-
+
{dealerItems.length > 0 ? (
) : null}
-
+
+
+
+
+ {settings.businessContact.eyebrow}
+
+
+ {settings.businessContact.title}
+
+
+
+ {settings.businessContact.ctaLabel}
+
→
+
+
+
+
+
{groups.map((group) => (
@@ -174,16 +265,11 @@ export default async function DealersPage({
{groups.length === 0 ? (
- {locale === 'zh'
- ? '授权经销商信息正在同步中。'
- : 'Authorized dealer information is being updated.'}
+ {settings.emptyState.message}
) : null}
-
-
-
)
}
diff --git a/src/app/(frontend)/[locale]/downloads/[slug]/page.tsx b/src/app/(frontend)/[locale]/downloads/[slug]/page.tsx
index 7ff51a1..7d39655 100644
--- a/src/app/(frontend)/[locale]/downloads/[slug]/page.tsx
+++ b/src/app/(frontend)/[locale]/downloads/[slug]/page.tsx
@@ -572,7 +572,7 @@ export default async function ProductDownloadsPage({
'https://www.eversolo.com/Uploads/guideClassify/fa6c444623c46ff4799f2cc96a007fe6.png'
return (
-
+
+
{locale === 'zh' ? '当前产品的下载内容正在整理中。' : 'Downloads for this product are being prepared.'}
) : null}
-
+
{groupedDownloads.map((group) => (
diff --git a/src/app/(frontend)/[locale]/downloads/page.tsx b/src/app/(frontend)/[locale]/downloads/page.tsx
index fe7778d..4858464 100644
--- a/src/app/(frontend)/[locale]/downloads/page.tsx
+++ b/src/app/(frontend)/[locale]/downloads/page.tsx
@@ -680,7 +680,7 @@ export default async function DownloadsPage({
const totalReleases = groups.reduce((sum, group) => sum + group.downloads.length, 0)
return (
-
+
{softwareItems.length > 0 ? (