UE的本地化

前文说了UE的简单UI和交互,到这里为止,应该简单的模拟本地单机登录到角色创建再到进入世界主地图应该都没有什么问题了!

但是项目在实际开发的时候,我们还需要考虑一下多语言之类的本地化!

UE内置了一套挺不错的本地化工具!官方link

在说正题之前,要提醒一下

配置也可以不通过Editor界面生成,但是这里是入门,就怎么简单怎么来!

文本的本地化

一步一步来,有些需求UE还是没有满足的,这个工具只是提供一种比较通用的。之前和朋友聊过(只能说他想要的太多了~欲求不满)!

启动本地化

需要先在编辑器中确定本地化工具是否已经开启了!

png

确定已经启动的话,就可以通过Window->Localization Dashboard打开工具界面

png

png

上图就是本地化工具的界面!

  • 红框1

配置;这里可以理解成你要将整个本地化划分为几个模块(一个模块一个配置)

eg: 程序员使用的是一份配置,美术资源的是一份配置(上图我的配置就是这样!)

  • 红框2

Gather Text里有三个大类!

Gether from Text Files 是检索文本类资源的,从中提取出需要翻译的词

Gather from Packages 是检索package(我也不知道这个要怎么翻译,资源总觉得不对)的,比如uasset,umap的资源(默认也是这两个);从中提取出需要翻译的词

Gather from Meta Data是指从元数据中的,(目前我基本没有用到!)

  • 红框3

这里是工具的基本操作了~

Gather Text 遍历获取所有要翻译的词!(注意,切换Culture后本地还是有的,你也可以重新生成、导入) Compile Text 虽然说是编译,但是我比较喜欢应用和生效,简单说就是将你翻译后的本地化能在运行时生效 其他的导入导出后面说!

  • 红框4

这里可以添加多种语言!在右侧还能直接展示翻译后的词条(也可以修改),也能看到该词条的引用处!

png

简单的生成后,接下来就是使用了~

切换本地化

上图好过说话!

png

修改Preview Game Language后,使用Standalone Game启动就可以看到效果了!

png

导出本地化配置

导出有几种方式

  • 单独导出某个配置的其中一种语言
  • 导出某个配置的所有语言
  • 导出所有配置的所有语言

png

上图是我导出所有的配置的!

#. Key:	5DCB8D944172677EFB7B5F9488A87FCA
#. SourceLocation:	/Game/UIs/Login/BP_Login_UI.BP_Login_UI_C:WidgetTree.RichTextBlock_142.Text
#: /Game/UIs/Login/BP_Login_UI.BP_Login_UI_C:WidgetTree.RichTextBlock_142.Text
msgctxt ",5DCB8D944172677EFB7B5F9488A87FCA"
msgid "press a to Login"
msgstr "按回车键或者LT/RT登录"

意思就是ue会根据内容分配一个key,这就代表着,它对于同一个单词,都会有多个重复的!!!

再说说其相关的配置

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

png

导入本地化配置

导入就简单很多了~一般是将我们外部翻译好的,重新导入到引擎内部使用!

这个操作是和导出对应的,可以是单个文件,也可以是一个文件夹(但是需要注意文件夹的目录结构和名称!

固有资源的完整替换

首先是在Content目录下创建一个L10N的目录

默认情况下,内容浏览器中隐藏了本地化资产。单击“ 查看选项”>“显示本地化资产”以查看它们。

png

然后就在L10N目录下创建不同语言的目录,资源就可以放置在不同的语言下了!

比如

原来资源是在/Game/UIs/Login/UI_LoginMain_BP的(/Game就是Content目录!)

进行enzh-Hans本地化后,目录是/Game/L10N/en/UIs/Login/UI_LoginMain_BP/Game/L10N/zh-Hans/UIs/Login/UI_LoginMain_BP

注意,我测试的时候,如果/Game/UIs/Login/UI_LoginMain_BP/Game/L10N/en/UIs/Login/UI_LoginMain_BP(其中任意一个)同时存在的时候,就会报错!

其他资源的我还没有测试!

程序的动态文本

程序开发如果需要使用的挺简单的!

// 定义要与LOCTEXT一起使用的命名空间
// 这只在单个文件中有效,并且必须在文件结束前取消定义
#define LOCTEXT_NAMESPACE "MyNamespace"
// 创建文本文字值
constFTextHelloWorld= NSLOCTEXT("MyOtherNamespace","HelloWorld","Hello World!")
constFTextGoodbyeWorld= LOCTEXT("GoodbyeWorld","Goodbye World!")
// 在文件结束前取消定义命名空间
#undef LOCTEXT_NAMESPACE

其他的可以去官网看看,这里就不在多说!

https://docs.unrealengine.com/4.27/zh-CN/ProductionPipelines/Localization/Formatting/