using System; using System.Collections.Generic; using System.Linq; namespace I2.Loc { public partial class LanguageSourceData { #region Language public int GetLanguageIndex( string language, bool AllowDiscartingRegion = true, bool SkipDisabled = true) { // First look for an exact match for (int i=0, imax=mLanguages.Count; iBestSimilitud) { BestSimilitud = commonWords; MostSimilar = i; } //if (AreTheSameLanguage(mLanguages[i].Name, language)) // return i; } if (MostSimilar>=0) return MostSimilar; } return -1; } public LanguageData GetLanguageData(string language, bool AllowDiscartingRegion = true) { int idx = GetLanguageIndex(language, AllowDiscartingRegion, false); return idx < 0 ? null : mLanguages[idx]; } // TODO: Fix IsCurrentLanguage when current=English and there are two variants in the source (English Canada, English US) public bool IsCurrentLanguage( int languageIndex ) { return LocalizationManager.CurrentLanguage == mLanguages[languageIndex].Name; } public int GetLanguageIndexFromCode( string Code, bool exactMatch=true, bool ignoreDisabled = false) { for (int i = 0, imax = mLanguages.Count; i < imax; ++i) { if (ignoreDisabled && !mLanguages[i].IsEnabled()) continue; if (string.Compare(mLanguages[i].Code, Code, StringComparison.OrdinalIgnoreCase) == 0) return i; } if (!exactMatch) { // Find any match without using the Regions for (int i = 0, imax = mLanguages.Count; i < imax; ++i) { if (ignoreDisabled && !mLanguages[i].IsEnabled()) continue; if (string.Compare(mLanguages[i].Code, 0, Code, 0, 2, StringComparison.OrdinalIgnoreCase) == 0) return i; } } return -1; } public static int GetCommonWordInLanguageNames(string Language1, string Language2) { if (string.IsNullOrEmpty (Language1) || string.IsNullOrEmpty (Language2)) return 0; var separators = "( )-/\\".ToCharArray(); string[] Words1 = Language1.ToLower().Split(separators); string[] Words2 = Language2.ToLower().Split(separators); int similitud = 0; foreach (var word in Words1) if (!string.IsNullOrEmpty(word) && Words2.Contains(word)) similitud++; foreach (var word in Words2) if (!string.IsNullOrEmpty(word) && Words1.Contains(word)) similitud++; return similitud; } public static bool AreTheSameLanguage(string Language1, string Language2) { Language1 = GetLanguageWithoutRegion(Language1); Language2 = GetLanguageWithoutRegion(Language2); return string.Compare(Language1, Language2, StringComparison.OrdinalIgnoreCase)==0; } public static string GetLanguageWithoutRegion(string Language) { int Index = Language.IndexOfAny("(/\\[,{".ToCharArray()); if (Index<0) return Language; return Language.Substring(0, Index).Trim(); } public void AddLanguage(string LanguageName) { AddLanguage(LanguageName, GoogleLanguages.GetLanguageCode(LanguageName)); } public void AddLanguage( string LanguageName, string LanguageCode ) { if (GetLanguageIndex(LanguageName, false)>=0) return; LanguageData Lang = new LanguageData(); Lang.Name = LanguageName; Lang.Code = LanguageCode; mLanguages.Add (Lang); int NewSize = mLanguages.Count; for (int i=0, imax=mTerms.Count; i GetLanguages( bool skipDisabled = true) { List Languages = new List(); for (int j = 0, jmax = mLanguages.Count; j < jmax; ++j) { if (!skipDisabled || mLanguages[j].IsEnabled()) Languages.Add(mLanguages[j].Name); } return Languages; } public List GetLanguagesCode(bool allowRegions = true, bool skipDisabled = true) { List Languages = new List(); for (int j = 0, jmax = mLanguages.Count; j < jmax; ++j) { if (skipDisabled && !mLanguages[j].IsEnabled()) continue; var code = mLanguages[j].Code; if (!allowRegions && code != null && code.Length > 2) code = code.Substring(0, 2); if (!string.IsNullOrEmpty(code) && !Languages.Contains(code)) Languages.Add(code); } return Languages; } public bool IsLanguageEnabled(string Language) { int idx = GetLanguageIndex(Language, false); return idx >= 0 && mLanguages[idx].IsEnabled(); } public void EnableLanguage(string Language, bool bEnabled) { int idx = GetLanguageIndex(Language, false, false); if (idx >= 0) mLanguages[idx].SetEnabled(bEnabled); } #endregion #region Save/Load Language public bool AllowUnloadingLanguages() { #if UNITY_EDITOR return _AllowUnloadingLanguages==eAllowUnloadLanguages.EditorAndDevice; #else return _AllowUnloadingLanguages!=eAllowUnloadLanguages.Never; #endif } string GetSavedLanguageFileName(int languageIndex) { if (languageIndex < 0) return null; return "LangSource_" + GetSourcePlayerPrefName() + "_" + mLanguages[languageIndex].Name + ".loc"; } public void LoadLanguage( int languageIndex, bool UnloadOtherLanguages, bool useFallback, bool onlyCurrentSpecialization, bool forceLoad ) { if (!AllowUnloadingLanguages()) return; // Some consoles don't allow IO access if (!PersistentStorage.CanAccessFiles()) return; if (languageIndex >= 0 && (forceLoad || !mLanguages[languageIndex].IsLoaded())) { var tempPath = GetSavedLanguageFileName(languageIndex); var langData = PersistentStorage.LoadFile(PersistentStorage.eFileType.Temporal, tempPath, false); if (!string.IsNullOrEmpty(langData)) { Import_Language_from_Cache(languageIndex, langData, useFallback, onlyCurrentSpecialization); mLanguages[languageIndex].SetLoaded(true); } } if (UnloadOtherLanguages && I2Utils.IsPlaying()) { for (int lan = 0; lan < mLanguages.Count; ++lan) { if (lan != languageIndex) UnloadLanguage(lan); } } } // if forceLoad, then the language is loaded from the cache even if its already loaded // this is needed to cleanup fallbacks public void LoadAllLanguages(bool forceLoad=false) { for (int i = 0; i < mLanguages.Count; ++i) { LoadLanguage(i, false, false, false, forceLoad); } } public void UnloadLanguage(int languageIndex) { if (!AllowUnloadingLanguages()) return; // Some consoles don't allow IO access if (!PersistentStorage.CanAccessFiles()) return; if (!I2Utils.IsPlaying() || !mLanguages[languageIndex].IsLoaded() || !mLanguages[languageIndex].CanBeUnloaded() || IsCurrentLanguage(languageIndex) || !PersistentStorage.HasFile(PersistentStorage.eFileType.Temporal, GetSavedLanguageFileName(languageIndex))) { return; } foreach (var termData in mTerms) { termData.Languages[languageIndex] = null; } mLanguages[languageIndex].SetLoaded(false); } public void SaveLanguages( bool unloadAll, PersistentStorage.eFileType fileLocation = PersistentStorage.eFileType.Temporal) { if (!AllowUnloadingLanguages()) return; // Some consoles don't allow IO access if (!PersistentStorage.CanAccessFiles()) return; for (int i = 0; i < mLanguages.Count; ++i) { var data = Export_Language_to_Cache(i, IsCurrentLanguage(i)); if (string.IsNullOrEmpty(data)) continue; PersistentStorage.SaveFile(PersistentStorage.eFileType.Temporal, GetSavedLanguageFileName(i), data); } if (unloadAll) { for (int i = 0; i < mLanguages.Count; ++i) { if (unloadAll && !IsCurrentLanguage(i)) UnloadLanguage(i); } } } public bool HasUnloadedLanguages() { for (int i = 0; i < mLanguages.Count; ++i) { if (!mLanguages[i].IsLoaded()) return true; } return false; } #endregion } }