using UnityEditor; using UnityEditor.Localization; using UnityEngine; using UnityEngine.Localization.Tables; namespace Crowdin.Plugin.Helpers.UnityLocalization { using Models.Translations; using Server_API.Helpers; public static class ImportDataHelper { public static bool ImportStringRow( TranslationString translationString, string tableName, bool? preserveEntryIds = null) { bool preserveIds = preserveEntryIds ?? SettingsHelper.GetToggleStatus_PreserveEntryIdsOnImport(); var stringTableCollection = LocalizationEditorSettings.GetStringTableCollection(tableName); var locales = LocalizationEditorSettings.GetLocales(); var keyId = stringTableCollection.SharedData.GetId(translationString.key); if (keyId == 0) { SharedTableData.SharedTableEntry sharedTableEntry = translationString.entryId is not 0 ? stringTableCollection.SharedData.AddKey(translationString.key, translationString.entryId) : stringTableCollection.SharedData.AddKey(translationString.key); keyId = sharedTableEntry.Id; } else if (preserveIds && translationString.entryId is not 0 && keyId != translationString.entryId) { Debug.LogWarning( $"[Crowdin] Key \"{translationString.key}\" already exists with local ID {keyId}, " + $"but Crowdin entry ID is {translationString.entryId}. Keeping local mapping."); } for (var i = 0; i < stringTableCollection.StringTables.Count; i++) { if (i >= locales.Count) { continue; } var code = UnityLocalizationHelper.GetLanguageCode( stringTableCollection.StringTables[i].LocaleIdentifier); if (SettingsHelper.GetSourceLanguage() == code) { stringTableCollection.StringTables[i].AddEntry(keyId, translationString.sourceString); } else { var translation = translationString.translations.Find(item => item.language == code); if (translation == null) { continue; } stringTableCollection.StringTables[i].AddEntry(keyId, translation.text); } } return true; } public static bool ImportAssetRow(TranslationAsset translationAsset, string tableName) { var assetTableCollection = LocalizationEditorSettings.GetAssetTableCollection(tableName); EditorUtility.SetDirty(assetTableCollection); var locales = LocalizationEditorSettings.GetLocales(); var keyId = assetTableCollection.SharedData.GetId(translationAsset.key); if (keyId == 0) { return false; } for (var i = 0; i < assetTableCollection.AssetTables.Count; i++) { if (i >= locales.Count) { continue; } var code = UnityLocalizationHelper.GetLanguageCode(assetTableCollection.AssetTables[i].LocaleIdentifier); if (SettingsHelper.GetSourceLanguage() == code) { if (translationAsset.sourceObject == null) continue; var path = AssetDatabase.GetAssetPath(translationAsset.sourceObject); var guid = AssetDatabase.AssetPathToGUID(path); assetTableCollection.AssetTables[i].AddEntry(keyId, guid); } else { var translation = translationAsset.translations.Find(item => item.language == code); if (translation == null) continue; var path = AssetDatabase.GetAssetPath(translation.asset); var guid = AssetDatabase.AssetPathToGUID(path); assetTableCollection.AssetTables[i].AddEntry(keyId, guid); } } return true; } } }