多語言文本解決方案
- 關鍵代碼
- 解決方案一 Application.systemLanguage
- unity官方API 能判定40多種語言
- 解決方案二 Android
- 根據個人需求選用API,比如我需要判斷菲律賓語 en-PH,菲律賓語言環境下,getLanguage回傳 en 為英語,不滿足需求,getCountry為 PH 可以完成判斷
- Unity代碼
- Android國家代碼點這里
- Code
- Excel轉Json
- 功能代碼
- 呼叫Json
關鍵代碼
解決方案一 Application.systemLanguage
unity官方API 能判定40多種語言
switch(Application.systemLanguage){
case SystemLanguage.Chinese://中文
case SystemLanguage.ChineseSimplified://中文簡體
//這兩個要一起判斷,有的機型回傳Chinese,有的回傳ChineseSimplified
break;
case SystemLanguage.ChineseTraditional://中文繁體
break;
case SystemLanguage.English://
break;
case SystemLanguage.Unknown://
break;
//...
}
解決方案二 Android
因我的專案馬來語,菲律賓語,方案一不能判定,采用AndroidAPI
getResources().getConfiguration().locale.getLanguage()
//如下圖,getLanguage回傳值為前半截 "en" 指英語
getResources().getConfiguration().locale.getCountry()
//如下圖,getCountry回傳值為后半截 "US" 指國家

根據個人需求選用API,比如我需要判斷菲律賓語 en-PH,菲律賓語言環境下,getLanguage回傳 en 為英語,不滿足需求,getCountry為 PH 可以完成判斷
Unity代碼
if (Application.platform == RuntimePlatform.Android)
{
//獲得系統國家代碼
AndroidJavaClass unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject _unityContext = unityClass.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject locale = _unityContext.Call<AndroidJavaObject>("getResources").Call<AndroidJavaObject>("getConfiguration").Get<AndroidJavaObject>("locale");
string countryCode = locale.Call<string>("getCountry");
return countryCode;
}
else
{
return "CN";
}
Android國家代碼點這里
提示:夜神模擬器可以設定不同語言環境測驗,很方便,
Code
Excel轉Json
翻譯或策劃可能提供的檔案是下圖這樣,第一行可能還有漢語寫的什么語言,我去掉了,也可以在代碼的遍歷忽略第一行

拿到的json可能是這樣

或這樣(有的會被Unicode)

