分支组件

如何在翻译中使用分支组件实现条件内容

分支组件可在 <T> 组件内实现条件内容渲染。它们能够处理 if/else 语句与复数规则等动态逻辑,同时确保所有内容变体都能被正确翻译。

可用组件

  • <Branch>: 基于取值或状态渲染条件内容
  • <Plural>: 按照各个 locale 的规则自动处理复数

快速开始

分支组件可在<T>内使用,用于处理条件逻辑:

import { T, Branch, Plural, Num, Var } from 'gt-react';

function NotificationPanel({ user, messageCount }) {
  return (
    <T>
      <Branch 
        branch={user.status}
        online={<p><Var>{user.name}</Var> 当前在线</p>}
        away={<p><Var>{user.name}</Var> 暂时离开</p>}
      >
        <p><Var>{user.name}</Var> 状态未知</p>
      </Branch>
      
      <Plural
        n={messageCount}
        one={<p>你有 <Num>{messageCount}</Num> 条消息</p>}
        other={<p>你有 <Num>{messageCount}</Num> 条消息</p>}
      />
    </T>
  );
}

分支组件的工作原理

分支组件通过以下方式处理翻译中的条件渲染:

  1. 替代三元运算符 和在 <T> 内的条件逻辑
  2. 在条件与预期不符时提供 fallback 内容
  3. 支持对所有可能的内容变体进行翻译
  4. 自动依据 locale 规则 处理 pluralization
// ❌ 这种写法会出错——在 <T> 中使用条件逻辑
<T><p>{isActive ? '用户为活跃状态' : '用户为非活跃状态'}</p></T>

// ✅ 这种写法可行——使用分支实现条件逻辑
<T>
  <Branch 
    branch={isActive} 
    true={<p>用户为活跃状态</p>}
    false={<p>用户为非活跃状态</p>}
  />
</T>

组件指南

<Branch> - 条件内容

使用 <Branch> 来根据值或状态进行条件渲染:

// 用户状态显示
<T>
  <Branch 
    branch={user.role}
    admin={<p>管理员仪表板</p>}
    user={<p>用户仪表板</p>}
    guest={<p>访客访问</p>}
  >
    <p>访问级别未知</p>
  </Branch>
</T>

// 布尔条件
<T>
  <Branch 
    branch={isLoggedIn}
    true={<p>欢迎回来!</p>}
    false={<p>请登录</p>}
  />
</T>

// 订阅层级
<T>
  <Branch
    branch={subscription.tier}
    free={<p>升级以解锁高级功能</p>}
    premium={<p>尽享高级体验</p>}
    enterprise={<p>联系支持以获取企业级解决方案</p>}
  >
    <p>订阅状态不可用</p>
  </Branch>
</T>

<Plural> - 智能复数处理

对于会随数量变化的内容,请使用<Plural>

// 基本复数处理
<T>
  <Plural
    n={itemCount}
    one={<p>购物车中有 <Num>{itemCount}</Num> 件商品</p>}
    other={<p>购物车中有 <Num>{itemCount}</Num> 件商品</p>}
  />
</T>

// 零值处理
<T>
  <Plural
    n={notifications}
    zero={<p>暂无新通知</p>}
    one={<p><Num>{notifications}</Num> 条通知</p>}
    other={<p><Num>{notifications}</Num> 条通知</p>}
  />
</T>

// 复杂复数处理(遵循 Unicode CLDR 规则)
<T>
  <Plural
    n={days}
    zero={<p>今天到期</p>}
    one={<p><Num>{days}</Num> 天后到期</p>}
    few={<p><Num>{days}</Num> 天后到期</p>}
    many={<p><Num>{days}</Num> 天后到期</p>}
    other={<p><Num>{days}</Num> 天后到期</p>}
  />
</T>

与变量组件结合使用

分支与变量组件可无缝协作:

