UE4+Locailzation本地化

UE4本地化

前言

环境

UE4版本 4.27.2

关于文化(cultures)

文化名称(IETF语言标记)由三个连字符分隔的部分组成

  1. 两个字母的ISO 639-1语言代码(例如“zh”)。
  2. 可选的四字母ISO 15924字符集代码(例如“Hans”)。
  3. 可选的双字母ISO 3166-1国家和地区代码(例如“CN”)。

当UE4查找特定文化的本地化数据时,它会将它们从最大特定到最不特定。例如:

zh-Hans-CN被处理为“zh-Hans-CN”,然后是“zh-CN”,然后是“zh-Hans”,然后是“zh”。

en-GB被处理为“en-GB”,然后是“en”。

为了实现特定文化的最广泛覆盖,请使用有效的最不具体的文化代码。使用“zh-Hans”进行简化本地化,使用“zh-Hant”进行传统本地化。

工具说明

默认创建工程并不会有本地化目标。本地化流程工具有两种调用方法

  1. 本地化控制板界面 Localization Dashboard
  2. 使用 Unreal Automation Tool (UAT)的Localize脚本。具体使用请看Localization Tools

Localization Dashboard

如果没有此选项,请按下图中打开

主界面分部分详解

  1. 本地化游戏目标,默认会创建一个,如果要创建新的本地化目标,请确保为其指定适当的加载策略(图上为2,通常为game或者always)。如果不这样做,则本地化目标不会在运行时加载。
  2. 本地化加载策略,纯运行的模块一般要设置为game或者always,默认为Never,是永不加载的,编辑器模块的一般选Editor,避免运行时加载浪费内存
  3. 选择要过滤的属性
  4. 文本文件,代码相关,如有不是c++项目,这里这不勾,不然可能会报错,中间内容包括添加搜索文本的目录,排除的目录
  5. 从包收集文本,蓝图等UE二进制资源,一样配置搜索目录和排除目录即可
  6. 从元数据收集文本,如果要翻译变量名,分类,工具提示等就勾上

  1. 所有语言进行的操作,具体的每个操作说明会后面在文本本地化 中说明,资源本地化无需用到
  2. 已添加需要翻译的地区语言,后面是每个语言单独可操作的Action
  3. 点击添加一种新的语言

本地化目标分布

前面工具说明1提到的目标添加,每个目标都会在本地生成一些配置和数据,本地化的大致原理如下:

本地化流程是基于本地化目标来进行工作的,要实现本地化,必须要有本地化目标并且加载本地化目标。本地化目标指的是经过命名的独立的本地化数据模块。目标中的文本是从一组特定来源中收集,存储在 Manifest 文件内,在针对特定语言文化 (Culture) 的存档文件(Archives)中翻译,编译成针对特定语言的本地化资源文件(LocRes),然后由系统加载以供显示。

目标创建的注意和使用

一个项目可以只有一个目标以便简化实施,也可以有多个目标以便将项目的本地化数据分成各个独立部分。Unreal 编辑器就有一个独立于虚幻引擎其他部分的目标,因此可以在对编辑器进行本地化的同时,避免将编辑器的本地化数据随游戏一起分发。通常来讲,游戏会用一个目标用于游戏本体的本地化数据,并使用额外的目标来实现游戏的扩展包内容

本地化目标由两部分组成:其配置(存储在Config/Localization/)及其数据(存储在Content/Localization/{TargetName}/)

资源本地化操作

前面有大概说明了本地化工具的使用,其实这个工具主要是针对文本本地化的操作,但是资源本地化跟这个工具生成的配置有依赖,所以需要说明一下,如果只是资源本地化的话,只需要添加要本地化的语言,然后选择下图Compile Text,会对所有语言编译二进制文件

这一步是为了生成各个语言的数据,也就是在Content/Localization/{CultureName}/文件夹, 需要保证每个语言文件夹不为空,最好是.Locres文件存在,上面Compile按理就会生成,然后开始分配每个资源的本地化

右键需要本地化的资源,然后如图分配语言

然后会生成一份副本在指定目录,您只需要替换这个资源,然后保证名字与原资源一致,生成目录会在/Game/L10N/{Culture}/{MyFolder}/{MyAsset}

