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

关于什么是Json 、如果读取Json 配置表等技术,请读者查看本UI框架系列博客的“游戏UI框架设计(五): 配置管理与应用”。
笔者在这里定义了一个语言管理器(LanguageMgr)类,系统框架启动后,按照默认规则从Json 配置文件读取“键值对”,存储到LanguageMgr类的一个“字典类“中。然后应用此UI框架的客户端程序,根据一个ID号通过LanguageMgr类的一个静态方法,查找到需要输出的文字内容。以下是LanguageMgr.cs 文件代码:
/***
*
* 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<string, string> _DicLauguageCache; private LauguageMgr()
{
_DicLauguageCache=new Dictionary<string, string>();
//初始化语言缓存集合
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框架项目,特提供源码下载链接:https://pan.baidu.com/s/1eTA8rHS 密码:4x6e
大家有任何技术问题,请在以下留言,谢谢!
游戏UI框架设计(7): 资源国际化技术的更多相关文章
- 游戏UI框架设计(一) : 架构设计理论篇
游戏UI框架设计(一) ---架构设计理论篇 前几天(2017年2月)看到一篇文章,国内王健林.马云等大咖们看好的未来十大最有"钱途"产业中,排名第一的就是"泛娱乐&qu ...
- 游戏UI框架设计(五): 配置管理与应用
游戏UI框架设计(五) --配置管理与应用 在开发企业级游戏/VR/AR产品时候,我们总是希望可以总结出一些通用的技术体系,框架结构等,为简化我们的开发起到"四两拨千金"的作用.所 ...
- 游戏UI框架设计(6): 消息传递中心
游戏UI框架设计(6) --消息传递中心 最近一直忙于一个益智类游戏的研发工作,所以博客有段时间没有更新了.经过朋友的督促,决定这两天立刻完成最后的两篇博客讲解(UI框架).说起“消息传递中心”,或者 ...
- 游戏UI框架设计(二) : 最简版本设计
游戏UI框架设计(二) --最简版本设计 为降低难度决定先讲解一个最简版本,阐述UI框架的核心设计理念.这里先定义三个核心功能: 1:UI窗体的自动加载功能. 2:缓存UI窗体. 3:窗体生命周期(状 ...
- 游戏UI框架设计(三) : 窗体的层级管理
游戏UI框架设计(三) ---窗体的层级管理 UI框架中UI窗体的"层级管理",最核心的问题是如何进行窗体的显示管理.窗体(预设)的显示我们前面定义了三种类型: 普通.隐藏其他.反 ...
- 游戏UI框架设计(四) : 模态窗体管理
游戏UI框架设计(四) --模态窗体管理 我们在开发UI窗体时,对于"弹出窗体"往往因为需要玩家优先处理弹出小窗体,则要求玩家不能(无法)点击"父窗体",这种窗 ...
- 《开源框架那些事儿22》:UI框架设计实战
UI是User Interface的缩写.通常被觉得是MVC中View的部分,作用是提供跟人机交互的可视化操作界面. MVC中Model提供内容给UI进行渲染,用户通过UI框架产生响应,一般而言会由控 ...
- 自己动手设计并实现一个linux嵌入式UI框架(设计)
看了"自己动手设计并实现一个linux嵌入式UI框架"显然没有尽兴,因为还没有看到庐山真面目,那我今天继续,先来说说,我用到了哪些知识背景.如:C语言基础知识,尤其是指针.函数指针 ...
- Cocos Creator 通用框架设计 —— 资源管理优化
接着<Cocos Creator 通用框架设计 -- 资源管理>聊聊资源管理框架后续的一些优化: 通过论坛和github的issue,收到了很多优化或bug的反馈,基本上抽空全部处理了,大 ...
随机推荐
- Bootstrap实现轮播图
第一步:设计轮播图容器:div.carousel,添加slide平滑切换,并定义id,方便后面采用data属性来触发 <div class='carousel slide' id="t ...
- 多参数请求 C# webApi
今天在写项目然后发现了一个 webapi 的一个小功能 可能有些人 不知道 所以顺手分享一下 希望大牛不要喷... webapi 创建的时候 的 get 请求 默认模板是俩个 一个不带参数的Get ...
- 论MySQL何时使用索引,何时不使用索引
索引: 使用索引可快速访问数据库表中的特定信息.索引是对数据库表中一列或多列的值进行排序的一种结构,例如 employee 表的姓(name)列.如果要按姓查找特定职员,与必须搜索表中的所有行相比,索 ...
- struts2.1.6教程二、struts.xml配置及例程
1.配置文件的优先级 在struts2中一些配置(比如常量)可以同时在struts-default.xml(只读性),strtus-plguin.xml(只读性),struts.xml,struts. ...
- 导入数据到mysql服务器上,报错,以及停止的解决办法
两次都是因为磁盘不够,这次得以解决: =>下面是可能会用到的命令行: 1.查看磁盘占用大小: df -hl 发现: 从上面看出来,根目录 / 下的东西沾满了 /dev/sda1 但是 / ...
- 记一次利用AutoMapper优化项目中数据层到业务层的数据传递过程。
目前项目中获取到DataSet数据后用下面这种方式复制数据. List<AgreementDoc> list = new List<AgreementDoc>(); ].Row ...
- 隐马尔科夫模型HMM(一)HMM模型
隐马尔科夫模型HMM(一)HMM模型基础 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数(TODO) 隐马尔科夫模型HMM(四)维特比 ...
- mysql之 MySQL 主从复制概述
1 .主从复制简介MySQL 主从复制就是将一个 MySQL 实例(Master)中的数据实时复制到另一个 MySQL 实例(slave)中,而且这个复制是一个异步复制的过程.实现整个复制操作主要由三 ...
- div+css的属性
div+css的属性 gCascading Style Sheet 层叠式样式表 ==> 层叠样式表 Internal Style Sheet 内部样式表 External Style Shee ...
- dede系统自定义变量删除方法
之前添加了个联系电话的系统变量,忘记写描述,结果就显示个冒号,很难看.这样的就要删除了重来,那么织梦怎么删除添加的变量呢?其实很简单.两种方法: 第一种:执行SQL语句.在织梦后台执行-系统-SQL命 ...