游戏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的反馈,基本上抽空全部处理了,大 ...
随机推荐
- javascript之深入剖析this
this的重要性不言而喻,比如面试题经常考到,其次,如果彻底理解了this,那么对理解框架源码及编写高质量代码都有很大的帮助.本文就是要深入剖析this的几种情况,理解了原理,以后妈妈再也不用担心你的 ...
- 简单RPC框架-基于Consul的服务注册与发现
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- STM32的RFID射频读写控制装置
,大二上学期做的,过了很久,先上一下图: 这并不是做个最后一版:主体是RC552+STM32+1062:蜂鸣器,继电器,LED等:反正最后的效果就是,刷一下卡,1602显示一下持卡人(需要提前注册,注 ...
- Submin1安装记录(CentOS5)
安装SVN和Apache wget http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco -O /tmp/RPM-GPG-KEY-WANdisco & ...
- Asp.Net Core MVC项目实现多语言(Globalization/Localization)
正好最近手上在给一个Razor MVC项目实现一个多语言功能,叫Globalization也好,Localization也好,whatever.最终要实现的效果呢,就是一键切换全站语言,并且开发的时候 ...
- Redis基本数据结构总结之STRING和LIST
Redis基本数据结构总结前言 Redis的特点在于其读写速度特别快,因为是存储在内存中的,其非常适合于处理大数据量的情况:还有一个是其不同于其他的关系型数据库,Redis是非关系型数据库,也就是我们 ...
- [原创]adb使用教程v1.0-----by-----使用logcat快速抓取android崩溃日志
原文再续,书接上回:<使用logcat快速抓取android崩溃日志>中提到的工具包可以下载拉~ <使用logcat快速抓取android崩溃日志>:http://www.cn ...
- 踩一踩微信小程序开发的坑---tabBar
最近忙于开发视频直播的项目,小程序学习也放置了两三个星期了,web开发者工具更新到新版,发现上个版本做的demo不显示了
- Datatable插件的简单的使用方式 和 学习方式
gridyxz = $("#sjjg_table_yxz").DataTable({ "searching" : false, "info&quo ...
- 【MyBatis源码解析】MyBatis一二级缓存
MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级),尤其是对于一些相 ...