变量组件

如何在翻译中使用变量组件处理动态内容

变量组件可让你在<T>组件中安全插入动态内容。它们在本地完成格式化和本地化处理,不会将数据发送到翻译 API,非常适合用于用户名、账户号码和财务数据等敏感信息。

可用组件

  • <Var>: 未经格式化的原始动态内容
  • <Num>: 按本地化规则格式化的数字
  • <Currency>: 含符号与格式的货币值
  • <DateTime>: 遵循本地化约定的日期与时间

快速开始

变量组件可在<T>中使用,用于处理动态内容:

import { T, Var, Num, Currency, DateTime } from 'gt-next';

function UserProfile({ user }) {
  return (
    <T>
      <p>欢迎回来,<Var>{user.name}</Var>!</p>
      <p>您有 <Num>{user.itemCount}</Num> 个项目。</p>
      <p>余额:<Currency currency="USD">{user.balance}</Currency></p>
      <p>上次登录:<DateTime>{user.lastLogin}</DateTime></p>
    </T>
  );
}

变量组件的工作原理

变量组件通过以下方式解决动态内容问题:

  1. 动态值进行封装,以便在<T>中使用
  2. 利用浏览器内置的 i18n API 在本地完成格式化
  3. 确保数据私密——内容绝不会发送到翻译 API
  4. 根据用户当前的 locale 提供本地化
// ❌ 这样会出错 - <T> 中包含动态内容
<T><p>Hello {username}</p></T>

// ✅ 这样可以正常工作 - 动态内容已用 <Var> 包装
<T><p>Hello <Var>{username}</Var></p></T>

组件指南

<Var> - 原始动态内容

<Var> 用于无需特殊格式的任意动态内容:

// 用户信息
<T>
  <p>你好,<Var>{user.name}</Var>!</p>
  <p>您的账户 ID 为 <Var>{user.accountId}</Var></p>
</T>

// 条件渲染
<T>
  Dashboard:<Var>{isAdmin ? <AdminPanel /> : <UserPanel />}</Var>
</T>

<Num> - 格式化数字

对于需要遵循 locale 格式规则的数字,请使用 <Num>

// 基本数字格式化
<T>
  您的购物车中有 <Num>{itemCount}</Num> 件商品。
</T>

// 独立使用(等同于 number.toLocaleString())
<Badge><Num>{totalItems}</Num></Badge>

// 自定义格式化选项
<T>
  距离:<Num options={{ maximumFractionDigits: 2 }}>{distance}</Num> 公里
</T>

<Currency> - 金额显示

使用 <Currency> 来展示货币金额:

// 基本货币格式(默认为 "USD")
<T>
  您的总额为 <Currency>{total}</Currency>。
</T>

// 不同的货币
<T>
  价格:<Currency currency="EUR">{price}</Currency>
</T>

// 自定义格式
<Currency 
  currency="USD" 
  options={{ minimumFractionDigits: 0 }}
>
  {roundedAmount}
</Currency>

<DateTime> - 日期和时间

使用 <DateTime> 处理日期和时间:

// 基本日期格式化
<T>
  订单下单时间:<DateTime>{orderDate}</DateTime>
</T>

// 时间格式化
<T>
  最后更新:<DateTime options={{ timeStyle: 'short' }}>{timestamp}</DateTime>
</T>

// 自定义日期格式
<DateTime options={{ 
  year: 'numeric', 
  month: 'long', 
  day: 'numeric' 
}}>
  {eventDate}
</DateTime>

隐私与安全

数据仅在本地处理

Variable 组件在本地利用浏览器的 Intl APIs 完成所有格式化。不会将任何动态内容发送到翻译 API,非常适合:

  • 用户名和个人信息
  • 账户号和 ID
  • 财务数据和余额
  • 私密时间戳与日期
// 安全 - 敏感数据保留在本地
<T>
  账户余额: <Currency currency="USD">{balance}</Currency>
  上次登录: <DateTime>{lastLoginTime}</DateTime>
</T>

重要例外

在变量组件中嵌套使用 <T> 组件时请注意:

// ⚠️ 内部的 <T> 内容将被发送以进行翻译
<T>
  <Var>
    <T>Hello, world!</T>  {/* 此部分会被翻译 */}
    {privateData}         {/* 此部分保持本地 */}
  </Var>
</T>

独立使用

Variable 组件可在 <T> 之外独立用于纯格式化:

// 这些组件的工作方式类似于各自的 .toLocale*() 方法
<span><Num>{count}</Num></span>                    // count.toLocaleString()
<span><Currency currency="USD">{price}</Currency></span>  // 价格格式化
<span><DateTime>{date}</DateTime></span>           // date.toLocaleDateString()

常见问题

忽略本地化选项

对于 <Currency>,请务必传入 currency 属性以指定货币类型。这样在显示 value 时就能使用正确的货币符号和格式:

// ❌ 默认为 USD - 可能不符合用户预期
<T>
  商品价格为 <Currency>{price}</Currency>
</T>

// ✅ 明确指定货币
<T>
  商品价格为 <Currency currency="EUR">{price}</Currency>
</T>

其他组件也提供可选的 props,方便你自定义格式:

// 基本格式化
<T>
  库存 <Num>{count}</Num> 件
</T>

// 自定义格式化
<T>
  完成率 <Num options={{ style: 'percent' }}>{percentage}</Num>
</T>

// 日期格式化
<T>
  最后更新: <DateTime options={{ dateStyle: 'short' }}>{lastUpdate}</DateTime>
</T>

后续步骤

本指南如何?