using UnityEditor; using UnityEngine; namespace Crowdin.Plugin.Helpers.PluginLocalization { using Models; using ScriptableObjects; using Server_API; public static class LocalizationHelper { private const string FileName = "CrowdinPluginLocalization"; private static readonly string LocalizationPath = $"Crowdin/{FileName}"; private static readonly string FullLocalizationPath = $"{FolderHelper.resourcesDirectory}/{FileName}.asset"; private static CrowdinPluginLocalization Localization { get; set; } static LocalizationHelper() { TryCreateLocalizationObj(); } public static void ResetLocalizations() { Localization = null; } public static string GetLocalStringByKey(LocalKeys key) { if (!TryLoadLocalization()) { TryCreateLocalizationObj(); } var localType = Localization.localizationStrings.GetType(); var field = localType.GetField(key.ToString()); if (field == null) { return key.ToString(); } var value = field.GetValue(Localization.localizationStrings); return value?.ToString() ?? key.ToString(); } /// Matches main's behaviour: an invalid/expired token (401) shows the same friendly /// "check your credentials" message used by the Connect popup, instead of the raw, /// technical API error text used for every other failure. public static string GetLocalStringByException(CrowdinApiException ex) { return ex.StatusCode == System.Net.HttpStatusCode.Unauthorized ? GetLocalStringByKey(LocalKeys.get_projects_error_label) : GetLocalStringByKey(LocalKeys.error_api, ex.ApiMessage); } public static string GetLocalStringByKey(LocalKeys key, string val) { var translation = GetLocalStringByKey(key); var replace = translation.Replace("&0", val); return replace; } public static string GetLocalStringByKey(LocalKeys key, string val0, string val1) { var translation = GetLocalStringByKey(key); var replace = translation.Replace("&0", val0); return replace.Replace("&1", val1); } public static string GetLocalStringByKey(LocalKeys key, string val0, string val1, string val2) { var translation = GetLocalStringByKey(key); var replace = translation.Replace("&0", val0); replace = replace.Replace("&1", val1); return replace.Replace("&2", val2); } private static bool TryLoadLocalization() { var settings = Resources.Load(LocalizationPath); if (settings == null) { return false; } Localization = settings; EditorUtility.SetDirty(settings); return true; } private static bool IsLoadLocalization() { return !(Localization is null); } private static void TryCreateLocalizationObj() { FolderHelper.TryCreateFolders(); if (!IsLoadLocalization()) { TryLoadLocalization(); } if (IsLoadLocalization()) { return; } var asset = ScriptableObject.CreateInstance(); AssetDatabase.CreateAsset(asset, FullLocalizationPath); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); TryLoadLocalization(); } } }