本地化的基礎流程
- 獲得本地化字符串
LanguageSource.GetTranslation
或LocalizationManager.GetTermTranslation
- 如果屬於資源類就
LanguageSource.FindAsset
或LocalizationManager.FindAsset
LocalizationManager
- 記錄所有實例
- 所有
LanguageSource
,用於訪問到所有本地化數據 - 所有註冊的
ILocalizeTarget
,用於處理對不同類型腳本的具體本地化邏輯 - 所有註冊的
ILocalizationParamsManager
,用於處理{[???]}
參數的嵌入邏輯
- 所有
- 提供主要靜態方法
- 本地化方法如:
LocalizeAll
,GetTermTranslation
,GetAppName
,ApplyLocalizationParams
- 工具方法如:
ApplyRTLfix
- 資源方法如:
FindAsset
- 本地化方法如:
LanguageSource
翻譯數據的存儲位置
- TermData
- 本地化文本存儲的類
- 無論什麼類型的資源,都會最終存爲字符串類型。如果爲資源類型,則需要再查找資源。
- 如:sprite會存成資源的名字xxx。在使用的時候,再去本地化系統中的Assets裏邊去查找
- LanguageData
- 語言配置
- Assets
- 存儲當前LanguageSource用到的資源
Localize 和 ILocalizeTarget
ILocalizeTarget
爲不同類型腳本的具體漢化邏輯。Localize
在初始化的時候會從LocalizationManager
獲得當前適用的ILocalizeTarget
。
層次結構如下
public abstract class ILocalizeTarget
public abstract class LocalizeTarget<T> : ILocalizeTarget where T : Object
public class LocalizeTarget_UnityUI_Text : LocalizeTarget<UnityEngine.UI.Text> {}
public class LocalizeTarget_UnityUI_Image : LocalizeTarget<UnityEngine.UI.Image>
{
public override void GetFinalTerms ( Localize cmp, string Main, string Secondary, out string primaryTerm, out string secondaryTerm )
{
// 獲取需要的腳本
var mTarget = GetTarget(cmp);
// 用mainTexture.name作爲本地化key
primaryTerm = mTarget.mainTexture ? mTarget.mainTexture.name : "";
if (mTarget.sprite!=null && mTarget.sprite.name!=primaryTerm)
primaryTerm += "." + mTarget.sprite.name;
secondaryTerm = null;
}
public override void DoLocalize ( Localize cmp, string mainTranslation, string secondaryTranslation )
{
var mTarget = GetTarget(cmp);
// 對物體進行本地化
Sprite Old = mTarget.sprite;
if (Old==null || Old.name!=mainTranslation)
mTarget.sprite = cmp.FindTranslatedObject<Sprite>( mainTranslation );
}
}
參數的處理
You have {[VALUE1]} points.
通過{[???]}
的形式存儲的字符串,通過正則查找出來({\[(.*?)\]}
)
在執行本地化的時候,會查找全局的ILocalizationParamsManager
。進匹配成功的參數進行替換。
複數的處理
You have {[VALUE1]} points.[i2p_Zero]You have no points.[i2p_One]You have 1 point.
如果一個翻譯串裏邊出現{[VALUE]}一類的參數,就可以設置複數形式。內部存儲如上。
if (pluralType != null)
{
var tag = "[i2p_" + pluralType + "]";
idx0 = translation.IndexOf (tag, System.StringComparison.OrdinalIgnoreCase);
if (idx0 < 0) idx0 = 0;
else idx0 += tag.Length;
idx1 = translation.IndexOf ("[i2p_", idx0+1, System.StringComparison.OrdinalIgnoreCase);
if (idx1 < 0) idx1 = translation.Length;
translation = translation.Substring(idx0, idx1-idx0);
}
上述代碼查找i2p的標籤進行字符串裁剪