如果要查看本地化资产

资产组

有时候需要某些资源使用其他语言,比如声音使用英文,文字使用中文等,这个时候可以把一些资产组成一个组,然后分配单独的文化

创建资产组

下面我们以音频资产作为示例:

要创建资产组,请在DefaultGame.ini类型的配置文件中设置如下内容

[Internationalization.AssetGroupClasses]
+Audio=SoundWave
+Audio=SoundCue

这里添加了SoundWave和SoundCue两种类型的资源,这个资产组的名字叫Audio

设置资产组的方式在后面设置文化语言 说明

独立窗口测试

在编辑器中可测试本地化效果,只能通过独立窗口模式测试

修改编辑器偏好设置,在独立窗口情况下增加启动参数 -culture=en

-culture=后边跟着的参数名字其实就是你添加的语言的简写,把鼠标放在本地化功能列表中语言名字上,tips框中会显示对应名字

文本本地化

概念说明

文本本地化的主要组件就是FText类,本地化文本由命名空间,键名,源字符串,和显示字符串组成,通过命名空间和键名能为文本定义唯一的索引

命名空间:通常表示用来当前所在的游戏模块,比如某一个页面 通过使用不同的命名空间,可以帮助在不同上下文的环境下同样的文本单来表达不同的意思

**键名:**提供了与文本有关的特定上下文

**源字符串:**是尚未翻译原文形式的字符串,通常是作为翻译的验证

**显示字符串:**是将要呈现的字符串形式,通常是根据源字符串翻译而来

创建可本地化的文本

C++中创建:使用LOCTEXT系列宏在C ++中创建文本文字

|
| 宏

NSLOCTEXT
LOCTEXT

简单来说使用NSLOCTEXT 可直接单独定义命名空间,LOCTEXT需要在前面加上宏定义,然后中间的文本都是用宏定义的命名空间,无需每次指定

在INI文件中创建:

可以使用NSLOCTEXT宏语法在INI文件中创建文本文字

UE资产中(蓝图等):

可以使用FText属性创建文本文字。将自动为您生成密钥,但您可以使用文本字段旁边的高级组合为文本定义自定义命名空间或密钥。使用默认命名空间或密钥也很好

配置文本本地化工具

前面工具说明 中有说明过,只需要配置Gather from Text Files和Gather from Package的搜索路径即可,可搭配排除路径去搜索到需要翻译的文本

翻译文本流程

上述配置完以后,主要操作都在Cultures中

  1. 先添加你需要翻译的语言地区和你本地文本默认的语言地区,然后

点击对应语言前面的小点设置本地使用的语言,这个Native 设置完以后收集完文本后会默认翻译

  1. 然后点击 Gather Text,收集本地需要翻译的文本,成功后

点击OK,如果有文本的话,下面文化列表会显示成

我默认语言是中文,后面的橙色进度条代表翻译的完成度,所以默认语言已显示完成10%

  1. 开始翻译文本, 这里有两种方式,一种是直接在UE工具中翻译,一种是导出使用第三方工具翻译
  2. UE工具翻译: 点击 每个文化语言后面

Untranslated显示未翻译的列表

NeedsReview需要重新确认,审查的文本列表

Completed已翻译的文件列表

在Translation 中写入翻译后的文本即可,然后点击保存

自行导出翻译

第一项是导出当前全部地区,第二项是导出指定地区的文本,选择路径导出后会生成.po格式文件,是包含要翻译的每种文化文本以及当前翻译的文件,是一种通用格式,可直接手动编辑

但是不建议这么干,这里建议使用 Poedit 翻译工具去进行编辑,里面功能很齐全,包括自动翻译,翻译提示,多人协同等

编辑完保存后,直接导入即可,按照你导出的方式,再导入即可

  1. 统计翻译文本

  1. 编译翻译文本

编译成功后会在Content{Target}{Culture}中.locres格式文件,代表翻译文本成功,游戏运行时本地化才会生效

TIPS: 可能会遇到不想使用PO格式文件编辑的情况,比如想用Excel之类的,这里推荐把po文件转换成excel/csv格式的文件就行了,网上有一堆Python转换的代码之类的,比如 poxls · PyPI,我们是自己写的python脚本,需要的可以下面留言讨论交流

