Initial commit: Unity WordConnect project

This commit is contained in:
2025-08-01 19:12:05 +08:00
commit f14db75802
3503 changed files with 448337 additions and 0 deletions

View File

@ -0,0 +1,215 @@
// // ©2015 - 2025 Candy Smith
// // All rights reserved
// // Redistribution of this software is strictly not allowed.
// // Copy of this software can be obtained from unity asset store only.
// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
// // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// // THE SOFTWARE.
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using UnityEngine;
using VContainer;
using WordsToolkit.Scripts.Levels;
using WordsToolkit.Scripts.Services;
using WordsToolkit.Scripts.Settings;
using WordsToolkit.Scripts.System;
namespace WordsToolkit.Scripts.Localization
{
public class LocalizationManager : SingletonBehaviour<LocalizationManager>, ILocalizationService
{
private static DebugSettings _debugSettings;
public static Dictionary<string, string> _dic;
private SystemLanguage _currentLanguage;
[Inject]
private LanguageConfiguration languageConfig;
[Inject]
private ILanguageService languageService;
private Dictionary<string, string> _placeholdersDic;
public override void Awake()
{
base.Awake();
InitializeLocalization();
}
public void InitializeLocalization()
{
_debugSettings = Resources.Load("Settings/DebugSettings") as DebugSettings;
LoadLanguage(GetSystemLanguage());
}
public void SetKeysPlaceholders(Dictionary<string, string> keys)
{
if (keys == null || keys.Count == 0)
{
Debug.LogWarning("Localization keys are null or empty. Using default language.");
LoadLanguage(SystemLanguage.English);
return;
}
_placeholdersDic = new Dictionary<string, string>(keys);
}
public void SetPairPlaceholder(string key, string value)
{
_placeholdersDic ??= new Dictionary<string, string>();
_placeholdersDic[key] = value;
}
public void LoadLanguage(SystemLanguage language)
{
_currentLanguage = language;
// Convert language enum to CultureInfo to get the actual file name
var cultureInfo = CultureInfo.GetCultures(CultureTypes.AllCultures)
.FirstOrDefault(c => string.Equals(c.EnglishName, language.ToString(), StringComparison.OrdinalIgnoreCase));
var fileName = cultureInfo != null ? cultureInfo.EnglishName : language.ToString();
var txt = Resources.Load<TextAsset>($"Localization/{fileName}");
if (txt == null)
{
Debug.LogWarning($"Localization file for {fileName} not found. Falling back to English.");
txt = Resources.Load<TextAsset>("Localization/English");
_currentLanguage = SystemLanguage.English;
}
_dic = new Dictionary<string, string>();
var lines = txt.text.Split(new[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);
foreach (var inp_ln in lines)
{
var l = inp_ln.Split(new[] { ':' }, 2);
if (l.Length == 2)
{
var key = l[0].Trim();
var text = l[1].Trim();
_dic[key] = text;
}
}
}
public void LoadLanguageFromBase(TextAsset localizationBase)
{
if (localizationBase == null)
{
Debug.LogWarning("Localization base is null. Falling back to English.");
LoadLanguage(SystemLanguage.English);
return;
}
_dic = new Dictionary<string, string>();
var lines = localizationBase.text.Split(new[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);
foreach (var inp_ln in lines)
{
var l = inp_ln.Split(new[] { ':' }, 2);
if (l.Length == 2)
{
var key = l[0].Trim();
var text = l[1].Trim();
_dic[key] = text;
}
}
}
public static SystemLanguage GetSystemLanguage()
{
if (_debugSettings == null)
{
_debugSettings = Resources.Load("Settings/DebugSettings") as DebugSettings;
}
// Try to get language from LanguageService if available
if (instance != null && instance.languageService != null)
{
try
{
var languageCode = instance.languageService.GetCurrentLanguageCode();
var cultureInfo = new CultureInfo(languageCode);
return (SystemLanguage)Enum.Parse(typeof(SystemLanguage), cultureInfo.EnglishName);
}
catch (Exception)
{
// Fallback if there's an issue parsing the language code
Debug.LogWarning("Failed to parse language from LanguageService. Using fallback.");
}
}
// Fallback to PlayerPrefs check for backward compatibility
if (PlayerPrefs.HasKey("SelectedLanguage"))
{
try
{
var value = PlayerPrefs.GetString("SelectedLanguage");
var cultureInfo = new CultureInfo(value);
return (SystemLanguage)Enum.Parse(typeof(SystemLanguage), cultureInfo.EnglishName);
}
catch (Exception)
{
Debug.LogWarning("Failed to parse saved language preference. Using default.");
}
}
if (Application.isEditor)
{
return _debugSettings.TestLanguage;
}
return Application.systemLanguage;
}
public string GetText(string key, string defaultText)
{
var currentLanguage = GetSystemLanguage();
if (_currentLanguage != currentLanguage || _dic == null || _dic.Count == 0)
{
LoadLanguage(currentLanguage);
}
if (!_dic.ContainsKey(key))
{
LoadLanguage(currentLanguage);
}
if (_dic.TryGetValue(key, out var localizedText) && !string.IsNullOrEmpty(localizedText))
{
return PlaceholderManager.ReplacePlaceholders(localizedText, _placeholdersDic);
}
return PlaceholderManager.ReplacePlaceholders(defaultText, _placeholdersDic);
}
public SystemLanguage GetCurrentLanguage()
{
return _currentLanguage;
}
public string GetLocalizedCurrentLanguage()
{
if (languageService != null)
{
var currentLanguageInfo = languageService.GetCurrentLanguageInfo();
if (currentLanguageInfo != null)
{
return currentLanguageInfo.localizedName;
}
}
// Fallback to old logic
foreach (var lang in languageConfig.languages)
{
if (lang.displayName == _currentLanguage.ToString())
{
return lang.localizedName;
}
}
return _currentLanguage.ToString();
}
}
}