分支组件

如何在翻译中使用分支组件处理条件内容

分支组件可在 <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. 提供备用内容,用于条件不符合预期值时
  3. 支持翻译所有可能的内容变体
  4. 自动根据 locale 规则执行复数化处理
// ❌ 这样会出错 - 在 <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>

与 Variable 组件配合使用

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

<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 个项目</p> : <p>{count} 个项目</p>}</T>

// ✅ 自动复数处理
<T>
  <Plural
    n={count}
    one={<p><Num>{count}</Num> 个项目</p>}
    other={<p><Num>{count}</Num> 个项目</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 个项目</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 文档中了解更多复数规则。

下一步

这份指南怎么样?

分支组件