做多语言的时候用中文做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. c Xcode has incompatible definitions in different translations units

    解决方案: build > setting enable module 改为No

  2. VS调试debug的即时窗口的使用

    例:

  3. C# defult关键字

    一.问题 今天写一个函数提示用defult,因为第一次用记录一下 public static T GetConfig<T>(string strConfig) { try { return ...

  4. java实现zip,gzip,7z,zlib格式的压缩打包

    本文主要介绍的是通过使用java的相关类可以实现对文件或文件夹的压缩. zlib是一种数据压缩程序库,它的设计目标是处理单纯的数据(而不管数据的来源是什么). 7z 是一种新的压缩格式,它拥有目前最高 ...

  5. 一次URL请求过程--tomcat

    一:请求的过程 1.DNS域名解析 2.建立TCP连接(三次握手) 3.发送请求--tomcat进行处理 4.四次挥手关闭连接 二:详解1---DNS域名解析 1.浏览器会检查缓存中有没有这个域名对应 ...

  6. vue+VeeValidate 校验范围(部分校验,全部校验)

    搜索很久,没有发现有关于vue+VeeValidate部分校验的.自己写一个. 主要是两个场景: 1. 校验范围内,所有的字段. 2. 校验全局所有字段.主要方法: 1.validate(fields ...

  7. js中5中继承方式分析

    //1.借用式继承   把sup的构造函数里的属性方法克隆一份sub实例对象     function Super(){       this.val = 1;       this.fun1 = f ...

  8. 全国高校绿色计算大赛 预赛第三阶段(Python)(随机数)

    只提交了随机数 (真心不会 T-T ) import csv import random import pandas as pd import numpy as np # 预测结果文件:src/ste ...

  9. CSS+DIV命名

    原地址:http://www.cnblogs.com/hylaz/archive/2012/10/27/2742743.html#2521377 页头:header 登录条:loginBar 标志:l ...

  10. UVa 11998 破碎的键盘(数组实现链表)

    题意: 输入一行字符,其中包含'[' 和 ‘]’, 意思为键盘上的home 和 end 键, 然后模拟字符在键盘上输入. 输入一行最终的结果 分析: 用数组模拟一个链表, 在链表的头尾插入字母然后输出 ...