diff --git a/Caddyfile b/Caddyfile new file mode 100644 index 0000000..913de19 --- /dev/null +++ b/Caddyfile @@ -0,0 +1,46 @@ +# Caddy reverse proxy for Eversolo Web +# Domain: test.luxsin.com.cn +# Caddy automatically obtains and renews SSL certificates via Let's Encrypt / ZeroSSL. +# HTTP (port 80) is automatically redirected to HTTPS. + +test.luxsin.com.cn { + # Security headers (applied to all responses) + header { + X-Content-Type-Options nosniff + X-Frame-Options SAMEORIGIN + Referrer-Policy strict-origin-when-cross-origin + } + + # Payload uploads served directly from the persistent data volume. + # docker-compose mounts ./data/{media,files,videos} -> /srv/uploads/{media,files,videos} + # handle creates an exclusive route: once matched, the request never falls through to the app. + handle /media/* { + root * /srv/uploads + header Cache-Control "public, max-age=2592000, immutable" + file_server + } + + handle /files/* { + root * /srv/uploads + header Cache-Control "public, max-age=604800" + file_server + } + + handle /videos/* { + root * /srv/uploads + header Cache-Control "public, max-age=2592000" + file_server + } + + # Everything else -> Next.js app (port 3000) + # WebSocket upgrade headers are handled automatically by Caddy. + handle { + reverse_proxy app:3000 { + header_up X-Real-IP {remote_host} + transport http { + read_timeout 300s + write_timeout 300s + } + } + } +} diff --git a/docker-compose.yml b/docker-compose.yml index c233ef9..fe2e21c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -21,19 +21,20 @@ services: networks: - web - nginx: - image: uhub.service.ucloud.cn/mysql-images/nginx:latest - container_name: eversolo-nginx + caddy: + image: uhub.service.ucloud.cn/mysql-images/caddy:2-alpine + container_name: eversolo-caddy restart: unless-stopped depends_on: - app ports: - "80:80" - "443:443" + - "443:443/udp" volumes: - - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - - ./nginx/conf.d:/etc/nginx/conf.d:ro - - ./nginx/certs:/etc/nginx/certs:ro + - ./Caddyfile:/etc/caddy/Caddyfile:ro + - caddy_data:/data + - caddy_config:/config - ./data/media:/srv/uploads/media:ro - ./data/files:/srv/uploads/files:ro - ./data/videos:/srv/uploads/videos:ro @@ -67,4 +68,6 @@ networks: driver: bridge volumes: - bootstrap_node_modules: \ No newline at end of file + bootstrap_node_modules: + caddy_data: + caddy_config: \ No newline at end of file diff --git a/docs/admin-operation-guide.md b/docs/admin-operation-guide.md new file mode 100644 index 0000000..258cfed --- /dev/null +++ b/docs/admin-operation-guide.md @@ -0,0 +1,538 @@ +# Admin 后台操作指南 + +> 本文档说明 Payload CMS 后台中每个集合(Collection)和全局配置(Global)的作用、可管理的内容,以及最终在前端哪个页面生效。 + +--- + +## 目录 + +- [模块权限体系](#模块权限体系) +- [Collections(集合)](#collections集合) + - [产品目录 Product Catalog](#产品目录-product-catalog) + - [支持中心 Support Center](#支持中心-support-center) + - [运营管理 Operations](#运营管理-operations) + - [销售渠道 Sales Channels](#销售渠道-sales-channels) + - [素材库 Asset Library](#素材库-asset-library) + - [媒体资料包管理 Media Asset Management](#媒体资料包管理-media-asset-management) + - [内容发布 Content Publishing](#内容发布-content-publishing) + - [系统设置 System Settings](#系统设置-system-settings) +- [Globals(全局配置)](#globals全局配置) + - [站点管理 Site Management](#站点管理-site-management) + - [媒体资料包管理 Media Asset Management](#媒体资料包管理-media-asset-management-1) + +--- + +## 模块权限体系 + +后台采用 **模块分组 + 角色** 的权限控制。每个集合和全局配置都归属一个管理模块。 + +| 模块键 | 中文名 | 适用角色 | +|--------|--------|---------| +| `systemSettings` | 系统设置 | Admin | +| `productCatalog` | 产品目录 | Admin / Editor / Reviewer | +| `supportCenter` | 支持中心 | Admin / Editor / Reviewer | +| `operations` | 运营管理 | Admin / Editor / Reviewer | +| `salesChannels` | 销售渠道 | Admin / Editor / Reviewer | +| `assetLibrary` | 素材库 | Admin / Editor / Reviewer | +| `mediaAssetManagement` | 媒体资料包管理 | Admin / Editor / Reviewer | +| `contentPublishing` | 内容发布 | Admin / Editor / Reviewer | +| `siteManagement` | 站点管理 | Admin / Editor / Reviewer | + +**角色说明:** +- **Admin**:拥有所有模块的完整权限(读、写、删) +- **Editor**:仅对被勾选授权的模块拥有读取和编辑权限;删除需要额外勾选"删除权限" +- **Reviewer**:仅对被勾选授权的模块拥有只读权限 + +--- + +## Collections(集合) + +### 产品目录 Product Catalog + +#### Products(产品) + +| 项目 | 说明 | +|------|------| +| 用途 | 产品主记录,驱动产品模板页、编辑器页面、奖项、下载、SEO | +| 前端位置 | `/products/[slug]` 产品详情页;`/products` 产品列表页 | +| 关键字段 | 型号(Model)、链接标识(Slug)、状态(Status)、分类(Category)、模板(Template) | +| 多语言 | 英文和中文产品作为独立文档维护 | + +**主要 Tab 页:** + +- **概览**:名称、副标题、摘要、描述正文 +- **媒体素材**:头图、移动端头图、卡片图、场景图、头图视频、相册 +- **内容**:核心卖点(数组)、技术亮点、规格参数(分组数组) +- **分发设置**:产品页下载按钮开关、相关产品、配件、推荐经销商 +- **奖项**:奖项列表(Logo、名称、年份、链接) +- **SEO**:页面级 SEO 元数据 + +--- + +#### Product Categories(产品分类) + +| 项目 | 说明 | +|------|------| +| 用途 | 产品目录的导航与分组分类 | +| 前端位置 | `/products` 产品列表页的分类筛选与导航 | +| 关键字段 | Slug、名称(Name)、副标题(Subtitle)、头图(Hero Image)、排序(Order) | +| 多语言 | 英文和中文分类作为独立文档维护 | + +--- + +#### Downloads(下载条目) + +| 项目 | 说明 | +|------|------| +| 用途 | 固件包、说明书、软件安装包、发布说明,关联到产品 | +| 前端位置 | `/downloads` 下载中心列表页;`/downloads/[slug]` 下载详情页;`/products/[slug]` 产品详情页的下载区块 | +| 关键字段 | 标题、分类(固件/说明书/软件/其他)、关联产品、版本号、发布日期、安装包文件、第三方下载地址、更新日志 | +| 多语言 | 英文和中文下载条目作为独立文档维护 | + +**注意**:修改下载条目会自动刷新 `/downloads`、`/products` 和 `/sitemap.xml` 的缓存。 + +--- + +#### Product Videos(产品视频) + +| 项目 | 说明 | +|------|------| +| 用途 | 产品关联的视频条目,用于产品详情页和营销区块 | +| 前端位置 | `/products/[slug]` 产品详情页的视频区块 | +| 关键字段 | 标题、关联产品、平台(YouTube/Vimeo/Bilibili)、视频链接、嵌入链接、缩略图 | +| 多语言 | 英文和中文视频条目作为独立文档维护 | + +--- + +#### Product Reviews(外部评测) + +| 项目 | 说明 | +|------|------| +| 用途 | 外部评测文章的引用、缩略图和外链;首页评测引用也从此集合获取 | +| 前端位置 | `/products/[slug]` 产品详情页的评测区块;`/reviews` 视频与评测页面;首页评测引用模块 | +| 关键字段 | 标题、关联产品、来源名称、评测链接、缩略图、摘要、引用语 | +| 多语言 | 英文和中文评测条目作为独立文档维护 | + +--- + +### 支持中心 Support Center + +#### FAQ Categories(常见问题分类) + +| 项目 | 说明 | +|------|------| +| 用途 | FAQ 列表的主题分类,用于前台 FAQ 页面的分类筛选 | +| 前端位置 | `/support/faq` FAQ 页面的分类标签 | +| 关键字段 | Slug、名称、描述、排序 | +| 多语言 | 英文和中文分类作为独立文档维护 | + +--- + +#### FAQs(常见问题) + +| 项目 | 说明 | +|------|------| +| 用途 | 支持知识库条目,驱动 FAQ 中心和产品帮助流 | +| 前端位置 | `/support/faq` FAQ 页面;`/products/[slug]` 产品详情页的帮助区块 | +| 关键字段 | 分类、问题、答案(富文本)、关联产品、关联下载(联动选择)、关联素材库文件 | +| 多语言 | 英文和中文 FAQ 作为独立文档维护 | + +**操作提示**:选择"下载型号"后,"关联下载"的下拉选项会自动筛选为该产品下的下载条目。 + +--- + +#### Video Tutorials(视频教程) + +| 项目 | 说明 | +|------|------| +| 用途 | 支持教程视频,展示在公开教程页面 | +| 前端位置 | `/support/tutorial` 教程页面 | +| 关键字段 | 标题、封面图、视频链接、嵌入链接、平台、发布时间、排序 | +| 多语言 | 英文和中文视频作为独立文档维护 | + +--- + +### 运营管理 Operations + +#### After-Service Requests(售后请求) + +| 项目 | 说明 | +|------|------| +| 用途 | 售后表单提交记录(用户通过前台售后表单提交) | +| 前端位置 | 前台 `/support/contact` 联系支持页面的售后表单(仅提交,不在前台展示) | +| 关键字段 | 姓名、邮箱、国家、电话、购买渠道、购买日期、产品型号、序列号、问题摘要、详细描述、附件照片 | +| 工作流 | 状态(新/跟进中/已关闭)、跟进负责人、IP 地址、用户代理 | + +--- + +#### Distributor Requests(经销合作请求) + +| 项目 | 说明 | +|------|------| +| 用途 | 经销商合作申请提交记录 | +| 前端位置 | 前台联系表单(仅提交,不在前台展示) | +| 关键字段 | 公司名称、联系人、邮箱、电话、国家、官网、渠道经验、业务说明 | +| 工作流 | 状态、跟进负责人 | + +--- + +#### OEM Requests(OEM 请求) + +| 项目 | 说明 | +|------|------| +| 用途 | OEM / 企业定制询价提交记录 | +| 前端位置 | 前台联系表单(仅提交,不在前台展示) | +| 关键字段 | 公司名称、联系人、邮箱、电话、国家、项目类型、项目说明 | +| 工作流 | 状态、跟进负责人 | + +--- + +#### Support Photos(售后图片) + +| 项目 | 说明 | +|------|------| +| 用途 | 售后表单中用户上传的图片附件 | +| 前端位置 | 后台查看售后请求时显示,不在前台展示 | +| 关键字段 | 文件名、MIME 类型、文件大小、描述 | + +--- + +### 销售渠道 Sales Channels + +#### Dealers(经销商) + +| 项目 | 说明 | +|------|------| +| 用途 | 经销商和分销商记录,用于经销商查找器和产品页推荐经销商 | +| 前端位置 | `/where-to-buy` 购买渠道页面的经销商列表和地图;`/products/[slug]` 产品详情页的推荐经销商 | +| 关键字段 | 名称、类型(经销商/体验店)、区域、国家、城市、地址、邮箱、电话、网站、Logo、门店图片、是否授权、排序 | +| 多语言 | 英文和中文经销商作为独立文档维护 | + +--- + +### 素材库 Asset Library + +#### Media(媒体图片) + +| 项目 | 说明 | +|------|------| +| 用途 | 全站图片上传集合,其他集合的图片字段均关联到此 | +| 前端位置 | 不直接对应前端页面;通过关联关系间接出现在各页面 | +| 说明 | Payload CMS 内置的上传集合,文件存储在服务器 `/media` 目录 | + +#### Files(文件) + +| 项目 | 说明 | +|------|------| +| 用途 | 通用文件上传集合(PDF、压缩包等),FAQ 关联资源和下载条目引用此集合 | +| 前端位置 | 不直接对应前端页面;通过关联关系间接出现在各页面 | +| 说明 | 文件存储在服务器 `/files` 目录 | + +#### Videos(视频文件) + +| 项目 | 说明 | +|------|------| +| 用途 | 视频文件上传集合,产品头图视频和首页 Hero 视频引用此集合 | +| 前端位置 | 不直接对应前端页面;通过关联关系间接出现在各页面 | +| 说明 | 文件存储在服务器 `/videos` 目录 | + +--- + +### 媒体资料包管理 Media Asset Management + +#### Media Asset Categories(资料分类) + +| 项目 | 说明 | +|------|------| +| 用途 | 媒体资料包的分类体系,支持两级层级(一级分类 → 二级分类) | +| 前端位置 | `/media-assets` 资料包首页 → `/media-assets/[category]` 二级分类页 → `/media-assets/[category]/[subcategory]` 三级详情页 | +| 关键字段 | 上级分类(为空则为一级)、名称、Slug、分类图片、描述、排序、压缩包下载地址 | +| 约束 | 只能选择一级分类作为上级;已有子分类的分类不能移到其他分类下 | + +--- + +#### Assets(资料列表) + +| 项目 | 说明 | +|------|------| +| 用途 | 单个图片、PDF、设计文件、视频等素材条目,属于二级分类 | +| 前端位置 | `/media-assets/[category]/[subcategory]` 资料详情列表页 | +| 关键字段 | 所属二级分类、标题、类型(图片/PDF/AI/PSD/视频/通用文件)、缩略图、预览/下载外链、文件格式、文件大小、描述、排序 | +| 约束 | 必须分配到二级分类,不能分配到一级分类 | + +--- + +### 内容发布 Content Publishing + +#### News Categories(新闻分类) + +| 项目 | 说明 | +|------|------| +| 用途 | 本地 CMS 新闻的分类管理 | +| 前端位置 | `/news` 新闻列表页的分类筛选 | +| 关键字段 | Slug、名称、描述、排序 | +| 多语言 | 英文和中文分类作为独立文档维护 | + +--- + +#### News(新闻) + +| 项目 | 说明 | +|------|------| +| 用途 | 编辑新闻故事,用于新闻列表页和首页新闻精选 | +| 前端位置 | `/news` 新闻列表页;`/news/[slug]` 新闻详情页;首页新闻区块(当新闻来源设为"本站新闻"时) | +| 关键字段 | Slug、分类、标题、摘要、封面图、正文(富文本)、作者、发布时间、关联产品 | +| 多语言 | 英文和中文新闻作为独立文档维护 | + +--- + +#### Redirects(重定向) + +| 项目 | 说明 | +|------|------| +| 用途 | URL 重定向规则,用于网站迁移、SEO 优化、旧链接跳转 | +| 前端位置 | 无独立前端页面;在 Next.js 路由层拦截匹配的请求并重定向 | +| 关键字段 | 源路径(From)、目标路径(To)、状态码(301/302/307/308)、匹配类型(精确/前缀/正则)、语言(any/en/zh)、启用开关 | + +--- + +### 系统设置 System Settings + +#### Users(用户) + +| 项目 | 说明 | +|------|------| +| 用途 | 后台管理员账户管理 | +| 前端位置 | 仅后台可见,不影响前台 | +| 关键字段 | 邮箱、密码、角色(Admin/Editor/Reviewer)、允许访问的模块、删除权限 | + +--- + +### 外部媒体资源(辅助集合) + +#### AWS Media Resources / Qiniu Media Resources + +| 项目 | 说明 | +|------|------| +| 用途 | AWS S3 和七牛云的外部媒体资源记录,提供"上传到 S3 / 七牛"按钮获取外链 | +| 前端位置 | 无独立前端页面;上传后生成的外链填入到 Media Assets 的"预览/下载外链"字段 | + +--- + +## Globals(全局配置) + +### 站点管理 Site Management + +#### Homepage(首页) + +| 项目 | 说明 | +|------|------| +| 前端位置 | `/`(首页) | +| 可配置内容 | | + +- **Hero Slides(首屏多图)**:最多 8 张,每张支持图片/视频模式、眉题、主标题、辅助文案、CTA 按钮、文字位置、遮罩开关、移动端独立图片 +- **Module Order(模块顺序)**:拖拽决定"Banner 区"和"精选产品"哪个先显示 +- **Hero Banners(轮播 Banner)**:首屏下方的轮播 Banner 条,支持标题、图片地址、链接 +- **Featured Products(精选产品卡片)**:3–8 张独立产品卡片,与 Products 集合无关联,在此独立配置图片、文案、链接、文字样式 +- **Featured Layout(精选布局)**:选择布局样式(一排 2/3/4 个、左大右小、横向展陈、杂志堆叠) +- **Statement(品牌主张)**:眉题、标题、正文、图片、CTA +- **Recognition(品牌认可)**:奖项列表 + 评测引用列表(首页展示) +- **Show News Section**:开关控制首页是否显示新闻区块 +- **News Source(新闻来源)**:选择首页新闻取自外部 Blog API 还是本站 CMS 新闻 +- **News Highlights(新闻精选)**:当来源为本地新闻时,手动选择最多 6 篇展示 +- **SEO**:首页级 SEO 元数据(含 canonical、focus keywords、noindex) + +--- + +#### Global Settings(全局设置) + +| 项目 | 说明 | +|------|------| +| 前端位置 | 全站所有页面 | +| 可配置内容 | | + +- **Site(站点信息)**:站点名称、标语、浅底/深底 Logo、Favicon +- **Navigation(导航)**: + - 主导航菜单(名称、链接、外部链接、新窗口、图标键名) + - APP 按钮(文字、链接、桌面端/移动端显示开关) +- **Footer(页脚)**: + - 页脚栏目(标题 + 链接项数组) + - 法律链接(隐私政策等) + - 版权文案 +- **Social Links(社交链接)**:平台名、展示形式(链接/二维码)、URL、二维码图片、图标键名 +- **SEO Defaults(SEO 默认值)**:标题后缀、默认描述、默认分享图 +- **Sitemap(站点地图)**:控制 `/sitemap.xml` 中包含哪些页面模块的开关(首页、产品、支持、下载、新闻、评测、购买渠道、关于、联系等共 16 项) + +--- + +#### About Page(关于页面) + +| 项目 | 说明 | +|------|------| +| 前端位置 | `/about` | +| 可配置内容 | 首屏(眉题、标题、正文、大图、移动端图、文字位置);内容 HTML(支持 HTML 的全文内容区块) | +| 隐藏字段 | 品牌故事、品牌理念、编辑导语、内容段落、能力支柱、奖项高光、媒体引述(当前不在前端显示) | + +--- + +#### Products Page(产品列表页) + +| 项目 | 说明 | +|------|------| +| 前端位置 | `/products` | +| 可配置内容 | Hero 首屏(眉题、标题、描述、图片、移动端图、文字位置) | + +--- + +#### Support Page(支持页面) + +| 项目 | 说明 | +|------|------| +| 前端位置 | `/support` | +| 可配置内容 | | + +- **Intro(首屏)**:眉题、标题、正文、大图、移动端图、文字位置 +- **Primary Entries(主入口卡片)**:键名、图标键名/自定义图标图、眉题、名称、说明、链接 +- **Support Path Card(支持路径卡片)**:眉题、标题、说明、按钮文案与链接 +- 首页支持区块快捷入口也使用此集合的数据 + +--- + +#### FAQ Page(FAQ 页面) + +| 项目 | 说明 | +|------|------| +| 前端位置 | `/support/faq` | +| 可配置内容 | Hero 首屏;统计卡片(答案标签、主题标签);联系支持 CTA(文案与链接);支持路径卡片 | + +--- + +#### Contact Page(联系支持页面) + +| 项目 | 说明 | +|------|------| +| 前端位置 | `/support/contact` | +| 可配置内容 | | + +- **Intro(首屏)**:眉题、标题、正文、大图、移动端图、文字位置 +- **Submission Guidance(提交说明)**:标题、说明文案、提示项数组、快捷链接、富文本(如二维码) +- **Form Enabled(启用表单)**:开关控制前台售后表单是否可用 +- **Form Disabled Message(表单关闭提示)**:表单关闭时的替代提示文案 + +--- + +#### Contact Us Page(联系我们页面) + +| 项目 | 说明 | +|------|------| +| 前端位置 | `/contact` | +| 可配置内容 | | + +- **Hero(首屏)**:眉题、标题、描述、图片、移动端图、文字位置 +- **Contact Groups(联系方式分组)**:标题、说明、条目数组(标签、内容、链接) +- **Form Intro(表单说明)**:眉题、标题、描述 + +--- + +#### Warranty Page(保修页面) + +| 项目 | 说明 | +|------|------| +| 前端位置 | `/support/warranty` | +| 可配置内容 | | + +- **Intro(首屏)**:眉题、标题、正文、大图、移动端图、文字位置 +- **Policy Header(保修说明头部)**:眉题、标题、说明文案 +- **Policy Body(保修正文)**:富文本 +- **Service Panel(服务面板)**:清单标题、说明、清单项数组、快捷链接 + +--- + +#### Downloads Page(下载列表页) + +| 项目 | 说明 | +|------|------| +| 前端位置 | `/downloads` | +| 可配置内容 | Hero 首屏(眉题、标题、描述、图片、移动端图、外部图片地址、文字位置);系列导航标签 | + +--- + +#### Reviews Page(评测页面) + +| 项目 | 说明 | +|------|------| +| 前端位置 | `/reviews` | +| 可配置内容 | Hero 首屏(眉题、标题、描述、图片、移动端图、外部图片地址、文字位置) | + +--- + +#### News Page Settings(新闻页面设置) + +| 项目 | 说明 | +|------|------| +| 前端位置 | `/news` | +| 可配置内容 | Hero 首屏(眉题、标题、描述、图片、移动端图、外部图片地址、文字位置);新闻来源切换(外部 Blog API / 本站新闻内容) | + +--- + +#### Support Tutorial Page(支持教程页面) + +| 项目 | 说明 | +|------|------| +| 前端位置 | `/support/tutorial` | +| 可配置内容 | Hero 首屏;来源链接;介绍 HTML(可选 HTML 显示在视频列表上方) | + +--- + +#### Where to Buy Page(购买渠道页面) + +| 项目 | 说明 | +|------|------| +| 前端位置 | `/where-to-buy` | +| 可配置内容 | | + +- **Hero(首屏)**:眉题、标题、描述、按钮文案与链接、图片、移动端图、文字位置 +- **Store Links(商城链接)**:最多 4 个购买入口卡片(标题、描述、链接文案、链接、图片) +- **Business Contact Card(商务合作卡片)**:眉题、标题、按钮文案与链接 +- **Show Dealers(显示经销商)**:开关控制是否显示经销商 Tab、地图、列表 +- **Map(地图)**:是否显示经销商地图 +- **Empty State(空状态)**:无经销商/无体验店时的提示文案 + +--- + +### 媒体资料包管理 Media Asset Management + +#### Media Assets Page(媒体资料页) + +| 项目 | 说明 | +|------|------| +| 前端位置 | `/media-assets` | +| 可配置内容 | 顶部文案(眉题、标题、描述) | +| 注意 | 保存后自动刷新 `/media-assets` 和 `/sitemap.xml` 缓存 | + +--- + +## 前端路由与 CMS 对应总览表 + +| 前端路由 | 消费的 Global | 消费的 Collection | +|---------|--------------|-------------------| +| `/`(首页) | Homepage | Product Reviews(评测引用)、News(新闻精选)、Support Page(支持快捷卡片) | +| `/products` | Products Page | Products、Product Categories | +| `/products/[slug]` | — | Products、Product Videos、Product Reviews、Downloads、Dealers | +| `/downloads` | Downloads Page | Downloads | +| `/downloads/[slug]` | — | Downloads、Products | +| `/support` | Support Page | — | +| `/support/faq` | FAQ Page | FAQs、FAQ Categories | +| `/support/contact` | Contact Page | After Service Requests(表单提交) | +| `/support/warranty` | Warranty Page | — | +| `/support/tutorial` | Support Tutorial Page | Support Tutorial Videos | +| `/news` | News Page | News、News Categories | +| `/news/[slug]` | — | News | +| `/reviews` | Reviews Page | Product Videos、Product Reviews | +| `/where-to-buy` | Dealers Page | Dealers | +| `/contact` | Contact Us Page | Distributor Requests、OEM Requests(表单提交) | +| `/about` | About Page | — | +| `/media-assets` | Media Assets Page | Media Asset Categories | +| `/media-assets/[category]` | — | Media Asset Categories | +| `/media-assets/[category]/[subcategory]` | — | Media Assets、Media Asset Categories | +| 全局(所有页面) | Global Settings | Media(图片)、Redirects(重定向) | diff --git a/src/app/(frontend)/[locale]/about/page.tsx b/src/app/(frontend)/[locale]/about/page.tsx index e4c1bcf..ed6adfa 100644 --- a/src/app/(frontend)/[locale]/about/page.tsx +++ b/src/app/(frontend)/[locale]/about/page.tsx @@ -92,7 +92,7 @@ export default async function AboutPage({ name: pageTitle || undefined, publisher: { '@type': 'Organization', - name: 'Eversolo', + name: 'Luxsin', }, url: buildAbsoluteUrl(`/${locale}/about`), }), diff --git a/src/app/(frontend)/[locale]/downloads/[slug]/page.tsx b/src/app/(frontend)/[locale]/downloads/[slug]/page.tsx index 1b7eb23..6b5c4b5 100644 --- a/src/app/(frontend)/[locale]/downloads/[slug]/page.tsx +++ b/src/app/(frontend)/[locale]/downloads/[slug]/page.tsx @@ -128,14 +128,14 @@ function getDownloadSeoTypePhrase(downloads: DownloadItem[], locale: Locale) { function getDownloadAutoSeoTitle(title: string, downloads: DownloadItem[], locale: Locale) { const typePhrase = getDownloadSeoTypePhrase(downloads, locale) - return `${title} ${typePhrase} | Eversolo` + return `${title} ${typePhrase} | Luxsin` } function getDownloadAutoSeoDescription(title: string, downloads: DownloadItem[], locale: Locale) { const typePhrase = getDownloadSeoTypePhrase(downloads, locale) return locale === 'zh' ? `下载 ${title} ${typePhrase}、更新日志和历史版本。` - : `Download ${title} ${typePhrase}, release notes, and version history from Eversolo.` + : `Download ${title} ${typePhrase}, release notes, and version history from Luxsin.` } function DownloadTypeIcon({ type }: { type: string }) { diff --git a/src/app/(frontend)/[locale]/downloads/page.tsx b/src/app/(frontend)/[locale]/downloads/page.tsx index 98ba147..4377e11 100644 --- a/src/app/(frontend)/[locale]/downloads/page.tsx +++ b/src/app/(frontend)/[locale]/downloads/page.tsx @@ -712,7 +712,7 @@ export default async function DownloadsPage({ item, position: index + 1, })), - name: locale === 'zh' ? 'Eversolo 下载中心' : 'Eversolo Downloads Center', + name: locale === 'zh' ? 'Luxsin 下载中心' : 'Luxsin Downloads Center', url: buildAbsoluteUrl(`/${locale}/downloads`), }), }} diff --git a/src/app/(frontend)/[locale]/media-assets/[category]/[subcategory]/page.tsx b/src/app/(frontend)/[locale]/media-assets/[category]/[subcategory]/page.tsx index c06cdb0..36a16c5 100644 --- a/src/app/(frontend)/[locale]/media-assets/[category]/[subcategory]/page.tsx +++ b/src/app/(frontend)/[locale]/media-assets/[category]/[subcategory]/page.tsx @@ -47,7 +47,7 @@ export async function generateMetadata({ return buildSeoMetadata({ description: pageData.subcategory.description || - (locale === 'zh' ? '下载 Eversolo 媒体资料。' : 'Download Eversolo media assets.'), + (locale === 'zh' ? '下载 Luxsin 媒体资料。' : 'Download Luxsin media assets.'), locale, ogImage: pageData.subcategory.imageUrl, pathname: `/media-assets/${category}/${subcategory}`, diff --git a/src/app/(frontend)/[locale]/media-assets/[category]/page.tsx b/src/app/(frontend)/[locale]/media-assets/[category]/page.tsx index f6b6b47..cd25de5 100644 --- a/src/app/(frontend)/[locale]/media-assets/[category]/page.tsx +++ b/src/app/(frontend)/[locale]/media-assets/[category]/page.tsx @@ -30,7 +30,7 @@ export async function generateMetadata({ return buildSeoMetadata({ description: pageData.category.description || - (locale === 'zh' ? '浏览 Eversolo 媒体资料分类。' : 'Browse Eversolo media asset categories.'), + (locale === 'zh' ? '浏览 Luxsin 媒体资料分类。' : 'Browse Luxsin media asset categories.'), locale, ogImage: pageData.category.imageUrl, pathname: `/media-assets/${category}`, diff --git a/src/app/(frontend)/[locale]/news/[slug]/page.tsx b/src/app/(frontend)/[locale]/news/[slug]/page.tsx index b0ae8e1..2a223a0 100644 --- a/src/app/(frontend)/[locale]/news/[slug]/page.tsx +++ b/src/app/(frontend)/[locale]/news/[slug]/page.tsx @@ -133,7 +133,7 @@ export default async function NewsArticlePage({ image: coverImageUrl ? [coverImageUrl] : undefined, publisher: { '@type': 'Organization', - name: 'Eversolo', + name: 'Luxsin', }, url: articleUrl, }), diff --git a/src/app/(frontend)/[locale]/news/page.tsx b/src/app/(frontend)/[locale]/news/page.tsx index 3acecfa..c28fe90 100644 --- a/src/app/(frontend)/[locale]/news/page.tsx +++ b/src/app/(frontend)/[locale]/news/page.tsx @@ -225,7 +225,7 @@ export default async function NewsPage({ '@context': 'https://schema.org', '@type': 'ItemList', itemListElement: itemListElements, - name: locale === 'zh' ? 'Eversolo 新闻列表' : 'Eversolo News List', + name: locale === 'zh' ? 'Luxsin 新闻列表' : 'Luxsin News List', }), }} /> diff --git a/src/app/(frontend)/[locale]/not-found.tsx b/src/app/(frontend)/[locale]/not-found.tsx index 9a8e346..aeb6b99 100644 --- a/src/app/(frontend)/[locale]/not-found.tsx +++ b/src/app/(frontend)/[locale]/not-found.tsx @@ -8,7 +8,7 @@ const COPY = { eyebrow: '404', title: 'This page is out of range.', description: - 'The address may have changed, or the content may no longer be available. Return home or continue through the main Eversolo paths.', + 'The address may have changed, or the content may no longer be available. Return home or continue through the main Luxsin paths.', home: 'Back to Home', support: 'Open Support', pathsLabel: 'Useful paths', diff --git a/src/app/(frontend)/[locale]/page.tsx b/src/app/(frontend)/[locale]/page.tsx index c821d97..44cf980 100644 --- a/src/app/(frontend)/[locale]/page.tsx +++ b/src/app/(frontend)/[locale]/page.tsx @@ -300,7 +300,7 @@ export async function generateMetadata({ extractRichTextPlainText(homepage.statement?.body) || undefined const title = - homepage.seo?.title?.trim() || (locale === 'zh' ? 'Eversolo 官方网站' : 'Eversolo Official Site') + homepage.seo?.title?.trim() || (locale === 'zh' ? 'Luxsin 官方网站' : 'Luxsin Official Site') return buildSeoMetadata({ description, @@ -397,7 +397,7 @@ export default async function HomePage({ __html: JSON.stringify({ '@context': 'https://schema.org', '@type': 'Organization', - name: 'Eversolo', + name: 'Luxsin', slogan: chrome.siteTagline, url: buildAbsoluteUrl(`/${locale}`), }), diff --git a/src/app/(frontend)/[locale]/products/[slug]/page.tsx b/src/app/(frontend)/[locale]/products/[slug]/page.tsx index d3b49b7..7eddfc5 100644 --- a/src/app/(frontend)/[locale]/products/[slug]/page.tsx +++ b/src/app/(frontend)/[locale]/products/[slug]/page.tsx @@ -145,7 +145,7 @@ function getProductAutoSeoTitle(product: Product, slug: string, locale: Locale) ? `${productName} ${seriesName}` : productName - return `${baseTitle} | Eversolo` + return `${baseTitle} | Luxsin` } type RichTextNodeLike = { diff --git a/src/app/(frontend)/[locale]/products/page.tsx b/src/app/(frontend)/[locale]/products/page.tsx index b5bfdef..175bb38 100644 --- a/src/app/(frontend)/[locale]/products/page.tsx +++ b/src/app/(frontend)/[locale]/products/page.tsx @@ -199,8 +199,8 @@ export async function generateMetadata({ description: page.hero?.description || (locale === 'zh' - ? '浏览 Eversolo 的流媒体播放器、解码器、功放与配件产品阵列。' - : 'Browse the Eversolo lineup across streamers, DACs, amplifiers, and accessories.'), + ? '浏览 Luxsin 的流媒体播放器、解码器、功放与配件产品阵列。' + : 'Browse the Luxsin lineup across streamers, DACs, amplifiers, and accessories.'), locale, ogImage: page.hero?.image || null, pathname: '/products', @@ -229,8 +229,8 @@ export default async function ProductsPage({ pageSeo, hero?.description?.trim() || (locale === 'zh' - ? '浏览 Eversolo 的流媒体播放器、解码器、功放与配件产品阵列。' - : 'Browse the Eversolo lineup across streamers, DACs, amplifiers, and accessories.'), + ? '浏览 Luxsin 的流媒体播放器、解码器、功放与配件产品阵列。' + : 'Browse the Luxsin lineup across streamers, DACs, amplifiers, and accessories.'), ) const categoryMap = new Map( categories.map((category) => [category.slug, normalizeCategory(category, category.slug, locale)]), @@ -268,7 +268,7 @@ export default async function ProductsPage({ '@context': 'https://schema.org', '@type': 'ItemList', itemListElement: itemList, - name: locale === 'zh' ? 'Eversolo 产品中心' : 'Eversolo Products', + name: locale === 'zh' ? 'Luxsin 产品中心' : 'Luxsin Products', }), }} /> diff --git a/src/app/(frontend)/[locale]/reviews/page.tsx b/src/app/(frontend)/[locale]/reviews/page.tsx index 933ae49..adea1da 100644 --- a/src/app/(frontend)/[locale]/reviews/page.tsx +++ b/src/app/(frontend)/[locale]/reviews/page.tsx @@ -291,8 +291,8 @@ export default async function ReviewsPage({ '@type': 'CollectionPage', description: locale === 'zh' - ? 'Eversolo 产品视频与媒体评测。' - : 'Eversolo product videos and editorial reviews.', + ? 'Luxsin 产品视频与媒体评测。' + : 'Luxsin product videos and editorial reviews.', name: 'Videos & Reviews', url: buildAbsoluteUrl(`/${locale}/reviews`), }), diff --git a/src/app/(frontend)/[locale]/support/page.tsx b/src/app/(frontend)/[locale]/support/page.tsx index 2f695e7..0392ad7 100644 --- a/src/app/(frontend)/[locale]/support/page.tsx +++ b/src/app/(frontend)/[locale]/support/page.tsx @@ -231,7 +231,7 @@ export default async function SupportPage({ '@context': 'https://schema.org', '@type': 'ItemList', itemListElement: itemListElements, - name: locale === 'zh' ? 'Eversolo 支持中心' : 'Eversolo Support Center', + name: locale === 'zh' ? 'Luxsin 支持中心' : 'Luxsin Support Center', }), }} /> diff --git a/src/app/(frontend)/[locale]/where-to-buy/page.tsx b/src/app/(frontend)/[locale]/where-to-buy/page.tsx index 903b7fd..26441be 100644 --- a/src/app/(frontend)/[locale]/where-to-buy/page.tsx +++ b/src/app/(frontend)/[locale]/where-to-buy/page.tsx @@ -617,7 +617,7 @@ export default async function WhereToBuyPage({ item, position: index + 1, })), - name: locale === 'zh' ? 'Eversolo 授权经销商网络' : 'Eversolo Authorized Dealer Network', + name: locale === 'zh' ? 'Luxsin 授权经销商网络' : 'Luxsin Authorized Dealer Network', url: buildAbsoluteUrl(`/${locale}/where-to-buy`), }), }} diff --git a/src/components/home/home-featured-products.tsx b/src/components/home/home-featured-products.tsx index 6bf46af..630017f 100644 --- a/src/components/home/home-featured-products.tsx +++ b/src/components/home/home-featured-products.tsx @@ -275,7 +275,7 @@ export function HomeFeaturedProducts({ forceDocumentNavigationHrefs = [], items, ) : null} {item.title
-
{(chrome.footerCopyright || '© Eversolo').replace('© Eversolo', `© ${year} Eversolo`)}
+
{(chrome.footerCopyright || '© Luxsin').replace('© Luxsin', `© ${year} Luxsin`)}
{chrome.legalLinks.map((item) => item.external ? ( diff --git a/src/components/site/site-header.tsx b/src/components/site/site-header.tsx index 57d5550..33688a7 100644 --- a/src/components/site/site-header.tsx +++ b/src/components/site/site-header.tsx @@ -22,7 +22,7 @@ export async function SiteHeader({ locale }: { locale: Locale }) { className="flex items-center" > {chrome.siteName} diff --git a/src/i18n/messages/en.json b/src/i18n/messages/en.json index dadb555..11401ee 100644 --- a/src/i18n/messages/en.json +++ b/src/i18n/messages/en.json @@ -1,6 +1,6 @@ { "site": { - "name": "Eversolo" + "name": "Luxsin" }, "nav": { "products": "Products", diff --git a/src/i18n/messages/zh.json b/src/i18n/messages/zh.json index 6b28c49..43ddec1 100644 --- a/src/i18n/messages/zh.json +++ b/src/i18n/messages/zh.json @@ -1,6 +1,6 @@ { "site": { - "name": "艾索洛 Eversolo" + "name": "乐笙 Luxsin" }, "nav": { "products": "产品中心", diff --git a/src/lib/global-settings.ts b/src/lib/global-settings.ts index fa51ffd..49e0e1b 100644 --- a/src/lib/global-settings.ts +++ b/src/lib/global-settings.ts @@ -133,18 +133,18 @@ function fallbackSettings(locale: Locale): SiteChromeSettings { ] return { - appLink: 'https://www.eversolo.com/controlapp/index.html', + appLink: 'https://www.luxsin.com.cn/controlapp/index.html', appLabel: 'APP', appOpenInNewTab: true, footerColumns, - footerCopyright: '© Eversolo', + footerCopyright: '© Luxsin', legalLinks: locale === 'zh' ? [{ href: '/zh/about', label: '隐私说明' }] : [{ href: '/en/about', label: 'Privacy' }], - logoUrl: 'https://www.eversolo.com/Public/home/images/zidoologo.svg', + logoUrl: 'https://www.luxsin.com.cn/Public/home/images/zidoologo.svg', navItems, socialLinks: [], - seoDescription: locale === 'zh' ? '探索 Eversolo 产品、支持、新闻与品牌故事。' : 'Explore Eversolo products, support, news, and brand story.', - seoTitleSuffix: 'Eversolo', - siteName: 'Eversolo', + seoDescription: locale === 'zh' ? '探索 Luxsin 产品、支持、新闻与品牌故事。' : 'Explore Luxsin products, support, news, and brand story.', + seoTitleSuffix: 'Luxsin', + siteName: 'Luxsin', siteTagline: locale === 'zh' ? '以更纯粹的方式体验音乐。' : 'A refined way to experience music.', } } diff --git a/src/lib/home-recognition-defaults.ts b/src/lib/home-recognition-defaults.ts index 77339ea..196fe94 100644 --- a/src/lib/home-recognition-defaults.ts +++ b/src/lib/home-recognition-defaults.ts @@ -19,26 +19,26 @@ export function getDefaultRecognitionAwards(locale: Locale): RecognitionAwardDef return [ { label: '2026 iF 设计奖', - logoUrl: 'https://www.eversolo.com/Uploads/banner/eb3c8564307e0d3b62260601e73ef7c7.jpg', - url: 'https://blogcn.eversolo.com/2026/03/%E7%BB%A7eisa%E5%90%8E%EF%BC%8C%E8%8D%A3%E8%8E%B72026-if%E8%AE%BE%E8%AE%A1%E5%A5%96%EF%BC%8C%E8%89%BE%E7%B4%A2%E6%B4%9Bplay%E6%91%98%E5%BE%97%E9%9F%B3%E8%B4%A8%E4%B8%8E%E8%AE%BE%E8%AE%A1%E7%9A%84/', + logoUrl: 'https://www.luxsin.com.cn/Uploads/banner/eb3c8564307e0d3b62260601e73ef7c7.jpg', + url: 'https://blogcn.luxsin.com.cn/2026/03/%E7%BB%A7eisa%E5%90%8E%EF%BC%8C%E8%8D%A3%E8%8E%B72026-if%E8%AE%BE%E8%AE%A1%E5%A5%96%EF%BC%8C%E8%89%BE%E7%B4%A2%E6%B4%9Bplay%E6%91%98%E5%BE%97%E9%9F%B3%E8%B4%A8%E4%B8%8E%E8%AE%BE%E8%AE%A1%E7%9A%84/', year: 2026, }, { label: 'EISA 2025-2026 年度超值流媒体功放', logoUrl: 'https://shop.zidoo.tv/cdn/shop/files/33_e115415a-60c0-4717-b131-9f530e2fe815.png?v=1733802430', - url: 'https://blogcn.eversolo.com/2025/08/%E6%9D%83%E5%A8%81%E8%A7%81%E8%AF%81%EF%BD%9C%E8%89%BE%E7%B4%A2%E6%B4%9B%E8%8D%A3%E8%8E%B72025-2026%E6%AC%A7%E6%B4%B2eisa%E4%B8%A4%E9%A1%B9%E5%B9%B4%E5%BA%A6%E5%A4%A7%E5%A5%96/', + url: 'https://blogcn.luxsin.com.cn/2025/08/%E6%9D%83%E5%A8%81%E8%A7%81%E8%AF%81%EF%BD%9C%E8%89%BE%E7%B4%A2%E6%B4%9B%E8%8D%A3%E8%8E%B72025-2026%E6%AC%A7%E6%B4%B2eisa%E4%B8%A4%E9%A1%B9%E5%B9%B4%E5%BA%A6%E5%A4%A7%E5%A5%96/', year: 2025, }, { label: 'EISA 2025-2026 年度高端流媒体播放器', logoUrl: 'https://shop.zidoo.tv/cdn/shop/files/33_e115415a-60c0-4717-b131-9f530e2fe815.png?v=1733802430', - url: 'https://blogcn.eversolo.com/2025/08/%E6%9D%83%E5%A8%81%E8%A7%81%E8%AF%81%EF%BD%9C%E8%89%BE%E7%B4%A2%E6%B4%9B%E8%8D%A3%E8%8E%B72025-2026%E6%AC%A7%E6%B4%B2eisa%E4%B8%A4%E9%A1%B9%E5%B9%B4%E5%BA%A6%E5%A4%A7%E5%A5%96/', + url: 'https://blogcn.luxsin.com.cn/2025/08/%E6%9D%83%E5%A8%81%E8%A7%81%E8%AF%81%EF%BD%9C%E8%89%BE%E7%B4%A2%E6%B4%9B%E8%8D%A3%E8%8E%B72025-2026%E6%AC%A7%E6%B4%B2eisa%E4%B8%A4%E9%A1%B9%E5%B9%B4%E5%BA%A6%E5%A4%A7%E5%A5%96/', year: 2025, }, { label: 'Hi-Fi News Outstanding Product', logoUrl: 'https://shop.zidoo.tv/cdn/shop/files/34_cab7c07d-f4bb-4fef-89bf-79a696085fa7.png?v=1733802430', - url: 'https://shop.eversolo.com/zh-cn/blogs/news/the-eversolo-dmp-a6-gen-2-all-in-one-music-streamer-is-officially-released', + url: 'https://shop.luxsin.com.cn/zh-cn/blogs/news/the-eversolo-dmp-a6-gen-2-all-in-one-music-streamer-is-officially-released', year: 2025, }, ] @@ -47,26 +47,26 @@ export function getDefaultRecognitionAwards(locale: Locale): RecognitionAwardDef return [ { label: 'iF Design Award 2026', - logoUrl: 'https://www.eversolo.com/Uploads/banner/eb3c8564307e0d3b62260601e73ef7c7.jpg', - url: 'https://blog.eversolo.com/2026/02/after-eisa-recognition-eversolo-play-wins-the-2026-if-design-award/', + logoUrl: 'https://www.luxsin.com.cn/Uploads/banner/eb3c8564307e0d3b62260601e73ef7c7.jpg', + url: 'https://blog.luxsin.com.cn/2026/02/after-eisa-recognition-eversolo-play-wins-the-2026-if-design-award/', year: 2026, }, { label: 'EISA 2025-2026 Best Streaming Amplifier', logoUrl: 'https://shop.zidoo.tv/cdn/shop/files/33_e115415a-60c0-4717-b131-9f530e2fe815.png?v=1733802430', - url: 'https://blogcn.eversolo.com/2025/08/%E6%9D%83%E5%A8%81%E8%A7%81%E8%AF%81%EF%BD%9C%E8%89%BE%E7%B4%A2%E6%B4%9B%E8%8D%A3%E8%8E%B72025-2026%E6%AC%A7%E6%B4%B2eisa%E4%B8%A4%E9%A1%B9%E5%B9%B4%E5%BA%A6%E5%A4%A7%E5%A5%96/', + url: 'https://blogcn.luxsin.com.cn/2025/08/%E6%9D%83%E5%A8%81%E8%A7%81%E8%AF%81%EF%BD%9C%E8%89%BE%E7%B4%A2%E6%B4%9B%E8%8D%A3%E8%8E%B72025-2026%E6%AC%A7%E6%B4%B2eisa%E4%B8%A4%E9%A1%B9%E5%B9%B4%E5%BA%A6%E5%A4%A7%E5%A5%96/', year: 2025, }, { label: 'EISA 2025-2026 High-End Streamer', logoUrl: 'https://shop.zidoo.tv/cdn/shop/files/33_e115415a-60c0-4717-b131-9f530e2fe815.png?v=1733802430', - url: 'https://blogcn.eversolo.com/2025/08/%E6%9D%83%E5%A8%81%E8%A7%81%E8%AF%81%EF%BD%9C%E8%89%BE%E7%B4%A2%E6%B4%9B%E8%8D%A3%E8%8E%B72025-2026%E6%AC%A7%E6%B4%B2eisa%E4%B8%A4%E9%A1%B9%E5%B9%B4%E5%BA%A6%E5%A4%A7%E5%A5%96/', + url: 'https://blogcn.luxsin.com.cn/2025/08/%E6%9D%83%E5%A8%81%E8%A7%81%E8%AF%81%EF%BD%9C%E8%89%BE%E7%B4%A2%E6%B4%9B%E8%8D%A3%E8%8E%B72025-2026%E6%AC%A7%E6%B4%B2eisa%E4%B8%A4%E9%A1%B9%E5%B9%B4%E5%BA%A6%E5%A4%A7%E5%A5%96/', year: 2025, }, { label: 'Hi-Fi News Outstanding Product', logoUrl: 'https://shop.zidoo.tv/cdn/shop/files/34_cab7c07d-f4bb-4fef-89bf-79a696085fa7.png?v=1733802430', - url: 'https://shop.eversolo.com/zh-cn/blogs/news/the-eversolo-dmp-a6-gen-2-all-in-one-music-streamer-is-officially-released', + url: 'https://shop.luxsin.com.cn/zh-cn/blogs/news/the-eversolo-dmp-a6-gen-2-all-in-one-music-streamer-is-officially-released', year: 2025, }, ] @@ -76,13 +76,13 @@ export function getDefaultRecognitionReviews(locale: Locale): RecognitionReviewD if (locale === 'zh') { return [ { - quote: '无论你如何使用 Eversolo 的流媒体设备,它在声音与交互层面都表现出色。', + quote: '无论你如何使用 Luxsin 的流媒体设备,它在声音与交互层面都表现出色。', sourceLogoUrl: 'https://shop.zidoo.tv/cdn/shop/files/33_e115415a-60c0-4717-b131-9f530e2fe815.png?v=1733802430', sourceName: 'EISA', - url: 'https://blogcn.eversolo.com/2025/08/%E6%9D%83%E5%A8%81%E8%A7%81%E8%AF%81%EF%BD%9C%E8%89%BE%E7%B4%A2%E6%B4%9B%E8%8D%A3%E8%8E%B72025-2026%E6%AC%A7%E6%B4%B2eisa%E4%B8%A4%E9%A1%B9%E5%B9%B4%E5%BA%A6%E5%A4%A7%E5%A5%96/', + url: 'https://blogcn.luxsin.com.cn/2025/08/%E6%9D%83%E5%A8%81%E8%A7%81%E8%AF%81%EF%BD%9C%E8%89%BE%E7%B4%A2%E6%B4%9B%E8%8D%A3%E8%8E%B72025-2026%E6%AC%A7%E6%B4%B2eisa%E4%B8%A4%E9%A1%B9%E5%B9%B4%E5%BA%A6%E5%A4%A7%E5%A5%96/', }, { - quote: '我还没有遇到哪一台设备,能像 Eversolo 这样把功能与体验都拿捏得这么完整。', + quote: '我还没有遇到哪一台设备,能像 Luxsin 这样把功能与体验都拿捏得这么完整。', sourceLogoUrl: 'https://shop.zidoo.tv/cdn/shop/files/darko_a8208a56-7e3c-4559-9e0f-d1409101440d.png?v=1731585474', sourceName: 'John Grandberg · Darko Audio', url: 'https://darko.audio/2024/08/second-opinion-eversolo-dmp-a8-review/', @@ -94,7 +94,7 @@ export function getDefaultRecognitionReviews(locale: Locale): RecognitionReviewD url: 'https://www.avforums.com/reviews/eversolo-dmp-a8-streaming-preamp-review.21355/', }, { - quote: '我很乐意把 Eversolo DMP-A6 加入我的推荐名单。', + quote: '我很乐意把 Luxsin DMP-A6 加入我的推荐名单。', sourceLogoUrl: 'https://shop.zidoo.tv/cdn/shop/files/asr.png?v=1731585881', sourceName: 'Amir · Audio Science Review', url: 'https://www.audiosciencereview.com/forum/index.php?threads/eversolo-dmp-a6-streamer-review.56486/', @@ -110,13 +110,13 @@ export function getDefaultRecognitionReviews(locale: Locale): RecognitionReviewD return [ { - quote: 'However you use Eversolo’s streamer, your music will sound and look great!', + quote: 'However you use Luxsin’s streamer, your music will sound and look great!', sourceLogoUrl: 'https://shop.zidoo.tv/cdn/shop/files/33_e115415a-60c0-4717-b131-9f530e2fe815.png?v=1733802430', sourceName: 'EISA', - url: 'https://blogcn.eversolo.com/2025/08/%E6%9D%83%E5%A8%81%E8%A7%81%E8%AF%81%EF%BD%9C%E8%89%BE%E7%B4%A2%E6%B4%9B%E8%8D%A3%E8%8E%B72025-2026%E6%AC%A7%E6%B4%B2eisa%E4%B8%A4%E9%A1%B9%E5%B9%B4%E5%BA%A6%E5%A4%A7%E5%A5%96/', + url: 'https://blogcn.luxsin.com.cn/2025/08/%E6%9D%83%E5%A8%81%E8%A7%81%E8%AF%81%EF%BD%9C%E8%89%BE%E7%B4%A2%E6%B4%9B%E8%8D%A3%E8%8E%B72025-2026%E6%AC%A7%E6%B4%B2eisa%E4%B8%A4%E9%A1%B9%E5%B9%B4%E5%BA%A6%E5%A4%A7%E5%A5%96/', }, { - quote: 'I have yet to experience one that nails everything quite like Eversolo does.', + quote: 'I have yet to experience one that nails everything quite like Luxsin does.', sourceLogoUrl: 'https://shop.zidoo.tv/cdn/shop/files/darko_a8208a56-7e3c-4559-9e0f-d1409101440d.png?v=1731585474', sourceName: 'John Grandberg · Darko Audio', url: 'https://darko.audio/2024/08/second-opinion-eversolo-dmp-a8-review/', @@ -129,7 +129,7 @@ export function getDefaultRecognitionReviews(locale: Locale): RecognitionReviewD url: 'https://www.avforums.com/reviews/eversolo-dmp-a8-streaming-preamp-review.21355/', }, { - quote: 'I am happy to add the Eversolo DMP-A6 to my recommended list.', + quote: 'I am happy to add the Luxsin DMP-A6 to my recommended list.', sourceLogoUrl: 'https://shop.zidoo.tv/cdn/shop/files/asr.png?v=1731585881', sourceName: 'Amir · Audio Science Review', url: 'https://www.audiosciencereview.com/forum/index.php?threads/eversolo-dmp-a6-streamer-review.56486/', diff --git a/src/lib/product-card-image-defaults.ts b/src/lib/product-card-image-defaults.ts index 8e72594..e85596d 100644 --- a/src/lib/product-card-image-defaults.ts +++ b/src/lib/product-card-image-defaults.ts @@ -1,59 +1,59 @@ export const PRODUCT_CARD_IMAGE_DEFAULTS = { 'amp-f10': { - en: 'https://www.eversolo.com/Uploads/product/1073a124cbc31208601d19ac6f84c0c5.jpg', - zh: 'https://www.eversolo.com/Uploads/product/26b6b8fb0403db899d9482bd501d57d3.jpg', + en: 'https://www.luxsin.com.cn/Uploads/product/1073a124cbc31208601d19ac6f84c0c5.jpg', + zh: 'https://www.luxsin.com.cn/Uploads/product/26b6b8fb0403db899d9482bd501d57d3.jpg', }, 'amp-f2': { - en: 'https://www.eversolo.com/Uploads/product/35be2b68ff28d2e44aebbd8a18101124.jpg', - zh: 'https://www.eversolo.com/Uploads/product/28c990470da21a368085329fcfedc8dc.jpg', + en: 'https://www.luxsin.com.cn/Uploads/product/35be2b68ff28d2e44aebbd8a18101124.jpg', + zh: 'https://www.luxsin.com.cn/Uploads/product/28c990470da21a368085329fcfedc8dc.jpg', }, 'dac-z10': { - en: 'https://www.eversolo.com/Uploads/product/e75f4db5a7e99f255ec2b078e47de12f.jpg', - zh: 'https://www.eversolo.com/Uploads/product/ae526258a24ab5b828f3b63ba6cd9bc6.jpg', + en: 'https://www.luxsin.com.cn/Uploads/product/e75f4db5a7e99f255ec2b078e47de12f.jpg', + zh: 'https://www.luxsin.com.cn/Uploads/product/ae526258a24ab5b828f3b63ba6cd9bc6.jpg', }, 'dac-z6': { - en: 'https://www.eversolo.com/Uploads/product/e4e42408a5aea449212a3ea3992ced90.jpg', - zh: 'https://www.eversolo.com/Uploads/product/a4611eba4a335b4cc71869e445b85e0b.jpg', + en: 'https://www.luxsin.com.cn/Uploads/product/e4e42408a5aea449212a3ea3992ced90.jpg', + zh: 'https://www.luxsin.com.cn/Uploads/product/a4611eba4a335b4cc71869e445b85e0b.jpg', }, 'dac-z8': { - en: 'https://www.eversolo.com/Uploads/product/01d9bf4a383430cf28a5bce1c977d4a5.jpg', - zh: 'https://www.eversolo.com/Uploads/product/6dee0fc89ae6c71a43994d717da52949.jpg', + en: 'https://www.luxsin.com.cn/Uploads/product/01d9bf4a383430cf28a5bce1c977d4a5.jpg', + zh: 'https://www.luxsin.com.cn/Uploads/product/6dee0fc89ae6c71a43994d717da52949.jpg', }, 'dmp-a10': { - en: 'https://www.eversolo.com/Uploads/product/4b56a4df14b5b9592304bc7f08a81216.jpg', - zh: 'https://www.eversolo.com/Uploads/product/104807d068dffc61f7511a4a13ff6ac4.jpg', + en: 'https://www.luxsin.com.cn/Uploads/product/4b56a4df14b5b9592304bc7f08a81216.jpg', + zh: 'https://www.luxsin.com.cn/Uploads/product/104807d068dffc61f7511a4a13ff6ac4.jpg', }, 'dmp-a6-gen-2': { - en: 'https://www.eversolo.com/Uploads/product/07cf5e918ee0db5a107cff0d9401f9b0.jpg', - zh: 'https://www.eversolo.com/Uploads/product/2ac781486e4725e5c15e06475b817c74.jpg', + en: 'https://www.luxsin.com.cn/Uploads/product/07cf5e918ee0db5a107cff0d9401f9b0.jpg', + zh: 'https://www.luxsin.com.cn/Uploads/product/2ac781486e4725e5c15e06475b817c74.jpg', }, 'dmp-a6-master-gen-2': { - en: 'https://www.eversolo.com/Uploads/product/8eadf55fdb57f727eadf803bf5452eb4.jpg', - zh: 'https://www.eversolo.com/Uploads/product/d207cde789fe6f5dd3e0ebc2b60f0c2d.jpg', + en: 'https://www.luxsin.com.cn/Uploads/product/8eadf55fdb57f727eadf803bf5452eb4.jpg', + zh: 'https://www.luxsin.com.cn/Uploads/product/d207cde789fe6f5dd3e0ebc2b60f0c2d.jpg', }, 'dmp-a8': { - en: 'https://www.eversolo.com/Uploads/product/f08b5ed0fe257466dc42f3092c5d7e9f.jpg', - zh: 'https://www.eversolo.com/Uploads/product/061777eadf1ab79e7680304b2d686f8f.jpg', + en: 'https://www.luxsin.com.cn/Uploads/product/f08b5ed0fe257466dc42f3092c5d7e9f.jpg', + zh: 'https://www.luxsin.com.cn/Uploads/product/061777eadf1ab79e7680304b2d686f8f.jpg', }, 'em-01': { - en: 'https://www.eversolo.com/Uploads/product/36dfb7e5628aeac7baa5d1c36bc697d7.jpg', - zh: 'https://www.eversolo.com/Uploads/product/34057f0ae27667ed6745dcefa87f1041.jpg', + en: 'https://www.luxsin.com.cn/Uploads/product/36dfb7e5628aeac7baa5d1c36bc697d7.jpg', + zh: 'https://www.luxsin.com.cn/Uploads/product/34057f0ae27667ed6745dcefa87f1041.jpg', }, play: { - en: 'https://www.eversolo.com/Uploads/product/127c304f4b4b037be81462f0d78a083f.jpg', - zh: 'https://www.eversolo.com/Uploads/product/d921888c88830f0102b4dce2f9a80ab0.jpg', + en: 'https://www.luxsin.com.cn/Uploads/product/127c304f4b4b037be81462f0d78a083f.jpg', + zh: 'https://www.luxsin.com.cn/Uploads/product/d921888c88830f0102b4dce2f9a80ab0.jpg', }, se100: { - en: 'https://www.eversolo.com/Uploads/product/7f0c4147019a477645dbe49cfff27125.jpg', - zh: 'https://www.eversolo.com/Uploads/product/6e6306be466bf5c09c700e4a1a0204e3.jpg', + en: 'https://www.luxsin.com.cn/Uploads/product/7f0c4147019a477645dbe49cfff27125.jpg', + zh: 'https://www.luxsin.com.cn/Uploads/product/6e6306be466bf5c09c700e4a1a0204e3.jpg', }, t8: { - en: 'https://www.eversolo.com/Uploads/product/1c8a7b6703700da2730358bc6206dbb1.jpg', - zh: 'https://www.eversolo.com/Uploads/product/f1fb9ebd56be5bcc7897569aa98754e6.jpg', + en: 'https://www.luxsin.com.cn/Uploads/product/1c8a7b6703700da2730358bc6206dbb1.jpg', + zh: 'https://www.luxsin.com.cn/Uploads/product/f1fb9ebd56be5bcc7897569aa98754e6.jpg', }, v16: { - en: 'https://www.eversolo.com/Uploads/product/0ab4b675acc3f5f548e7451bd3e18d5f.jpg', - zh: 'https://www.eversolo.com/Uploads/product/107f133acbb056f027a1bab63bdac03f.jpg', + en: 'https://www.luxsin.com.cn/Uploads/product/0ab4b675acc3f5f548e7451bd3e18d5f.jpg', + zh: 'https://www.luxsin.com.cn/Uploads/product/107f133acbb056f027a1bab63bdac03f.jpg', }, } as const diff --git a/src/lib/product-templates.ts b/src/lib/product-templates.ts index fe796f5..fd24cf1 100644 --- a/src/lib/product-templates.ts +++ b/src/lib/product-templates.ts @@ -23,7 +23,7 @@ export type LoadedProductTemplate = { } const LEGACY_PRODUCT_ROOT = path.join(process.cwd(), 'src', 'seed', 'raw') -const LEGACY_SITE_ORIGIN = 'https://www.eversolo.com' +const LEGACY_SITE_ORIGIN = 'https://www.luxsin.com.cn' function rewriteTemplateAssetReferences(html: string, assetBase: string) { return html diff --git a/src/payload/globals/GlobalSettings.ts b/src/payload/globals/GlobalSettings.ts index e3ddea3..1e03004 100644 --- a/src/payload/globals/GlobalSettings.ts +++ b/src/payload/globals/GlobalSettings.ts @@ -56,7 +56,7 @@ export const GlobalSettings: GlobalConfig = { label: { en: 'Link', zh: '链接' }, type: 'text', localized: true, - defaultValue: 'https://www.eversolo.com/controlapp/index.html', + defaultValue: 'https://www.luxsin.com.cn/controlapp/index.html', required: true, }, { name: 'openInNewTab', label: { en: 'Open in New Tab', zh: '新窗口打开' }, type: 'checkbox', defaultValue: true }, diff --git a/src/scripts/backfill-support-tutorial-thumbnails.mjs b/src/scripts/backfill-support-tutorial-thumbnails.mjs index 4c8d11b..ae98b11 100644 --- a/src/scripts/backfill-support-tutorial-thumbnails.mjs +++ b/src/scripts/backfill-support-tutorial-thumbnails.mjs @@ -61,8 +61,8 @@ async function ensureMedia(payload, item) { const created = await payload.create({ collection: 'media', data: { - alt: 'Eversolo video tutorial thumbnail', - credit: 'Eversolo', + alt: 'Luxsin video tutorial thumbnail', + credit: 'Luxsin', }, filePath, }) diff --git a/src/seed/import-seed.mjs b/src/seed/import-seed.mjs index 1eb4938..8e25935 100644 --- a/src/seed/import-seed.mjs +++ b/src/seed/import-seed.mjs @@ -208,20 +208,20 @@ function marketingCopy(locale) { if (locale === 'zh') { return { aboutBody: - 'Eversolo 以数字音频系统为核心,围绕工业设计、交互体验与系统整合能力,建立更连贯的产品语言。', + 'Luxsin 以数字音频系统为核心,围绕工业设计、交互体验与系统整合能力,建立更连贯的产品语言。', aboutBrandParagraphs: [ - 'Eversolo 关注的不只是设备参数,而是整套数字音频系统在真实家居环境里的完整体验。', + 'Luxsin 关注的不只是设备参数,而是整套数字音频系统在真实家居环境里的完整体验。', '从外观比例、材质触感到界面层级与控制路径,我们希望产品在长期使用里保持清晰、稳定和自然。', ], aboutPhilosophyParagraphs: [ '复杂功能不应该把使用过程变得更重。我们更在意如何把播放、管理、连接和升级整理成顺手的流程。', '这种取向让产品既具备技术深度,也能在日常使用中保持节奏感和可理解性。', ], - aboutTitle: '关于 Eversolo', + aboutTitle: '关于 Luxsin', contactDescription: '提交产品型号、购买信息与问题摘要后,支持团队可以更快进入排查与售后流程。', contactTitle: '联系支持', - globalDescription: '探索 Eversolo 产品、支持、新闻与品牌故事。', + globalDescription: '探索 Luxsin 产品、支持、新闻与品牌故事。', heroHeadline: '面向高品质数字音频系统的完整产品阵列', heroSupporting: '从流媒体播放、解码到放大与控制,把更完整的家用聆听系统放进一个清晰的产品体系里。', @@ -229,7 +229,7 @@ function marketingCopy(locale) { '把 FAQ、保修政策、下载中心与售后入口集中在一起,让排查、升级与联系支持更顺畅。', supportTitle: '支持中心', warrantyDescription: - '查看 Eversolo 保修政策、服务说明,以及提交售后支持前需要准备的信息。', + '查看 Luxsin 保修政策、服务说明,以及提交售后支持前需要准备的信息。', warrantyPolicyParagraphs: [ '保修覆盖范围会因产品类别、销售地区与购买渠道而有所不同,请以购买凭证与当地授权服务政策为准。', '提交售后支持前,建议先准备产品型号、序列号、购买时间,以及当前固件或系统相关信息,这会显著提升排查效率。', @@ -249,20 +249,20 @@ function marketingCopy(locale) { return { aboutBody: - 'Eversolo builds around digital audio systems, balancing industrial design, usability, and system cohesion across the product range.', + 'Luxsin builds around digital audio systems, balancing industrial design, usability, and system cohesion across the product range.', aboutBrandParagraphs: [ - 'Eversolo is interested in more than specification sheets. The focus is the full digital listening experience as it appears in real living spaces.', + 'Luxsin is interested in more than specification sheets. The focus is the full digital listening experience as it appears in real living spaces.', 'From proportions and materials to interface hierarchy and control flow, the products are shaped to feel clear, stable, and natural over time.', ], aboutPhilosophyParagraphs: [ 'Complex capability should not make the experience heavier. The goal is to organize playback, management, connectivity, and updates into a calmer flow.', 'That direction keeps the products technically capable while still feeling understandable and composed in everyday use.', ], - aboutTitle: 'About Eversolo', + aboutTitle: 'About Luxsin', contactDescription: 'Share the product model, purchase details, and issue summary so the support team can move into triage faster.', contactTitle: 'Contact Support', - globalDescription: 'Explore Eversolo products, support, news, and brand story.', + globalDescription: 'Explore Luxsin products, support, news, and brand story.', heroHeadline: 'A complete product range for modern digital listening systems', heroSupporting: 'Move from streaming transport and conversion to amplification and control inside one clearer product ecosystem.', @@ -270,7 +270,7 @@ function marketingCopy(locale) { 'Keep FAQ, warranty, downloads, and after-sales contact in one clearer support workspace.', supportTitle: 'Support Center', warrantyDescription: - 'Review Eversolo warranty coverage, service guidance, and what to prepare before contacting support.', + 'Review Luxsin warranty coverage, service guidance, and what to prepare before contacting support.', warrantyPolicyParagraphs: [ 'Warranty coverage can vary by product category, sales region, and purchase channel, so the local authorized service policy and proof of purchase remain the primary reference.', 'Before reaching out, prepare the product model, serial number, purchase timing, and relevant firmware or system details to speed up triage.', @@ -1090,7 +1090,7 @@ function mapHomepageFeaturedProductCard(product, locale) { textFont: 'default', textPosition: 'center', eyebrow: product.model || null, - title: product.name || product.model || 'Eversolo', + title: product.name || product.model || 'Luxsin', supportingLine: product.tagline || null, primaryCta: { label: locale === 'zh' ? '了解更多' : 'Learn More', @@ -1151,7 +1151,7 @@ async function upsertVideo(payload, slug, item, locale, report) { const data = { docLocale: locale, - title: item.title || 'Eversolo Video', + title: item.title || 'Luxsin Video', description: item.description ? richTextFromText(item.description) : undefined, embedUrl: item.embedUrl || undefined, product: product.id, @@ -1188,7 +1188,7 @@ async function upsertReview(payload, slug, item, locale, report) { { slug: `${slug}-${(item.title || 'review').slice(0, 48).toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, url: { en: item.thumbnailUrl, zh: item.thumbnailUrl }, - alt: { en: item.title || 'Eversolo Review', zh: item.title || 'Eversolo Review' }, + alt: { en: item.title || 'Luxsin Review', zh: item.title || 'Luxsin Review' }, }, report, ) @@ -1196,7 +1196,7 @@ async function upsertReview(payload, slug, item, locale, report) { const data = { docLocale: locale, - title: item.title || 'Eversolo Review', + title: item.title || 'Luxsin Review', product: product.id, thumbnail: thumbnailId, excerpt: item.excerpt || undefined, @@ -1504,7 +1504,7 @@ async function updateHomepageGlobal(payload, seed, report) { { ...defaultHeroZh, textFont: 'default', textPosition: 'right' }, ] const defaultStatementEn = { - eyebrow: 'About Eversolo', + eyebrow: 'About Luxsin', title: en.aboutTitle, body: richTextFromText(en.aboutBody), cta: { @@ -1513,7 +1513,7 @@ async function updateHomepageGlobal(payload, seed, report) { }, } const defaultStatementZh = { - eyebrow: '关于 Eversolo', + eyebrow: '关于 Luxsin', title: zh.aboutTitle, body: richTextFromText(zh.aboutBody), cta: { @@ -1776,7 +1776,7 @@ async function updateGlobalSettings(payload, seed, report) { ? existingSettingsEn.navigation.app : { label: 'APP', - href: 'https://www.eversolo.com/controlapp/index.html', + href: 'https://www.luxsin.com.cn/controlapp/index.html', openInNewTab: true, showOnDesktop: true, showOnMobile: true, @@ -1786,18 +1786,18 @@ async function updateGlobalSettings(payload, seed, report) { ? existingSettingsZh.navigation.app : { label: 'APP', - href: 'https://www.eversolo.com/controlapp/index.html', + href: 'https://www.luxsin.com.cn/controlapp/index.html', openInNewTab: true, showOnDesktop: true, showOnMobile: true, } - const finalSiteName = !isForceSeed && existingSettingsEn?.site?.name ? existingSettingsEn.site.name : 'Eversolo' + const finalSiteName = !isForceSeed && existingSettingsEn?.site?.name ? existingSettingsEn.site.name : 'Luxsin' const finalTaglineEn = !isForceSeed && existingSettingsEn?.site?.tagline ? existingSettingsEn.site.tagline : 'A refined way to experience music.' const finalTaglineZh = !isForceSeed && existingSettingsZh?.site?.tagline ? existingSettingsZh.site.tagline : '以更纯粹的方式体验音乐。' const finalSeoDescriptionEn = !isForceSeed && existingSettingsEn?.seoDefaults?.description ? existingSettingsEn.seoDefaults.description : en.globalDescription const finalSeoDescriptionZh = !isForceSeed && existingSettingsZh?.seoDefaults?.description ? existingSettingsZh.seoDefaults.description : zh.globalDescription - const finalSeoSuffixEn = !isForceSeed && existingSettingsEn?.seoDefaults?.titleSuffix ? existingSettingsEn.seoDefaults.titleSuffix : 'Eversolo' - const finalSeoSuffixZh = !isForceSeed && existingSettingsZh?.seoDefaults?.titleSuffix ? existingSettingsZh.seoDefaults.titleSuffix : 'Eversolo' + const finalSeoSuffixEn = !isForceSeed && existingSettingsEn?.seoDefaults?.titleSuffix ? existingSettingsEn.seoDefaults.titleSuffix : 'Luxsin' + const finalSeoSuffixZh = !isForceSeed && existingSettingsZh?.seoDefaults?.titleSuffix ? existingSettingsZh.seoDefaults.titleSuffix : 'Luxsin' await payload.updateGlobal({ slug: 'globalSettings', @@ -1813,7 +1813,7 @@ async function updateGlobalSettings(payload, seed, report) { footer: { columns: finalFooterColumnsEn, legalLinks: finalLegalLinksEn, - copyright: existingSettingsEn?.footer?.copyright || '© Eversolo', + copyright: existingSettingsEn?.footer?.copyright || '© Luxsin', }, seoDefaults: { titleSuffix: finalSeoSuffixEn, @@ -1852,7 +1852,7 @@ async function updateGlobalSettings(payload, seed, report) { footer: { columns: finalFooterColumnsZh, legalLinks: finalLegalLinksZh, - copyright: existingSettingsZh?.footer?.copyright || existingSettingsEn?.footer?.copyright || '© Eversolo', + copyright: existingSettingsZh?.footer?.copyright || existingSettingsEn?.footer?.copyright || '© Luxsin', }, seoDefaults: { titleSuffix: finalSeoSuffixZh, @@ -1911,8 +1911,8 @@ function whereToBuyGlobalData(locale, media = {}) { eyebrow: isZh ? '购买渠道' : 'Where to Buy', title: 'Where to Buy', description: isZh - ? '线上了解购买渠道,或查找 Eversolo 授权经销商与线下体验空间。' - : 'Shop online or connect with authorized Eversolo dealers and experience spaces around the world.', + ? '线上了解购买渠道,或查找 Luxsin 授权经销商与线下体验空间。' + : 'Shop online or connect with authorized Luxsin dealers and experience spaces around the world.', buttonLabel: isZh ? '联系销售' : 'Contact Sales', buttonHref: isZh ? '/zh/contact' : '/en/contact', image: media.hero || undefined, @@ -1925,7 +1925,7 @@ function whereToBuyGlobalData(locale, media = {}) { { id: 'products', label: '产品中心', - description: '浏览 Eversolo 产品与购买信息。', + description: '浏览 Luxsin 产品与购买信息。', linkLabel: '了解更多', href: '/zh/products', image: media.products || undefined, @@ -1952,7 +1952,7 @@ function whereToBuyGlobalData(locale, media = {}) { { id: 'reviews', label: '视频与评测', - description: '查看 Eversolo 视频与媒体评价。', + description: '查看 Luxsin 视频与媒体评价。', linkLabel: '查看内容', href: '/zh/reviews', image: media.reviews || undefined, @@ -1963,7 +1963,7 @@ function whereToBuyGlobalData(locale, media = {}) { { id: 'products', label: 'Products', - description: 'Browse Eversolo products and buying options.', + description: 'Browse Luxsin products and buying options.', linkLabel: 'Learn More', href: '/en/products', image: media.products || undefined, @@ -1972,7 +1972,7 @@ function whereToBuyGlobalData(locale, media = {}) { { id: 'contact-sales', label: 'Contact Sales', - description: 'Contact Eversolo for regional buying support.', + description: 'Contact Luxsin for regional buying support.', linkLabel: 'Contact Us', href: '/en/contact', image: media.contact || undefined, @@ -1990,7 +1990,7 @@ function whereToBuyGlobalData(locale, media = {}) { { id: 'reviews', label: 'Videos & Reviews', - description: 'Explore reviews and videos from the Eversolo community.', + description: 'Explore reviews and videos from the Luxsin community.', linkLabel: 'Explore', href: '/en/reviews', image: media.reviews || undefined, @@ -2029,8 +2029,8 @@ async function updateWhereToBuyGlobal(payload, report) { payload, { slug: 'where-to-buy-hero', - url: { en: 'https://www.eversolo.com/Public/home/images/nav_show.jpg' }, - alt: { en: 'Eversolo where to buy hero', zh: 'Eversolo 购买渠道主视觉' }, + url: { en: 'https://www.luxsin.com.cn/Public/home/images/nav_show.jpg' }, + alt: { en: 'Luxsin where to buy hero', zh: 'Luxsin 购买渠道主视觉' }, }, report, ) @@ -2075,8 +2075,8 @@ async function updateAboutGlobal(payload, companyContact, report) { payload, { slug: 'about-page-hero', - url: { en: 'https://www.eversolo.com/Public/home/images/about_us.jpg' }, - alt: { en: 'Eversolo about page hero', zh: 'Eversolo 关于页主视觉' }, + url: { en: 'https://www.luxsin.com.cn/Public/home/images/about_us.jpg' }, + alt: { en: 'Luxsin about page hero', zh: 'Luxsin 关于页主视觉' }, }, report, ) @@ -2096,7 +2096,7 @@ async function updateAboutGlobal(payload, companyContact, report) { { slug: 'about-story-awards', url: { - en: 'https://www.eversolo.com/Products/other/assets/eisaHifi.jpg', + en: 'https://www.luxsin.com.cn/Products/other/assets/eisaHifi.jpg', }, alt: { en: 'Winning global awards', zh: '赢得全球认可' }, }, @@ -2192,12 +2192,12 @@ async function updateAboutGlobal(payload, companyContact, report) { storyMoments: [ { title: 'Feel the Charm of HiFi', - body: 'From playback, conversion, and amplification to control, Eversolo is shaped around the complete digital listening experience rather than isolated specifications.', + body: 'From playback, conversion, and amplification to control, Luxsin is shaped around the complete digital listening experience rather than isolated specifications.', image: charmImageId || undefined, }, { title: 'Winning Global Recognition', - body: 'Professional media praise and international awards such as EISA and iF now form a more visible part of Eversolo’s global reputation.', + body: 'Professional media praise and international awards such as EISA and iF now form a more visible part of Luxsin’s global reputation.', image: awardsImageId || undefined, }, ], @@ -2209,7 +2209,7 @@ async function updateAboutGlobal(payload, companyContact, report) { ][index], body: [ - 'Eversolo pursues purity, realism, and spatial depth, aiming to reveal musical detail instead of simply foregrounding the hardware itself.', + 'Luxsin pursues purity, realism, and spatial depth, aiming to reveal musical detail instead of simply foregrounding the hardware itself.', 'Hardware and software are developed together so chassis design, power, decoding, system flow, and interface behavior operate as one product idea.', 'Continuous tuning, testing, and integration refine frequency balance, resolution, and soundstage into a presentation that feels stable and natural.', ][index] || body, @@ -2233,19 +2233,19 @@ async function updateAboutGlobal(payload, companyContact, report) { storyMoments: [ { title: '感受 Hi-Fi 的魅力', - body: '从播放、解码、放大到控制,Eversolo 更关心的是整套数字音频系统的完整体验,而不只是单点参数表现。', + body: '从播放、解码、放大到控制,Luxsin 更关心的是整套数字音频系统的完整体验,而不只是单点参数表现。', image: charmImageId || undefined, }, { title: '赢得全球认可', - body: '从专业媒体的一致肯定,到 EISA 与 iF 等国际奖项,Eversolo 正在把产品实力转化成更稳定的全球口碑。', + body: '从专业媒体的一致肯定,到 EISA 与 iF 等国际奖项,Luxsin 正在把产品实力转化成更稳定的全球口碑。', image: awardsImageId || undefined, }, ], capabilityPillars: [ { title: '追求更高的 Hi-Fi 表现', - body: 'Eversolo 关注声音的纯净度、真实感与空间感,希望用户能听见音乐内部的层次,而不是只听见器材本身。', + body: 'Luxsin 关注声音的纯净度、真实感与空间感,希望用户能听见音乐内部的层次,而不是只听见器材本身。', }, { title: '软硬件一体化开发', @@ -2298,14 +2298,14 @@ async function updateContactUsGlobal(payload, report) { payload, { slug: 'contact-us-page-hero', - url: { en: 'https://www.eversolo.com/Public/home/images/about_us.jpg' }, - alt: { en: 'Eversolo contact page hero', zh: 'Eversolo 联系我们主视觉' }, + url: { en: 'https://www.luxsin.com.cn/Public/home/images/about_us.jpg' }, + alt: { en: 'Luxsin contact page hero', zh: 'Luxsin 联系我们主视觉' }, }, report, ) const defaultContactGroupsEn = [ { - title: 'Eversolo Audio China Office', + title: 'Luxsin Audio China Office', items: [ { label: 'Address', @@ -2313,16 +2313,16 @@ async function updateContactUsGlobal(payload, report) { }, { 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' }, + { href: 'mailto:support@luxsinaudio.com', label: 'Email', value: 'support@luxsinaudio.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: 'mailto:support@luxsinaudio.com', label: 'Sales Email', value: 'support@luxsinaudio.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: 'mailto:support@luxsinaudio.com', label: 'OEM/ODM', value: 'support@luxsinaudio.com' }, { href: '#partnership-forms', label: 'OEM Requirements', value: 'Submit OEM inquiry' }, ], }, @@ -2331,28 +2331,28 @@ async function updateContactUsGlobal(payload, report) { 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: '/en/support/faq', label: 'FAQ', value: 'Support FAQ' }, - { href: 'mailto:service@eversolo.com', label: 'Support Email', value: 'service@eversolo.com' }, + { href: 'mailto:support@luxsinaudio.com', label: 'Support Email', value: 'support@luxsinaudio.com' }, { href: '/en/support/contact', label: 'After Service', value: 'Submit support request' }, ], }, ] const defaultContactGroupsZh = [ { - title: 'Eversolo 中国办公室', + title: '乐笙 Luxsin 中国办公室', 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' }, + { href: 'mailto:support@luxsinaudio.com', label: '邮箱', value: 'support@luxsinaudio.com' }, ], }, { title: '销售与渠道合作', items: [ { label: 'Sales Skype', value: 'cathy@zidoo.tv' }, - { href: 'mailto:sales@eversolo.com', label: '销售邮箱', value: 'sales@eversolo.com' }, + { href: 'mailto:support@luxsinaudio.com', label: '销售邮箱', value: 'support@luxsinaudio.com' }, { href: '#partnership-forms', label: '经销商申请', value: '填写经销合作表单' }, - { href: 'mailto:myq@eversolo.com', label: 'OEM/ODM', value: 'myq@eversolo.com' }, + { href: 'mailto:support@luxsinaudio.com', label: 'OEM/ODM', value: 'support@luxsinaudio.com' }, { href: '#partnership-forms', label: 'OEM 需求', value: '填写 OEM 需求表单' }, ], }, @@ -2361,7 +2361,7 @@ async function updateContactUsGlobal(payload, report) { body: '如遇到安装、升级或常见设置问题,建议先查看 FAQ 与下载中心;仍需协助时,可通过售后支持入口或邮件继续联系。', items: [ { href: '/zh/support/faq', label: 'FAQ', value: '常见问题' }, - { href: 'mailto:service@eversolo.com', label: '支持邮箱', value: 'service@eversolo.com' }, + { href: 'mailto:support@luxsinaudio.com', label: '支持邮箱', value: 'support@luxsinaudio.com' }, { href: '/zh/support/contact', label: '售后支持', value: '提交售后请求' }, ], }, @@ -2381,7 +2381,7 @@ async function updateContactUsGlobal(payload, report) { description: 'Distributor requests, OEM/ODM inquiries, sales contacts, and support channels in one focused page.', eyebrow: 'Business & Support Contact', image: heroImageId || undefined, - title: 'Contact Eversolo', + title: 'Contact Luxsin', }, contactGroups: defaultContactGroupsEn, formIntro: { @@ -2431,8 +2431,8 @@ async function updateSupportGlobals(payload, support, companyContact, report) { payload, { slug: 'support-page-hero', - url: { en: 'https://www.eversolo.com/Uploads/guideClassify/fa6c444623c46ff4799f2cc96a007fe6.png' }, - alt: { en: 'Eversolo support page hero', zh: 'Eversolo 支持中心主视觉' }, + url: { en: 'https://www.luxsin.com.cn/Uploads/guideClassify/fa6c444623c46ff4799f2cc96a007fe6.png' }, + alt: { en: 'Luxsin support page hero', zh: 'Luxsin 支持中心主视觉' }, }, report, ) @@ -2440,8 +2440,8 @@ async function updateSupportGlobals(payload, support, companyContact, report) { payload, { slug: 'contact-page-hero', - url: { en: 'https://www.eversolo.com/Uploads/product/d44c180bbe0df77b698e3852c4caf38f.jpg' }, - alt: { en: 'Eversolo contact support hero', zh: 'Eversolo 联系支持主视觉' }, + url: { en: 'https://www.luxsin.com.cn/Uploads/product/d44c180bbe0df77b698e3852c4caf38f.jpg' }, + alt: { en: 'Luxsin contact support hero', zh: 'Luxsin 联系支持主视觉' }, }, report, ) @@ -2449,8 +2449,8 @@ async function updateSupportGlobals(payload, support, companyContact, report) { payload, { slug: 'warranty-page-hero', - url: { en: 'https://www.eversolo.com/Uploads/product/64ddb2be3f999331ae5155285deefb87.jpg' }, - alt: { en: 'Eversolo warranty page hero', zh: 'Eversolo 保修页面主视觉' }, + url: { en: 'https://www.luxsin.com.cn/Uploads/product/64ddb2be3f999331ae5155285deefb87.jpg' }, + alt: { en: 'Luxsin warranty page hero', zh: 'Luxsin 保修页面主视觉' }, }, report, )