diff --git a/Assets/AutoTranslate/Editor/AutoTranslate_EditorWindow.cs b/Assets/AutoTranslate/Editor/AutoTranslate_EditorWindow.cs index 994a9f8..171f99f 100644 --- a/Assets/AutoTranslate/Editor/AutoTranslate_EditorWindow.cs +++ b/Assets/AutoTranslate/Editor/AutoTranslate_EditorWindow.cs @@ -10,6 +10,7 @@ using UnityEngine.Localization; using EqualchanceGames.Tools.FactoryTranslate; using EqualchanceGames.Tools.InterfaceTranslate; +using System.Threading; namespace EqualchanceGames.Tools.AutoTranslate.Windows { @@ -18,6 +19,9 @@ public class AutoTranslate_EditorWindow : BaseLocalization_EditorWindow // Window parameters protected const string k_WindowTitle = "Auto Translate for Unity Localization"; + // EditorPrefs key for saving language selection + private const string PREF_KEY_SELECTED_LANGUAGES = "AutoTranslate_SelectedLanguages"; + // Arguments for execute private TranslateParameters _translateParameters = new TranslateParameters(); @@ -49,6 +53,9 @@ protected override void OnEnable() base.OnEnable(); _isErrorConnection = WebInformation.IsConnectedToInternet(); + // Load saved preferences + _translateParameters.LoadPrefs(); + if (_sharedStringTables != null) _checkListStringTable = new CheckListGUI(_sharedStringTables.Select(w => w.TableCollectionName).ToList()); else @@ -67,6 +74,9 @@ protected override void OnEnable() _checkListLanguages.Height = 600; _checkListLanguages.MinHeight = 500; + // Load saved language selection + LoadSelectedLanguages(); + _dropdownLanguages.UpdateSelected += DropdownLanguages_UpdateSelected; AutoTranslateSetting setting = AutoTranslateSetting.GetOrCreateSettings(); @@ -98,8 +108,12 @@ protected override void OnFocus() } if (_locales != null) { - _checkListLanguages = new CheckListGUI(_locales.Select(w => w.name).ToList()); + // Exclude Pseudo-Locale + _checkListLanguages = new CheckListGUI(_locales.Where(w => !w.name.Contains("Pseudo-Locale")).Select(w => w.name).ToList()); if (_dropdownLanguages != null) _checkListLanguages.UpdateCheck(new List() { _dropdownLanguages.Selected }, false, false); + + // Load saved language selection + LoadSelectedLanguages(); } AutoTranslateSetting setting = AutoTranslateSetting.GetOrCreateSettings(); @@ -123,9 +137,20 @@ void OnGUI() EditorGUILayout.HelpBox(translator.GetNameService() + " service does not support some dialects of languages, the choice of language will be changed to the generally accepted.", MessageType.Warning); } - _translateParameters.canOverrideWords = LinesGUI.DrawLineToggle("Override words that have a translation", _translateParameters.canOverrideWords, k_SeparationWidth); - _translateParameters.canTranslateEmptyWords = LinesGUI.DrawLineToggle("Single word translation. No translation errors, but attempts are exhausted faster.", _translateParameters.canTranslateEmptyWords, k_SeparationWidth); - _translateParameters.canTranslateSmartWords = LinesGUI.DrawLineToggle("Translate smart words", _translateParameters.canTranslateSmartWords, k_SeparationWidth); + bool newCanOverrideWords = LinesGUI.DrawLineToggle("Override words that have a translation", _translateParameters.canOverrideWords, k_SeparationWidth); + bool newCanTranslateEmptyWords = LinesGUI.DrawLineToggle("Translate words that don't have a translation", _translateParameters.canTranslateEmptyWords, k_SeparationWidth); + bool newCanTranslateSmartWords = LinesGUI.DrawLineToggle("Translate smart words", _translateParameters.canTranslateSmartWords, k_SeparationWidth); + + // Save preferences when values change + if (newCanOverrideWords != _translateParameters.canOverrideWords || + newCanTranslateEmptyWords != _translateParameters.canTranslateEmptyWords || + newCanTranslateSmartWords != _translateParameters.canTranslateSmartWords) + { + _translateParameters.canOverrideWords = newCanOverrideWords; + _translateParameters.canTranslateEmptyWords = newCanTranslateEmptyWords; + _translateParameters.canTranslateSmartWords = newCanTranslateSmartWords; + _translateParameters.SavePrefs(); + } //EditorGUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); //EditorGUILayout.LabelField("Translate words that contain chars", GUILayout.Width(k_SeparationWidth)); //int minchar = (int)MinChar; @@ -138,7 +163,9 @@ void OnGUI() GUILayout.Space(10); - EditorGUILayout.HelpBox(" Found " + _locales?.Count + " languages" + + // Exclude Pseudo-Locale + int countLocales = _locales?.Count(w => !w.name.Contains("Pseudo-Locale")) ?? 0; + EditorGUILayout.HelpBox(" Found " + countLocales + " languages" + "\n Found " + _sharedStringTables?.Count + " table collection" + "\n Found " + _stringTables?.Count + " string tables" + "\n Found " + _assetTables?.Count + " asset tables", MessageType.Info); @@ -153,7 +180,34 @@ void OnGUI() } LS = EditorGUILayout.BeginFoldoutHeaderGroup(LS, "Target languages"); - if (LS) _checkListLanguages.DrawButtons(); + if (LS) + { + // Store previous state to detect changes + var previousState = _checkListLanguages.RowCheckLists + .Select(r => new { r.Name, r.IsActive }) + .ToList(); + + _checkListLanguages.DrawButtons(); + + // Check if any language selection changed + bool stateChanged = false; + for (int i = 0; i < _checkListLanguages.RowCheckLists.Count; i++) + { + var current = _checkListLanguages.RowCheckLists[i]; + var previous = previousState.FirstOrDefault(p => p.Name == current.Name); + if (previous != null && previous.IsActive != current.IsActive) + { + stateChanged = true; + break; + } + } + + // Save if changed + if (stateChanged) + { + SaveSelectedLanguages(); + } + } EditorGUILayout.EndFoldoutHeaderGroup(); var names = GetNames(); @@ -208,11 +262,13 @@ private void ButtonTranslate_Click() _isErrorConnection = WebInformation.IsConnectedToInternet(); if (_isErrorConnection ) return; - EditorUtility.DisplayCancelableProgressBar("Translating", "Load Tables", 0); - + EditorUtility.DisplayCancelableProgressBar("Translating", "Load Tables...", 0); + Thread.Sleep(50); + UpdateLocalization(); - - EditorUtility.DisplayCancelableProgressBar("Translating", "Preparation translate", 0.1f); + + EditorUtility.DisplayCancelableProgressBar("Translating", "Preparation translate...", 0.05f); + Thread.Sleep(50); _selectedLocale = _locales.First(w => w.LocaleName == _dropdownLanguages.Selected); @@ -234,17 +290,48 @@ private void ButtonTranslate_Click() } } + EditorUtility.DisplayCancelableProgressBar("Translating", "Initializing translator...", 0.08f); + Thread.Sleep(50); + TranslateLocalization translateLocalization = new TranslateLocalization(); _translateParameters.FillDictinary(_checkListStringTable.RowCheckLists); + // Calculate total count + int selectedTablesCount = _checkListStringTable.RowCheckLists.Count(r => r.IsActive); + int targetLanguagesCount = translateData.locales.Count; + int totalCount = selectedTablesCount * targetLanguagesCount; + int currentIndex = 0; + + // Debug info + // UnityEngine.Debug.Log($"[AutoTranslate] Selected Tables: {selectedTablesCount}, Target Languages: {targetLanguagesCount}, Total: {totalCount}"); + // UnityEngine.Debug.Log($"[AutoTranslate] translateData.sharedtables count: {translateData.sharedtables.Count}"); + // UnityEngine.Debug.Log($"[AutoTranslate] translateData.locales count: {translateData.locales.Count}"); + + EditorUtility.DisplayCancelableProgressBar("Translating", $"Ready to translate {totalCount} items... (Tables: {selectedTablesCount}, Languages: {targetLanguagesCount})", 0.1f); + Thread.Sleep(100); // Increase delay to see the message + try { foreach (var translateStatus in translateLocalization.Make(_translateParameters, translateData)) { - if (EditorUtility.DisplayCancelableProgressBar("Translating", "Translate... Table " + translateStatus.sharedTable + " | Language -" + translateStatus.targetLanguageTable, translateStatus.progress)) + //UnityEngine.Debug.Log($"[AutoTranslate] Status: sharedTable='{translateStatus.sharedTable}', targetLanguage='{translateStatus.targetLanguageTable}', progress={translateStatus.progress}"); + + if (!string.IsNullOrEmpty(translateStatus.sharedTable)) { - return; + // Increment first, then display (so first table shows as 1/total) + currentIndex++; + + string progressMessage = $"Translate... ({currentIndex}/{totalCount}) Table: {translateStatus.sharedTable} | Language: {translateStatus.targetLanguageTable}"; + + // Display progress bar + if (EditorUtility.DisplayCancelableProgressBar("Translating", progressMessage, translateStatus.progress)) + { + return; + } + + EditorUtility.DisplayCancelableProgressBar("Translating", progressMessage, translateStatus.progress); + Thread.Sleep(50); // Longer delay to ensure visibility } } } @@ -268,10 +355,15 @@ private void ButtonTranslate_Click() EditorUtility.ClearProgressBar(); } + // Save all modified string tables + EditorUtility.DisplayProgressBar("Translating", "Saving string tables...", 0.95f); SaveStringTables(); - - EditorUtility.DisplayProgressBar("Translating", "Completed", 1f); - + Thread.Sleep(200); // Show saving message for half a second + + // Show completion briefly + EditorUtility.DisplayProgressBar("Translating", "Translation completed!", 1f); + Thread.Sleep(500); // Show completion message for half a second + EditorUtility.ClearProgressBar(); } @@ -282,6 +374,53 @@ private void SaveStringTables() EditorUtility.SetDirty(stringTable); } } + + /// + /// Save selected languages to EditorPrefs + /// + private void SaveSelectedLanguages() + { + if (_checkListLanguages == null || _checkListLanguages.RowCheckLists == null) + return; + + var selectedLanguages = _checkListLanguages.RowCheckLists + .Where(r => r.IsActive) + .Select(r => r.Name) + .ToList(); + + string serialized = string.Join("|", selectedLanguages); + EditorPrefs.SetString(PREF_KEY_SELECTED_LANGUAGES, serialized); + } + + /// + /// Load selected languages from EditorPrefs + /// + private void LoadSelectedLanguages() + { + if (_checkListLanguages == null || _checkListLanguages.RowCheckLists == null) + return; + + string serialized = EditorPrefs.GetString(PREF_KEY_SELECTED_LANGUAGES, ""); + if (string.IsNullOrEmpty(serialized)) + return; + + var selectedLanguages = serialized.Split('|').ToList(); + foreach (RowCheckList rowCheckList in _checkListLanguages.RowCheckLists) + { + if(!rowCheckList.IsAvailable) + { + continue; + } + if(selectedLanguages.Contains(rowCheckList.Name)) + { + rowCheckList.IsActive = true; + } + else + { + rowCheckList.IsActive = false; + } + } + } } } diff --git a/Assets/AutoTranslate/Editor/BaseLocalization_EditorWindow.cs b/Assets/AutoTranslate/Editor/BaseLocalization_EditorWindow.cs index 9883c5a..ccac520 100644 --- a/Assets/AutoTranslate/Editor/BaseLocalization_EditorWindow.cs +++ b/Assets/AutoTranslate/Editor/BaseLocalization_EditorWindow.cs @@ -49,7 +49,8 @@ protected override void OnFocus() if ( _dropdownLanguages != null) { _dropdownLanguages.ClearOptions(); - _dropdownLanguages.AddOptions(_locales.Select(w => w.name).ToList()); + // Exclude Pseudo-Locale + _dropdownLanguages.AddOptions(_locales.Where(w => !w.name.Contains("Pseudo-Locale")).Select(w => w.name).ToList()); } else { diff --git a/Assets/AutoTranslate/GUIPro/CheckListGUI.cs b/Assets/AutoTranslate/GUIPro/CheckListGUI.cs index df6ecd2..31ff915 100644 --- a/Assets/AutoTranslate/GUIPro/CheckListGUI.cs +++ b/Assets/AutoTranslate/GUIPro/CheckListGUI.cs @@ -11,7 +11,7 @@ public class CheckListGUI : BaseGUI public int Width = 1000; public int MinWidth = 100; public int Height; - public int MinHeight = 100; + public int MinHeight = 200; public Color BackColor = Color.gray; private GUIStyle CheckListStyle; diff --git a/Assets/AutoTranslate/GoogleApiFree/GoogleApiFree.cs b/Assets/AutoTranslate/GoogleApiFree/GoogleApiFree.cs index 2aa21b6..96ff17a 100644 --- a/Assets/AutoTranslate/GoogleApiFree/GoogleApiFree.cs +++ b/Assets/AutoTranslate/GoogleApiFree/GoogleApiFree.cs @@ -1,28 +1,52 @@ -ο»Ώusing EqualchanceGames.Tools.Helpers; +using EqualchanceGames.Tools.Helpers; using EqualchanceGames.Tools.InterfaceTranslate; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; -using System.Diagnostics; using System.Linq; using System.Net; -using System.Reflection; using System.Text; -using UnityEngine.TestTools; namespace EqualchanceGames.Tools.InterfaceTranslate { public class GoogleApiFree : ITranslateApi { private const int MAXCHARS_FORREQUST = 5000; + + // Half-width bracket separators (original) private const String SEPARATE_STRING = " [π“€€] "; private const String SEPARATE_STRING2 = " [⨉] "; private const String SEPARATE_STRING3 = "[β„–]"; private const String SEPARATE_STRING4 = "[⨉]"; private const String SEPARATE_STRING5 = "[π“€€]"; + + // Full-width bracket separators (for Japanese/Chinese translations) + private const String SEPARATE_STRING_FW = " 【𓀀】 "; + private const String SEPARATE_STRING2_FW = " 【⨉】 "; + private const String SEPARATE_STRING3_FW = "【№】"; + private const String SEPARATE_STRING4_FW = "【⨉】"; + private const String SEPARATE_STRING5_FW = "【𓀀】"; + + // Mixed bracket separators (half-width + full-width) + private const String SEPARATE_STRING_MIX1 = " [𓀀】 "; + private const String SEPARATE_STRING_MIX2 = " 【𓀀] "; + private const String SEPARATE_STRING_MIX3 = " [⨉】 "; + private const String SEPARATE_STRING_MIX4 = " 【⨉] "; + private const String SEPARATE_STRING3_MIX = "[№】"; - private Dictionary _ignoreLocale; + private Dictionary _ignoreLocale; + + /// + /// Number of items to translate in each batch + /// (Smaller batches are more reliable but slower) + /// + public int BatchSize = 10; + + /// + /// Delay in milliseconds between translation batches to avoid rate limiting + /// + public int BatchDelayMs = 100; public GoogleApiFree() { @@ -66,88 +90,148 @@ public string Translate(string sourceText, string sourceLanguage, string targetL return respontTranslateGoogle.FullRespont; } - public Dictionary Translate(Dictionary words, string sourceLanguage, string targetLanguage, bool singleWordTranslation = false, string key = null) + public Dictionary Translate(Dictionary words, string sourceLanguage, string targetLanguage, string key = null) { - List listRespontWords = new List(); Dictionary targetWords = new Dictionary(); - StringBuilder sourceText = new StringBuilder(MAXCHARS_FORREQUST + 100); - StringBuilder sourceTryText = new StringBuilder(MAXCHARS_FORREQUST + 100); - - string translationFromGoogle = string.Empty; - RespontTranslateGoogle respontTranslateGoogle; - sourceLanguage = MappingLocale(sourceLanguage); targetLanguage = MappingLocale(targetLanguage); - if (singleWordTranslation) - { - foreach (var item in words) - { - translationFromGoogle = RequestToGoogleApi(item.Value, sourceLanguage, targetLanguage, key); - respontTranslateGoogle = DeserializeRespont(translationFromGoogle); - if (string.IsNullOrEmpty(respontTranslateGoogle.FullRespont) == true) listRespontWords.Add(""); - else listRespontWords.Add(respontTranslateGoogle.FullRespont); - } - } - else - { - foreach (var item in words) - { - string temp = item.Value + SEPARATE_STRING; - sourceTryText.Append(temp); - if (sourceTryText.Length > MAXCHARS_FORREQUST) - { - translationFromGoogle = RequestToGoogleApi(sourceTryText.ToString(), sourceLanguage, targetLanguage, key); - respontTranslateGoogle = DeserializeRespont(translationFromGoogle); - listRespontWords.AddRange(respontTranslateGoogle.FullRespont.Split(SEPARATE_STRING.ToCharArray()).ToList()); - sourceTryText.Clear(); - sourceText.Clear(); - } - else - { - sourceText.Append(temp); - } - } - - translationFromGoogle = RequestToGoogleApi(sourceText.ToString(), sourceLanguage, targetLanguage); - - respontTranslateGoogle = DeserializeRespont(translationFromGoogle); - string response = respontTranslateGoogle.FullRespont; - String[] mass = new String[5]; - mass[0] = SEPARATE_STRING; - mass[1] = SEPARATE_STRING4; - mass[2] = SEPARATE_STRING5; - mass[3] = SEPARATE_STRING2; - mass[4] = SEPARATE_STRING3; - - listRespontWords.AddRange(response.Split(mass, StringSplitOptions.None).ToList()); - } - - if (listRespontWords.Count != 0 && String.IsNullOrEmpty(listRespontWords[listRespontWords.Count - 1])) + // Define separator array once for consistent splitting + // Include both half-width and full-width brackets for Japanese/Chinese translations + String[] separators = new String[15]; + separators[0] = SEPARATE_STRING; + separators[1] = SEPARATE_STRING4; + separators[2] = SEPARATE_STRING5; + separators[3] = SEPARATE_STRING2; + separators[4] = SEPARATE_STRING3; + // Full-width bracket variants (used by Google Translate for Japanese/Chinese) + separators[5] = SEPARATE_STRING_FW; + separators[6] = SEPARATE_STRING2_FW; + separators[7] = SEPARATE_STRING3_FW; + separators[8] = SEPARATE_STRING4_FW; + separators[9] = SEPARATE_STRING5_FW; + // Mixed variants + separators[10] = SEPARATE_STRING_MIX1; + separators[11] = SEPARATE_STRING_MIX2; + separators[12] = SEPARATE_STRING_MIX3; + separators[13] = SEPARATE_STRING_MIX4; + separators[14] = SEPARATE_STRING3_MIX; + + // Process in batches to avoid URL length limits + var wordsList = words.ToList(); + int totalWords = wordsList.Count; + int batchNumber = 0; + + //UnityEngine.Debug.Log($"[GoogleApiFree] Starting translation for {totalWords} words in batches of {BatchSize}"); + + for (int i = 0; i < totalWords; i += BatchSize) { - listRespontWords.RemoveAt(listRespontWords.Count - 1); + batchNumber++; + int batchSize = System.Math.Min(BatchSize, totalWords - i); + var currentBatch = wordsList.GetRange(i, batchSize); + + //UnityEngine.Debug.Log($"[GoogleApiFree] Batch {batchNumber}: Processing items {i + 1} to {i + batchSize} ({batchSize} items)"); + + // Build request text + StringBuilder batchText = new StringBuilder(); + foreach (var item in currentBatch) + { + batchText.Append(item.Value); + batchText.Append(SEPARATE_STRING); + } + + try + { + // Send request + string requestText = batchText.ToString(); + string translationFromGoogle = RequestToGoogleApi(requestText, sourceLanguage, targetLanguage, key); + RespontTranslateGoogle respontTranslateGoogle = DeserializeRespont(translationFromGoogle); + + // Split results - keep empty entries to maintain alignment + var rawSplitResult = respontTranslateGoogle.FullRespont.Split(separators, StringSplitOptions.None); + + // Clean up the split results: trim whitespace and filter meaningful entries + var splitResult = new List(); + foreach (var item in rawSplitResult) + { + string trimmed = item.Trim(); + if (!string.IsNullOrWhiteSpace(trimmed)) + { + splitResult.Add(trimmed); + } + } + + //UnityEngine.Debug.Log($"[GoogleApiFree] Batch {batchNumber}: Expected {batchSize} translations, received {splitResult.Count}"); + + // Validate result count + if (splitResult.Count != batchSize) + { + UnityEngine.Debug.LogWarning($"[GoogleApiFree] Batch {batchNumber}: Translation count mismatch! Expected {batchSize}, got {splitResult.Count}"); + UnityEngine.Debug.LogWarning($"[GoogleApiFree] Request preview: {requestText.Substring(0, System.Math.Min(300, requestText.Length))}"); + UnityEngine.Debug.LogWarning($"[GoogleApiFree] Response preview: {respontTranslateGoogle.FullRespont.Substring(0, System.Math.Min(500, respontTranslateGoogle.FullRespont.Length))}"); + + // Debug: Show each split item + for (int debugIdx = 0; debugIdx < System.Math.Min(splitResult.Count, 15); debugIdx++) + { + UnityEngine.Debug.LogWarning($"[GoogleApiFree] Split[{debugIdx}]: '{splitResult[debugIdx]}'"); + } + } + + // Map results to dictionary + if (splitResult.Count == batchSize) + { + // Perfect match - direct mapping + for (int j = 0; j < currentBatch.Count; j++) + { + targetWords.Add(currentBatch[j].Key, splitResult[j]); + } + } + else + { + // Count mismatch - retry each item individually to avoid mapping errors + UnityEngine.Debug.LogWarning($"[GoogleApiFree] Translation count mismatch in batch {batchNumber}. Retrying items individually..."); + + foreach (var item in currentBatch) + { + try + { + UnityEngine.Debug.Log($"[GoogleApiFree] Individually translating '{item.Key}': '{item.Value}'"); + string singleTranslation = Translate(item.Value, sourceLanguage, targetLanguage, key); + UnityEngine.Debug.Log($"[GoogleApiFree] Individual result for '{item.Key}': '{singleTranslation}'"); + targetWords.Add(item.Key, singleTranslation); + System.Threading.Thread.Sleep(BatchDelayMs / 2); // Shorter delay for individual items + } + catch (System.Exception ex) + { + UnityEngine.Debug.LogWarning($"[GoogleApiFree] Failed to translate '{item.Key}': {ex.Message}. Using original value."); + targetWords.Add(item.Key, item.Value); + } + } + } + + // Add small delay between batches to avoid rate limiting + if (i + batchSize < totalWords) + { + System.Threading.Thread.Sleep(BatchDelayMs); + } + } + catch (System.Exception ex) + { + UnityEngine.Debug.LogError($"[GoogleApiFree] Batch {batchNumber} failed with error: {ex.Message}"); + // Use original values as fallback for this batch + foreach (var item in currentBatch) + { + if (!targetWords.ContainsKey(item.Key)) + { + targetWords.Add(item.Key, item.Value); + } + } + } } - if (listRespontWords.Count != words.Count) - { - foreach (var item in words) - { - targetWords.Add(item.Key, ""); - } - } - else - { - int index = 0; - foreach (var item in words) - { - // string responseWord = listRespontWords[index]; - //if (item.Value.Length != 0 && responseWord.Length != 0 && ) - targetWords.Add(item.Key, listRespontWords[index]); - ++index; - } - } - + UnityEngine.Debug.Log($"[GoogleApiFree] Translation completed. Processed {targetWords.Count}/{totalWords} words"); + return targetWords; } @@ -188,20 +272,23 @@ private string RequestToGoogleApi(string sourceText, string sourceLanguage, stri { string translationFromGoogle = ""; + // URL encode the source text to handle special characters properly + string encodedSourceText = System.Uri.EscapeDataString(sourceText); + string url = string.Empty; if ( key == null ) { url = string.Format("https://translate.googleapis.com/translate_a/single?client=gtx&sl={0}&tl={1}&dt=t&q={2}", sourceLanguage, targetLanguage, - sourceText); + encodedSourceText); } else { url = string.Format("https://translate.googleapis.com/translate_a/single?client=gtx&sl={0}&tl={1}&dt=t&q={2}&key={3}", sourceLanguage, targetLanguage, - sourceText, + encodedSourceText, key); } @@ -222,4 +309,4 @@ public class RespontTranslateGoogle public List TargetWords = new List(); public string FullRespont; } -} +} \ No newline at end of file diff --git a/Assets/AutoTranslate/Scripts/AutoLocalization_MenuItems.cs b/Assets/AutoTranslate/Scripts/AutoLocalization_MenuItems.cs index 8d1462e..64a7bf4 100644 --- a/Assets/AutoTranslate/Scripts/AutoLocalization_MenuItems.cs +++ b/Assets/AutoTranslate/Scripts/AutoLocalization_MenuItems.cs @@ -12,8 +12,9 @@ public class AutoLocalization_MenuItems : MonoBehaviour public const string MainDomainNameMenuItem = "Auto Localization"; - [MenuItem(MainDomainNameMenuItem, false, 6000)] - public static void PriorityDomainName() {} + // Commented out invalid MenuItem - Unity requires menu items to have at least one submenu level + // [MenuItem(MainDomainNameMenuItem, false, 6000)] + // public static void PriorityDomainName() {} [MenuItem("Auto Localization/Add Define Auto Localization", false, 10000 + 120)] public static void AddDefine_AutoLocalization() diff --git a/Assets/AutoTranslate/Scripts/SimpleInterfaceTranslateApi/ITranslateApi.cs b/Assets/AutoTranslate/Scripts/SimpleInterfaceTranslateApi/ITranslateApi.cs index 2e2464f..2a1696a 100644 --- a/Assets/AutoTranslate/Scripts/SimpleInterfaceTranslateApi/ITranslateApi.cs +++ b/Assets/AutoTranslate/Scripts/SimpleInterfaceTranslateApi/ITranslateApi.cs @@ -5,7 +5,7 @@ namespace EqualchanceGames.Tools.InterfaceTranslate public interface ITranslateApi { string Translate(string word, string sourceLanguage, string targetLanguage, string key = null); - Dictionary Translate(Dictionary words, string sourceLanguage, string targetLanguage, bool singleWordTranslation = false, string key = null); + Dictionary Translate(Dictionary words, string sourceLanguage, string targetLanguage, string key = null); bool CheckService(); bool ValidateLocale(string nameLocale); string MappingLocale(string nameLocale); diff --git a/Assets/AutoTranslate/Scripts/TranslateLocalization/TranslateLocalization.cs b/Assets/AutoTranslate/Scripts/TranslateLocalization/TranslateLocalization.cs index b9190b3..ff02a07 100644 --- a/Assets/AutoTranslate/Scripts/TranslateLocalization/TranslateLocalization.cs +++ b/Assets/AutoTranslate/Scripts/TranslateLocalization/TranslateLocalization.cs @@ -82,7 +82,7 @@ public IEnumerable Make(TranslateParameters translateParameters StringTableEntry targetWord; if (targetLanguageTable.TryGetValue(entry.Id, out targetWord)) { - if (String.IsNullOrEmpty(targetWord.Value) == false && translateParameters.canOverrideWords == false) + if (translateParameters.canOverrideWords == false) { continue; } @@ -141,7 +141,7 @@ public IEnumerable Make(TranslateParameters translateParameters if ( lists.Count != 0 ) { - Dictionary result = translator.Translate(lists, sourceLanguageTable.LocaleIdentifier.Code, targetLanguageTable.LocaleIdentifier.Code, translateParameters.canTranslateEmptyWords); + Dictionary result = translator.Translate(lists, sourceLanguageTable.LocaleIdentifier.Code, targetLanguageTable.LocaleIdentifier.Code); foreach (var item in result) { diff --git a/Assets/AutoTranslate/Scripts/TranslateLocalization/TranslateParameters.cs b/Assets/AutoTranslate/Scripts/TranslateLocalization/TranslateParameters.cs index 71afbad..daa25f4 100644 --- a/Assets/AutoTranslate/Scripts/TranslateLocalization/TranslateParameters.cs +++ b/Assets/AutoTranslate/Scripts/TranslateLocalization/TranslateParameters.cs @@ -1,10 +1,17 @@ using EqualchanceGames.Tools.GUIPro; using System.Collections.Generic; +#if UNITY_EDITOR +using UnityEditor; +#endif namespace EqualchanceGames.Tools.AutoTranslate { public class TranslateParameters { + private const string PREF_KEY_OVERRIDE = "AutoTranslate_CanOverrideWords"; + private const string PREF_KEY_EMPTY = "AutoTranslate_CanTranslateEmptyWords"; + private const string PREF_KEY_SMART = "AutoTranslate_CanTranslateSmartWords"; + public bool canOverrideWords = false; public bool canTranslateEmptyWords = false; public bool canTranslateSmartWords = true; @@ -18,5 +25,27 @@ public void FillDictinary(List rowCheckLists) IsTranslateStringTables.Add(rowCheckList.Name, rowCheckList.IsActive); } } + +#if UNITY_EDITOR + /// + /// Load settings from EditorPrefs + /// + public void LoadPrefs() + { + canOverrideWords = EditorPrefs.GetBool(PREF_KEY_OVERRIDE, false); + canTranslateEmptyWords = EditorPrefs.GetBool(PREF_KEY_EMPTY, false); + canTranslateSmartWords = EditorPrefs.GetBool(PREF_KEY_SMART, true); + } + + /// + /// Save settings to EditorPrefs + /// + public void SavePrefs() + { + EditorPrefs.SetBool(PREF_KEY_OVERRIDE, canOverrideWords); + EditorPrefs.SetBool(PREF_KEY_EMPTY, canTranslateEmptyWords); + EditorPrefs.SetBool(PREF_KEY_SMART, canTranslateSmartWords); + } +#endif } }