l10n

AliceInCradle 的 localization 语法(0.27h)

On n’habite pas un pays, on habite une langue. Une patrie, c’est cela et rien d’autre.

Localization,意为「本土化」。它是面向多国语言用户的软件开发过程中包括但不限于文本翻译的一项重要工作,往往还涉及到数字、日期、时间的格式调整,以及民间计量单位的换算等。不建议叫「本地化」,因为「本地/离线/脱机」一词往往与「远程/在线/联机」相对。

游戏 AliceInCradle 的 StreamingAssets 文件夹中有一个 localization 子文件夹,里面放置的正是其每种语言的翻译文本。每种语言有一个 icon.png 表示该语言在标题画面右下角的图标,一般为国旗。截至 2025.02.21 发布的 0.27h 版本,一共有以下语言(括号内的语言代码为子文件夹名称,下文中以 XX 代指):

  1. 日语(_):游戏作者的母语,游戏中除《爱丽丝梦游仙境》以外所有文本的原稿语言。
  2. 英语(en):游戏作者的第一外语,游戏中《爱丽丝梦游仙境》节选文本的原稿语言。
  3. 韩语(ko-kr):由第三方翻译而成。
  4. 泰语(th):由第三方翻译而成,停留在 0.09 版而没有后续更新,读者可用来制作自己的语言包。
  5. 汉语繁体(zh-tc):由第三方翻译而成,与下面的简体版本在内容上相互独立。
  6. 汉语简体(zh-cn)由本游戏的中国区官方翻译而成,该官方也负责游戏下载站等重要站点的运营维护。

__AdditionalFonts文件夹则不代表任何语言,其中存放了中文和韩文的额外字体文件(.dat)以及一些字宽修正文件(letterspace_*.txt)。

localization 内除上述文件夹外还有几个___family_XX.txt用来引导各语言的加载,一般无需修改。

准备工作

首先是系统需求,考虑到 Windows 10 将于 2025.10.14 停止支持,因此 Windows 用户务必使用其最新版本。也可以干脆升级到 Windows 11,以使得记事本(notepad)支持标签页/选项卡功能。

特别注意,localization 文件夹下所有 txt 文件的编码必须为不带 BOM 的 UTF-8,必须用 Unix 风格的换行(LF,\n),不能用 Windows 风格的回车换行(CRLF,\r\n),否则游戏中会变成双倍行距。记事本新建的文件默认是 CRLF 且无法更改,可通过复制已有文件来解决。

接着是游戏配置,请确保已在 StreamingAssets 文件夹的 _debug.txt 文件中将 reloadmtr、announce、timestamp 这三项后的数字都改为 1,成功的话游戏中左下角会显示当前时间。非标题画面按下 F7 键可打开控制台(事件中则是在右侧显示调试界面),按下 F9 键可以热刷新修改后的 localization 文件夹,而无需重启游戏。笔记本电脑用户请注意 Fn 键的默认行为。

F9 热刷新的功能在 0.27h 版本失效了,不知是 BUG 还是故意的。

txt 文件分为两类,一类是XX_tx*.txt,另一类则是ev_*.txt,下文会分别简称为 tx 类文件和 ev 类文件并作说明。不管是哪一类,如果某一行开头是//(两个撇斜杠),则整行会被作为注释忽略,但/**/之间的内容则是有意义的,见下。

tx 类文件

tx 类文件主要用于向玩家展示游戏界面,如对话选项、菜单项、物品、魔法、技能、装备等。

它们的第一行一定是%FAMILY XX,且同一语言内可以互相合并内容或调换顺序,只要保持文件名不变。

但是 XX_tx_whole.txt 除外!只有日语文件夹的__tx_whole.txt在所有语言设置下强制生效,其他语言文件夹下的这个文件修改无效。

每个词条有两种常规写法,其一是单行写法&&KEY VALUE,此时内容必须写在文件的同一行内,但仍然可以用\n在运行时换行。内容可能含有 &1、&2 等形式参数,举例如下:

