- 一、简介
- 二、代码实现
- 数据格式
小编使用的Excel管理所有语言,格式如下:
如有更多的语言翻译,只需要在后面加一列即可。另外我们也可以把数据以上面的结构保存成Json文件的方式。
- 编辑器 -> 静态文本
为Text组件添加LocalizationText.cs脚本,在属性页面可以设置当前Text组件的文本多语言ID,即可查看对应翻译内容
- 动态文本
二、代码实现比如:LEVELS {0},需要再脚本动态更新关卡数目,这样的话可以通过封装的获取文本的接口LocalizationManager.GetLocalText(ID)获取文本,然后设置动态属性值
- LocalizationTextEditor
主要逻辑就是依赖CustomEditor类为LocalizationText脚本添加编辑器管理脚本,通过获取目标组件对象,在属性窗口为目标对象设置属性,具体使用方法可以参考脚本中官方文档以及代码注释
////// LocalizationText组件的属性页面编辑器 /// [官方]https://docs.unity3d.com/Manual/editor-CustomEditors.html /// [CustomEditor(typeof(LocalizationText))] public class LocalizationTextEditor : Editor { private LocalizationText m_LocalizationText; ////// 获取编辑器所属组件对象 /// private void OnEnable() { OnCheckLocalization(); m_LocalizationText = target as LocalizationText; } ////// 执行代码,访问目标组件属性 /// public override void OnInspectorGUI() { //依据属性名称获取目标对象属性 EditorGUILayout.PropertyField(serializedObject.FindProperty("Text"),true); //应用修改属性 serializedObject.ApplyModifiedProperties(); //设置用户输入,获取文本ID m_LocalizationText.LanguageID = EditorGUILayout.IntField("多语言ID", m_LocalizationText.LanguageID); string content = LocalizationManager.GetLocalText(m_LocalizationText.LanguageID); if (!string.IsNullOrEmpty(content)) { EditorGUILayout.HelpBox(content,MessageType.Info); } else { EditorGUILayout.HelpBox("俺没有找到哎", MessageType.Error); } } private void OnCheckLocalization() { if(!LocalizationManager.IsAvalibleLanguage()) { LocalizationManager.InitLanguage(); } } }
- LocalizationText.cs
为Text组件添加该脚本并在属性窗口设置文本ID,游戏运行即可以获取正确的翻译文本,方法不多,不在赘述
public class LocalizationText : MonoBehaviour
{
public Text Text;
public int LanguageID;
private void Awake()
{
OnModifiedProperties();
}
///
/// 修改文本内容
///
public void OnModifiedProperties()
{
string content = LocalizationManager.GetLocalText(LanguageID);
Text.text = string.IsNullOrEmpty(content) ? Text.text : content;
}
}
- LocalizationManager.cs管理脚本
(1)依据设备所在地区,读取相应的翻译内容
(2)提供接口,依据ID获取文本
注:小编使用的QuickSheet管理Excel数据,感兴趣的话,可以在网上搜下
private static LanguageConfig m_LanguageConfig;
private static Dictionary m_LanguageTextDic = new Dictionary();
///
/// 更新本地语言库
///
public static void OnUpdateLanguage()
{
if(m_LanguageConfig == null)
{
m_LanguageConfig = ResourcesManager.Instance.Load(string.Format(Define.Path.RESOURCES_EXCELASSETS, typeof(LanguageConfig).Name));
}
m_LanguageTextDic.Clear();
Debug.Log(Application.systemLanguage);
switch (Application.systemLanguage)
{
case SystemLanguage.ChineseSimplified:
foreach (var item in m_LanguageConfig.dataArray)
{
m_LanguageTextDic.Add(item.Id, item.Chinese);
}
break;
case SystemLanguage.Chinese :
foreach (var item in m_LanguageConfig.dataArray)
{
m_LanguageTextDic.Add(item.Id, item.Chinese);
}
break;
case SystemLanguage.English:
foreach (var item in m_LanguageConfig.dataArray)
{
m_LanguageTextDic.Add(item.Id, item.English);
}
break;
}
}
///
/// 获取本地语言
///
///
///
public static string GetLocalText(int id)
{
if (m_LanguageTextDic.ContainsKey(id))
return m_LanguageTextDic[id];
return null;
}
///
/// 多语言是否可用
///
///
public static bool IsAvalibleLanguage()
{
return m_LanguageTextDic.Count > 0 ? true : false;
}


![[Unity] 多语言实现方案 [Unity] 多语言实现方案](http://www.mshxw.com/aiimages/31/905538.png)
