在正式介绍多语言本地化方案之前,先介绍一点点的冷知识。如果与国际接轨那么有一个词是绝对绕不开的:ISO(国际标准组织)。
而ISO 639-1的标准就定义了这个世界绝大部分国家或者地区的简写代码。
ISO 639-1在 2002年成为正式标准,但在之前的[草拟]阶段已被使用多年。最后加进ISO 639-1的代码是在2004年10月19日加入的si,代表僧加罗语。由1995年3月起,RFC 1766推荐使用本标准,而接着在2001年1月起的RFC 3066亦推荐使用本标准。Infoterm(International Information Center for Terminology)是ISO 639-1代码的注册机构。——百度百科
而在面向全球发行的游戏研发中,也不得不考虑地区相关的一致性,不管是硬件设备的系统语言还是商店上架发行的地区,都需要对地区做出规划和识别。
以下是截取的一部分国家和地区简写,在639-1的标准中,都是2个字母表示地区,而随后的-2和-3的版本中则允许使用三位。
(未截取完整)
但这里稍微有点坑的地方是Unity并没有遵守这一准则。Unity读取系统语言的方式如下:
SystemLanguage是一个枚举,状态如下:
不仅命名奇怪,而且数量很少。具体可以跳转到如下地址:
https://docs.unity3d.com/ScriptReference/SystemLanguage.html
所以为了保持和国际接轨,我们需要一个转换函数将其转换到ISO标准之下,同时所有的策划配置表也走ISO标准。
比如这张表就配置了相关的语言情况,以及一些基本的配置。其中默认语言是指由策划配置的某一个渠道包所支持的默认语言种类,而是否提供语则表示改地区是否提供本地化语言,这个在后面的语言优先度里再具体说。
同样,我们的语言表也会针对该标准进行文本转译。
当语言简写相关的设定完成之后,我们需要做的就是如何根据本机语言和发行地区给玩家提供最正确的选择。
我们大概的逻辑是,本地缓存过的选择>策划预定>系统当前语言(前提是游戏也提供了)>英文。之所以做这个逻辑抉择也有一些考量因素。
首先,如果本地缓存过,则代表玩家在以下界面手动选择过语言版本,也就代表这是玩家最主观的需求,其他的都不重要。
而如果玩家没有选择过,或者首次进入游戏,则需要判定该包是预期发往哪个地区,也就是默认想要给地区使用的语言。这里之所以不直接进行系统语言判定是因为,海外很多手机都是来自于不同国家,有很多甚至是二手机,水货机器,也许手机本身不提供当地语言,但我们的包在发行时候是指定覆盖盖地区的,自然也会优先考虑地区的官方语言。
如果策划或者运营忘记设置,或者不太清楚该地区的语言,又或者因为BUG导致没有读取到默认,则优先从提供的语言里找出一种,如果该语言恰好和手机语言吻合(大部分玩家的手机语言还是和自己的语言吻合的),直接使用。如果不是,则优先使用英文,直到该玩家进游戏后手动设置。
本节内容比较简单,只是大概讲了一个小点,如何在启动时候确定当前使用的语言种类,后面的内容会针对多语言的其他要点进行升级改造,以符合当前选中的语言类别。