很多游戏中都有语言设置选项,NGUI插件中自带了国际化脚本,但是灵活性较低,而且目前项目是UGUI,以下是修改后,以便记录。

Localization和NGUI中用法一样,挂在在一个不销毁的游戏物体上,并设置当前语言,及所有语言的陪标

  1. //----------------------------------------------
  2. //----------------------------------------------
  3. using UnityEngine;
  4. using System.Collections.Generic;
  5. using UnityEngine.UI;
  6. public class Localization : MonoBehaviour
  7. {
  8. static Localization mInst;
  9. static public Localization instance
  10. {
  11. get
  12. {
  13. if (mInst == null)
  14. {
  15. mInst = Object.FindObjectOfType(typeof(Localization)) as Localization;
  16. if (mInst == null)
  17. {
  18. GameObject go = new GameObject("_Localization");
  19. DontDestroyOnLoad(go);
  20. mInst = go.AddComponent<Localization>();
  21. }
  22. }
  23. return mInst;
  24. }
  25. }
  26. public string startingLanguage;
  27. public TextAsset[] languages;
  28. Dictionary<int, string> mDictionary = new Dictionary<int, string>();
  29. string mLanguage;
  30. public string currentLanguage
  31. {
  32. get
  33. {
  34. //if (string.IsNullOrEmpty(mLanguage))
  35. {
  36. currentLanguage = PlayerPrefs.GetString("Language");
  37. if (string.IsNullOrEmpty(mLanguage))
  38. {
  39. currentLanguage = startingLanguage;
  40. if (string.IsNullOrEmpty(mLanguage) && (languages != null && languages.Length > 0))
  41. {
  42. currentLanguage = languages[0].name;
  43. }
  44. }
  45. }
  46. return mLanguage;
  47. }
  48. set
  49. {
  50. if (mLanguage != value)
  51. {
  52. startingLanguage = value;
  53. if (!string.IsNullOrEmpty(value))
  54. {
  55. if (languages != null)
  56. {
  57. for (int i = 0, imax = languages.Length; i < imax; ++i)
  58. {
  59. TextAsset asset = languages[i];
  60. if (asset != null && asset.name == value)
  61. {
  62. Load(asset);
  63. return;
  64. }
  65. }
  66. }
  67. TextAsset txt = Resources.Load(value, typeof(TextAsset)) as TextAsset;
  68. if (txt != null)
  69. {
  70. Load(txt);
  71. return;
  72. }
  73. }
  74. mDictionary.Clear();
  75. PlayerPrefs.DeleteKey("Language");
  76. }
  77. }
  78. }
  79. /// <summary>
  80. /// Determine the starting language.
  81. /// </summary>
  82. void Awake() { if (mInst == null) { mInst = this; DontDestroyOnLoad(gameObject); } else Destroy(gameObject); }
  83. /// <summary>
  84. /// Start with the specified starting language.
  85. /// </summary>
  86. void Start() { if (!string.IsNullOrEmpty(startingLanguage)) currentLanguage = startingLanguage; }
  87. /// <summary>
  88. /// Oddly enough... sometimes if there is no OnEnable function in Localization, it can get the Awake call after UILocalize's OnEnable.
  89. /// </summary>
  90. void OnEnable() { if (mInst == null) mInst = this; }
  91. /// <summary>
  92. /// Remove the instance reference.
  93. /// </summary>
  94. void OnDestroy() { if (mInst == this) mInst = null; }
  95. /// <summary>
  96. /// Load the specified asset and activate the localization.
  97. /// </summary>
  98. void Load(TextAsset asset)
  99. {
  100. mLanguage = asset.name;
  101. PlayerPrefs.SetString("Language", mLanguage);
  102. ByteReader reader = new ByteReader(asset);
  103. mDictionary = reader.ReadDictionary();
  104. // Broadcast("OnLocalize");
  105. }
  106. public string Get(int key)
  107. {
  108. string val;
  109. return (mDictionary.TryGetValue(key, out val)) ? val : null;
  110. }
  111. }

