Unity插件I2Localization源碼分析

本地化的基礎流程

  1. 獲得本地化字符串LanguageSource.GetTranslationLocalizationManager.GetTermTranslation
  2. 如果屬於資源類就LanguageSource.FindAssetLocalizationManager.FindAsset

LocalizationManager

  1. 記錄所有實例
    • 所有LanguageSource,用於訪問到所有本地化數據
    • 所有註冊的ILocalizeTarget,用於處理對不同類型腳本的具體本地化邏輯
    • 所有註冊的ILocalizationParamsManager,用於處理{[???]}參數的嵌入邏輯
  2. 提供主要靜態方法
    • 本地化方法如:LocalizeAll,GetTermTranslation,GetAppName,ApplyLocalizationParams
    • 工具方法如:ApplyRTLfix
    • 資源方法如:FindAsset

LanguageSource

翻譯數據的存儲位置

  1. TermData
    • 本地化文本存儲的類
    • 無論什麼類型的資源,都會最終存爲字符串類型。如果爲資源類型,則需要再查找資源。
      • 如:sprite會存成資源的名字xxx。在使用的時候,再去本地化系統中的Assets裏邊去查找
  2. LanguageData
    • 語言配置
  3. 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的標籤進行字符串裁剪

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章