游戏UI框架设计(七)

转自:https://www.cnblogs.com/LiuGuozhu/p/7125662.html

游戏UI框架设计(7): 资源国际化技术

游戏UI框架设计(7)

--资源国际化技术

 

       说起“资源国际化”技术,个人认为可以追述到微软Window2000 PC操作系统的发布,在这之前windows98操作系统的开发都是先由美国总部出一个英文版本,然后在发布windows 版本之后的大约一年后,全世界其他语言版本的操作系统才能面世。 在这一年中,就是微软驻各个国家分公司的多语言版本的翻译工作,需要从操作系统的核心到外围软件,全部翻译为所在国家语言,不留死角。
       这种情况对于微软来说需要为多语言版本付出额外非常大的经济负担,据说2000年前微软从事多语言翻译的研发人员就多达300多人。 但是这个状况到了Window2000的发布,好像就可以做到全世界版本的同步发布,直到目前最新的Win10系统。这些变化就是Win2000的开发从一开始采用了“资源国际化”技术,来加速多语言版本的发布。
      不仅游戏行业,其实所有的IT研发行业也都存在多语言、多资源(图片、音频)等,资源国际化技术问题。这里个人仅仅从本游戏UI框架设计角度出发,设计一套非常简洁易懂的语言国际化策略,以供参考。
多语言版本的实现,最基本的原理就是根据ID去读取语言配置表,不同的语言新建一个语言配置表。以下是用Json 做的语言配置表:

游戏UI框架设计(七)     游戏UI框架设计(七)

     

        关于什么是Json 、如果读取Json 配置表等技术,请读者查看本UI框架系列博客的“游戏UI框架设计(五): 配置管理与应用”。
笔者在这里定义了一个语言管理器(LanguageMgr)类,系统框架启动后,按照默认规则从Json 配置文件读取“键值对”,存储到LanguageMgr类的一个“字典类“中。然后应用此UI框架的客户端程序,根据一个ID号通过LanguageMgr类的一个静态方法,查找到需要输出的文字内容。以下是LanguageMgr.cs 文件代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

/***

 *

 *    Title: "SUIFW" UI框架项目

 *           主题: 语言国际化

 *    Description:

 *           功能: 使得我们发布的游戏,可以根据不同的国家,显示不同的语言信息。

 *                 

 *    Date: 2017

 *    Version: 0.1版本

 *    Modify Recoder:

 *   

 *  

 */

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

 

namespace SUIFW

{

    public class LauguageMgr {

        //本类实例

        public static LauguageMgr _Instance;

        //语言翻译的缓存集合

        private Dictionary<stringstring> _DicLauguageCache;

 

 

 

        private LauguageMgr()

        {

             _DicLauguageCache=new Dictionary<stringstring>();

             //初始化语言缓存集合

             InitLauguageCache();

        }

 

        /// <summary>

        /// 得到本类实例

        /// </summary>

        /// <returns></returns>

        public static LauguageMgr GetInstance()

        {

            if(_Instance==null)

            {

                _Instance=new LauguageMgr();

            }

            return _Instance;

        }

 

        /// <summary>

        /// 到显示文本信息

        /// </summary>

        /// <param name="lauguageID">语言的ID</param>

        /// <returns></returns>

        public string ShowText(string lauguageID)

        {

            string strQueryResult = string.Empty;           //查询结果

 

            //参数检查

            if (string.IsNullOrEmpty(lauguageID)) return null;

 

            //查询处理

            if (_DicLauguageCache != null && _DicLauguageCache.Count>=1)

            {

                _DicLauguageCache.TryGetValue(lauguageID, out strQueryResult);

                if (!string.IsNullOrEmpty(strQueryResult))

                {

                    return strQueryResult;

                }

            }

 

            Debug.Log(GetType() + "/ShowText()/ Query is Null!  Parameter lauguageID: " + lauguageID);

            return null;

        }

 

        /// <summary>

        /// 初始化语言缓存集合

        /// </summary>

        private void InitLauguageCache()

        {

            IConfigManager config = new ConfigManagerByJson("LauguageJSONConfig");

            if (config!=null)

            {

                _DicLauguageCache = config.AppSetting;

            }

        }

 

 

    }

}

 

以上原理说明白后,具体的客户端程序可以通过改变Json配置文件,动态的改变UI界面文字语言。调用效果如下图:

游戏UI框架设计(七)

游戏UI框架设计(七)