NarraLeaf

本地化

读取和切换游戏面向玩家的语言,并解析命名文本 key

这六个节点是游戏切换自己语言的方式:设置界面列出项目配置的语言,玩家挑一个,这个选择会被记住。语言、翻译表和命名 key 都在 Localization 里配置——节点只读取那里已有的东西

约定

  • 六个全是 latent,没有一个是 pure。 它们都要够到宿主并异步返回,所以都不能出现在 function 图里,也不能支撑 Blueprint Value。六个都声明 eventmacro
  • 这是游戏的语言,不是编辑器的语言。 Studio 自身的界面语言是另一个设置,这里没有任何节点会读它或写它。两者可以不同,通常也确实不同——你用自己的语言创作,游戏跑在玩家的语言上
  • 这个选择存在哪里。 Set Language 写入宿主持久化存储的 nls.locale,每个项目一条记录,和持久变量走同一条通道。它能挺过退出游戏,而且属于存档的一部分,所以读档永远不会改变语言。首次启动时若没有存下任何有效值,会把玩家的系统语言与项目配置的语言做匹配并存下来;此后以存下来的选择为准
  • 查找会走一条回退链。 文本先在当前语言里查,再查该语言配置的 fallback,依此类推——在源语言之前停下,因为源语言的文本是编译进去的默认值,而不是表里的一条。走到链尾就意味着渲染源语言文本
  • 配音语言是分开的。 配音语言和字幕语言是刻意区分的两个设置;这里没有任何东西会碰语音轨
  • 编辑器画布跑不了它们。 作者时画布上没有宿主,六个节点在那里都会以 Host API unavailable (use Dev Mode) 失败,而画布本就按设计渲染源语言文本

Get Current Language

blueprint.localization.getCurrentLanguage · Latent

Get Current Language(获取当前语言)给出游戏当前运行所用的 locale code:只要玩家存下的选择仍是项目配置的语言之一,就是它;否则是项目的源语言。没有配置本地化的项目读到空字符串

引脚方向类型说明
inin · exec
nextout · exec
valueout · datastring标注为Language

Set Language

blueprint.localization.setLanguage · Latent

Set Language(设置语言)切换游戏语言并记住这个选择

引脚方向类型说明
inin · exec
nextout · exec
languagein · datastring项目已配置语言中的一个 locale code

写入之前会先拿这个 code 与已配置的语言核对,所以一个笔误不会把玩家困在一门不存在的语言里:未知或为空的 code 是执行错误,在完全没有配置语言的项目里运行这个节点同样是执行错误

这次切换够得着什么,够不着什么:

  • 控件上的文本——Text 的内容、Button 的标签、Text Input 的占位符——会立刻重新解析并重绘。什么都不需要重新挂载
  • 有翻译的剧情行会编译成随渲染重新解析的值,所以新语言无需重新编译、也无需重启就能生效
  • 说话人的 nametag 是在该行进入对话状态那一刻解析的,所以行中途的切换要从下一行才看得到
  • 图已经产出的字符串——比如某个写出去的 Get Text 结果——到那时就是一个普通字符串了。它不会重新解析。请重新跑一次图

Get Available Languages

blueprint.localization.getAvailableLanguages · Latent

Get Available Languages(获取可用语言)给出项目配置的每一种语言,顺序与项目中列出的顺序一致

引脚方向类型说明
inin · exec
nextout · exec
valueout · dataany标注为Languages。项目没有本地化时为空

每一项带有 codedisplayNameisSourcedisplayName 是作者填写的语言自称——日本語,而不是 Japanese——这正是语言选择器要展示给玩家的东西;code 则是交回给 Set Language 的东西。这个引脚类型是 any,因为它的值是一组对象,而不是蓝图的某种标量类型

Get Text

blueprint.localization.getText · Latent

Get Text(获取文本)把一个命名 key 解析为当前语言下的文本。命名 key 是项目里由开发者撰写的字符串:既不是剧情行,也不是直接填在控件卡片上的那些

引脚方向类型说明
inin · exec
nextout · exec
keyin · datastring接线时覆盖卡片上的字段
valueout · datastring标注为Text

卡片字段

字段说明
Key命名 key,从项目的 key 登记表中选择。每个选项显示其源文本、key 名跟在后面,所以你是按这句话说了什么来挑的

解析顺序是:当前语言的翻译(沿回退链);然后是该 key 自己的源文本;最后,当这个 key 根本不在登记表里时,是 key 名本身——这样你删掉或写错的 key 会在跑起来的游戏里显形,而不是渲染成一片空白

直接填在控件卡片上的文本不需要这个节点:带文本的控件会自己按当前语言解析要显示的文本。当这个字符串是由图决定的,才轮到 Get Text

Has Text

blueprint.localization.hasText · Latent

Has Text(是否有文本)判断某个命名 key 在项目中是否存在

引脚方向类型说明
inin · exec
nextout · exec
keyin · datastring接线时覆盖卡片上的字段。key 为空时读到false,而不是报错
valueout · databoolean标注为Exists

卡片字段

字段说明
Key命名 key,从项目的 key 登记表中选择

它回答的是这个 key 有没有定义,不是它有没有被翻译。一个在当前语言下没有翻译的 key 依然报告 true,因为届时渲染出来的就是它的源文本。翻译覆盖率是本地化编辑器的问题,不是跑起来的游戏该问的问题

Format Text

blueprint.localization.formatText · Latent

Format Text(格式化文本)按位置把值填进模板的 {0}{1}……占位符

引脚方向类型说明
inin · exec
nextout · exec
textin · datastring模板,通常是一个Get Text结果
valuesin · datalist按下标代入
valueout · datastring标注为Result

占位符的形式就是译者看到的那种形式,因此一份翻译可以把占位符挪到它那门语言需要的位置上。这正是要格式化而不是拼接的理由:拼接会把你先写的那门语言的语序钉死

没有对应值的占位符渲染为空字符串,多出来的值被忽略。values 输入不是列表时按单个值处理,为空时按没有值处理

本页目录