本地化打包相关设置

翻译完了以后除了可以在引擎中直接测试独立窗口测试,当然也要把我们翻译过的文本打包到平台包里,下面会介绍打包相关设置,不设置文本本地化是不会生效的,还有重要的一步就是在游戏中设置我们翻译的文化设置文化语言

在localization to package中把需要打包进去的语言勾选上,Internationalization Support选择EFIGSCJK(多语言集合),

OK,至此本地化文本的部分全部结束,Enjoy it

设置文化语言

在运行时管理活动的文化

在运行时管理活动的文化

对文化的管理有三种情况:

1.language: language控制使用的本地化数据,包括文本翻译和一般的本地化资产。、

2.locale: 区域设置是用来控制数字/日期/时间/等的格式化。

3.Asset group culture: 这个控制特定资产组中的资产所使用的文化。

你可以通过SetCurrentCulture一次性将所有这些都设置成一种文化。但如果你需要使用单独的资产组,比如使用另一种文化的音频。那么你单独设置,且 在这个之后,不然会被覆盖

获取当前文化信息:

| GetCurrentLanguage
| 获取language当前使用的文化的IETF语言标记

GetCurrentLocale
获取locale当前使用的文化的IETF语言标记
GetCurrentAssetGroupCulture
获取指定资产组当前使用的文化的IETF语言标记
GetDefautCulture
获取系统指定的文化的IETF语言标记
GetNativeCulture
获取“本地”文化的IETF语言标记
GetLocalizedCultures
获取可用的文化。指在项目中添加的所有文化的IETF语言标记
GetSuitableCulture
从可用文化列表中获取最合适的文化的IETF语言标记。
GetCultureDisplayName
从IETF语言标记中获取文化的显示名称。比如zh在中文中显示为中文,在英文中显示chinese

设置正在使用的文化

| SetCurrentCulture
| 使用IETF语言标记将language,locale,和所有资产组都设置成指定文化

SetCurrentLanguage
使用IETF语言标记设置language为指定文化
SetCurrentLocale
使用IETF语言标记设置locale为指定文化
SetCurrentLanguageAndLocale
使用IETF语言标记设置language和locale为指定文化
SetCurrentAssetGroupCulture
使用IETF语言标记设置特定的资产组为指定文化
ClearCurrentAssetGroupCulture
清空指定资产组的文化,并使用当前language使用的文化

上面设置API可在c++和蓝图中调用,位置KismetInternationlizationLibrary.h中声明,这些API主要用于动态改变现有文化,上述Set语言的API有一个SavetoConfig参数,如果你需要更改后下次运行依然生效,可把这个设置为ture

如果你在运行时改变文化,本地化文本将重新加载,但本地化资产并不会在重新加载!!。已经加载过的资源将继续使用原有文化的本地化资源,还未加载的资源在加载时,将使用新的文化的本地化资源。 如果您计划在运行时支持动态文化更改,则可能需要重新启动游戏才能使这些更改生效。重新启动游戏会清除并重新加载本地化的资产

如果不需要动态修改,只是单独发布指定地区的版本包,可在ini配置中默认配置

项目的默认设置通常在DefaultGame.ini中定义,也可以在DefaultGameUserSetting.ini中定义,且DefaultGameUserSetting中的优先级更高

示例:全部设置成中文

[Internationalization]
culture=zh

语言,地区,资产组分别设置

[Internationalization]
language=zh
locale=zh
[Internationalization.AssetGroupCultures]
+Audio=ja

IOS平台本地化

设置iOS 本地化

本地化iOS项目中的”plist”和”NSLocalizedString” | 虚幻引擎文档 (unrealengine.com)

iOS 本地化配置只有在Mac机上打的iOS 15包才会生效,远程打包不会生效

其他本地化

字体,对话等,用到时再补充

总结:上面基本包含了文本和图片等的本地化全部流程处理,其他资源本地化我们暂时没用到,后面再补充,但是原理基本一样,文章写的仓促,可能有纰漏的地方,有问题可在下面留言讨论,End~