做多语言的时候用中文做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. chat - 和数据集沟通的指令稿

    总览 SYNOPSIS chat [ options ] script 描述 DESCRIPTION chat 程式在電腦與數據機之間定義溝通交換事宜. 它最主要的目的是用來在點對點協定的隱形程式 ( ...

  2. 删数问题(Noip1994)

    1321:[例6.3]删数问题(Noip1994) 时间限制: 1000 ms         内存限制: 65536 KB提交数: 5127     通过数: 1595 [题目描述] 输入一个高精度 ...

  3. 02CSS基本语法

    CSS基本语法 id选择符 在HTML文档中,需要唯一标识一个元素时,就会赋予它一个id标识,以便在对整个文档进行处理时能够很快地找到这个元素. 而id选择符就是用来对这个单一元素定义单独的样式.#号 ...

  4. iis如何在dos中注册

    iis如何在dos中注册   2009-09-23 08:13 提问者采纳   cd \cd c:\windows\microsoft.net\framework\v2.0.50727aspnet_r ...

  5. ICMP协议和ping命令

    当网络不通的情况下,通常会想到ping命令,ping一下,但是ping命令内部如何执行的,可能并不清楚,其实ping是基于ICMP协议进行工作的.  一.ICMP协议的格式 ICMP是在RFC 792 ...

  6. socket编程(Java实现)

    主要是前段时间学习的网络知识的基于TCP与UDP编程,Java实现简单的大小写字母的转化,该文主要参考: https://blog.csdn.net/yjp19871013/article/detai ...

  7. http请求体笔记

    一.请求体数据格式 1.application/json:json格式 2.text/plain:纯文本格式 3.application/x-www-form-urlencoded:url编码后产生的 ...

  8. IDEA基本使用及配置(1)

    前言:现在IDEA用的人很多,我以前都是用Eclipse的,都说这个IDE比较智能.好用,于是学习一下. IDEA与Eclipse目录结构对比: IDEA中的Project相当于Eclispe中的wo ...

  9. PHP实现定时任务的几种方式

    关于定时任务,之前以前认识了一种最常用的:crontab定时任务.通过linux的定时任务去实现.今天又认识了一下php实现定时方式的其它方式,总结一下. 一 服务器定时任务 服务器定时任务,其实就是 ...

  10. 原生JS版和jQuery 版实现文件上传功能

    <!doctype html> <html lang="zh"> <head> <meta charset="utf-8&quo ...