做多语言的时候用中文做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的更多相关文章

  1. bootbox.js [v4.2.0]设置确认框 按钮语言为中文

    Bootbox.js (http://bootboxjs.com/)是一个小型的 JavaScript 库用来创建简单的可编程对话框,基于 Twitter 的 Bootstrap 开发. 弹出确认框方 ...

  2. abp 设置默认语言为中文

    abp 设置默认语言为中文 abp的默认语言设置,存放于数据库表AbpSettings中,这样配置可使默认语言为中文: name: Abp.Localization.DefaultLanguageNa ...

  3. WP模拟器修改语言为中文方法

    对于WP7模拟器来说默认启动时显示的语言为英文,除了操作界面外,如果你的应用支持多国语言必须修改为中文才能显示正确的界面.下面Zune123将WP7 Emulator修改语言为中文的方法写个简单的教程 ...

  4. centos7设置系统语言为中文

    centos7设置系统语言为中文 修改 /etc/locale.conf  文件内容为: LANG="zh_CN.GB18030" LANGUAGE="zh_CN.GB1 ...

  5. mac启动 Apache JMeter 5.3 语言选择中文界面出现乱码 问题解决

    问题重现 问题修复 出现这个问题,是因为,语言与外观不兼容导致,语言选“中文”,外观选“Metal” 细心的你,可能发现,为啥要重启2次呢???第一次设置完语言后,在设置外观,发现菜单不能选择,第二次 ...

  6. JMeter如何设置语言为中文

    一.现象 JMeter安装后,默认语言为英文,如下图所示: 对于英文水平一般的人来说,刚开始使用起来比较费劲(比如我),影响我工作效率.那么,怎么将英文改为中文呢? 二.解决方法 1.修改设置 点击菜 ...

  7. React 等框架使用 index 做 key 的问题

    React 等框架使用 index 做 key 的问题 假如有两个树,一个是之前,一个是更变之后,我们抽象成两种可能性. 插入内容在最后 插入内容在最前 关于插在中间,原理一样,就不阐述. 使用 ul ...

  8. winform 不同语言(中文,英文等)

    Visual Studio 对于.NET 程序的本地化提供了完整的支持,这里仅介绍实现多语言版本本地化程序的简单步骤.注意黑体处为关键点.一. 窗体本地化    对于Windows 窗体,你需要做的第 ...

  9. 开源管理系统OSSIM设置 语言为中文简体

    最近研究OSSIM系统,OSSIM的安装是做好的ISO,操作系统选择的是CentOS 64Bit系统.我使用的OSSIM 4.11 的ISO安装,虽然系统说明支持中文,实际上,只是台湾的繁体中文而以. ...

随机推荐

  1. 用npm来部署快速一个httpweb服务器

    https://blog.csdn.net/u012182627/article/details/55060594 http-server的安装######注意事项 安装http-server的时候 ...

  2. JVM优化(下)

    14.Tomcat8优化之G1牢记收集器的测试结果以及小结: jmeter测试:(1)tomcat未做任何优化:(2)禁用AJP:(3)启用连接池:(4)设置最大线程数1000,初始线程数200:(5 ...

  3. 启动myeclipse弹窗Please allow Subclipse team to receive anonymous usage statistics for this Eclipse intance

    Please allow Subclipse team to receive anonymous usage statistics for this Eclipse intance(翻译:请允许Sub ...

  4. vue 中动画配置

    <transition name="fade">   <router-view ></router-view> </transition& ...

  5. 梦回----32位CPU和64位CPU的通用寄存器

    1 32位Intel的CPU通用寄存器 32位CPU所含有的寄存器有:4个数据寄存器(EAX.EBX.ECX和EDX):2个变址和指针寄存器(ESI和EDI):2个指针寄存器(ESP和EBP):6个段 ...

  6. js 技巧 (四)

    //下载文件 function DownURL(strRemoteURL,strLocalURL) { try {   var xmlHTTP=new ActiveXObject("Micr ...

  7. winform ComboBox/TextBox自动提示

    ComboBox和TextBox控件都带有自动前缀匹配,只要设置其中的AutoCompleteMode,AutoCompleteSource,AutoCompleteCustomSource三个属性的 ...

  8. android 如何从activity跳转到另一个activity下指定的fragment

    思路: 跳转到目标fragment所在的activity,并传递一个flag,来确定要到哪个fragment,根据该flag判断后,跳转到指定的fragment即可. 代码: 当前界面: intent ...

  9. 洛谷 1197 [JSOI2008]星球大战

    [题解] 把询问离线,倒着加点,并查集维护连通性即可. #include<cstdio> #include<cstring> #include<algorithm> ...

  10. JS判断滚动条是否停止滚动

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...