<T>
  <Branch
    branch={order.status}
    pending={
      <p>
        订单 <Var>{order.id}</Var> 处理中。
        总计:<Currency currency="USD">{order.total}</Currency>
      </p>
    }
    shipped={
      <p>
        订单 <Var>{order.id}</Var> 已于 <DateTime>{order.shippedDate}</DateTime> 发货
      </p>
    }
    delivered={
      <p>订单 <Var>{order.id}</Var> 已成功送达</p>
    }
  >
    <p>订单状态未知</p>
  </Branch>
</T>

何时使用分支型组件

替换三元运算符

将条件逻辑改写为可在 <T> 中使用的形式:

// ❌ 不能在 <T> 中使用三元运算符
<T>{isActive ? <p>活跃用户</p> : <p>非活跃用户</p>}</T>

// ✅ 请改用 Branch
<T>
  <Branch 
    branch={isActive}
    true={<p>活跃用户</p>}
    false={<p>非活跃用户</p>}
  />
</T>

处理多个条件

用它替代 switch 语句或多重 if/else 分支:

// ❌ 复杂的条件逻辑
<T>
  {status === 'loading' ? <p>加载中...</p> : 
   status === 'error' ? <p>发生错误</p> : 
   status === 'success' ? <p>成功!</p> : 
   <p>未知状态</p>}
</T>

// ✅ 清晰的分支逻辑
<T>
  <Branch
    branch={status}
    loading={<p>加载中...</p>}
    error={<p>发生错误</p>}
    success={<p>成功!</p>}
  >
    <p>未知状态</p>
  </Branch>
</T>

复数处理规则

用以下方式替代手动处理复数:

// ❌ 手动复数形式处理
<T>{count === 1 ? <p>1 item</p> : <p>{count} items</p>}</T>

// ✅ 自动复数形式处理
<T>
  <Plural
    n={count}
    one={<p><Num>{count}</Num> item</p>}
    other={<p><Num>{count}</Num> items</p>}
  />
</T>

独立使用

分支组件可在 <T> 之外独立使用,用于仅处理逻辑、不涉及翻译的场景:

// 纯粹的条件渲染
<Branch
  branch={theme}
  dark={<DarkModeIcon />}
  light={<LightModeIcon />}
>
  <DefaultIcon />
</Branch>

// 纯粹的复数化处理
<Plural
  n={count}
  one={<SingleItemComponent />}
  other={<MultipleItemsComponent />}
/>

常见问题

缺失的分支键

务必为未匹配的值提供回退内容:

// ❌ 未预期的值没有回退
<Branch
  branch={userRole}
  admin={<AdminPanel />}
  user={<UserPanel />}
  // 如果 userRole 是 "moderator" 怎么办?
/>

// ✅ 始终提供回退
<Branch
  branch={userRole}
  admin={<AdminPanel />}
  user={<UserPanel />}
>
  <DefaultPanel /> {/* 其他任意值的回退处理 */}
</Branch>

复数形式不完整

请为默认 locale 提供所需的复数形式:

// ❌ 缺少 "other" 形式
<Plural
  n={count}
  one={<p>1 item</p>}
  // 那 0、2、3 等情况呢?
/>

// ✅ 包含必需的形式
<Plural
  n={count}
  zero={<p>无项目</p>}
  one={<p>1 个项目</p>}
  other={<p>{count} 个项目</p>}
/>

复杂嵌套逻辑

虽然这种做法可行,但我们建议尽量简化分支逻辑,避免深度嵌套:

// ❌ 复杂的嵌套分支
<Branch branch={status}>
  <Branch branch={subStatus}>
    {/* 不易阅读和维护 */}
  </Branch>
</Branch>

// ✅ 将逻辑扁平化或拆分为多个组件
<Branch
  branch={`${status}-${subStatus}`}
  active-online={<ActiveOnline />}
  active-offline={<ActiveOffline />}
  inactive-online={<InactiveOnline />}
>
  <DefaultState />
</Branch>

Unicode CLDR 文档中进一步了解复数规则。

下一步

本指南如何?