# General Translation Changelog: gt-next 6.12.0: 字符串函数的静态派生
URL: https://generaltranslation.com/zh/blog/gt-next_v6_12_0.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: 
Authors: Ernest McCarter
Published: 2025-12-15

## 概述

在 [gt-next@6.8.0](/devlog/gt-next_v6_8_0) 中，我们引入了 `<Static>` 组件，用于解决 JSX 内容中的句子碎片化和代码复用问题。
该组件允许在翻译中直接调用静态函数，同时保留不同语言中的词语搭配、动词变位和词序变化。
但对于使用 `gt()` 和 [`msg()`](/docs/react/reference/functions/msg) 的字符串翻译，这一能力仍然缺失。
与 JSX 一样，许多应用也非常依赖通过工具函数拼接字符串，尤其是在较成熟的代码库中，可翻译内容往往分散在各种服务、工具函数和业务逻辑中。

**gt-next 6.12.0** 通过引入 `declareStatic()` (即 `<Static>` 组件对应的字符串形式) ，以及配套函数 [`declareVar()`](/docs/react/reference/functions/declare-var) 和 [`decodeVars()`](/docs/react/reference/functions/decode-vars)，补上了这一空白。

## 核心功能

### `declareStatic()`

其用法与 `<Static>` 类似，但适用于字符串函数。CLI 会分析所有可能的返回路径，并为每种结果分别创建翻译条目。

```tsx
const getDisplayName = (name) => {
  return name ? declareVar(name) : 'Someone';
};

gt(`${declareStatic(getDisplayName(name))} says hello.`);
```


### `declareVar()`

[`<Var>`](/docs/react/reference/components/var) 的字符串形式——用于在 `declareStatic()` 函数中标记动态内容；这些内容会被排除在哈希计算之外，并在运行时按变量处理。
其实现方式是将动态内容包装在与 ICU 兼容的 select 语句中，使其在插值时解析为原始动态内容。

```tsx
const greeting = "Hello, " + declareVar(name);
// "你好，{_gt_, select, other {name}}"
```

### `decodeVars()`

由于 [`declareVar()`](/docs/react/reference/functions/declare-var) 会在源文本中添加与 ICU 兼容的标记，因此仅使用 [`declareVar()`](/docs/react/reference/functions/declare-var) 可能会与现有的字符串处理逻辑产生冲突。
要提取原始值，只需用 [`decodeVars()`](/docs/react/reference/functions/decode-vars) 包裹源字符串即可。

```tsx
const greeting = "Hello, " + declareVar("Brian");
// "Hello, {_gt_, select, other {Brian}}"
const decodedGreeting = decodeVars(greeting);
// "Hello, Brian"
```

## 其他优化

### 增强的字符串函数

`gt()` 和 [`msg()`](/docs/react/reference/functions/msg) 现在都支持字符串拼接，但**仅限静态字符串**：

```tsx
gt("Hello " + "world");
msg("Welcome, " + "Brian");
```

### 扩展后的 `<Static>` 支持

到目前为止，`<Static>` 组件的子元素只支持函数调用。
现在，它还支持可在构建时解析的任意 JSX 表达式，例如嵌套的 JSX 文本、三元运算符、条件语句以及函数调用。

```tsx
function getDisplayName(name) {
  return name ? <Var>{name}</Var> : 'Someone';
};
...
<T>
  <Static>
    Hello {getDisplayName("Brian")}!
    {
      isFriend ? " How are you?" : " What's up?"
    }
  </Static>
</T>
```


## 性能注意事项

与 `<Static>` 类似，`declareStatic()` 会使翻译条目数成倍增加。
每次函数调用只要存在多个可能结果，就会生成单独的翻译；而同一字符串中多次调用 `declareStatic()`，会让总条目数呈指数级增长。
请谨慎使用此功能；当倍增效应过高时，优先使用 ICU `select` 语句。

## Sitemap

See the full [sitemap](https://generaltranslation.com/sitemap.md) for all pages.
