本地化
所有游戏资源(脚本、音频、语音、背景等)都可以本地化为多种语言/文化。
默认情况下,最初用于创作项目的资源与源语言环境相关联。例如,如果游戏最初是用英语创作的,则所有原始(源)剧本脚本、UI、背景上的标牌等都是英语;这意味着源语言环境是 en(如果您希望为特定地区使用单独的语言环境,则为 en-GB / en-US 等)。
可以通过 Naninovel -> Configuration -> Localization 菜单中的 Source Locale 属性更改源语言环境。Source Locale 设置仅确定与项目源资产关联的语言环境的名称(ID),并在设置的“Language”下拉菜单和相关引擎 API 中用于区分该语言环境。
提示
如果您想与第三方共享源语言的可本地化文本(例如,用于校对)但不想共享源剧本脚本,请将 Source Locale 更改为某个您不会使用的无关语言,然后禁用 Expose Source Locale 并为源内容添加一个专用语言环境。之后即可将该语言环境导出到本地化 文档 或 电子表格。
要添加语言环境,请在 Resources/Naninovel/Localization(本地化资源根目录)内创建一个子文件夹,其名称等于您希望支持的 RFC5646 语言标签之一。例如,要添加德语,请创建 Resources/Naninovel/Localization/de。内置游戏设置 UI 中的“Language”下拉菜单将自动包含所有添加的语言环境。
请注意,您不必为源语言环境在本地化资源根目录中创建子文件夹。存储在本地化资源根目录之外的所有项目资源默认属于源语言环境。
可以通过 Loader > Path Prefix 属性在本地化配置菜单中更改本地化资源根目录路径。请注意,配置的路径是相对于“Resources”文件夹(而不是“Assets”)的。Unity 以特殊方式处理“Resources”文件夹;您可以在项目内的任何位置拥有多个此类文件夹来组织特定于语言环境的资产。
提示
您也可以不使用“Resources”文件夹,而是选择其他资源提供者;例如,使用 Addressables,您可以独立于主游戏包打包特定于语言环境的资源,并按需下载它们。安装该包后,Naninovel 会自动将生成的本地化文档注册到 Addressables。
默认语言环境
要指定玩家首次运行游戏时默认选择的语言环境,请使用本地化配置菜单中的 Default Locale 属性。未指定此属性时,游戏将以 Source Locale 启动。
当启用 Auto Detect Locale 选项且游戏首次运行时,Naninovel 将尝试根据系统语言检测语言环境。如果检测成功且游戏支持该语言环境,则将选择该语言环境;否则游戏将回退到 Default Locale。
警告
自动检测到的语言环境不会包含说明符;即,当系统语言为英语时,检测到的语言环境将是 en,绝不会是 en-US 或 en-GB。这是 Unity 系统语言检测 的限制。依赖自动检测时,请避免在添加的语言环境中使用说明符。
资源本地化
请在本地化资源根目录中存放本地化资源;在游戏设置中选择相应的本地化时,将使用这些资源代替源资源。
例如,如果您希望在选择 ja-JP 语言环境时替换主背景(Actor ID MainBackground)的“City”外观精灵,请将本地化版本放置在:
Resources/Naninovel/Localization/ja-JP/Backgrounds/MainBackground/City脚本本地化
资源本地化方案适用于大多数资源类型,但剧本脚本和管理文本文档除外。对于这些类型,请使用通过 Naninovel -> Tools -> Localization 访问的本地化工具:
首先,选择 Script Folder (input)——存储 Naninovel 剧本脚本(.nani)的项目目录(例如 Assets/Scenario)。此外,若要同时为 管理文本 生成本地化文档,还可以选择 Text Folder (input)——存储管理文本文档的目录(默认为 Assets/Resources/Naninovel/Text)。
您也可以基于另一语言环境已有的本地化文档来生成文档,而不使用源脚本。此时,请选择存放该语言环境现有本地化文档的文本文件夹,例如 Assets/Resources/Naninovel/Localization/ja-JP/Text。
然后选择生成的本地化资源应存储到的语言环境文件夹路径。请确保您选择了实际的语言环境文件夹(例如 Resources/Naninovel/Localization/ja-JP)。选择了有效的输出语言环境文件夹后,字段下方的标签会给出提示并显示目标语言环境名称。
提示
您可以通过选择本地化资源根目录而不是特定的语言环境文件夹来一次为项目中的所有语言环境生成资源;该工具将遍历子文件夹并为每个子文件夹生成资源。
按“Generate Localization Documents”创建或更新本地化资源。在后续运行中,该工具会沿用先前生成的本地化文档,并在源内容未更改时保留已本地化的条目。
脚本本地化文档归入“Scripts”文件夹,由以下格式的语句组成:
# ID
; Source text
Translation text# ID 行是本地化内容的唯一标识符,不应修改。
; Source text 行包含要翻译的原始内容。这是一个注释,因此更改它不会影响游戏——它是为了方便翻译人员而提供的。
将实际翻译直接放在注释行之后。为了便于阅读,可以使用多行(它们将被连接),但请确保它们出现在下一个 # ID 行之前。例如:
# aj0e5dea
; 天地<b>玄黄</b>,宇宙洪荒。<br>日月盈昃,辰宿列张。
Оценивая блеск <b>металлического</b> шарика, пространство равноденственно.<br>
Противостояние есть метеорный дождь.连接行
当待翻译的通用文本行包含内联命令或表达式时,它可能会被拆分为多个文本片段,每个片段映射到一个唯一的文本 ID。在生成的本地化文档中,此类片段使用管道符号 | 连接成一行。
例如,给定以下源脚本文本:
Looks like rain is starting[rain]. Hey, {MC}, hurry up!— 本地化文档将包含:
# id1|id2|id3
; Looks like rain is starting|. Hey, |, hurry up!注意内联命令和表达式被替换为 |。请在翻译文本中保留它们,例如:
# id1|id2|id3
; Looks like rain is starting|. Hey, |, hurry up!
Похоже, дождь начинается|. Эй, |, поспеши!如果目标语言需要,您还可以重新排列本地化片段,例如:
# id1|id2
; Hey, |, hurry up!
|, эй, поспеши!— 这将在句子的其余部分之前打印 {MC}(主角名称)。
批注
启用 Include Annotations 时,生成的本地化文档会包含正在本地化的源脚本内容(命令或通用文本行),以及放置在它之前的任何注释。例如,给定此源脚本:
; Player has to pick route.
@choice "Go left" set:route="left"
@choice "Go right" set:route="right"
Narrator: You've decided to go {route}. Wise choice!— 生成的本地化文档将包含:
# id1
; > Player has to pick route.
; > @choice "|#id1|" set:route="left"
; Go left
# id2
; > @choice "|#id2|" set:route="right"
; Go right
# id3|id4
; > Narrator: |#id3|{route}|#id4|
; You've decided to go |. Wise choice!批注为翻译人员提供了本地化文本的上下文。请确保不要在翻译中包含批注行(以 ; > 开头的行)。只有以单个 ; 开头(不带 >)的行才需要翻译。
示例
本地化设置示例请参阅 本地化示例。如果您在项目中设置本地化时遇到问题,请将其用作参考。
电子表格
您可以将项目的所有剧本脚本和管理文本本地化汇总到电子表格中——例如,用于与翻译人员或编辑共享文本。
Spreadsheet 工具将可本地化文本提取到 .csv 表格中,并可将编辑后的表格导回项目。
在导出之前,请务必先使用本地化工具(Naninovel -> Tools -> Localization)生成本地化数据。您可以通过为 Locale Folder (output) 属性选择本地化根目录(Resources/Naninovel/Localization)来一次为所有语言环境生成资源。
本地化数据更新到最新后,通过 Naninovel -> Tools -> Spreadsheet 打开 Spreadsheet 工具。
指定所需的文件夹:
- Input Scripts Folder — 存储源
.nani脚本的文件夹(例如Assets/Scenario)。 - Input Text Folder — 生成 管理文本文档 的文件夹(例如
Assets/Resources/Naninovel/Text)。如果该文件夹缺失,请确保先通过工具生成管理文本文档。 - Input Localization Folder — 存储语言环境资源的本地化根目录(例如
Assets/Resources/Naninovel/Localization)。 - Output Folder — 生成或编辑后的表格的存放位置。
单击“Export”将表格导出到选定的目标位置。
每个脚本和管理文本文档将导出到一个单独的表格。每个表格都有一个存储可本地化文本 ID 的“key”列,以及每个语言环境各自的附加列。您可以修改除“key”之外的任何列;但是,修改源语言环境列对导入没有任何影响。
启用 Include Annotations 时,生成的表格还将包含带有源脚本内容(作者名称、内联命令和注释)的列。该列在导入期间会被忽略。
启用 Import Source 时,电子表格中的源语言环境列将直接写入剧本脚本。这便于将源剧本内容与译文一并校对。请注意,仅会重写已分配 ID 的文本,以保持其与现有翻译的关联。
编辑表格后,单击“Import”将数据导回项目。
警告
从电子表格导入时,项目本地化文档将被覆盖,因此在编辑电子表格期间请避免修改它们,以防止冲突。
自定义处理器
您可以注入自定义电子表格处理器以自定义表格生成和导入/导出过程。
通过继承内置的 Naninovel.Spreadsheet.Processor 创建自定义处理器类。该工具将自动选用您的自定义处理器来代替内置处理器。
下面是一个带有关键重写点的示例处理器:
using Naninovel.Spreadsheet;
public class CustomProcessor : Processor
{
public CustomProcessor (ProcessorOptions options) : base(options)
{
// 访问导出/导入选项,例如:
// options.ScriptFolder
// options.SourceLocale
// ...
}
// 重写脚本从项目导出到表格的方式。
protected override void ExportScripts () { }
// 重写管理文本从项目导出到表格的方式。
protected override void ExportText () { }
// 重写脚本从表格导入到项目的方式。
protected override void ImportScripts () { }
// 重写管理文本从表格导入到项目的方式。
protected override void ImportText () { }
}示例
有关如何设置和使用该工具的示例,请参阅 本地化示例。
UI 本地化
要本地化自定义和内置 UI,请使用 管理文本提供者 组件。它还可以用于本地化任何其他自定义游戏对象(预制件)。有关使用管理文本记录并对其进行本地化的更多信息,请参阅管理文本指南。
字体
要以某些语言显示文本,您需要兼容的字体。默认使用 Inter,它支持 Unicode 7.0 中的拉丁、西里尔和希腊字符。
提示
如果您计划用一种字体支持多种语言,请考虑 Noto 字体。
TMPro 打印机支持从右到左(RTL)语言(阿拉伯语、希伯来语、波斯语等),但需要额外的设置;有关详细信息,请参阅 指南。
面向 CJK 语言(中文、日文和韩文)发布时,请考虑使用 Character Extractor 实用程序来优化 TMPro 字体图集大小。请参阅 指南。
要将字体与特定语言环境关联,请使用 UI 配置中字体选项的 Apply On Locale 属性。分配后,每当在游戏设置中选择该语言环境时,字体将自动应用。
确保在文本打印机上正确设置了 Font Change Configuration。有关配置字体的说明,请参阅 UI 指南。
示例
有关设置本地化专用字体的示例,请参阅 本地化示例。
社区本地化
当已发布的游戏获得足够的人气时,社区可能希望贡献额外的本地化;这通常导致玩家破解构建资产以替换显示的文本。Naninovel 提供了一个运行时本地化选项,允许您在不篡改构建文件的情况下添加社区本地化。
弹出本地化资源
要生成本地化资源(脚本和管理文本文档),请使用 -nani-eject 参数运行游戏可执行文件,例如:
./game.exe -nani-eject这将像往常一样启动游戏,但在 Naninovel 初始化后,它会将本地化资源弹出到 Unity 持久数据目录 下的 Localization 目录。例如,如果公司名称是 Foo 且游戏标题是 Bar,Windows 上的弹出路径将是:
C:/Users/User/AppData/LocalLow/Foo/Bar/Localization如果您想基于内置本地化生成本地化资源,请将语言环境标签附加到 eject 参数。例如,假设游戏具有 ja-JP 本地化,请使用:
-nani-eject-ja-JP当未指定语言环境标签时,将弹出源语言环境的文档。
接下来,提供本地化要使用的字体。将字体文件放在 Localization 目录下,例如 Localization/Noto.ttf。
注意 Localization/Info.txt 文件。通过替换默认内容指定本地化的作者(第一行)和提供的字体名称(第二行)。例如:
Awesome Author
Noto.ttf— “Awesome Author”将默认显示在“Language”下拉菜单中(开发人员可以自定义)。字体将在游戏启动时默认应用。
不要删除或移动 Info.txt 文件,因为它是检测社区本地化是否存在所必需的。
翻译
文档弹出后,您可以开始翻译。过程类似于上面的“脚本本地化”和“UI 本地化”。脚本本地化文档存储在 Localization/Text/Scripts 中,而管理文本文档存储在 Localization/Text 中。
像往常一样重启游戏(不带 eject 参数),它将自动使用持久数据目录中的本地化资源。要使脚本本地化更改生效,必须重新加载关联的脚本(通常保存后再加载即可),但在某些情况下可能需要重启。
如果开发人员更新了游戏,您可以再次弹出以更新现有的本地化;将插入新行和记录,同时保留源内容未更改部分的现有翻译。
翻译完成后,共享“Localization”文件夹并指示玩家将其放置在上述持久数据目录下以激活本地化。要禁用本地化,请删除该文件夹。
编译器本地化
NaniScript 在领域特定语言中很特别,因为它与自然语言紧密交织在一起,即作者需要不断在输入显示给玩家的文字(打印的文本行)和引擎结构(命令和标签)之间切换。
只要您用英语创作剧本,这就不是问题,但是用其他语言工作的作者将不得不切换键盘布局来输入自然语言文本和基于英语的命令。更糟糕的是,某些布局可能没有所需的字符(例如 @),这就要求作者通过键码输入它们。
为了帮助用英语以外的语言创作剧本,Naninovel 提供了编译器本地化功能。它允许重新映射控制字符、命令和参数名称、常量,以及创作剧本时需要输入的几乎任何内容。
首先,通过 Create -> Naninovel -> Compiler Localization 创建编译器本地化资产。选择该资产,并指定编译器各项内容的本地化设置:
要覆盖命令、参数、查询和常量,请使用专用列表。您还可以本地化与命令和参数关联的文档和使用示例;这些将显示在 IDE 扩展中。
列表最初是空的。要使用项目中可用的命令和查询填充它们,请使用检查器上下文菜单。
进行所需的更改后,重新启动 Unity 编辑器并重新导入剧本脚本资产以使更改生效。
本地化后的内容会同步到故事编辑器和 IDE 扩展,并在元数据同步后用于自动补全和悬停文档。
示例
查看 编译器本地化示例,其中编译器已针对俄语及其键盘布局进行了本地化。