本地化的基础流程
- 获得本地化字符串
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的标签进行字符串裁剪