hellbound/Assets/Sources/I2/Localization/Scripts/Manager/LocalizationManager_Paramet...

187 lines
6.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using UnityEngine;
using Object = UnityEngine.Object;
namespace I2.Loc
{
public static partial class LocalizationManager
{
#region Variables: Misc
public static List<ILocalizationParamsManager> ParamManagers = new List<ILocalizationParamsManager>();
#endregion
#region Parameters
public delegate object _GetParam(string param);
public static void AutoLoadGlobalParamManagers()
{
foreach (var manager in Object.FindObjectsOfType<LocalizationParamsManager>())
{
if (manager._IsGlobalManager && !ParamManagers.Contains(manager))
{
Debug.Log(manager);
ParamManagers.Add(manager);
}
}
}
public static void ApplyLocalizationParams(ref string translation, bool allowLocalizedParameters = true)
{
ApplyLocalizationParams(ref translation, p => GetLocalizationParam(p, null), allowLocalizedParameters);
}
public static void ApplyLocalizationParams(ref string translation, GameObject root, bool allowLocalizedParameters = true)
{
ApplyLocalizationParams(ref translation, p => GetLocalizationParam(p, root), allowLocalizedParameters);
}
public static void ApplyLocalizationParams(ref string translation, Dictionary<string, object> parameters, bool allowLocalizedParameters = true)
{
ApplyLocalizationParams(ref translation, p => {
object o = null;
if (parameters.TryGetValue(p, out o))
return o;
return null;
}, allowLocalizedParameters);
}
public static void ApplyLocalizationParams(ref string translation, _GetParam getParam, bool allowLocalizedParameters=true)
{
if (translation == null)
return;
string pluralType=null;
int idx0 = 0;
int idx1 = translation.Length;
int index = 0;
while (index>=0 && index<translation.Length)
{
int iParamStart = translation.IndexOf("{[", index, StringComparison.Ordinal);
if (iParamStart < 0) break;
int iParamEnd = translation.IndexOf("]}", iParamStart, StringComparison.Ordinal);
if (iParamEnd < 0) break;
// there is a sub param, so, skip this one: "this {[helo{[hi]} end"
int isubParam = translation.IndexOf("{[", iParamStart+1, StringComparison.Ordinal);
if (isubParam>0 && isubParam<iParamEnd)
{
index = isubParam;
continue;
}
// Check that some plural parameters can have the form: {[#name]}
var offset = translation[iParamStart + 2] == '#' ? 3 : 2;
var param = translation.Substring(iParamStart + offset, iParamEnd - iParamStart - offset);
var result = (string)getParam(param);
if (result != null)
{
if (allowLocalizedParameters)
{
// check if Param is Localized
LanguageSourceData source;
var termData = GetTermData(result, out source);
if (termData != null)
{
int idx = source.GetLanguageIndex(CurrentLanguage);
if (idx >= 0)
{
result = termData.GetTranslation(idx);
}
}
}
var paramTag = translation.Substring(iParamStart, iParamEnd - iParamStart + 2);
translation = translation.Replace(paramTag, result);
int amount = 0;
if (int.TryParse(result, out amount))
{
pluralType = GoogleLanguages.GetPluralType(CurrentLanguageCode, amount).ToString();
}
index = iParamStart + result.Length;
}
else
{
index = iParamEnd + 2;
}
}
if (pluralType != null)
{
var tag = "[i2p_" + pluralType + "]";
idx0 = translation.IndexOf(tag, StringComparison.OrdinalIgnoreCase);
if (idx0 < 0) idx0 = 0;
else idx0 += tag.Length;
idx1 = translation.IndexOf("[i2p_", idx0 + 1, StringComparison.OrdinalIgnoreCase);
if (idx1 < 0) idx1 = translation.Length;
translation = translation.Substring(idx0, idx1 - idx0);
}
}
internal static string GetLocalizationParam(string ParamName, GameObject root)
{
string result = null;
if (root)
{
var components = root.GetComponents<MonoBehaviour>();
for (int i = 0, imax = components.Length; i < imax; ++i)
{
var manager = components[i] as ILocalizationParamsManager;
if (manager != null && components[i].enabled)
{
result = manager.GetParameterValue(ParamName);
if (result != null)
return result;
}
}
}
for (int i = 0, imax = ParamManagers.Count; i < imax; ++i)
{
result = ParamManagers[i].GetParameterValue(ParamName);
if (result != null)
return result;
}
return null;
}
#endregion
#region Plural
private static string GetPluralType( MatchCollection matches, string langCode, _GetParam getParam)
{
for (int i = 0, nMatches = matches.Count; i < nMatches; ++i)
{
var match = matches[i];
var param = match.Groups[match.Groups.Count - 1].Value;
var result = (string)getParam(param);
if (result == null)
continue;
int amount = 0;
if (!int.TryParse (result, out amount))
continue;
var pluralType = GoogleLanguages.GetPluralType(langCode, amount);
return pluralType.ToString ();
}
return null;
}
#endregion
}
}