1
2
3
4
&&Depert_from_noon 从第&1天的早上开始(危险度:&2)
&&Depert_from_evening 从第&1天的黄昏开始(危险度:&2)
&&Depert_from_night 从第&1天的夜晚开始(危险度:&2)
&&SerDesc_sleep 忍不住睡意。\n在醒来之前无法行动。\n受到攻击会略微缩短睡眠时间。

其二是多行写法,模板如下:

1
2
3
4
/* ___ 标识符 ___ */
第一行
...
最后一行

同样支持带有形式参数,例如:

1
2
3
4
5
6
7
8
9
10
11
/* ___ Guild_alert_goout_another_area ___ */
目前您在公会中所接的委托
需在&1完成,如若此时前往&2,
可能会导致上述委托无法完成。
是否仍要出发?

/* ___ Guild_alert_backhome_without_clear ___ */
目前您在公会中所接受的 &1 个委托,
还剩 &2 个仍未完成。
若此时返回据点,
将视为放弃委托。

XX_tx_item.txt 中还有第三种写法,具体如下:

1
2
3
4
5
6
%ITEM 物品ID 物品名
物品介绍
第二行
...
最后一行
%RECIPE_REPLACE 物品ID 食材简称

示例如下:

1
2
3
4
5
%ITEM mtr_curry 小瓶香料
伏沦岭特产的
小瓶香辛料。
气味令人食欲大开。
%RECIPE_REPLACE mtr_curry 咖喱

上述写法本质上是一种糖衣语法,相当于以下写法:

1
2
3
4
5
6
&&_NelItem_name_mtr_curry 小瓶香料
/* ___ _NelItem_desc_mtr_curry ___ */
伏沦岭特产的
小瓶香辛料。
气味令人食欲大开。
&&_NelItem_nameR_mtr_curry 咖喱

ev 类文件

这类文件的数量和具体命名没有限制,只要以 ev_ 开头即可。其内容基本上都是剧情事件中的对话或独白(或者说是事件中 MSG 指令的实际参数),不过从 0.24 起还允许书写告示牌/书信的内容。

特别地:

  • 对于 ev_book.txt,其中有一些很长的段落在运行时要作为书页显示,这需要用到事件中形如MSG b00 K[L]的指令。
  • 对于 ev_debug.txt,其内容不属于游戏流程且语言混乱,但有一些控制序列的例子,可以参考。
  • 对于 fatal 事件(土蛇、森主、休息室、商人取卵),其 txt 文件的引用是在 resources.assets 文件内完成的,一般的读者不必深究。

每条对话的语法形如:

1
2
3
4
5
6
*事件ID x_id
第一行
...
最后一行
*
第二页

看上去有些复杂,下面逐步讲解:

  1. 事件ID:与 evt 文件夹下的 cmd 文件相对路径一致,也可在事件运行过程中打开 F7 调试界面在右上角看到。
  2. 同一事件中的所有对话只有第一条需要写明事件 ID,后面的每条对话前都可以简写为*x_id,总之就是「有且只有一个*并且在行首」。
  3. x_id:事件中MSG x_id指令的形式参数,或者TX_BOARD *xxx指令的形式参数去掉星号即xxx
  4. 换行与换页:由于 Unity 引擎的缺陷,中日韩文无法像英文一样根据对话框宽度自动换行,而是会在任何一行字数过多时将整页字号缩小。
    对于默认大小的对话框(420×240),每行不应超过 16 个全角字符,每页不应超过 5 行,换页请使用*独占一行。

下面是几个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// 美术馆后厅的独白,请注意 n_00 和 board 一词左边有无星号。
*___city_museum/t_kenzen n_00
……呜呜。
也许我还没有准备好去直面这些回忆……
*board_not_kenzen
健全模式已经开启。
如果要查看插画的话
必须关闭健全模式。

// 冒险者公会的告示,请注意和上面例子的区别。
*___city/guild_board_105 board
传说中的巨大树类魔族已被勇者打倒!
我们有志气、亦有能力战胜大自然的挑战!
*n_00
<think>这、这个,
该从哪里开始吐槽比较好呢……

