popiart-server
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

778 lines
25 KiB

export const locales = ["zh", "en"] as const;
export type Locale = (typeof locales)[number];
type Stat = {
label: string;
value: string;
};
type Scene = {
category: string;
name: string;
description: string;
};
type Step = {
title: string;
description: string;
};
type Plan = {
badge: string;
name: string;
price: string;
cadence: string;
summary: string;
features: string[];
cta: string;
highlight?: boolean;
};
type Faq = {
question: string;
answer: string;
};
type QuickStep = {
title: string;
description: string;
code: string;
};
type EnvVar = {
name: string;
required: string;
description: string;
};
type DocSkill = {
name: string;
command: string;
description: string;
};
type Benefit = {
kicker: string;
title: string;
description: string;
};
type ConsoleMetric = {
label: string;
value: string;
};
type ConsoleSkill = {
name: string;
routeKey: string;
status: string;
};
type ApiKey = {
name: string;
masked: string;
scope: string;
};
type UsageRow = {
name: string;
count: string;
cost: string;
};
export type AppDictionary = {
brand: {
name: string;
subtitle: string;
};
nav: {
home: string;
docs: string;
console: string;
pricing: string;
login: string;
};
footer: {
copy: string;
};
home: {
tag: string;
title: string;
subtitle: string;
primaryCta: string;
secondaryCta: string;
freeTrial: string;
socialProof: string;
stageLabel: string;
stageValue: string;
stageDescription: string;
heroPhrases: string[];
scenesTag: string;
scenesTitle: string;
scenesSubtitle: string;
scenes: Scene[];
flowTag: string;
flowTitle: string;
flowSubtitle: string;
flowSteps: Step[];
trustTag: string;
trustTitle: string;
trustStats: Stat[];
};
pricing: {
tag: string;
title: string;
subtitle: string;
plans: Plan[];
faqTag: string;
faqTitle: string;
faqs: Faq[];
};
docs: {
tag: string;
title: string;
intro: string;
quickStartTitle: string;
quickSteps: QuickStep[];
envTitle: string;
envVars: EnvVar[];
skillsTag: string;
skillsTitle: string;
skills: DocSkill[];
};
login: {
tag: string;
title: string;
subtitle: string;
primaryProvider: string;
secondaryProvider: string;
termsPrefix: string;
termsLink: string;
and: string;
privacyLink: string;
benefits: Benefit[];
};
console: {
tag: string;
title: string;
subtitle: string;
billingCta: string;
loginCta: string;
metrics: ConsoleMetric[];
skillsTag: string;
skillsTitle: string;
officialSkills: ConsoleSkill[];
keysTag: string;
keysTitle: string;
apiKeys: ApiKey[];
usageTag: string;
usageTitle: string;
usageRows: UsageRow[];
planTag: string;
planTitle: string;
planDescription: string;
planBenefits: string[];
planCta: string;
};
};
const zh: AppDictionary = {
brand: {
name: "PopiArt",
subtitle: "官方 AI Skill 控制台",
},
nav: {
home: "首页",
docs: "文档",
console: "控制台",
pricing: "定价",
login: "登录",
},
footer: {
copy: "面向创作者与 coding agent 的官方 Skill 接入、控制台与订阅平台。",
},
home: {
tag: "OFFICIAL SKILLS",
title: "把官方 PopiArt Skills 接进你的创作与自动化流程",
subtitle:
"覆盖图片生成、编辑、视频与批量工作流,让团队用统一账号、统一计费、统一控制台管理所有 AI 能力。",
primaryCta: "开始使用",
secondaryCta: "查看文档",
freeTrial: "无需信用卡,注册即送 50 Credits",
socialProof: "已为团队工作流准备好账号、订阅与用量追踪",
stageLabel: "本月概览",
stageValue: "12,480 Credits",
stageDescription: "管理官方技能、订阅计划、API key 与项目级用量。",
heroPhrases: [
"图片生成",
"图像编辑",
"图生视频",
"动作迁移",
"批量处理",
"官方计费",
],
scenesTag: "SCENARIOS",
scenesTitle: "覆盖高频 AI 创作场景",
scenesSubtitle: "沿用目标站点的信息结构,但切换为更贴近 PopiArt 产品语义的能力列表。",
scenes: [
{
category: "IMAGE",
name: "文生图",
description: "从简短 prompt 到完整视觉概念,一键生成统一风格的图像结果。",
},
{
category: "IMAGE",
name: "图片编辑",
description: "支持局部重绘、风格替换、多参考图融合与批量出图工作流。",
},
{
category: "VIDEO",
name: "图生视频",
description: "以首帧图片为基础生成短视频,适合角色、商品和海报动效。",
},
{
category: "VIDEO",
name: "动作迁移",
description: "将参考视频动作迁移到目标人物图像,快速生产社媒动态内容。",
},
{
category: "UTILITY",
name: "抠图与超清",
description: "把日常修图能力做成稳定的 Skill,适配电商与工作台场景。",
},
{
category: "OPS",
name: "批量官方技能",
description: "把技能能力、额度、项目和账单统一到一个控制台管理。",
},
],
flowTag: "INTEGRATION",
flowTitle: "三步接入官方控制台",
flowSubtitle: "先搭出官网结构,再逐步接回 popiartServer 的登录、用量和计费接口。",
flowSteps: [
{
title: "注册并登录 PopiArt 账号",
description: "先拿到产品层账号与 API key,而不是把供应商密钥直接暴露给客户端。",
},
{
title: "在文档页完成 CLI 或 API 接入",
description: "根据官方 quick start 配置 endpoint、token 和默认输出目录。",
},
{
title: "在控制台查看技能、用量和账单",
description: "按项目查看技能调用量、订阅状态和充值记录。",
},
],
trustTag: "CONTROL",
trustTitle: "围绕产品层能力组织,而不是裸模型调用",
trustStats: [
{ label: "官方技能目录", value: "24+" },
{ label: "项目级路由覆盖", value: "Per Project" },
{ label: "统一登录与会话", value: "1 Account" },
{ label: "订阅与充值", value: "Built In" },
],
},
pricing: {
tag: "PRICING",
title: "简单透明的订阅与充值",
subtitle: "既能买月度订阅,也能按项目补充 Credits,适合个人与团队一起用。",
plans: [
{
badge: "推荐方案",
name: "Pro Subscription",
price: "¥69.99",
cadence: "/月",
summary: "适合个人创作者和轻量团队,优先拿到官方技能、控制台与基础配额。",
features: [
"每月 12,000 Credits",
"官方技能全量可见",
"项目级用量统计",
"标准 API key 与 CLI 接入",
],
cta: "订阅 Pro",
highlight: true,
},
{
badge: "灵活补充",
name: "Credit Top-up",
price: "¥199",
cadence: "/包",
summary: "在已有订阅上追加额度,适合视频类高消耗任务或团队集中出图周。",
features: [
"追加 50,000 Credits",
"购买后立即生效",
"支持与订阅叠加",
"统一记录到账单中心",
],
cta: "立即充值",
},
],
faqTag: "FAQ",
faqTitle: "常见问题",
faqs: [
{
question: "订阅和充值包可以同时购买吗?",
answer: "可以。订阅提供基础月额度,充值包作为叠加额度优先消耗。",
},
{
question: "控制台会显示技能级用量吗?",
answer: "会。按 skill、项目、时间维度展示调用次数、Credits 和费用归因。",
},
{
question: "后续能接企业方案吗?",
answer: "可以。企业版通常会补充团队成员、预算控制、发票和专属支持能力。",
},
],
},
docs: {
tag: "DOCUMENTATION",
title: "PopiArt 开发者文档",
intro:
"先把官网、登录和控制台骨架搭起来,后续直接把文档页接到 popiartcli 与 popiartServer 的真实协议。",
quickStartTitle: "快速开始",
quickSteps: [
{
title: "1. 设置服务地址",
description: "将 Web 控制台和 CLI 指向统一的产品层后端。",
code: "export POPIART_ENDPOINT=http://127.0.0.1:8080/v1",
},
{
title: "2. 登录并写入 token",
description: "先拿到产品层 session,后端再桥接到上游模型网关。",
code: "popiart auth login --key <your-product-token>",
},
{
title: "3. 调用官方 skill",
description: "直接通过技能名或 route key 发起任务。",
code: "popiart skills list\npopiart run --skill popiskill-image-text2image-basic-v1",
},
],
envTitle: "环境变量",
envVars: [
{
name: "POPIART_ENDPOINT",
required: "必填",
description: "产品层 API 地址,CLI 与控制台共用。",
},
{
name: "POPIART_API_KEY",
required: "必填",
description: "登录后签发的产品层 token,而不是上游 provider key。",
},
{
name: "POPIART_OUTPUT_DIR",
required: "选填",
description: "默认输出目录,未设置时可沿用当前工作目录。",
},
{
name: "POPIART_PROJECT_ID",
required: "选填",
description: "项目级路由、预算和用量归因的作用域。",
},
],
skillsTag: "OFFICIAL SKILLS",
skillsTitle: "技能能力一览",
skills: [
{
name: "文生图",
command: "popiart run --skill popiskill-image-text2image-basic-v1",
description: "从 prompt 直接生成图片,适合快速概念验证与海报起稿。",
},
{
name: "图像编辑",
command: "popiart run --skill popiskill-image-img2img-basic-v1",
description: "对已有图片进行编辑、风格迁移和参考图约束生成。",
},
{
name: "图生视频",
command: "popiart run --skill popiskill-video-image2video-basic-v1",
description: "把静态图转成动态短视频,并保留任务追踪与 artifact 引用。",
},
{
name: "模型直连",
command: "popiart models infer --model gemini-3.1-flash-image-preview",
description: "跳过技能层,直接以模型为入口发任务,适合调试模型能力。",
},
],
},
login: {
tag: "SIGN IN",
title: "登录以访问 PopiArt 官方控制台",
subtitle: "登录后即可查看官方技能目录、项目级用量、API key 与订阅状态。",
primaryProvider: "使用 PopiArt 账号登录",
secondaryProvider: "使用 GitHub 登录",
termsPrefix: "点击登录即表示同意",
termsLink: "服务条款",
and: "和",
privacyLink: "隐私政策",
benefits: [
{
kicker: "CONSOLE",
title: "统一查看技能与项目",
description: "所有官方技能、项目路由和调用记录都收敛到一个控制台。",
},
{
kicker: "BILLING",
title: "订阅与充值同页管理",
description: "避免在 CLI、支付页和后台系统之间来回切换。",
},
{
kicker: "ACCESS",
title: "产品层账号替代裸密钥分发",
description: "让团队协作建立在 session、权限和计费规则之上。",
},
],
},
console: {
tag: "CONSOLE",
title: "官方技能与用量控制台",
subtitle: "第一版先用静态数据还原页面信息架构,下一步再接回真实 auth、skills、budget 和 billing API。",
billingCta: "查看定价",
loginCta: "登录账号",
metrics: [
{ label: "剩余 Credits", value: "8,420" },
{ label: "本月调用次数", value: "1,284" },
{ label: "活跃项目", value: "6" },
{ label: "账单周期支出", value: "¥412.60" },
],
skillsTag: "SKILLS",
skillsTitle: "官方技能目录",
officialSkills: [
{ name: "Basic Text2Image", routeKey: "image.text2image", status: "Live" },
{ name: "Basic Img2Img", routeKey: "image.img2img", status: "Beta" },
{ name: "Basic Image2Video", routeKey: "video.image2video", status: "Live" },
{ name: "Poster Generator", routeKey: "image.poster", status: "Planned" },
],
keysTag: "API KEYS",
keysTitle: "当前可用密钥",
apiKeys: [
{ name: "Primary App Key", masked: "pk_live_****9f2d", scope: "skills:read jobs:write" },
{ name: "Automation Key", masked: "pk_live_****1a70", scope: "jobs:write artifacts:read" },
],
usageTag: "USAGE",
usageTitle: "近期技能用量",
usageRows: [
{ name: "文生图", count: "682 calls", cost: "¥118.20" },
{ name: "图像编辑", count: "391 calls", cost: "¥94.60" },
{ name: "图生视频", count: "77 jobs", cost: "¥199.80" },
],
planTag: "BILLING",
planTitle: "当前订阅",
planDescription: "Pro Subscription 已激活,额度不足时可追加 Credits Top-up。",
planBenefits: [
"月度基础额度 12,000 Credits",
"充值包与订阅额度可叠加",
"账单、发票和续费记录集中管理",
],
planCta: "管理订阅与充值",
},
};
const en: AppDictionary = {
brand: {
name: "PopiArt",
subtitle: "Official AI Skill Console",
},
nav: {
home: "Home",
docs: "Docs",
console: "Console",
pricing: "Pricing",
login: "Login",
},
footer: {
copy: "The official skill catalog, console, and billing surface for creators and coding agents.",
},
home: {
tag: "OFFICIAL SKILLS",
title: "Bring official PopiArt skills into your creative and automation workflows",
subtitle:
"One account, one console, and one billing layer for image generation, editing, video, and team-ready AI operations.",
primaryCta: "Get started",
secondaryCta: "Read docs",
freeTrial: "No credit card required. 50 free credits on signup.",
socialProof: "Built for account management, subscriptions, and usage visibility.",
stageLabel: "This month",
stageValue: "12,480 Credits",
stageDescription: "Manage official skills, subscriptions, API keys, and per-project usage from one place.",
heroPhrases: [
"Text to image",
"Image edit",
"Image to video",
"Motion transfer",
"Batch ops",
"Official billing",
],
scenesTag: "SCENARIOS",
scenesTitle: "Designed around high-frequency AI production flows",
scenesSubtitle:
"The structure mirrors the reference site, but the content is adapted to PopiArt's product model.",
scenes: [
{
category: "IMAGE",
name: "Text to image",
description: "Generate polished concept visuals from prompts with room for brand and style control.",
},
{
category: "IMAGE",
name: "Image editing",
description: "Run inpainting, style transfer, multi-reference edits, and iterative revision workflows.",
},
{
category: "VIDEO",
name: "Image to video",
description: "Turn key visuals into short motion clips for creator campaigns and demos.",
},
{
category: "VIDEO",
name: "Motion transfer",
description: "Apply motion from a reference clip to a target portrait or character frame.",
},
{
category: "UTILITY",
name: "Cutout and upscale",
description: "Ship dependable utility skills for ecommerce, editorial, and content pipelines.",
},
{
category: "OPS",
name: "Official skill operations",
description: "Bring skills, quotas, projects, and billing together in one product surface.",
},
],
flowTag: "INTEGRATION",
flowTitle: "Three steps to launch the official console",
flowSubtitle:
"Start with the web experience, then connect auth, usage, and billing to popiartServer.",
flowSteps: [
{
title: "Create and sign into a PopiArt account",
description: "Use a product-level account instead of pushing provider credentials into the client.",
},
{
title: "Complete CLI or API setup from the docs",
description: "Point your tooling to the shared endpoint and configure the official token flow.",
},
{
title: "Track skills, usage, and billing in the console",
description: "Review usage by project, skill, and billing period from a single dashboard.",
},
],
trustTag: "CONTROL",
trustTitle: "Organized around product semantics instead of raw model calls",
trustStats: [
{ label: "Official skills", value: "24+" },
{ label: "Project routing", value: "Per project" },
{ label: "Unified auth", value: "1 account" },
{ label: "Billing flows", value: "Built in" },
],
},
pricing: {
tag: "PRICING",
title: "Simple subscriptions and credit top-ups",
subtitle: "Use a monthly plan for the baseline and top up when video or batch workflows spike.",
plans: [
{
badge: "Recommended",
name: "Pro Subscription",
price: "$9.99",
cadence: "/month",
summary: "For solo creators and small teams that need the official skill catalog and a predictable base quota.",
features: [
"12,000 monthly credits",
"Full official skill directory",
"Per-project usage analytics",
"Standard API key and CLI access",
],
cta: "Subscribe to Pro",
highlight: true,
},
{
badge: "Flexible",
name: "Credit Top-up",
price: "$28",
cadence: "/pack",
summary: "Add extra capacity during launch weeks, video-heavy runs, or large team sprints.",
features: [
"50,000 extra credits",
"Instant activation after purchase",
"Stacks on top of subscriptions",
"Tracked in the same billing center",
],
cta: "Top up credits",
},
],
faqTag: "FAQ",
faqTitle: "Common questions",
faqs: [
{
question: "Can subscriptions and top-ups be combined?",
answer: "Yes. The subscription provides the base monthly quota and top-ups add extra spendable credits.",
},
{
question: "Will the console show per-skill usage?",
answer: "Yes. The intended product surface tracks calls, credits, and cost attribution by skill and project.",
},
{
question: "Can this grow into an enterprise plan later?",
answer: "Yes. Team seats, budgets, invoicing, and enterprise controls can sit on top of the same billing layer.",
},
],
},
docs: {
tag: "DOCUMENTATION",
title: "PopiArt developer docs",
intro:
"This first pass recreates the information architecture of the reference site while aligning it with popiartcli and popiartServer.",
quickStartTitle: "Quick start",
quickSteps: [
{
title: "1. Configure the endpoint",
description: "Point both the console and CLI at the same product-layer backend.",
code: "export POPIART_ENDPOINT=http://127.0.0.1:8080/v1",
},
{
title: "2. Sign in with a product token",
description: "Keep provider credentials behind the backend and work through the product session layer.",
code: "popiart auth login --key <your-product-token>",
},
{
title: "3. Run official skills",
description: "Invoke skills by skill id or move to model-level calls when you need direct debugging.",
code: "popiart skills list\npopiart run --skill popiskill-image-text2image-basic-v1",
},
],
envTitle: "Environment variables",
envVars: [
{
name: "POPIART_ENDPOINT",
required: "Required",
description: "The product-layer API base shared by the CLI and the console.",
},
{
name: "POPIART_API_KEY",
required: "Required",
description: "A product-layer token issued after login, not a raw provider key.",
},
{
name: "POPIART_OUTPUT_DIR",
required: "Optional",
description: "Default output directory for generated artifacts.",
},
{
name: "POPIART_PROJECT_ID",
required: "Optional",
description: "Project scope for routing, budgets, and usage attribution.",
},
],
skillsTag: "OFFICIAL SKILLS",
skillsTitle: "Skill catalog",
skills: [
{
name: "Text to image",
command: "popiart run --skill popiskill-image-text2image-basic-v1",
description: "Generate polished visuals directly from text prompts.",
},
{
name: "Image editing",
command: "popiart run --skill popiskill-image-img2img-basic-v1",
description: "Edit existing visuals with references, masks, and style constraints.",
},
{
name: "Image to video",
command: "popiart run --skill popiskill-video-image2video-basic-v1",
description: "Turn a still image into a short motion clip with tracked artifacts.",
},
{
name: "Model inference",
command: "popiart models infer --model gemini-3.1-flash-image-preview",
description: "Bypass the skill layer for direct model testing.",
},
],
},
login: {
tag: "SIGN IN",
title: "Sign in to access the PopiArt official console",
subtitle: "View official skills, project usage, API keys, and subscriptions after login.",
primaryProvider: "Continue with PopiArt account",
secondaryProvider: "Continue with GitHub",
termsPrefix: "By continuing you agree to the",
termsLink: "Terms of Service",
and: "and",
privacyLink: "Privacy Policy",
benefits: [
{
kicker: "CONSOLE",
title: "One place for skills and projects",
description: "See the official catalog, routing state, and job visibility from a single product surface.",
},
{
kicker: "BILLING",
title: "Subscriptions and top-ups together",
description: "Avoid splitting billing, product, and CLI workflows across separate systems.",
},
{
kicker: "ACCESS",
title: "Accounts over raw secrets",
description: "Build collaboration on sessions, permissions, and billing rules instead of shared provider keys.",
},
],
},
console: {
tag: "CONSOLE",
title: "Official skills and usage console",
subtitle:
"This first pass uses seeded data to recreate the target dashboard structure before wiring it to real auth, skill, usage, and billing APIs.",
billingCta: "View pricing",
loginCta: "Sign in",
metrics: [
{ label: "Credits left", value: "8,420" },
{ label: "Monthly calls", value: "1,284" },
{ label: "Active projects", value: "6" },
{ label: "Billing cycle spend", value: "$56.20" },
],
skillsTag: "SKILLS",
skillsTitle: "Official catalog",
officialSkills: [
{ name: "Basic Text2Image", routeKey: "image.text2image", status: "Live" },
{ name: "Basic Img2Img", routeKey: "image.img2img", status: "Beta" },
{ name: "Basic Image2Video", routeKey: "video.image2video", status: "Live" },
{ name: "Poster Generator", routeKey: "image.poster", status: "Planned" },
],
keysTag: "API KEYS",
keysTitle: "Available keys",
apiKeys: [
{ name: "Primary App Key", masked: "pk_live_****9f2d", scope: "skills:read jobs:write" },
{ name: "Automation Key", masked: "pk_live_****1a70", scope: "jobs:write artifacts:read" },
],
usageTag: "USAGE",
usageTitle: "Recent skill usage",
usageRows: [
{ name: "Text to image", count: "682 calls", cost: "$16.10" },
{ name: "Image editing", count: "391 calls", cost: "$12.90" },
{ name: "Image to video", count: "77 jobs", cost: "$27.20" },
],
planTag: "BILLING",
planTitle: "Current plan",
planDescription: "Pro Subscription is active, with top-ups available whenever the team needs extra credits.",
planBenefits: [
"12,000 base monthly credits",
"Top-up packs stack with subscriptions",
"Invoices, renewals, and spend live in one place",
],
planCta: "Manage billing",
},
};
const dictionaries: Record<Locale, AppDictionary> = {
zh,
en,
};
export function isLocale(value: string): value is Locale {
return locales.includes(value as Locale);
}
export function getDictionary(locale: Locale): AppDictionary {
return dictionaries[locale] ?? dictionaries.zh;
}