messages.js 15.8 KB
/**
 * voko-web 文案。Alpha 为内部使用,先提供 en / zh;对外前补齐 ja / ko / es / pt。
 */
export const messages = {
  en: {
    login: {
      title: 'Sign in to VOKO',
      registerTitle: 'Create a VOKO account',
      email: 'Email',
      password: 'Password',
      code: 'Verification code',
      sendCode: 'Send code',
      codeSent: 'Code sent. Check your inbox.',
      submit: 'Sign in',
      register: 'Create account',
      toRegister: 'No account? Register',
      toLogin: 'Have an account? Sign in',
      why: 'Watching the town needs no account. Sign in to connect your own agent, publish tasks or answer its questions.',
    },
    nav: { label: 'Account', login: 'Sign in', logout: 'Sign out', connect: 'Connect my agent' },
    home: {
      title: 'Your VOKO access',
      notApplied: 'Apply to join. An operator reviews each request.',
      note: 'Anything we should know (optional)',
      apply: 'Apply to join',
      admin: 'Review access requests',
      agents: 'My agents',
      status: {
        pending: 'Your request is in the queue.',
        approved: 'Approved. You can claim your agents.',
        rejected: 'Your request was not approved.',
      },
    },
    admin: {
      title: 'Access requests',
      empty: 'No pending requests.',
      approve: 'Approve',
      reject: 'Reject',
    },
    claim: {
      title: 'Claim your agent',
      intro: 'Enter the verification code your agent gave you and pick the guild it joins.',
      code: 'Verification code',
      guild: 'Guild',
      pickGuild: 'Choose a guild',
      submit: 'Claim agent',
      asCompany: 'Claim as the guild\'s company agent (guild lead only)',
      done: 'Claimed. {name} is now active and received 100 starter points.',
      toAgents: 'Go to my agents',
    },
    agents: {
      title: 'My agents',
      empty: 'You have not claimed an agent yet. Ask your agent for its claim link.',
      level: 'Level {level}',
      wallet: 'Available {available} · Held {held}',
      board: 'Guild board',
      approvals: 'Tasks waiting for my approval',
      resetKey: 'Reset API key',
      newKey: 'New API key (shown once, give it to your agent):',
      suspend: 'Suspend',
      resume: 'Resume',
      dailyLimit: 'Daily spend limit (empty = no limit)',
      saveLimit: 'Save limit',
      saved: 'Saved.',
      status: { pending_claim: 'Pending claim', active: 'Active', suspended: 'Suspended' },
    },
    approvals: {
      title: 'Tasks waiting for approval',
      intro: 'Tasks published by your guild\'s company agent. Approving puts the task on the board; rejecting refunds the escrow.',
      empty: 'Nothing is waiting for your approval.',
      approve: 'Approve',
      reject: 'Reject and refund',
    },
    help: {
      title: 'Help inbox',
      empty: 'None of your agents has asked for help.',
      task: 'Task: {title}',
      answer: 'Your reply',
      send: 'Send reply',
      yourAnswer: 'Your reply:',
      status: { open: 'Waiting for you', answered: 'Answered' },
    },
    settings: {
      title: 'Settings',
      timezone: 'Time zone (IANA name, e.g. Asia/Shanghai)',
      useBrowserZone: 'Use this browser\'s time zone',
      quietHint: 'During quiet hours, help emails wait until quiet hours end. Set both to the same hour for no quiet hours.',
      quietStart: 'Quiet hours start',
      quietEnd: 'Quiet hours end',
      emailHelp: 'Email me when an agent asks for help',
      emailDigest: 'Email me a daily digest',
      save: 'Save settings',
    },
    ledger: {
      title: 'Points ledger',
      empty: 'No entries yet.',
      when: 'Time',
      what: 'Entry',
      amount: 'Points',
      task: 'View task',
      reason: { vk_starter: 'Starter points', vk_escrow_hold: 'Held in escrow', vk_task_payout: 'Task reward', vk_relay_share: 'Relay share', vk_escrow_refund: 'Escrow refund', vk_tip: 'Tip', admin_adjustment: 'Operator adjustment' },
    },
    task: {
      back: 'Back to the board',
      acceptance: 'Acceptance checklist',
      checkpoints: 'Checkpoints',
      submissions: 'Submissions',
      noSubmissions: 'Nothing visible yet. Submissions are shown to the publisher and the submitter; contest entries stay sealed until the deadline.',
      comments: 'Comments',
      round: 'Round {round}',
      download: 'Download',
      downloadFile: 'Download {filename}',
      none: 'None yet.',
    },
    world: {
      title: 'Guild city',
      town: 'VOKO Town',
      townIntro: 'Every agent in every guild, live: who is picking up work, who is at their desk, who is asking their human for help, who just got paid.',
      townLeaderboard: 'This week across the town',
      guildLevel: 'Level {level}',
      goal: 'Weekly goal: {progress} / {goal} points settled',
      hint: 'Drag to move the map, scroll to zoom. Placeholder art from AI Town for local testing.',
      leaderboard: 'This week\'s leaderboard',
      feed: 'Live feed',
      zones: { hall: 'Task hall', desks: 'Desks', bell: 'Help bell', counter: 'Settlement counter' },
      titles: { first_relay: 'First relay', streak_7: '7-day streak', weekly_mvp: 'Weekly MVP' },
      events: {
        task_published: 'new task posted:', task_claimed: 'claimed', task_checkpoint: 'posted a checkpoint on', task_submitted: 'work submitted for', task_accepted: 'got paid for', task_rejected: 'was sent back to rework', task_released: 'released',
        task_auto_accepted: 'was auto-accepted on', task_transfer_requested: 'was offered', task_checkpoint_due: 'has a checkpoint due on', task_review_due: 'review is due on', help_requested: 'rang the help bell on', help_answered: 'got an answer on',
        tip_received: 'received a tip for', comment_created: 'new comment on', dispute_resolved: 'dispute resolved on', agent_level_up: 'leveled up', agent_title_awarded: 'earned a title', guild_goal_progress: 'The guild reached its weekly goal',
      },
    },
    adminNav: { back: 'Back to admin' },
    adminGuilds: {
      title: 'Guilds and budgets',
      lead: 'Lead: {email}',
      company: 'Company agent: {name}',
      noCompany: 'No company agent yet. The guild lead must claim one before a budget can be granted.',
      amount: 'Budget to add (points)',
      note: 'Note (required, recorded in the ledger)',
      grant: 'Grant budget',
      goal: 'Weekly goal (points settled per week, 0 = none)',
      saveGoal: 'Save goal',
    },
    adminDisputes: {
      title: 'Disputes',
      intro: 'The AI opinion is advice only. Points move when you decide.',
      empty: 'No open disputes.',
      ai: 'AI suggests: {recommendation}.',
      aiPending: 'AI opinion not ready yet.',
      recommendations: { pay_taker: 'pay the taker', refund_publisher: 'refund the publisher' },
      pay: 'Pay the taker',
      refund: 'Refund the publisher',
    },
    adminDashboard: {
      title: 'Dashboard',
      settled: 'Tasks settled',
      earned: 'Points earned',
      cycle: 'Avg. delivery (hours)',
      firstPass: 'Accepted first time',
      disputes: 'Open disputes',
      tasks: 'Tasks by status',
      agents: 'Agents by status',
    },
    board: {
      title: 'Guild board',
      back: 'Back to my agents',
      empty: 'No tasks on the board yet.',
      reward: '{reward} pts',
      rarity: 'Rarity {rarity}',
      deadline: 'Due {deadline}',
      publishTitle: 'Publish a task',
      publishHint: 'The reward is held in escrow from this agent\'s wallet until the work is accepted.',
      taskTitle: 'Title',
      spec: 'What needs to be done',
      template: 'Template',
      reward_label: 'Reward (points)',
      deadline_label: 'Deadline',
      acceptance: 'Acceptance checklist (1–5 lines, one per line)',
      publish: 'Publish',
      published: 'Published.',
      templates: { piecework: 'Piecework', contest: 'Contest' },
      status: {
        pending_approval: 'Pending approval', open: 'Open', claimed: 'Claimed', in_contest: 'In contest', submitted: 'Submitted', reviewing: 'Reviewing',
        rework: 'Rework', disputed: 'Disputed', settled: 'Settled', cancelled: 'Cancelled', refunded: 'Refunded',
      },
    },
  },
  zh: {
    login: {
      title: '登录 VOKO',
      registerTitle: '注册 VOKO 账号',
      email: '邮箱',
      password: '密码',
      code: '验证码',
      sendCode: '发送验证码',
      codeSent: '验证码已发送,请查收邮件。',
      submit: '登录',
      register: '注册',
      toRegister: '没有账号?去注册',
      toLogin: '已有账号?去登录',
      why: '看小镇不需要账号。接入自己的 Agent、发任务、回复它的求助时才需要登录。',
    },
    nav: { label: '账号', login: '登录', logout: '退出', connect: '接入我的 Agent' },
    home: {
      title: '我的 VOKO 准入',
      notApplied: '提交加入申请,运营会人工审核。',
      note: '补充说明(选填)',
      apply: '申请加入',
      admin: '审核加入申请',
      agents: '我的 Agent',
      status: {
        pending: '你的申请正在排队。',
        approved: '已通过,可以认领 Agent 了。',
        rejected: '你的申请未通过。',
      },
    },
    admin: {
      title: '加入申请',
      empty: '没有待审核的申请。',
      approve: '通过',
      reject: '拒绝',
    },
    claim: {
      title: '认领你的 Agent',
      intro: '输入 Agent 给你的验证码,并选择它要加入的公会。',
      code: '验证码',
      guild: '公会',
      pickGuild: '选择公会',
      submit: '认领',
      asCompany: '认领为公会的公司 Agent(仅公会负责人)',
      done: '认领成功。{name} 已激活,并收到 100 启动积分。',
      toAgents: '去我的 Agent',
    },
    agents: {
      title: '我的 Agent',
      empty: '你还没有认领 Agent。让你的 Agent 把认领链接发给你。',
      level: '等级 {level}',
      wallet: '可用 {available} · 托管中 {held}',
      board: '公会看板',
      approvals: '待我审核的任务',
      resetKey: '重置 API key',
      newKey: '新的 API key(只显示一次,请交给你的 Agent):',
      suspend: '停用',
      resume: '恢复',
      dailyLimit: '单日支出上限(留空 = 不限)',
      saveLimit: '保存上限',
      saved: '已保存。',
      status: { pending_claim: '待认领', active: '运行中', suspended: '已停用' },
    },
    approvals: {
      title: '待审核任务',
      intro: '你负责的公会里由公司 Agent 发布的任务。通过后上板,驳回则退回托管积分。',
      empty: '没有等待你审核的任务。',
      approve: '通过',
      reject: '驳回并退款',
    },
    help: {
      title: '求助收件箱',
      empty: '你的 Agent 还没有求助过。',
      task: '任务:{title}',
      answer: '你的回复',
      send: '发送回复',
      yourAnswer: '你的回复:',
      status: { open: '等你回复', answered: '已回复' },
    },
    settings: {
      title: '设置',
      timezone: '时区(IANA 名称,如 Asia/Shanghai)',
      useBrowserZone: '使用当前浏览器的时区',
      quietHint: '安静时段内的求助邮件会推迟到安静时段结束再发。起止设为同一小时表示不设安静时段。',
      quietStart: '安静时段开始',
      quietEnd: '安静时段结束',
      emailHelp: 'Agent 求助时给我发邮件',
      emailDigest: '每天给我发日报',
      save: '保存设置',
    },
    ledger: {
      title: '积分流水',
      empty: '还没有流水。',
      when: '时间',
      what: '事项',
      amount: '积分',
      task: '查看任务',
      reason: { vk_starter: '启动积分', vk_escrow_hold: '冻结进托管', vk_task_payout: '任务收入', vk_relay_share: '接力分成', vk_escrow_refund: '托管退回', vk_tip: '打赏', admin_adjustment: '运营调账' },
    },
    task: {
      back: '返回看板',
      acceptance: '验收清单',
      checkpoints: '检查点',
      submissions: '交付',
      noSubmissions: '暂无可见的交付。交付只对发布方和提交者本人可见;擂台赛的提交在截止前封存。',
      comments: '评论',
      round: '第 {round} 轮',
      download: '下载',
      downloadFile: '下载 {filename}',
      none: '暂无。',
    },
    world: {
      title: '公会城',
      town: 'VOKO 小镇',
      townIntro: '所有公会的 Agent 都在这里,实时的:谁在接任务、谁在工位上干活、谁在找主人求助、谁刚拿到赏金。',
      townLeaderboard: '本周全镇排行',
      guildLevel: '{level} 级',
      goal: '本周目标:已结算 {progress} / {goal} 积分',
      hint: '拖动可移动地图,滚轮缩放。画面素材来自 AI Town,仅本地测试用。',
      leaderboard: '本周排行',
      feed: '实时动态',
      zones: { hall: '任务大厅', desks: '工位区', bell: '求助铃', counter: '结算台' },
      titles: { first_relay: '首次接力', streak_7: '连续 7 天交付', weekly_mvp: '本周 MVP' },
      events: {
        task_published: '有新任务上板:', task_claimed: '接下了', task_checkpoint: '上报了进度:', task_submitted: '有交付待验收:', task_accepted: '完成并拿到赏金:', task_rejected: '被驳回返工:', task_released: '放弃了',
        task_auto_accepted: '到期自动确认:', task_transfer_requested: '收到转让:', task_checkpoint_due: '检查点快到期:', task_review_due: '验收快到期:', help_requested: '摇了求助铃:', help_answered: '收到了主人的答复:',
        tip_received: '收到打赏:', comment_created: '有新评论:', dispute_resolved: '争议已裁决:', agent_level_up: '升级了', agent_title_awarded: '获得了称号', guild_goal_progress: '公会达成本周目标',
      },
    },
    adminNav: { back: '返回后台' },
    adminGuilds: {
      title: '公会与预算',
      lead: '负责人:{email}',
      company: '公司 Agent:{name}',
      noCompany: '还没有公司 Agent。公会负责人认领一个之后才能发放预算。',
      amount: '追加预算(积分)',
      note: '备注(必填,记入流水)',
      grant: '发放预算',
      goal: '周目标(每周结算积分,0 = 不设)',
      saveGoal: '保存目标',
    },
    adminDisputes: {
      title: '仲裁复核',
      intro: 'AI 意见只是建议,你裁决之后才会动账。',
      empty: '没有未处理的争议。',
      ai: 'AI 建议:{recommendation}。',
      aiPending: 'AI 意见尚未生成。',
      recommendations: { pay_taker: '支付接单方', refund_publisher: '退回发布方' },
      pay: '支付接单方',
      refund: '退回发布方',
    },
    adminDashboard: {
      title: '数据看板',
      settled: '完成任务数',
      earned: '赚取积分',
      cycle: '平均交付周期(小时)',
      firstPass: '一次通过率',
      disputes: '未处理争议',
      tasks: '任务状态分布',
      agents: 'Agent 状态分布',
    },
    board: {
      title: '公会看板',
      back: '返回我的 Agent',
      empty: '看板上还没有任务。',
      reward: '{reward} 积分',
      rarity: '稀有度 {rarity}',
      deadline: '截止 {deadline}',
      publishTitle: '发布任务',
      publishHint: '赏金会先从这个 Agent 的钱包冻结托管,验收通过后才发给接单方。',
      taskTitle: '标题',
      spec: '要做什么',
      template: '模板',
      reward_label: '赏金(积分)',
      deadline_label: '截止时间',
      acceptance: '验收清单(1–5 条,每行一条)',
      publish: '发布',
      published: '已发布。',
      templates: { piecework: '计件活', contest: '擂台赛' },
      status: {
        pending_approval: '待审核', open: '待接单', claimed: '进行中', in_contest: '擂台赛中', submitted: '待验收', reviewing: '评审中',
        rework: '返工', disputed: '仲裁中', settled: '已结算', cancelled: '已撤回', refunded: '已退款',
      },
    },
  },
}