受BWiki近期改动影响,普通用户无法访问除重定向、编辑表格外的特殊页面(如最近更改等),进行3次有效编辑后即可正常访问。
模板:Tr/Documentation
模板简述
该模板以标准译名数据库为基准,配合一些变体扩展处理,提供自动翻译功能,使各类名词的翻译能够统一处理,并为翻译工作提供便利。
同时,此模板是 i18n 体系的主要基础设施之一,为其他大量模板提供透明自动翻译支持。
模板已经过仔细的性能优化,单个页面内使用上万次不会引发问题,可以放心使用。
如何使用
常规翻译
常规用法:模板:Code
或者,推荐使用terraria各语言wiki的通用翻译模板别名 模板:Code: 模板:Code
翻译成功时会输出相应翻译中文结果,翻译失败则将输入参数原样输出。
输入参数大小写不敏感,但翻译失败时的输出会按输入的大小写原样输出,不会引入任何额外处理。
例:
输入 | 输出 | 备注 |
---|---|---|
{{tr|Copper Shortsword}} | 模板:UnitTest | 翻译成功,输出中文 |
{{tr|someTHING}} | 模板:UnitTest | 翻译失败,维持原始大小写输出原文 |
针对页面标题
针对页面标题,将英文wiki标题转为中文: 模板:Code
由于英文翻译为中文时有多词同译的情况,可能导致两个英文页面标题翻译为同样的中文,此时需要额外进行消冲突处理,此用法即用于自动处理此种情况。
例如,英文 wiki 中同时有 Mushrooms 和 Mushroom 两个页面,但是直接翻译中文均为“蘑菇”,因此需要将其中之一加后缀做消冲突处理:
输入 | 输出 |
---|---|
{{tr|Mushroom}} | 模板:UnitTest |
{{tr|Mushrooms}} | 模板:UnitTest |
{{tr|Mushroom|link=yes}} | 模板:UnitTest |
{{tr|Mushrooms|link=yes}} | 模板:UnitTest |
当{{Tr}}
的结果用于链接至其他页面时应当使用此参数。
词间空格
{{Tr}}
空格处理遵循以下规则(本章节中出现下划线均表示此处为空格,使用下划线仅为了更清晰):
- 最终输出结果前后一定无空格,无论输入时前后是否有空格。因此使用时可能需要手工在前后加空格,例如:世界_{{tr|NPCs}},请使用时自行判断。
- 游戏内的中文译名在涉及中英文混合的情况中英文之间不加空格,
{{Tr}}
对此类词条及其衍生词条维持此处理,不加空格,例如“Propeller Gato”的翻译为“模板:UnitTest”而非“飞翔 Gato”。此类词条和其他前后缀组合时,中英文之间也不加空格,例如“Propeller Gato pet”的输出是“模板:UnitTest”而非“飞翔Gato 宠物”。 - 其他情况下中英文之间、普通中文与阿拉伯数字之间加空格,例如“town npc”这个词条的中文是“模板:UnitTest”,“town npc pet”的输出是“模板:UnitTest”,“town npc pet 2”的输出是“模板:UnitTest”。
- 但英文和中文标点之间不加空格。例如“Ballista Panic! NPC”的输出是“模板:UnitTest”而非“弩车恐慌!_NPC”。
- 以上两条结合起来,配合
{{Tr}}
本身的处理顺序,有时会产生意料之外的结果,即因为实际切分的不同而导致英文单词左右的空格有无情况和预期的有所不同。但总能通过直接添加词条解决。
- 词间出现多个连续空格的情况不做保证,在处理的不同阶段和不同场景下是否能够处理连续空格是不确定的。有许多情况下连续空格和单个空格的效果一致,但请勿依赖于此。
一个没实际意义的例子:
>{{tr| basic the melee regular red yellow green blue purple pink normal Lazure's Valkyrie Circlet buff 4 Bewitched surface biomes set weapons Boss Debuff (bug) npc(biome) material 2 layer 7 accessory IDs 2763 3234 }}<
会输出(注意其中Lazure前后无空格):
>basic the melee regular red yellow green blue purple pink normal Lazure's Valkyrie Circlet buff 4 Bewitched surface biomes set weapons Boss Debuff (bug) npc(biome) material 2 layer 7 accessory IDs 2763 3234<
性能问题
{{Tr}}
的处理能力在设计时大量照顾了各种模版内集成使用以实现透明自动翻译的需求,因此有一些地方为了功能的强大而部分妥协了性能。在日常人工翻译页面时,请注意:
{{Tr}}
在翻译失败时的开销是非常高的,如果使用了{{Tr}}
后确定翻译失败,请编辑解除此次调用,以提高页面性能。注意词表中有部分“保持原文”的词条,这并非翻译失败,使用Tr有助于标准化输出大小写并方便未来必要时更改译名。此类词条的例子有 NPC、bug 等。{{Tr}}
在翻译长输入时开销偏高,避免单次给出太长的输入,可以恰当地拆成若干个{{Tr}}
调用。长输入并不太容易预测输出结果,反而增加了翻译工作成本。
和翻译结果相关的更多细节注意事项,请参考下文。
示例
以下是各种使用示例,兼做单元测试:
输入 | 输出 | 备注 |
---|---|---|
{{tr|Copper Shortsword}} | 模板:UnitTest | 直接精确匹配 |
{{tr|a Book}} | 模板:UnitTest | 脱冠词 a |
{{tr|the Book}} | 模板:UnitTest | 脱冠词 the |
{{tr|Books}} | 模板:UnitTest | 复数处理 -s |
{{tr|Thorny Bushes}} | 模板:UnitTest | 复数处理 -es |
{{tr|Butterflies}} | 模板:UnitTest | 复数处理 -ies |
{{tr|Waterleaves}} | 模板:UnitTest | 复数处理 -ves |
{{tr|the Butterflies}} | 模板:UnitTest | 脱冠词+自动复数处理双重生效 |
{{tr|Buggy Body}} | 模板:UnitTest | 后缀,自动拆分为主词条 Buggy 与后缀 Body 分别处理 |
{{tr| Surface (Biome) }} | 模板:UnitTest | 后缀处理,拆分为主词条 Surface 与后缀 (Biome) 分别套用翻译,后缀来自后缀表。 |
{{tr| Snow (Space) }} | 模板:UnitTest | 后缀处理,拆分为主词条 Snow 与后缀 (Space) 分别处理,后缀来自主词表。 |
{{tr|Buggy 2}} | 模板:UnitTest | 数字编号,自动拆分为主词条 Buggy 与 数字编号 2 分别处理 |
{{tr|Desktop 1.3.5.2}} | 模板:UnitTest | 带有.的数字编号,自动拆分为主词条 Desktop 与 数字编号 1.3.5.2 分别处理 |
{{tr|Phantasm Dragon Body 4 }} | 模板:UnitTest | 数字编号+后缀, 自动拆分为主词条 Phantasm Dragon 与后缀 Body 加上数字编号 4 分别处理 |
{{tr|Basic Weapon}} | 模板:UnitTest | 前缀,拆分为前缀 basic 和主词条 Weapon 分别判定处理。 |
{{tr|Basic Buggy Body}} | 模板:UnitTest | 前缀+后缀同时存在 |
{{tr|Basic Buggies}} | 模板:UnitTest | 前缀+复数 |
{{tr|Surface Block}} | 模板:UnitTest | 前后缀冲突,优先匹配后缀。 |
{{tr|Surface Block Block}} | 模板:UnitTest | 两轮前后缀分析,变为 前缀 + 主体 + 后缀 |
{{tr|Shit Block}} | 模板:UnitTest | 前/后缀拆分之后任何一部分匹配不成功即整体视为不成功 |
{{tr|the yellow woods blocks 3}} | 模板:UnitTest | 多重叠加:冠词+前缀+主体带复数+后缀 |
{{tr|The Corruptions}} | 模板:UnitTest | 先脱冠词再判定复数。 |
{{tr|Dirt Block and Stone Block}} | 模板:UnitTest | and组合。普通案例,不考虑and划分直接通过连续前后缀处理也能得到正确结果。 |
{{tr|the Crimson and Stone Block}} | 模板:UnitTest | and组合,特殊案例,和只通过连续前后缀处理得到的结果是不同的,用于确定and划分的正确性 |
{{tr|the Crimson/the Corruption}} | 模板:UnitTest | / 组合 |
{{tr|the Crimson, the Corruption}} | 模板:UnitTest | 逗号组合 |
{{tr|the Crimson ,the Corruption}} | 模板:UnitTest | 逗号前后空格任意 |
{{tr|the Crimson, the hallow, and the Corruption }} | 模板:UnitTest | and/or加上逗号的并列结构。 |
{{tr|Mummy, Dark Mummy, and Light Mummy}} | 模板:UnitTest | 针对牛津顿号的边缘情况测试。 |
{{tr|a basic the melee regular pink slimes normal Baby Face Monster 4 surface biomes weapons set material 2 event 7 accessory 2763}} | 模板:UnitTest | 毫无实用性的超级复杂多重解析。 |
{{tr|xs}} {{tr|x}} {{tr|xs}} | 模板:UnitTest | 缓存一致性 |
内部流程解析
了解自动翻译的内部流程有助于了解 {{Tr}}
的能力范围,并正确预计其输出结果。
{{Tr}}
的工作基于三类处理:
- 直接匹配:按照主词表进行直接精确匹配(不区分大小写)。这是最基础的翻译实现部分。
- 基本处理:尝试对输入进行冠词和复数的判定,脱冠词并转单数,处理完的结果再尝试匹配。基本处理负责解决常见的词形变体。
- 扩展处理:包括前缀、后缀、尾部括号、尾部数字编号、and/or组合,扩展处理负责将输入分解成若干片段并对每一片段进行单独翻译处理,如果所有片段全部成功则合并后输出结果,若有任何片段不成功则视为翻译失败。
处理的的大致流程规则如下,一旦某一步成功就中止后继处理,返回得到的结果:
- 如果指定了 pagename=yes,查询标题消冲突数据表。
- 进行标准翻译处理,标准翻译处理按如下流程进行
- 尝试进行直接匹配(大小写不敏感)。
- 尝试通过基本处理解除常见变体并尝试匹配。按如下顺序进行,每一步处理完成后立刻将得到的处理结果尝试进行直接匹配:
- 脱冠词,去掉前面的the/a/an。
- 将上一步的结果叠加进行s/es/ies解复数处理。
- 尝试将未脱冠词的输入进行 s/es/ies/ves解复数处理。
- 尝试 脱冠词+解ves 处理
- 尝试进行扩展处理,按如下顺序进行:
- 逗号处理,尝试匹配 X, Y 的格式,拆分为X和Y两部分,两部分分别递归套用标准翻译处理。输出为 X、Y。注意此时X和Y都可能不止一个单词。另外X部分按照最短匹配选择,例如对于 A, B, C, X = A, y = B, C。
- and处理,尝试匹配 X and Y 的格式,拆分为X和Y两部分,两部分分别递归套用标准翻译处理。输出为 X和Y。注意此时X和Y都可能不止一个单词。X部分按照最短匹配选择。
- or处理,尝试匹配 X or Y 的格式,拆分为X和Y两部分,两部分分别递归套用标准翻译处理。输出为 X或Y。注意此时X和Y都可能不止一个单词。X部分按照最短匹配选择。
- 尾部数字编号判定,将输入拆分成 主体+尾部数字编号,主体递归套用标准翻译处理。注意如果成功,此处输出结果中中文和数字之间是有空格的,输出类似于:中文_数字_。
- 尾部括号后缀判定,将输入按照 主体 (后缀) 的模式尝试拆分,主体递归套用标准翻译处理,后缀部分按照如下顺序尝试处理:
- 带括号进行专用后缀匹配
- 后缀去掉括号进行专用后缀匹配
- 后缀去掉括号进行基本处理
- 进行后缀/前缀判定,按照如下顺序尝试:
- 拆分为 主体+后缀, 主体套用标准翻译处理,后缀套用专用后缀匹配。
- 拆分为 前缀+主体, 主体套用标准翻译处理,前缀套用专用前缀匹配。
- 拆分为 主体+后缀, 主体套用标准翻译处理,后缀套用基本处理。
- 拆分为 前缀+主体, 主体套用标准翻译处理,前缀套用基本处理。
- 全部尝试失败,返回输入原文。
其中,基本处理内:
- 第一轮(脱冠词后的)解复数处理只尝试 s、es、ies 三种后缀,并按此顺序进行尝试,一旦成功即中止后继。例如,输入为 Pixies, 则首先尝试的是 Pixie,并在这里成功匹配,不会再继续尝试 Pixi 和 Pixy。 如果输入为the taxies,在这一轮会依次尝试(注意会被脱冠词)taxie、taxi、taxy。
- 第二轮(未脱冠词的)解复数处理会处理 s、es、ies、ves 四种后缀,并且 ves 后缀会尝试 f 和 fe 两种解法,均按列出顺序进行。因此,假设输入为 the baxies,在第二轮会依次尝试匹配 the baxie、the baxi、the baxy;如果输入为 kaves,会依次尝试 kave、kav、kaf、kafe。
- 前两轮尝试都不成功且 -ves 结尾的输入会额外尝试脱冠词+解ves复数处理(按-f,-fe的顺序)。因此,假设基本处理的输入为 the kaves,那么完整的匹配尝试顺序是: kave、kav、the kave、the kav、the kaf、the kafe、kaf、kafe(共8个候选)。
扩展处理内:
- 前缀:
- 前缀的拆分标准为脱冠词后的第一个单词。
- 后缀:
- 后缀的拆分标准为最后一个单词。
- 尾部数字编号:
- 要求最后一个单词为纯阿拉伯数字和小数点(.)字符组成,例如 238、0.3、1.3.4 等,诸如 II 之类的不视为数字编号。注意,由于 lua 的正则表达式功能限制,这里 ..、1..4 等亦符合此处模式要求,但一般使用中不会引发困扰。
整体叠加后,需要注意:
- 扩展处理之间能不断叠加,而两轮基本处理之间必须要隔着一轮扩展处理。因此,双重冠词时无法处理的。例如, The The block 是无法解析的(每一轮基本处理只能处理一个冠词)。在“实际”的使用中此条并不会造成问题。
- 由于脱冠词处理先于复数处理进行,个别情况下,词条可能在经过 脱冠词+扩展处理 之后命中匹配,但结果却并非预期。例如,The Corruptions(The Corruption的复数)预期结果为“腐化之地”,但依据处理流程会被先脱冠词再处理复数而以Corruption进行匹配,得到“模板:UnitTest”。但此类情况总是可以通过将词条和正确翻译直接加入标准翻译词库来解决。
- 更复杂的多重处理叠加时会有更多类似的可能情况,但都可以通过直接加入主词库的方式来解决问题。
临时词条
有时在单个页面上有一些词汇反复出现,但因为种种原因主词条库不包含此词汇。此时可以用在页面上定义临时词条:
定义之后即可在tr中正常使用此词条。
注意:
- 英文原文参数无视大小写。中文参数则会按输入的样子原样呈现。
- 临时词条定义如果和主数据库重复,则不会覆盖主数据库定义。这是为了保持主数据库翻译的权威性,也便于后继扩充升级。
- 临时词条如果互相重复,也遵循不覆盖原则,先定义的有效。
- 临时词条定义必须在所有实际使用之前定义,否则无效。
- 临时词条定义对基本处理有效,但对扩展处理无效。
- 临时词条定义仅限于单个页面内部有效,自定义之处开始,到页面结束。所谓“单个页面”指的是“根页面”,即访问的url所对应的那个页面。如果在一个模板中定义了临时词条,那么调用此模板的页面中在模板之后此临时词条依然有效。
例,以下代码序列及结果:
临时词条定义 | ||
---|---|---|
输入(按顺序) | 输出(按顺序) | 备注 |
{{Tr/define|keke|蛤蛤}} | 模板:Tr/define | 定义临时词条,无可见输出 |
{{tr|keke}} | keke | 定义后此词条即可使用 |
{{tr|the kekes}} | the kekes | 基本处理有效 |
{{tr|the keke block}} | the keke block | 扩展处理无效 |
{{Tr/define|keke|克克}} | 模板:Tr/define | 重复定义,也无可见输出 |
{{tr|keke}} | keke | 重复定义无效 |
{{tr|Book}} | Book | 主词条数据库有定义 |
{{Tr/define|book|书本}} | 模板:Tr/define | 重复定义,无可见输出 |
{{tr|Book}} | Book | 重复定义无效 |
翻译相关词表维护
- 主词表: Template:Tr/db 和 Module:Tr/db 中各有一份,需要同步维护。这种冗余是为了Tr的高性能而不得不付出的代价。
- 页面冲突解决表: Template:Tr/db 中。
- 前缀表: Module:Tr/db 中。
- 后缀表: Module:Tr/db 中。
注意:
- 所有数据表的英文输入部分信息均必须为全小写,混杂大写的条目无效。
- 条目重复定义不会出错(但会增加不必要的负载)。在同一表内部重复定义,后定义的覆盖先定义的。(注意这和临时词条定义的覆盖顺序不同)
- 空格的处理依赖于词表内的定义,因此在词表中在中文翻译的前后要视情况加上空格,
{{Tr}}
才能知道词条和其他前后缀组合时是否需要加空格。