// 诺艾儿刚抵达格拉提亚的事件,请注意 n_02 的换页。
*105/m00_entrance_00 n_00
呼……
*n_01
总算是到格拉提亚了。
和那么大的魔族战斗,
有多少条命都不够用啊……
*n_02
军队的士兵们,
可能正在解除战备吧。
*
伊夏同学被送到
哪里去了呢?
要是能在课程开始前
见到她就好了……
*n_03
……有没有知道的人啊,
问一下那边的军人吧。

静态文本中的控制序列

ev 类文件中的台词/独白在对话框里是以打字机效果逐个显示出来的,而告示牌/书信以及 tx 类文件中的文本则是一次显示一整段,因此称为静态文本。

静态文本中可使用的控制序列并不是很多,不过它们全部可以用于 ev 类文件中的台词/独白。具体而言,其语法有点像是 HTML 标签?

书页以及 fatal 事件的文本虽然也是打字机效果,不过可能属于静态文本。

字体属性控制

语法为<font k1="v1" k2="v2" ...>文本</font>,这里的 k1, k2 等可以是以下属性名。

  • alpha: 不透明度,如<font alpha="0.25">No Use</font>,范围是 0 到 1.
  • color: 颜色,格式为十六进制,示例如下。
    <font color="#6D72FF">肚子饿的时候吃饭更美味哦!</font>
    <font color="#A00B35">因为肚子饱了会吃不完,</font>
    <font color="#B828AC">或许无法充分吸收营养,</font>
    <font color="#A00B35">已经一点儿也吃不下了…</font>
  • letterspacing: 字母间距,只有英文用到了,如<font letterspacing="0.88">Can't Give Birth</font>.
  • linespacing: 行距,如<font linespacing="1.5">危险</font>
  • size: 字号,如<font size="12">(Enter键除外)</font><font size="80%">(房间匹配)</font>

此外,也可以写<i>斜体</i>(tx 类和 ev 类通用),但没有粗体和下划线。

确切地说,现有的 txt 文件里有很多<b>试图显示成粗体的文本</b>,但是都没有生效。
倒是有<s>删除线</s>,只在四子棋的规则中出现,而且首次出现时不生效,要翻到下一页再翻回来才行,所以应该没法用于 ev 类文件。

按键提示和其他图标

使用<key 键名/>可以显示一个按键的提示图标,例如同时长按<key z/>+<key x/>:圣光爆发。所有可用的按键键名在 XX_tx_config.txt 中以 &&Keyconfig_name_xxx 的形式列出,比如 a s d z x c.
如果使用<key_s 键名/>就会显示出一个不可用的按键图标,被斜线划去。

使用<shape 形状名/>的写法来显示一个几何图形,比如<shape right_arrow/><shape check/>.

此外,还可以用<img mesh="图标名"/>来插入其他图标(例如异常状态),比如:
特殊货币有兑锭<img mesh="money_crafts"/>和精萃<img mesh="money_juice"/>这两种

还有参数特别多的<fiximg mesh="KC_pad" tx_color alpha="0.25" margin="-10" behind="1" x="0" y="0" scale="2" />,不知道有什么用。

台词/独白中的控制序列

除了静态文本中可用的以外,台词/独白还可以使用以下控制序列。

对话框样式调整