ByteReader数据解析类,不多余解释

  1. //----------------------------------------------
  2. //            NGUI: Next-Gen UI kit
  3. // Copyright © 2011-2012 Tasharen Entertainment
  4. //----------------------------------------------
  5. using UnityEngine;
  6. using System.Text;
  7. using System.Collections.Generic;
  8. /// <summary>
  9. /// MemoryStream.ReadLine has an interesting oddity: it doesn't always advance the stream's position by the correct amount:
  10. /// http://social.msdn.microsoft.com/Forums/en-AU/Vsexpressvcs/thread/b8f7837b-e396-494e-88e1-30547fcf385f
  11. /// Solution? Custom line reader with the added benefit of not having to use streams at all.
  12. /// </summary>
  13. public class ByteReader
  14. {
  15. byte[] mBuffer;
  16. int mOffset = 0;
  17. public ByteReader(byte[] bytes) { mBuffer = bytes; }
  18. public ByteReader(TextAsset asset) { mBuffer = asset.bytes; }
  19. /// <summary>
  20. /// Whether the buffer is readable.
  21. /// </summary>
  22. public bool canRead { get { return (mBuffer != null && mOffset < mBuffer.Length); } }
  23. /// <summary>
  24. /// Read a single line from the buffer.
  25. /// </summary>
  26. static string ReadLine(byte[] buffer, int start, int count)
  27. {
  28. #if UNITY_FLASH
  29. // Encoding.UTF8 is not supported in Flash :(
  30. StringBuilder sb = new StringBuilder();
  31. int max = start + count;
  32. for (int i = start; i < max; ++i)
  33. {
  34. byte byte0 = buffer[i];
  35. if ((byte0 & 128) == 0)
  36. {
  37. // If an UCS fits 7 bits, its coded as 0xxxxxxx. This makes ASCII character represented by themselves
  38. sb.Append((char)byte0);
  39. }
  40. else if ((byte0 & 224) == 192)
  41. {
  42. // If an UCS fits 11 bits, it is coded as 110xxxxx 10xxxxxx
  43. if (++i == count) break;
  44. byte byte1 = buffer[i];
  45. int ch = (byte0 & 31) << 6;
  46. ch |= (byte1 & 63);
  47. sb.Append((char)ch);
  48. }
  49. else if ((byte0 & 240) == 224)
  50. {
  51. // If an UCS fits 16 bits, it is coded as 1110xxxx 10xxxxxx 10xxxxxx
  52. if (++i == count) break;
  53. byte byte1 = buffer[i];
  54. if (++i == count) break;
  55. byte byte2 = buffer[i];
  56. if (byte0 == 0xEF && byte1 == 0xBB && byte2 == 0xBF)
  57. {
  58. // Byte Order Mark -- generally the first 3 bytes in a Windows-saved UTF-8 file. Skip it.
  59. }
  60. else
  61. {
  62. int ch = (byte0 & 15) << 12;
  63. ch |= (byte1 & 63) << 6;
  64. ch |= (byte2 & 63);
  65. sb.Append((char)ch);
  66. }
  67. }
  68. else if ((byte0 & 248) == 240)
  69. {
  70. // If an UCS fits 21 bits, it is coded as 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
  71. if (++i == count) break;
  72. byte byte1 = buffer[i];
  73. if (++i == count) break;
  74. byte byte2 = buffer[i];
  75. if (++i == count) break;
  76. byte byte3 = buffer[i];
  77. int ch = (byte0 & 7) << 18;
  78. ch |= (byte1 & 63) << 12;
  79. ch |= (byte2 & 63) << 6;
  80. ch |= (byte3 & 63);
  81. sb.Append((char)ch);
  82. }
  83. }
  84. return sb.ToString();
  85. #else
  86. return Encoding.UTF8.GetString(buffer, start, count);
  87. #endif
  88. }
  89. /// <summary>
  90. /// Read a single line from the buffer.
  91. /// </summary>
  92. public string ReadLine()
  93. {
  94. int max = mBuffer.Length;
  95. // Skip empty characters
  96. while (mOffset < max && mBuffer[mOffset] < 32) ++mOffset;
  97. int end = mOffset;
  98. if (end < max)
  99. {
  100. for (;;)
  101. {
  102. if (end < max)
  103. {
  104. int ch = mBuffer[end++];
  105. if (ch != '\n' && ch != '\r') continue;
  106. }
  107. else ++end;
  108. string line = ReadLine(mBuffer, mOffset, end - mOffset - 1);
  109. mOffset = end;
  110. return line;
  111. }
  112. }
  113. mOffset = max;
  114. return null;
  115. }
  116. /// <summary>
  117. /// Assume that the entire file is a collection of key/value pairs.
  118. /// </summary>
  119. public Dictionary<int, string> ReadDictionary()
  120. {
  121. Dictionary<int, string> dict = new Dictionary<int, string>();
  122. char[] separator = new char[] { '=' };
  123. while (canRead)
  124. {
  125. string line = ReadLine();
  126. if (line == null) break;
  127. #if UNITY_FLASH
  128. string[] split = line.Split(separator, System.StringSplitOptions.RemoveEmptyEntries);
  129. #else
  130. string[] split = line.Split(separator, 2, System.StringSplitOptions.RemoveEmptyEntries);
  131. #endif
  132. if (split.Length == 2)
  133. {
  134. int key = int.Parse(split[0].Trim());
  135. string val = split[1].Trim();
  136. dict[key] = val;
  137. }
  138. }
  139. return dict;
  140. }
  141. }

