做多语言的时候用中文做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. autofs - automounter maps的格式

    描述(DESCRIPTION) automounter maps 是一系列非主映射文件或者是NIS映射(NIS maps),它们被 automounter 的主映射文件(master map)具体调用 ...

  2. Flutter web环境变量搭建及开发

    使用flutter开发app已有三个月,有一些行为形成了惯性,在搭建flutter web环境变量时走了不少的坑,分享出来,免得其他小伙伴再走一遍. 首先flutter的版本要使用1.5及以上版本 d ...

  3. node.js编译less文件

    大多数文章对于到底怎样编译less文件并没有一个详细的说明,清一色的grunt命令,看得也是晕晕的,所以也就有了这篇手记的存在. 步入正题 1.安装配置好sublime text3(包括各种实用插件) ...

  4. 使用JQuery MiniUI,json数据构建TreeGrid(树图)

    index.html直接上代码. 需要引用MiniUI的boot.js <!DOCTYPE html> <html> <head> <meta charset ...

  5. DHCP和PXE

    继续学习,Let's go!DHCP和PXE都是什么呢?如果非科班出身,可能一脸懵逼,好多东西需要去学习了,真的,继续学吧,付出不一定会有回报,不付出肯定就是等死了,呵呵! 一.DHCP 真正需要手动 ...

  6. C#基础学习(二)

    ---恢复内容开始--- 面向对象 (类是不占内存,实例占内存) C#与python不用可以直接从另一个文件直接实例化一个类,不需要导包:                                ...

  7. 【Mysql数据库】学习笔记

    一.数据库的创建 create database database_name  DEFAULT CHARACTER SET utf8; //创建一个数据库 drop database database ...

  8. C51 继电器 个人笔记

    一句话 小电流控制大电流的开关. 电路图 给J2端口一个低电平,三极管导通,线圈吸合 一般用P1^4口连接 #include <reg51.h> #define u16 unsigned ...

  9. ProxySQL Tutorial : setup in a MySQL replication topology

    ProxySQL Tutorial : setup in a MySQL replication topology 时间 2015-09-15 05:23:20 ORACLE数据库技术文刊 原文  h ...

  10. hihoCoder#1069 最近公共祖先·三

    原题地址 根据提示用Spase Table做 将Tree先展成List,因为数组长度等于边数的2倍,树中边数等于节点数-1,所以List数组只要开2倍节点数大小即可 WA了几次,原来是查询的时候出现左 ...