做多语言的时候用中文做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. PHP 中 echo 和 print 的区别

    一般来说,PHP中动态输出HTML内容,是通过print 和 echo 语句来实现的,在实际使用中, print 和 echo 两者的功能几乎是完全一样.可以这么说,凡是有一个可以使用的地方,另一个也 ...

  2. java正则表达式进阶运用20181023

    直接上代码. package org.jimmy.autotranslate20181022.test; import java.util.regex.Matcher; import java.uti ...

  3. java实现搜索文件夹中所有文件包含的关键字的文件路径(递归搜索)

    import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io ...

  4. [python] 时间序列分析之ARIMA

    1 时间序列与时间序列分析 在生产和科学研究中,对某一个或者一组变量  进行观察测量,将在一系列时刻  所得到的离散数字组成的序列集合,称之为时间序列. 时间序列分析是根据系统观察得到的时间序列数据, ...

  5. HTML location 用法(获取当前URL)

    Location 对象 Location 对象包含有关当前 URL 的信息. Location 对象是 Window 对象的一个部分,可通过 window.location 属性来访问. 属性 loc ...

  6. qrcode.js

    (function(r){r.fn.qrcode=function(h){var s;function u(a){this.mode=s;this.data=a}function o(a,c){thi ...

  7. java IO流 内容整理

    在java中,对数据的输入和输出操作以流的方式进行.(注:对文件的操作用io.File类,但不能对文件中的内容进行操作) 一.IO流的分类: 按数据流的方向不同,可以分为输入流和输出流: 按处理数据的 ...

  8. leetcode-240搜索二维矩阵II

    搜索二维矩阵II class Solution: def searchMatrix(self, matrix, target): """ :type matrix: Li ...

  9. 32道常见的Java基础面试题

    1. 什么是 Java 虚拟机(JVM)?为什么 Java 被称作是“平台无关的编程语言”? Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程.Java 源文件被编译成能被 Java 虚拟 ...

  10. iPhone安装ipa的方法(iTunes,PP助手)

    1,通过iTunes: 将手机与电脑通过数据线连接,打开电脑中的iTunes,将ipa文件添加到资料库(ipa文件是iTunes能够识别的文件),方式如下图,然后安装,同步即可. 2,通过PP助手: ...