我是單獨弄了個工程做這個,路徑什么的比較隨便
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
using OfficeOpenXml;
using LitJson;
public class ExcelToXML
{
static Dictionary<string, string>[] dics;
[MenuItem("Tools/讀取Excel")]
public static void ReadExcel()
{
dics = new Dictionary<string, string>[9];
for (int i = 0; i < 9; i++)
{
if (dics[i] == null)
{
dics[i] = new Dictionary<string, string>();
}
}
string tempKey = "";
string outPutDir = Application.dataPath + "\\" + "Excel.xlsx";//路徑根據自己需求來
using (ExcelPackage package = new ExcelPackage(new FileStream(outPutDir, FileMode.Open)))
{
for (int i = 1; i <= package.Workbook.Worksheets.Count; ++i)
{
ExcelWorksheet sheet = package.Workbook.Worksheets[i];
for (int m = sheet.Dimension.Start.Row, n = sheet.Dimension.End.Row; m <= n; m++)
{
for (int j = sheet.Dimension.Start.Column, k = sheet.Dimension.End.Column; j <= k; j++)
{
if (sheet.GetValue(m, j) != null)
{
string str = sheet.GetValue(m, j).ToString();
if (str != null)
{
// do something
Debug.Log(str + "----" + m + "/" + j);
if (j == 1)
{
tempKey = str;
}
else
{
dics[j - 2].Add(tempKey, str);
}
}
}
}
}
}
}
Write();
}
// 簡體中文 英文 西班牙 YinNi MaLai YueNan FeiLvBin TaiGuo BaXi
public static void Write()
{
string[] list = { "Chinese", "English", "Xibanya", "Yinni", "Malaixiya", "Yuenan", "Feilvbin", "Taiguo", "Baxi" };
for (int i = 0; i < dics.Length; i++)
{
//找到當前路徑
FileInfo file = new FileInfo(Application.dataPath + "\\" + list[i] + ".Json"); //路徑根據自己需求來
//判斷有沒有檔案,有則打開檔案,,沒有創建后打開檔案
StreamWriter sw = file.CreateText();
//ToJson介面將你的串列類傳進去,,并自動轉換為string型別
string json = JsonMapper.ToJson(dics[i]);
Debug.Log(json);
//將轉換好的字串存進檔案,
// sw.Write()
sw.WriteLine(json);
// File.WriteAllText(Application.dataPath+"\\"+i+".Json",json ,System.Text.Encoding.UTF8);
//注意釋放資源
sw.Close();
sw.Dispose();
AssetDatabase.Refresh();
}
}
}
功能代碼
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Text.RegularExpressions;
public enum LanguageEnum//根據需求自己添加
{
NONE,
CHINESE,
ENGLISH,
FEILVBIN,
MALAIXIYA
}
public class Languages : Singleton<Languages>//單例腳本就不寫了
{
private LanguageEnum _curLanguage = LanguageEnum.NONE;
public LanguageEnum CurLanguage
{
get
{
if (_curLanguage == LanguageEnum.NONE)
{
_curLanguage = GetLanguage();
}
return _curLanguage;
}
}
private Dictionary<string, string> _dicTexts = new Dictionary<string, string>();
public void Init()
{
string name = "Chinese";
switch (CurLanguage)
{
case LanguageEnum.CHINESE:
name = "Chinese";
break;
case LanguageEnum.ENGLISH:
name = "English";
break;
case LanguageEnum.FEILVBIN:
name = "Feilvbin";
break;
case LanguageEnum.MALAIXIYA:
name = "Malaixiya";
break;
}
string fileName = name;
string url = "config/" + fileName;
var self = this;
Resources.Load(url);
string str = (Resources.Load(url) as TextAsset).text;
_dicTexts = JsonConvert.DeserializeObject<Dictionary<string, string>>(str);//我用的JosnDotnet 根據自己方法決議
switch (Application.systemLanguage)
{
case SystemLanguage.Chinese://中文
case SystemLanguage.ChineseSimplified://中文簡體
case SystemLanguage.ChineseTraditional://中文繁體
break;
case SystemLanguage.English:
break;
case SystemLanguage.Unknown:
break;
default:
break;
}
}
public string GetText(string key)
{
if (_dicTexts.ContainsKey(key))
{
string str = _dicTexts[key].Replace("\\n", "\n");
return Unicode2String(str);
}
else
{
if (Application.platform == RuntimePlatform.WindowsEditor)
{
Debug.LogError($"未獲取到:{key}的文案");
return "<color=red>無文案</color>";
}
else
{
return "";
}
}
}
/// <summary>
/// Unicode轉字串
/// </summary>
/// <param name="source">經過Unicode編碼的字串</param>
/// <returns>正常字串</returns>
public static string Unicode2String(string source)
{
return new Regex(@"\\u([0-9A-F]{4})", RegexOptions.IgnoreCase | RegexOptions.Compiled).Replace(
source, x => string.Empty + Convert.ToChar(Convert.ToUInt16(x.Result("$1"), 16)));
}
public LanguageEnum GetCountry()
{
if (Application.platform == RuntimePlatform.Android)
{
//獲得系統國家代碼
AndroidJavaClass unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject _unityContext = unityClass.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject locale = _unityContext.Call<AndroidJavaObject>("getResources").Call<AndroidJavaObject>("getConfiguration").Get<AndroidJavaObject>("locale");
string country = locale.Call<string>("getCountry");
return GetLanguage(country);
}
else
{
return LanguageEnum.CHINESE;
}
}
private LanguageEnum GetLanguage(string code)
{
LanguageEnum temp = LanguageEnum.CHINESE;
switch (code)
{
case "PH":
temp = LanguageEnum.FEILVBIN;//菲律賓Filipino PH PHL
break;
case "MY":
temp = LanguageEnum.MALAIXIYA;//馬來西亞MY MYS
break;
case "CN":
case "TW":
temp = LanguageEnum.CHINESE;
break;
default:
temp = LanguageEnum.ENGLISH;
break;
}
return temp;
}
}
呼叫Json
Languages.Instance.Init();//游戲開始呼叫初始化
text.text = Languages.Instance.GetText("001006");//界面使用
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/277134.html
標籤:其他
上一篇:VUE+Express+MongoDB前后端分離,實作一個便簽墻(一)
下一篇:第十一屆藍橋杯 ——車牌
