游戏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的反馈,基本上抽空全部处理了,大 ...
随机推荐
- 二、 添加控制器Controller(ASP.NET MVC5 系列)
MVC是Model-View-Controller的简写.MVC是一种开发良好架构,可测试,易维护应用程序的设计模式.据于MVC的应用程序应该包含: Models: 是呈现应用程序数据和使用验证逻辑给 ...
- ArrayList构造方法源码分析
首先看一下无参的构造方法: private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; transient Object ...
- 使用Post方法模拟登陆爬取网页
最近弄爬虫,遇到的一个问题就是如何使用post方法模拟登陆爬取网页.下面是极简版的代码: import java.io.BufferedReader; import java.io.InputStre ...
- ELK安装与配置
ELK介绍 日志主要包括系统日志.应用程序日志和安全日志.系统运维和开发人员可以通过日志了解服务器软硬件信息.检查配置过程中的错误及错误发生的原因.经常分析日志可以了解服务器的负荷,性能安全性,从而及 ...
- css因Mime类型不匹配而被忽略,怎么解决
问题:在火狐.谷歌都可以正常显示出来,在别人的IE浏览器上也可以正常显示出来,但是在自己的ie浏览器就完全不能加载的熬样式了 控制台报告 SEC7113: CSS 因 Mime 类型不匹配而被忽略 答 ...
- javascript基础-闭包
原理 函数里包含函数,即闭包. 包含函数的结果是,子函数会挟持父函数的活动对象.子函数在访问一个变量时,先读自身的活动对象,是否包含此变量,没有从父函数里找,还没有,去祖函数,层层回溯,直到windo ...
- 将 FFmpeg 移植到 Android平台 (完整版)
首先需要去FFmpeg的官网http://www.ffmpeg.org/去下载FFmpeg的源码,目前的版本号为FFmpeg3.3(Hilbert). 下载的文件为压缩包,解压后得到ffmpeg-3. ...
- Warning: session_start() [function.session-start]: Cannot send session cache limiter
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers alrea ...
- “织梦”CMS注入高危漏洞情况
"织梦"CMS注入高危漏洞情况 作者: 时间:2014-04-17 "织梦"CMS是由上海卓卓网络科技有限公司研发的一款网站建站系统软件,又称&quo ...
- 在linux下利用信号量实现一个写者线程多个读者线程
#include<pthread.h> #include<string.h> #include<stdlib.h> #include<stdio.h> ...