将UILocalize脚本挂在在Text上或者Image上,就是需要多语言切换的UI上

  1. //----------------------------------------------
  2. //----------------------------------------------
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. public class UILocalize : MonoBehaviour
  6. {
  7. /// <summary>
  8. /// Localization key.
  9. /// </summary>
  10. public string Atlas;
  11. public string key;
  12. string mLanguage;
  13. bool mStarted = false;
  14. /// <summary>
  15. /// This function is called by the Localization manager via a broadcast SendMessage.
  16. /// </summary>
  17. void OnLocalize(Localization loc) { if (mLanguage != loc.currentLanguage) Localize(); }
  18. /// <summary>
  19. /// Localize the widget on enable, but only if it has been started already.
  20. /// </summary>
  21. void OnEnable() { if (mStarted && Localization.instance != null) Localize(); }
  22. /// <summary>
  23. /// Localize the widget on start.
  24. /// </summary>
  25. void Start()
  26. {
  27. mStarted = true;
  28. if (Localization.instance != null) Localize();
  29. }
  30. /// <summary>
  31. /// Force-localize the widget.
  32. /// </summary>
  33. public void Localize(string key = null)
  34. {
  35. if (key == null)
  36. key = this.key;
  37. Localization loc = Localization.instance;
  38. MaskableGraphic w = GetComponent<MaskableGraphic>();
  39. Text lbl = w as Text;
  40. Image sp = w as Image;
  41. // If no localization key has been specified, use the label's text as the key
  42. if (string.IsNullOrEmpty(mLanguage) && string.IsNullOrEmpty(key) && lbl != null)
  43. key = lbl.text;
  44. // If we still don't have a key, use the widget's name
  45. string val = string.IsNullOrEmpty(key) ? w.name : loc.Get(int.Parse(key));
  46. if (val != null)
  47. {
  48. if (lbl != null)
  49. {
  50. lbl.text = val;
  51. }
  52. else if (sp != null)
  53. {
  54. if (Atlas == null)
  55. return;
  56. sp.sprite = DoRo.Manager.LoadManager.Instance.LoadSprite(Atlas, val);
  57. }
  58. }
  59. mLanguage = loc.currentLanguage;
  60. }
  61. }

