Unity3D研究之多语言用中文做KEY
做多语言的时候用中文做KEY绝对是有100%的优点,假设用英文表示那么代码里面给文字赋值的地方全都是英文。写的代码多了以后维护起来就没有人能看懂了,或者看起来非常费劲。
对PoolManager不了解的能够看下初探PoolManager插件非常适合新手学习。
说说用中文做KEY的原理:Unity中给文字赋值的地方就两处, 一个是提前预制在UI Prefab上的文字。另一个是写在代码里面的文字。那么在开发阶段我们在Prefab和代码里面直接就写中文,等项目后期通过工具把所有中文的地方所有提取出来。然后把提取出来的中文交给策划。让策划他们去翻译去,这样我们之前写的中文就是多语言的KEY。终于显示的界面上的文字是用这个中文KEY读表读出来的。
NGUI里全部的文字都是在UILabel中,但是我们要做图文混排,一般都是在UILabel上在拓展一个自己的脚本,用这个脚本在生成相应的UILabel和UISprite。这篇文章我就先以UILabel来说明原理。
1.遍历全部UIPrefab把包括UILabe(或者是你自己写的)组件找出来,而且把文字提取出来。
2.遍历全部的CS代码。把全部 StrUtil.GetText(“成功智慧网\n我要换行“); 双引號中间的中文以及字符全部提取出来。
直接上思路代码。
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
public class TestStart :Editor
{
//UIPrefab文件夹文件夹
private static string UIPrefabPath = Application.dataPath + "/UI";
//脚本的文件夹文件夹
private static string ScriptPath = Application.dataPath + "/Scripts";
//导出的中文KEY路径
private static string OutPath = Application.dataPath +"/out.txt";
private static List<string>Localization = null;
private static string staticWriteText = "";
[MenuItem("Tools/导出多语言")]
static void ExportChinese()
{
Localization = new List<string>();
staticWriteText ="";
//提取Prefab上的中文
staticWriteText +="----------------Prefab----------------------\n";
LoadDiectoryPrefab(new DirectoryInfo(UIPrefabPath));
//提取CS中的中文
staticWriteText +="----------------Script----------------------\n";
LoadDiectoryCS(new DirectoryInfo(ScriptPath));
//终于把提取的中文生成出来
string textPath = OutPath;
if (System.IO.File.Exists (textPath))
{
File.Delete (textPath);
}
using(StreamWriter writer = new StreamWriter(textPath, false, Encoding.UTF8))
{
writer.Write(staticWriteText);
}
AssetDatabase.Refresh();
}
//递归全部UI Prefab
static public void LoadDiectoryPrefab(DirectoryInfo dictoryInfo)
{
if(!dictoryInfo.Exists) return;
DirectoryInfo []chindDictoryInfos = dictoryInfo.GetDirectories();
foreach(DirectoryInfo chindDictoryInfo in chindDictoryInfos)
{
LoadDiectoryPrefab(chindDictoryInfo);
}
FileInfo[] fileInfos = dictoryInfo.GetFiles("*.prefab", SearchOption.AllDirectories);
foreach (FileInfo files in fileInfos)
{
string path = files.FullName;
string assetPath = path.Substring(path.IndexOf("Assets/"));
GameObject prefab = AssetDatabase.LoadAssetAtPath(assetPath, typeof(GameObject)) as GameObject;
GameObject instance = GameObject.Instantiate(prefab) as GameObject;
SearchPrefabString(instance.transform);
GameObject.DestroyImmediate(instance);
}
}
//递归全部C#代码
static public void LoadDiectoryCS(DirectoryInfo dictoryInfo)
{
if(!dictoryInfo.Exists) return;
DirectoryInfo []chindDictoryInfos = dictoryInfo.GetDirectories();
foreach(DirectoryInfo chindDictoryInfo in chindDictoryInfos)
{
LoadDiectoryPrefab(chindDictoryInfo);
}
FileInfo[] fileInfos = dictoryInfo.GetFiles("*.cs", SearchOption.AllDirectories);
foreach (FileInfo files in fileInfos)
{
string path = files.FullName;
string assetPath = path.Substring(path.IndexOf("Assets/"));
TextAsset textAsset = AssetDatabase.LoadAssetAtPath(assetPath, typeof(TextAsset)) as TextAsset;
string text = textAsset.text;
//用正則表達式把代码里面两种字符串中间的字符串提取出来。
Regex reg = new Regex("StrUtil.GetText\\(\".*?\"");
MatchCollection mc = reg.Matches(text);
foreach(Match m in mc)
{
string format = m.Value;
format = format.Replace("StrUtil.GetText(\"","");
format = format.Replace("\"","");
if(!Localization.Contains(format) && !string.IsNullOrEmpty(format)){
Localization.Add(format);
staticWriteText+=format+"\n";
}
}
}
}
//提取Prefab上的中文
static public void SearchPrefabString(Transform root)
{
foreach(Transform chind in root)
{
//由于这里是写样例,所以我用的是UILabel
//这里应该是写你用于图文混排的脚本。
UILabel label = chind.GetComponent<UILabel>();
if(label != null)
{
string text = label.text;
if(!Localization.Contains(text) && !string.IsNullOrEmpty(text)){
Localization.Add(text);
text = text.Replace("\n",@"\n");
staticWriteText+=text+"\n";
}
}
if(chind.childCount >0)
SearchPrefabString(chind);
}
}
}
比方这个是个简单界面上赋值的代码。用StrUtil.GetText()去取中文。StrUtiL类是我们自己写的。
using UnityEngine;
using System.Collections;
public class UIMain : MonoBehaviour
{
private UILabel mName = null;
void Awake ()
{
mName = transform.Find("name").GetComponent<UILabel>();
mName.text = StrUtil.GetText("雨松MOMO\n我要换行");
mName.text = StrUtil.GetText("我是{0}我的网名{1}","宣雨松","雨松MOMO");
}
}
StrUtiL类里面去处理Key从本地数据表里中替换相应多语言显示的文字。
using UnityEngine;
using System.Collections;
public class StrUtil
{
static public string GetText( string text)
{
//通过传进来的中文KEY 去数据表里面读相应替换的多语言文字
return text;
}
static public string GetText(string text,params object[] args)
{
//通过传进来的中文KEY 去数据表里面读相应替换的多语言文字
return string.Format(text,args);
}
}
使用工具代码提取,终于将全部多语言中文的地方提取在txt里面。
最后就是让策划拿着生成出来的中文KEY在Excel表里。给出相应的翻译文字。
另一个重要的知识点就是换行问题,可能你在Prefab上进行的换行的操作,可是\n并非字符串。所以我们要把\n转成”\n”字符串写进去。
text.Replace(“\n”,@”\n”);
反过来在读取表的时候还是须要再把”\n”字符串转成\n换行符
text.Replace(@”\n”,”\n”);
这样就没问题了。策划也能够直接在数据表里填写\n来进行换行了。
最后的思考
1.开发的过程中可能要改动代码或者要加新功能删功能,所以我们要把差异性的中文Key提取出来,也就是把新添加的KEY 或者 新删除的KEY列举出来。
由于没有变化的就不须要策划又一次翻译了。
2.最好能直接帮策划生成Excel文件。Windows上非常easy。可是MAC就不行。我知道怎么在Mac上读取excel文件。可是我不知道在mac上怎么生成Excel有哪位大神知道还请告知一下我。
要能生成.xlsx的那种。谢谢啦。
3.由于要做图文混排,所以UILabel我已经不直接使用了,而是又写了一个类去管理UILable和UISprite, 事实上就是依据XML或者JSON 一类的描写叙述符去动态生成UILable和UISprite在帮它的动态的算坐标,算间距 一类的。
由于你的中文KEY须要传參数 比方 “我叫{0}我今年{1}大了” 一类的字符串。所以还是在写一个方法。
最后是本文的 p=1014">下载地址
Unity3D研究之多语言用中文做KEY的更多相关文章
- bootbox.js [v4.2.0]设置确认框 按钮语言为中文
Bootbox.js (http://bootboxjs.com/)是一个小型的 JavaScript 库用来创建简单的可编程对话框,基于 Twitter 的 Bootstrap 开发. 弹出确认框方 ...
- abp 设置默认语言为中文
abp 设置默认语言为中文 abp的默认语言设置,存放于数据库表AbpSettings中,这样配置可使默认语言为中文: name: Abp.Localization.DefaultLanguageNa ...
- WP模拟器修改语言为中文方法
对于WP7模拟器来说默认启动时显示的语言为英文,除了操作界面外,如果你的应用支持多国语言必须修改为中文才能显示正确的界面.下面Zune123将WP7 Emulator修改语言为中文的方法写个简单的教程 ...
- centos7设置系统语言为中文
centos7设置系统语言为中文 修改 /etc/locale.conf 文件内容为: LANG="zh_CN.GB18030" LANGUAGE="zh_CN.GB1 ...
- mac启动 Apache JMeter 5.3 语言选择中文界面出现乱码 问题解决
问题重现 问题修复 出现这个问题,是因为,语言与外观不兼容导致,语言选“中文”,外观选“Metal” 细心的你,可能发现,为啥要重启2次呢???第一次设置完语言后,在设置外观,发现菜单不能选择,第二次 ...
- JMeter如何设置语言为中文
一.现象 JMeter安装后,默认语言为英文,如下图所示: 对于英文水平一般的人来说,刚开始使用起来比较费劲(比如我),影响我工作效率.那么,怎么将英文改为中文呢? 二.解决方法 1.修改设置 点击菜 ...
- React 等框架使用 index 做 key 的问题
React 等框架使用 index 做 key 的问题 假如有两个树,一个是之前,一个是更变之后,我们抽象成两种可能性. 插入内容在最后 插入内容在最前 关于插在中间,原理一样,就不阐述. 使用 ul ...
- winform 不同语言(中文,英文等)
Visual Studio 对于.NET 程序的本地化提供了完整的支持,这里仅介绍实现多语言版本本地化程序的简单步骤.注意黑体处为关键点.一. 窗体本地化 对于Windows 窗体,你需要做的第 ...
- 开源管理系统OSSIM设置 语言为中文简体
最近研究OSSIM系统,OSSIM的安装是做好的ISO,操作系统选择的是CentOS 64Bit系统.我使用的OSSIM 4.11 的ISO安装,虽然系统说明支持中文,实际上,只是台湾的繁体中文而以. ...
随机推荐
- Zend Studio / Eclipse 缩进设置
首先是Window – Preferences打开Preferences配置对话框: 然后依次找到PHP – Code Style – Formatter,如下图所示: 这里注意一下Active pr ...
- http和socket
大多数情况下都是使用Http协议做网络通信的,少数情况下,如扣扣之类的即时通讯,就是用Socket建立长链接 Http一般都是短连接的,即客户端和服务端通讯一次后,服务端就关闭连接 Socket是长连 ...
- [C语言]输入一行整数,用空格分开,回车结束。
在屏幕一行中的字符会保留在缓冲区,例如 1 2 3 4 5 6 ; i < n; i++) { scanf("%d",&cur); array[i] = cur; c ...
- windows系统查看目录树
进入到需要查看的目录后,按住shift键,然后单击鼠标右键,选择“在此处打开命令窗口”,然后命令行窗口界面. 1.若是只查看该目录下有哪些目录,输入tree即可 2.若是显示该目录及其子目录下的所有目 ...
- MySQL-----唯一索引
唯一索引: 单列唯一索引和联合唯一索引 索引是为了加速查找. 唯一索引是加了约束条件.例如主外键. 唯一索引的约束: 约束不能重复(可以为空) 主键不能重复(不能为空) 加速查找 create tab ...
- Python之面向对象函数式编程
Python之面向对象函数式编程 函数式编程的根本就是用 def 去模拟数学式的编程逻辑. 类似与 y = 2*x + 1 ,当x = 3 时,函数的结果y就得7. def test(x): retu ...
- 杭电 2111 Saving HDU (贪心)
Description 话说上回讲到海东集团面临内外交困,公司的元老也只剩下XHD夫妇二人了.显然,作为多年拼搏的商人,XHD不会坐以待毙的. 一天,当他正在苦思冥想解困良策的时候,突然想到了自己 ...
- 字符串String对象构造方法的创建和直接赋值的区别
/* * 通过构造方法创建的字符串对象和直接赋值方式创建的字符串对象有什么区别呢? * 区别是:通过构造方法创建的字符串对象是在堆内存.通过赋值创建的字符串对象是在方法区的常量池 * * == * 基 ...
- python标准库笔记
1.python互联网数据处理模块 base64数据编码 二进制数据 encode ASCII字符 ASCll字符 decode 二进制数据 json数据交换格式 轻量的数据交换格式,json暴露的A ...
- 7-14 电话聊天狂人(25 分)(Hash表基本操作)
7-14 电话聊天狂人(25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤105),为通话记录条数.随后N行,每行给出一条通话记录.简单 ...