NarraLeaf

本地化

读取和切换游戏面向玩家的语言,并读取翻译键

这六个节点是游戏切换自己语言、读取翻译键的方式:设置界面列出项目配置的语言,玩家挑一个,这个选择会被记住。语言、翻译表和翻译键都在 Localization 里配置——节点只读取那里已有的东西。第七个节点 Format Text 已不在创建浮窗中提供,已有图里的这个节点照常运行

约定

  • 一个是 pure,其余都是 latent。 Translation Key Text 在被读取时计算结果,所以能用于 Blueprint Value 和函数。另外五个异步返回,只能用于事件图和宏图
  • 这是游戏的语言,不是编辑器的语言。 Studio 自身的界面语言是另一个设置,这里没有任何节点会读它或写它。两者可以不同,通常也确实不同——你用自己的语言创作,游戏跑在玩家的语言上
  • 这个选择存在哪里。 Set Language 写入宿主持久化存储的 nls.locale,每个项目一条记录,和持久变量走同一条通道。它能挺过退出游戏,而且不属于存档的一部分,所以读档永远不会改变语言。首次启动时若没有存下任何有效值,会把玩家的系统语言与项目配置的语言做匹配并存下来;此后以存下来的选择为准
  • 同一个翻译键处处读出同样的结果。 Get Text、Translation Key Text 与文字来自翻译键的控件,对同一个键给出同一个结果:当前语言的译文;然后沿该语言配置的回退语言逐个查找译文;然后是键的源文本;项目中没有这个键时是键名本身——这样删掉或写错的键会在跑起来的游戏里显形,而不是渲染成一片空白。无论项目是否设置了源语言,键都能读取
  • Blueprint Value 跟随语言。 读取玩家语言的 Blueprint Value——通过 Translation Key Text,或通过它调用的函数里的 Get Text、Get Current Language——会在玩家切换语言时重新求值
  • 配音语言是分开的。 配音语言和字幕语言是刻意区分的两个设置;这里没有任何东西会碰语音轨
  • 编辑器画布跑不了 latent 节点。 作者时画布上没有宿主,除 Format Text 之外的 latent 节点在那里都会以 该节点仅在游戏运行时可用,需在开发模式中运行 失败,而画布本就按设计渲染源语言文本

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 的占位符——会立刻重新解析并重绘。什么都不需要重新挂载
  • 读取语言的 Blueprint Value 会重新求值,显示新的语言
  • 图已经用 Set Text 或 Set Label 写入的文字,在所有语言中都按写入的内容显示,直到页面重新打开。要换成新语言,请重新跑一次图

游戏进行中切换时会发生什么,由项目在项目 → 游戏 → 语言的游戏进行中切换语言里设定:

选项玩家得到的结果
重启应用并回到原处默认值。游戏重启,回到玩家所在的那一行,所有内容都换成新语言
重启应用,不保留当前进度游戏像正常启动那样重启,停在标题画面。当前这局不保留,玩家的存档保留
下次启动时应用当前会话什么都不变,界面文本也不变。下次启动游戏时使用新语言

Get Available Languages

blueprint.localization.getAvailableLanguages · Latent

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

引脚方向类型说明
inin · exec—
nextout · exec—
valueout · dataarray<struct:nl.language>标注为Languages,即语言列表。项目没有本地化时为空

每一项带有 code、displayName 和 isSource。displayName 是作者填写的语言自称——日本語,而不是 Japanese——这正是语言选择器要展示给玩家的东西;code 则是交回给 Set Language 的东西。用 Get Field 读取其中的字段

Translation Key Text

blueprint.localization.keyText · Pure

Translation Key Text(翻译键文本)给出一个翻译键在玩家当前语言中的文字。结果与 Get Text 相同,但没有执行引脚,所以 Blueprint Value 和函数也能显示译文

引脚方向类型说明
keyin · datastring接线时覆盖卡片上的字段
valueout · datastring标注为Text。没有选键时为空字符串

卡片字段

字段说明
Key翻译键,从项目的翻译键中选择

显示它的 Blueprint Value 与文字来自翻译键的控件在同一帧换成新语言

要把值填进译文,把它接到 Format 的 template。例如键 settings.seconds 的源文本是 {0} s、中文译文是 {0} 秒:Translation Key Text 接到 template,装着 3 的 Make Array 接到 values,英文显示 3 s,中文显示 3 秒

Get Text

blueprint.localization.getText · Latent

Get Text(获取文本)把一个翻译键解析为当前语言下的文字。翻译键是用到它的所有控件和图共用的同一段文字,只翻译一次

引脚方向类型说明
inin · exec—
nextout · exec—
keyin · datastring接线时覆盖卡片上的字段。键为空是执行错误
valueout · datastring标注为Text

卡片字段

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

结果按约定中的顺序得出:沿回退链的译文,然后是键的源文本,项目中没有这个键时是键名

控件上的文字不需要这个节点:直接输入的文字和来自翻译键的文字,控件都会按玩家的语言显示。文字由图决定时用 Get Text,在 Blueprint Value 里用 Translation Key Text

Has Text

blueprint.localization.hasText · Latent

Has Text(是否有文本)判断某个翻译键在项目中是否存在,与项目是否设置了源语言无关

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

卡片字段

字段说明
Key翻译键,从项目的翻译键中选择

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

Format Text

blueprint.localization.formatText · Latent

已不在创建浮窗中提供;已有图里的这个节点照常运行。请改用 Format:它同样用数组填 {0}、{1}……占位符,还能用对象填 {name},并且可用于 Blueprint Value 与函数

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

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

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

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

本页目录