Unity 国际化 多语言设置的更多相关文章

  1. iOS 国际化多语言设置 xcode7

    iOS 国际化多语言设置 方式一: 1. 在storyboard中创建好UI,然后在 project 里面  Localizables 栏目里面,添加你需要的语言:默认是Englist; 比如这里我添 ...

  2. yii2 api接口 实现国际化多语言设置

    1) 在 /config/main.php 下添加如下代码: 'components' => [ 'language' => 'zh-CN', 'i18n' => [ 'transl ...

  3. iOS国际化多语言设置

    一.创建工程.添加语言

  4. unity音量设置(同时设置到多个物体上)——引伸语言设置

    在游戏中游戏设置是一个很重要的功能,但是比如语言设置和音量设置分散在很多个物体的组件上,如果每个对应的物体都放到一个链表里,会导致程序雍总难堪,使用事件调用是最好的方式 音量存储类 SoundMana ...

  5. WPF 实际国际化多语言界面

    前段时候写了一个WPF多语言界面处理,个人感觉还行,分享给大家.使用合并字典,静态绑定,动态绑定.样式等东西 效果图 定义一个实体类LanguageModel,实际INotifyPropertyCha ...

  6. [Spring]Spring Mvc实现国际化/多语言

    1.添加多语言文件*.properties F64_en_EN.properties详情如下: F60_G00_M100=Please select data. F60_G00_M101=Are yo ...

  7. iOS 学习笔记六 【APP中的文字和APP名字的国际化多语言处理】

    今天为新手解决下APP中的文字和APP名字的国际化多语言处理, 不多说了,直接上步骤: 1.打开你的项目,单机project名字,选中project,直接看图吧: 2.创建Localizable.st ...

  8. php gettext方式实现UTF-8国际化多语言(i18n)

    php gettext方式实现UTF-8国际化多语言(i18n) 一.总结 一句话总结: 二.php gettext方式实现UTF-8国际化多语言(i18n) 近 来随着i18n(国际化)的逐渐标准化 ...

  9. django国际化的简单设置

    设置国际化的具体步骤: 一.国际化 1)效果:针对不同的国家的人可以配置不同的语言(一般是英文和中文,  English  Chinese) 2)目的:增加项目的用户量 3)难度:不难 比较费劲的就是 ...

随机推荐

  1. java基础7 封装

    面向对象的三大特征: 1.封装   (将一类属性封装起来,并提供set()和get()方法给其他对象设置和获取值.或者是将一个运算方法封装起来,其他对象需要此种做运算时,给此对象调用) 2.继承   ...

  2. kubeadm高可用master节点部署文档

    kubeadm的标准部署里,etcd和master都是单节点的. 但上生产,至少得高可用. etcd的高可用,用kubeadm微微扩散一下就可以. 但master却官方没有提及. 于是搜索了几篇文档, ...

  3. 关闭webstorm自动保存,并显示文件未保存标识

    1.取消自动保存 2.显示编辑状态设置:

  4. Python全栈开发之10、网络编程

    网络编程就是如何在程序中实现两台计算机的通信,而两台计算机间的通信其实就是两个进程间的通信,进程间的通信主要通过socket(套接字)来描述ip地址(主机)和端口(进程)来实现的,因此我们学习网络编程 ...

  5. Gitlab在centos7上手工安装

    本节内容: 安装包 安装Gitlab 配置Gitlab URL 配置防火墙 执行Gitlab的一些基本设置 环境及条件: 系统:CentOS Linux release 7.5.1804 (Core) ...

  6. 【WPF】设置Listview样式

    <ListView Grid.Row="0" ItemsSource="{Binding Lst_bind}"> <ListView.Item ...

  7. Java Script 基础

    一. JS的简介 JavaScript是一种网页编程技术,经常用于创建动态交互网页 JavaScript是一种基于对象和事件驱动的解释性脚本语言,类似C语言和Java的语法 事先不编译:逐行执行:无需 ...

  8. linux网络管理----网络命令

    1 Linux网络命令之网络环境查看命令  ifconfig  2 Linux网络命令之网络测试命令  telnet 基本已经被ssh替代了,telnet是明文传递,不安全

  9. linux网络管理----Linux网络配置

    1.1 linux配置IP地址 1️⃣ ifconfig命令临时配置IP地址 能不能自动获取IP地址和DNS地址,要看有没有DHCP服务器 win10上,输入ipconfig /all 会看到是否有D ...

  10. java 数组操作方法

    数组操作方法: 实现数组拷贝: 语法:System.arraycopy(源数组名称,源数组拷贝开始索引,目标数组名称,目标数组拷贝数组索引,长度) 数组A:1 . 2 . 3 . 4 . 5 . 6  ...