语法为<样式>,必须写在一页对话的开头(换言之同一条对话的各页可以用不同样式)。这里的样式不同于事件中 HKDS 指令设置的样式,所有可用的样式如下:

  • normal: 默认(当面正常讲话),一般用来从其他样式恢复默认,白底棕边圆角平行四边形。
  • angry: 愤怒(突然厉声呵斥),圆角矩形且四周冒出剑山污染体一样的尖刺。
  • think: 心想(其他人听不到),四角变成圆耳朵,指向角色的尖角变成小气泡。
  • circ: 圆泡(游戏中未使用),与 think 类似但尖角不变,左右边缘会有更多小气泡。
  • evil: 魔族(酒保和小木偶),灰底红边圆角平行四边形,打字速度变为六分之一。
  • device: 电话(法杖无线通信),灰底蓝边尖角平行四边形。
  • noise: 噪音(梅法命令撤离),部分文字被随机涂黑。
    可以使用<noise level=n>指定涂黑概率,n 值默认为 1(即<noise>),最大为 4(几乎全文涂黑)。
  • tigrina: 黑客(蒂格蕾娜学姐),对话框形状本身不变但打字速度变为三倍。
  • dwarf: 矮人(暂时还未实装),会根据下面的 C# 代码将矮人文显示出来。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    protected override TextRenderer.CHAR_INFO_RES GetCharacterInfo(
    char chr, int index, out CharacterInfo Ch, ref PxlFrame PFReplace, ref float scale, int ext_size_request, float size
    ){
    if (!this.is_dwarf)
    return base.GetCharacterInfo(chr, index, out Ch, ref PFReplace, ref scale, ext_size_request, size);
    Ch = new CharacterInfo();
    float scale1;
    if (!NelDwarfCharManager.getCharacter(this.Stb, index, out PFReplace, out scale1))
    return TextRenderer.CHAR_INFO_RES.CONTINUE;
    scale = scale1;
    this.initMeshSub(TextRenderer.MESH_TYPE.SPECIAL1);
    return TextRenderer.CHAR_INFO_RES.MESH_REPLACED;
    }
    在上述样式中,noise 可以和其他一个一起用(比如和 device,注意要分别写在两个<>内),此外 noise 和 device 并不影响台词的嘟嘟音效,音效是由事件中的 TALKER_REPLACE 指令切换的。

此外,在样式之前可以使用<I>令对话框突然出现,没有动画过程,如上课时老师连续讲授。

字号、颜色和特效

可以使用<big>大文字</big><small>小文字</small>将文字切换为 38 或 12 磅字号,其他字号 n 可使用<font size="n">文字</font>来指定。

可以使用<c 颜色>文字<c><m 特效>文字<m>来变色或添加特效,其中<c><m>也可分别写作<c0><m0>

此法支持的颜色如下(圆括号内的字母可以省略,其他颜色可用前文提到的十六进制写法):
red, ora(nge), yel(low), gre(en), blu(e), pin(k), gra(y), whi(te), bl(ac)k
除黑色外,其余八种颜色也可以用<c1><c8>指定。

此法支持的特效如下(部分特效在文字出现后循环播放,可与 ple 或 fadein 一起使用):

  • normal: 默认,文字匀速地一个个突然出现,游戏中未使用过。
  • strong: 强壮,但实际效果好像和 normal 一致,游戏中未使用过。
  • ple(asure): 文字由大变小,常用来配合更大字号表示大喊。
  • fadein: 淡入,在慢速下比起突然出现的一个个字符要更流畅。
  • joy: 波浪线(循环),如校门口的占卜双胞胎。
  • scary: 原地颤抖(循环),如瓦罗斯的口头禅「咔哈哈!」
  • vib: 整齐地上下弹跳(循环),游戏中未使用过。
  • cry: 错落有致地上下弹跳(循环),被搜身时会使用。

打字速度调节、上方注音

使用以下四种语法可以调节打字速度(N 为正整数):

  • <wN>: 暂停打 N 个字的时间。
  • <WN>: 暂停打 10N 个字的时间,相当于<wN0>
  • <sN>: 打字速度变为正常速度的 1/N 倍。
  • <SN>: 打字速度变为正常速度的 N 倍。

此外还有形如<MT><MT> l=N的控制序列,整数 N 的取值范围是 {-1,0,1,2,3},效果不明。

众所周知,日语有大量音读/训读汉字以及用片假名写成的英文单词。因此在配音语言和字幕语言不一致时,就可能需要在正文中意译部分词汇并在上方注音。

注音的语法为<rb c="注音">正文</rb>,字号大小为正文的一半,例如:

1
2
这华丽的战斗可谓<rb c="PERFECT">赏心悦目</rb>!
给我注入了澎湃的<rb c="Love"><m cry>热情<m0></rb>啊!

当然,因为 AliceInCradle 没有配音,因此注音内容最好用英文。

实战

请打开所属语言的 ev_s10.txt 文件,定位到 *s10_4c_srng x_00 一行,在其下尽可能尝试上述所有语法,并在游戏中(魔女杂货店坡顶的霰弹教学 NPC 处)查看效果。

本文档最后更新于 2025 年 2 月 24 日。

Author

e9ae9933 vs. GreyDoge

Posted on

2025-03-03

Updated on

2025-03-03

Licensed under