# 本地化字符串表模板

一张译者可以直接上手的字符串表：每个键一行，带上下文、长度限制、英文源文本和四种译文，另外每种语言都有术语表和风格指南。以 .zip 下载：表格是一个 CSV 文件（UTF-8，逗号分隔），其余是 Markdown，整套文件都能导入 Nodary，CSV 会变成一张可用作翻译表的表格。

免费，无需账户，无需邮箱。随意使用、修改和分享。

[下载模板 (.zip)](https://nodary.ai/downloads/bendihua-zifuchuanbiao-muban.zip)

## 下载前先读每个文件

概览说明各列的含义、键的命名方式、占位符和翻译状态。表格中有 13 条来自 Saltmarrow 的示例字符串，这是本网站处处使用的示例游戏；其中两个单元格是故意写错的，用来展示检查能发现什么。

- 本地化字符串表: 这张表如何运作：各列、键的命名、占位符、翻译状态，以及旁边的文件。
- 字符串: 表格本身：每条字符串一行，带上下文和长度限制、英文源文本和四种译文。
- 术语表: 处处只有一种译法的词，以及永不翻译的名称。
- 风格指南: 游戏在每种语言里怎样说话：它的语气、如何称呼玩家、排版、长度和复数。

### 本地化字符串表

_使用方法：斜体行是写作提示。用你自己的话替换它们，然后删除。方括号里的值由你填写。表格本身是这一页旁边的 CSV 文件。_

#### 文件

- [字符串](https://nodary.ai/zh/templates/localization-string-table#doc-strings)：表格本身，每条字符串一行，每种语言一列
- [术语表](https://nodary.ai/zh/templates/localization-string-table#doc-glossary)：处处译法一致的词，以及永不翻译的名称
- [风格指南](https://nodary.ai/zh/templates/localization-string-table#doc-style)：游戏在每种语言里怎样说话

#### 列

| 列 | 内容 |
| --- | --- |
| key | 字符串的唯一名称，永远不会显示给玩家 |
| context | 文本出现在哪里、由谁说出：译者无法猜到的信息 |
| max_length | 文本在屏幕上最多可占的字符数 |
| en | 源文本 |
| fr, de, es, pl | 每种语言一列，以语言代码命名 |

#### 键的命名

_按文本所在的位置命名键，从大到小，这样相关的字符串会排在一起。_

- 格式：[界面].[元素].[细节]，比如 menu.play 或 hud.tide.warning
- 全部小写，各部分之间用点分隔，不含空格
- 不要把一个键挪用给另一段文本：新增一个

#### 占位符和标记

_由游戏填入的值写在花括号里，比如 {count}；每条译文都保留源文本中的每个占位符。标记标签，比如 item.crystal.desc 中的粗体标签，要留在它所标记的词周围。_

#### 翻译状态

```mermaid
flowchart LR
  n0["缺失"]
  n1["草稿"]
  n2["已审校"]
  n3["定稿"]
  n4["已过期"]
  n0 --> n1
  n1 --> n2
  n2 --> n3
  n3 --> n4
  n4 --> n1
```
_译文的状态：源文本改动后，译文会变为已过期，需要重新检查_

_示例（Saltmarrow，一款示例游戏）： 示例中有两个单元格是故意写错的。menu.settings 的德语 Einstellungen 有 13 个字符，而按钮只能容纳 10 个，所以长度检查会标出它；档案员的问候语还没有波兰语译文，所以算作缺失。_

_这个模板可以自由使用、修改和分享。它来自_ [Nodary](https://nodary.ai/zh)_，在那里这些文件会以互相链接的文档地图形式导入，CSV 则导入为表格。_

### 字符串

| key | context | max_length | en | fr | de | es | pl |
| --- | --- | --- | --- | --- | --- | --- | --- |
| menu.play | 主菜单按钮 | 12 | Play | Jouer | Spielen | Jugar | Graj |
| menu.settings | 主菜单按钮；按钮可容纳 10 个字符 | 10 | Settings | Paramètres | Einstellungen | Ajustes | Ustawienia |
| menu.quit | 主菜单按钮 | 12 | Quit | Quitter | Beenden | Salir | Wyjdź |
| hud.tide.warning | 潮水转向前两分钟显示在 HUD 上；{minutes} 是数字 | 40 | The tide turns in {minutes} min | La marée tourne dans {minutes} min | Gezeitenwechsel in {minutes} Min. | La marea cambia en {minutes} min | Zmiana pływu za {minutes} min |
| hud.salt.count | HUD 计数器；{count} 是数字 | 20 | Salt: {count} | Sel : {count} | Salz: {count} | Sal: {count} | Sól: {count} |
| dialogue.archivist.greet | 溺亡的档案员，初次见面。冷静而正式：用敬称称呼玩家 | 120 | You came down with the tide. Most who do, stay. | Vous êtes descendu avec la marée. La plupart de ceux qui le font restent. | Sie sind mit der Flut herabgestiegen. Die meisten, die das tun, bleiben. | Ha bajado con la marea. La mayoría de quienes lo hacen se quedan. |  |
| item.crystal.name | 物品名称，用于背包和商店 | 24 | Memory crystal | Cristal de mémoire | Erinnerungskristall | Cristal de memoria | Kryształ pamięci |
| item.crystal.desc | 物品描述；<b> 标出需要突出的词 | 140 | Holds one <b>memory</b> of the drowned city. Sells well in the village. | Contient un <b>souvenir</b> de la cité engloutie. Se vend bien au village. | Enthält eine <b>Erinnerung</b> an die versunkene Stadt. Verkauft sich gut im Dorf. | Guarda un <b>recuerdo</b> de la ciudad sumergida. Se vende bien en el pueblo. | Zawiera jedno <b>wspomnienie</b> zatopionego miasta. Dobrze się sprzedaje w wiosce. |
| quest.horn.title | 日志中的任务标题 | 32 | Before the horn | Avant la corne | Vor dem Horn | Antes del cuerno | Zanim zabrzmi róg |
| quest.horn.goal | 日志中的任务目标；{count} 是数字 | 60 | Crystals to bring up before the horn: {count} | Cristaux à remonter avant la corne : {count} | Kristalle, die vor dem Horn nach oben müssen: {count} | Cristales que subir antes del cuerno: {count} | Kryształy do wyniesienia, zanim zabrzmi róg: {count} |
| ui.save.done | 存档后的提示，显示两秒 | 40 | Game saved | Partie sauvegardée | Spiel gespeichert | Partida guardada | Gra zapisana |
| ui.tide.low | 潮汐指示器的标签 | 16 | Low tide | Marée basse | Ebbe | Marea baja | Odpływ |
| ui.tide.high | 潮汐指示器的标签 | 16 | High tide | Marée haute | Flut | Marea alta | Przypływ |

### 术语表

**负责人：** [姓名] · **状态：** 草稿 · **上次审阅：** [日期]

_译者第一次问到某个术语时就把它加进来。同一个词有两种译法，会让玩家困惑，客服问题也会翻倍。_

#### 术语

| 术语 (en) | fr | de | es | pl | 备注 |
| --- | --- | --- | --- | --- | --- |
| tide | marée | Gezeiten | marea | pływ | 驱动所有系统的水位 |
| salt | sel | Salz | sal | sól | 常用资源 |
| memory crystal | cristal de mémoire | Erinnerungskristall | cristal de memoria | kryształ pamięci | 始终用全称，在商店里绝不只写“水晶” |
| horn | corne | Horn | cuerno | róg | 潮水转向前两分钟响起的信号 |
| [术语] | [...] | [...] | [...] | [...] | [...] |

#### 永不翻译

- Saltmarrow，游戏名称
- [保持原样的角色名和地名]
- [平台和品牌名称]

相关文档： [本地化字符串表](https://nodary.ai/zh/templates/localization-string-table#doc-overview) · [字符串](https://nodary.ai/zh/templates/localization-string-table#doc-strings) · [风格指南](https://nodary.ai/zh/templates/localization-string-table#doc-style)

### 风格指南

**负责人：** [姓名] · **状态：** 草稿 · **上次审阅：** [日期]

#### 语气

_用三个词描述游戏的语气，再写下它绝不会是什么样子。_

- 语气：[...]
- 绝不：[...]

_示例（Saltmarrow，一款示例游戏）： 沉静，略带古意，像一位档案馆的看守。句子简短。不用现代网络用语。_

#### 逐个语言

| 语言 | 如何称呼玩家 | 排版 | 备注 |
| --- | --- | --- | --- |
| 法语 (fr) | [tu 或 vous] | 在 : ; ! ? 之前和 « » 内侧加不换行空格 | [...] |
| 德语 (de) | [du 或 Sie] | „引号“，名词首字母大写 | 常比英文长：先检查 max_length |
| 西班牙语 (es) | [tú 或 usted] | 句首倒置的 ¿ 和 ¡ | [...] |
| 波兰语 (pl) | [ty，或 Pan 和 Pani] | „引号”，三种复数形式 | 玩家名字周围的词会随性别变化 |
| [语言] | [...] | [...] | [...] |

#### 长度

_留出余地：从英文译出的文本常常更长，有些语言长出三分之一。按屏幕空间设定 max_length，而不是按英文长度。_

#### 复数和数字

_各语言的计数方式不同：波兰语有三种复数形式，英语有两种。把数字放在标签后面（盐：{count}），或者使用引擎的复数系统，并按每种语言的习惯格式化数字和日期。_

相关文档： [本地化字符串表](https://nodary.ai/zh/templates/localization-string-table#doc-overview) · [术语表](https://nodary.ai/zh/templates/localization-string-table#doc-glossary) · [字符串](https://nodary.ai/zh/templates/localization-string-table#doc-strings)

## 如何使用

### 替换示例字符串

保留各列和键的命名方式，填入你自己的字符串。每条字符串交给译者之前，都要写好上下文和长度限制。

### 尽早写术语表

译者第一次问到某个术语时就把它加进来，并写上每种语言的译法。同一个词有两种译法，会让玩家困惑，客服问题也会翻倍。

### 按语言约定风格

开始翻译前，先决定每种语言如何称呼玩家、遵循哪些排版规则。之后再改，就意味着要重读每一条字符串。

### 发出前先冻结源文本

英文定稿后再把字符串送去翻译。源文本之后若有改动，它的译文都要重新检查。

## 导入 Nodary，用作翻译表

Nodary 是一个为 AI 而生的工作区，团队的文档在这里互相链接，而不是越堆越多。导入 .zip 后，CSV 会作为一张表格出现在概览下面，术语表和风格指南就在旁边。在表格上，“翻译表”会从表头读取各列的角色（key、context、max_length，以及每种语言一列），然后检查每条译文的长度和占位符，为每条译文标记状态，在源文本改动时把译文标为过期，并导出 Unity、Unreal 和 Godot 可用的文件：CSV、JSON、gettext .po 和 XLIFF。

1. 打开一个项目的地图，点击“导入”。
2. 选择“文件夹或 ZIP”标签页，再点击“选择 ZIP 文件”，选中文件后导入。
3. 打开“字符串”，选择“翻译表”，检查从表头读出的角色，然后点击“用作翻译表”。

免费版每个工作区可容纳十个文档，项目自己的页面也算在内：模板的四个文件绰绰有余。源文本列是英文：如果你的游戏用其他语言写成，在 Nodary 显示角色时把那一列设为源文本即可。

## 维护一张译者能用的字符串表

当译者不得不猜一行字是什么意思、有多少空间，或者文本翻译之后又被改动却没人发现时，字符串表就失效了。下面这些习惯能避免这三种情况。

### 给每条字符串写上下文

谁说的、出现在哪里、回应的是什么。“Open”在门上是动词，在商店招牌上是形容词：只有上下文能分清。

### 按屏幕定长度

量一量按钮、一行文字或对话气泡能容纳多少字符，写下这个限制，而不是英文的长度。

### 不要用碎片拼句子

在代码里把“你找到了”和“3 个水晶”拼起来，会破坏大多数语言的语序和语法。每个句子都给一个独立的键，并使用占位符。

### 保持占位符完整

每条译文都要保留源文本中的每个 {占位符} 和每个标签。丢了一个 {count}，玩家就会看到空白，甚至让游戏崩溃。

### 一个键，一个含义

不要把一个键挪用给另一段文本。新增一个键；等没有地方再用旧键时再删掉它。

### 发出前先冻结源文本

只翻译定稿的文本。源文本仍然改动时，把它的译文标为过期，以便重新检查。

## 关于本地化字符串表的问题

### 什么是本地化字符串表？

字符串表保存游戏显示的所有文字，每条字符串一行：代码使用的键、源文本、给译者的备注、长度限制，以及每种语言一列。游戏按键加载玩家所用语言的文本，因此文字可以修改和翻译，而不用改动代码。

### 字符串表应该有哪些列？

至少要有键和源文本，再加每种语言一列。上下文列和最大长度列能省掉译者原本要问的大部分问题。这个模板五类列都有，以英语为源语言，另有法语、德语、西班牙语和波兰语。

### 字符串的键该怎么命名？

按文本所在的位置，从大到小命名，比如 menu.play 或 hud.tide.warning：全部小写，各部分之间用点分隔。这样相关的字符串会排在一起，看到键就知道去游戏里哪里找。

### 复数怎么处理？

各语言的计数方式不同：英语有两种复数形式，波兰语有三种，中文则没有词形变化。可以把数字放在标签后面，比如“盐：{count}”，或者使用引擎的复数系统，每种形式一段文本。

### 如何在 Excel 中打开这个 CSV？

Google 表格、LibreOffice Calc、Numbers 和 Nodary 可以直接打开。只有当电脑的列表分隔符是逗号时（中文系统设置通常如此），Excel 才能双击直接打开；如果分隔符是分号，比如法语或德语设置，每一行都会挤在一列里。这时请改用导入：在“数据”选项卡中选择从文本/CSV 导入，选中文件，把文件原始格式设为 UTF-8、分隔符设为逗号，然后加载。

### Unity、Unreal 或 Godot 能读取这个 CSV 吗？

模板的 CSV 是为电子表格和 Nodary 的导入而做的。每个引擎读取各自的格式：从同一张表，Nodary 的翻译表可以导出 Godot 和 Unity 用的 CSV、Unreal 和 Godot 用的 gettext .po、大多数引擎可用的 JSON，以及翻译工具用的 XLIFF。

### 可以添加语言吗？

可以。新增一列，用语言代码命名，比如 zh-Hans 或 pt-BR。Nodary 能识别表头中的语言代码和语言名称，它的翻译表也可以为某种语言新增一列。

本页地址: https://nodary.ai/zh/templates/localization-string-table
