Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
169 changes: 154 additions & 15 deletions Assets/AutoTranslate/Editor/AutoTranslate_EditorWindow.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
using UnityEngine.Localization;
using EqualchanceGames.Tools.FactoryTranslate;
using EqualchanceGames.Tools.InterfaceTranslate;
using System.Threading;

namespace EqualchanceGames.Tools.AutoTranslate.Windows
{
Expand All @@ -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();

Expand Down Expand Up @@ -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
Expand All @@ -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();
Expand Down Expand Up @@ -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<string>() { _dropdownLanguages.Selected }, false, false);

// Load saved language selection
LoadSelectedLanguages();
}

AutoTranslateSetting setting = AutoTranslateSetting.GetOrCreateSettings();
Expand All @@ -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;
Expand All @@ -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);
Expand All @@ -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();
Expand Down Expand Up @@ -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);

Expand All @@ -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
}
}
}
Expand All @@ -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();
}

Expand All @@ -282,6 +374,53 @@ private void SaveStringTables()
EditorUtility.SetDirty(stringTable);
}
}

/// <summary>
/// Save selected languages to EditorPrefs
/// </summary>
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);
}

/// <summary>
/// Load selected languages from EditorPrefs
/// </summary>
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;
}
}
}
}
}

3 changes: 2 additions & 1 deletion Assets/AutoTranslate/Editor/BaseLocalization_EditorWindow.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down
2 changes: 1 addition & 1 deletion Assets/AutoTranslate/GUIPro/CheckListGUI.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Loading