# 翻译 (/zh/docs/go/i18n)

标识与译名的双向查找。



星盘上每个字段都同时给出译名与 `*Key` 标识，通常不必手工翻译。
这两个函数用于手上只有标识（或只有某种语言的译名）、需要换算的场合。

支持六种语言：`zh-CN`、`zh-TW`、`en-US`、`ja-JP`、`ko-KR`、`vi-VN`。

***

## Translate [#translate]

**用途**　把任意标识译成指定语言。

**签名**

```go
func Translate(key string, language Language) (string, error)
```

**参数**

| 参数         | 类型         | 必填 | 默认 | 说明     |
| ---------- | ---------- | -- | -- | ------ |
| `key`      | `string`   | 是  | —  | 语言无关标识 |
| `language` | `Language` | 是  | —  | 目标语言   |

覆盖十二类共 260 个标识：

| 类目          | 数量  | 例                                                         |
| ----------- | --- | --------------------------------------------------------- |
| 星耀          | 162 | `ziweiMaj`、`changsheng`、`yunlu`                           |
| 宫位（含身宫、来因宫） | 14  | `soulPalace`、`wealthPalace`、`bodyPalace`、`originalPalace` |
| 天干          | 10  | `jiaHeavenly`                                             |
| 地支          | 12  | `ziEarthly`                                               |
| 亮度          | 7   | `miao`、`wang`                                             |
| 四化          | 4   | `sihuaLu`                                                 |
| 五行局         | 5   | `water2nd`                                                |
| 性别          | 2   | `male`、`female`                                           |
| 生肖          | 12  | `rat`、`ox`                                                |
| 时辰          | 13  | `earlyRatHour`                                            |
| 星座          | 12  | `aries`                                                   |
| 运限层级        | 7   | `decadal`、`turn`                                          |

**返回值**　译名；未知标识返回空串（不是错误）。

**示例**

```go
a, _ := iztro.Translate(iztro.StarZiweiMaj, iztro.LanguageEnUS)
b, _ := iztro.Translate(iztro.PalaceSoul, iztro.LanguageJaJP)
c, _ := iztro.Translate("nosuch", iztro.LanguageZhCN)

fmt.Printf("%q %q %q\n", a, b, c)
```

**输出**

```text
"emperor" "命宮" ""
```

**边界与陷阱**

<Callout type="warn" title="未知标识返回空串而非错误">
  标识查不到不算异常，返回空串。要区分「译名恰好是空串」与「标识不存在」时，
  先确认标识在上表的类目内。
</Callout>

***

## KeyOf [#keyof]

**用途**　由任意语言的译名反查标识。

**签名**

```go
func KeyOf(text string) (string, error)
func KeyOfIn(text, keyFilter string) (string, error)
```

**参数**

| 参数          | 类型       | 必填 | 默认 | 说明                  |
| ----------- | -------- | -- | -- | ------------------- |
| `text`      | `string` | 是  | —  | 任一支持语言下的译名          |
| `keyFilter` | `string` | 是  | —  | 限定标识名须含的子串，用于消歧同形译名 |

**返回值**　标识；查不到返回空串。

**示例**

```go
a, _ := iztro.KeyOf("紫微")
b, _ := iztro.KeyOf("emperor")
c, _ := iztro.KeyOf("자미")
d, _ := iztro.KeyOf("查无此名")

fmt.Printf("%q %q %q %q\n", a, b, c, d)
```

**输出**

```text
"ziweiMaj" "ziweiMaj" "ziweiMaj" ""
```

三种语言的译名都落到同一个标识。

**边界与陷阱**

<Accordions>
  <Accordion title="同形译名与 KeyOfIn">
    少数译名在多个类目下同形：en-US 的 `horse` 既是生肖马也是天马，
    `dragon` 既是生肖龙也是青龙，ko-KR 的 `사` 既是地支巳也是长生12神的死。

    `KeyOf` 逐语言、每种语言内逐标识取先命中者，顺序与 iztro 的 `kot` 完全一致
    （有金标测试逐例守着）。要指定类目就用 `KeyOfIn`——标识名含该子串才纳入比对：

    ```go
    a, _ := iztro.KeyOf("horse")               // "horse"（生肖马）
    b, _ := iztro.KeyOfIn("horse", "Min")      // "tianmaMin"（天马）
    c, _ := iztro.KeyOf("유시")                 // "hourly"（流时）
    d, _ := iztro.KeyOfIn("유시", "Hour")       // "roosterHour"（酉时）
    e, _ := iztro.KeyOfIn("horse", "Palace")   // ""
    ```

    常用子串：`Maj` 十四主星、`Min` 辅星、`Heavenly` / `Earthly` 干支、
    `Palace` 宫位、`Hour` 时辰。限定后无匹配返回空串，不退回未限定的结果。
  </Accordion>

  <Accordion title="全表扫描">
    `KeyOf` 会遍历 260 个标识 × 6 种语言，且经一次 wasm 往返。
    不要放在每宫每星的内层循环里——那种场合直接用数据自带的 `*Key` 字段。
  </Accordion>
</Accordions>

***

## AllKeys [#allkeys]

**用途**　取全部 260 个可翻译标识。

**签名**

```go
func AllKeys() ([]string, error)
```

**返回值**　标识切片，顺序即 `KeyOf` 的反查次序：
运限层级、生肖、时辰、星座、五行局、天干、地支、亮度、四化、星耀、宫位、性别，
与 iztro 各语言翻译文件的合并次序一致。

**示例**

```go
keys, _ := iztro.AllKeys()
first, _ := iztro.Translate(keys[0], iztro.LanguageZhCN)

fmt.Println(len(keys), keys[:4], first)
```

**输出**

```text
260 [decadal childhood yearly monthly] 大限
```

要遍历某一类目自己的标识时，用 `keys.go` 的常量或 `GetConstants()` 更省事。

***

## 没有全局语言开关 [#没有全局语言开关]

x-iztro 不设「当前语言」这样的全局状态：排盘时语言随参数传入，
翻译函数每次调用都显式指定目标语言。

<Callout type="info" title="为什么">
  全局语言开关会让同一段代码在不同调用顺序下产出不同结果，
  并发环境尤其危险。显式传参使每次调用的结果只由入参决定。
</Callout>

要在一个进程里同时输出多种语言，直接排多张盘即可，互不干扰：

```go
zh, _ := iztro.BySolar("2000-8-16", 2, iztro.GenderFemale, true, iztro.LanguageZhCN, nil)
en, _ := iztro.BySolar("2000-8-16", 2, iztro.GenderFemale, true, iztro.LanguageEnUS, nil)

fmt.Println(zh.Palace(iztro.PalaceSoul).MajorStars[0].Name,
    en.Palace(iztro.PalaceSoul).MajorStars[0].Name)
```

**输出**

```text
紫微 emperor
```

两张盘的 `*Key` 字段完全相同，因此任何基于标识的判断在两张盘上结果一致。
