コード例 #1
0
        void Export_Local(string File, eLocalSpreadsheeet CurrentExtension, eSpreadsheetUpdateMode UpdateMode)
        {
            try
            {
                serializedObject.ApplyModifiedProperties();
                serializedObject.Update();
                ClearErrors();

                string sPath = string.Empty;
                if (!System.IO.Path.IsPathRooted(File))
                {
                    File = string.Concat(Application.dataPath, "/", File);
                }

                try {
                    sPath = System.IO.Path.GetDirectoryName(File);
                }
                catch (System.Exception) {}

                if (string.IsNullOrEmpty(sPath))
                {
                    sPath = Application.dataPath + "/";
                }

                File = System.IO.Path.GetFileName(File);
                if (string.IsNullOrEmpty(File))
                {
                    File = "Localization.csv";
                }

                if (Application.platform == RuntimePlatform.OSXEditor)
                {
                    File = EditorUtility.SaveFilePanel("Select a CSV file renamed as TXT", sPath, File, "txt");
                }
                else
                {
                    File = EditorUtility.SaveFilePanel("Select a CSV or TXT file", sPath, File, "csv;*.txt");
                }
                if (!string.IsNullOrEmpty(File))
                {
                    mLanguageSource.Spreadsheet_LocalFileName = TryMakingPathRelativeToProject(File);

                    char Separator = mProp_Spreadsheet_LocalCSVSeparator.stringValue.Length > 0 ? mProp_Spreadsheet_LocalCSVSeparator.stringValue[0] : ',';
                    var  encoding  = System.Text.Encoding.GetEncoding(mProp_Spreadsheet_LocalCSVEncoding.stringValue);
                    if (encoding == null)
                    {
                        encoding = System.Text.Encoding.UTF8;
                    }

                    switch (CurrentExtension)
                    {
                    case eLocalSpreadsheeet.CSV: Export_CSV(File, UpdateMode, Separator, encoding); break;
                    }
                }
            }
            catch (System.Exception)
            {
                ShowError("Unable to export file\nCheck it is not READ-ONLY and that\nits not opened in an external viewer");
            }
        }
コード例 #2
0
        void OnGUI_GoogleButtons_ImportExport(string SpreadsheetKey)
        {
            GUI.enabled = !string.IsNullOrEmpty(SpreadsheetKey) && mConnection_WWW == null;

            GUILayout.BeginHorizontal();
            GUILayout.Space(10);

            eSpreadsheetUpdateMode Mode = SynchronizationButtons("Import");

            if (Mode != eSpreadsheetUpdateMode.None)
            {
                ClearErrors();
                serializedObject.ApplyModifiedProperties();

                Import_Google(Mode);
            }

            GUILayout.FlexibleSpace();

            Mode = SynchronizationButtons("Export");
            if (Mode != eSpreadsheetUpdateMode.None)
            {
                ClearErrors();
                serializedObject.ApplyModifiedProperties();

                Export_Google(Mode);
            }

            GUILayout.Space(10);
            GUILayout.EndHorizontal();

            GUI.enabled = true;
        }
コード例 #3
0
        void OnGUI_Spreadsheet_Local_ImportExport(eLocalSpreadsheeet CurrentExtension, string File)
        {
            GUI.enabled = (CurrentExtension != eLocalSpreadsheeet.NONE);

            GUILayout.BeginHorizontal();
            GUILayout.Space(10);

            GUI.backgroundColor = Color.Lerp(Color.gray, Color.white, 0.5f);
            eSpreadsheetUpdateMode Mode = SynchronizationButtons("Import");

            if (Mode != eSpreadsheetUpdateMode.None)
            {
                Import_Local(File, CurrentExtension, Mode);
            }

            GUILayout.FlexibleSpace();

            GUI.backgroundColor = Color.Lerp(Color.gray, Color.white, 0.5f);
            Mode = SynchronizationButtons("Export", true);
            if (Mode != eSpreadsheetUpdateMode.None)
            {
                Export_Local(File, CurrentExtension, Mode);
            }

            GUILayout.Space(10);
            GUILayout.EndHorizontal();

            GUI.enabled = true;
        }
コード例 #4
0
        void Import_Google(eSpreadsheetUpdateMode UpdateMode)
        {
            StopConnectionWWW();
            LanguageSource source = ((LanguageSource)target);

            mConnection_WWW = source.Import_Google_CreateWWWcall(true);
            if (mConnection_WWW == null)
            {
                OnImported_Google(string.Empty, "Unable to import from google", eSpreadsheetUpdateMode.Replace);
            }
            else
            {
                mConnection_Callback = null;
                switch (UpdateMode)
                {
                case eSpreadsheetUpdateMode.Replace: mConnection_Callback += OnImported_Google_Replace; break;

                case eSpreadsheetUpdateMode.Merge: mConnection_Callback += OnImported_Google_Merge; break;

                case eSpreadsheetUpdateMode.AddNewTerms: mConnection_Callback += OnImported_Google_AddNewTerms; break;
                }
                EditorApplication.update += CheckForConnection;
                mConnection_Text          = "Downloading spreadsheet";
                //mConnection_TimeOut = Time.realtimeSinceStartup + 10;
            }
        }
コード例 #5
0
        void OnImported_Google(string Result, string Error, eSpreadsheetUpdateMode UpdateMode)
        {
            if (!string.IsNullOrEmpty(Error))
            {
                Debug.Log(Error);
                ShowError("Unable to access google");
                return;
            }
            LanguageSource source    = ((LanguageSource)target);
            string         ErrorMsg  = source.Import_Google_Result(Result, UpdateMode);
            bool           HasErrors = !string.IsNullOrEmpty(ErrorMsg);

            if (HasErrors)
            {
                ShowError(ErrorMsg);
            }

            serializedObject.Update();
            ParseTerms(true, !HasErrors);
            mSelectedKeys.Clear();
            mSelectedCategories.Clear();
            ScheduleUpdateTermsToShowInList();
            mLanguageSource.GetCategories(false, mSelectedCategories);

            EditorUtility.SetDirty(target);
            AssetDatabase.SaveAssets();
        }
コード例 #6
0
        public void Export_CSV(string FileName, eSpreadsheetUpdateMode UpdateMode, char Separator = ',')
        {
            LanguageSource source = (LanguageSource)target;

            string CSVstring = source.Export_CSV(null, Separator);

            System.IO.File.WriteAllText(FileName, CSVstring, System.Text.Encoding.UTF8);
        }
コード例 #7
0
        public void Export_CSV(string FileName, eSpreadsheetUpdateMode UpdateMode, char Separator, System.Text.Encoding encoding)
        {
            LanguageSource source = (LanguageSource)target;

            string CSVstring = source.Export_CSV(null, Separator, mProp_Spreadsheet_SpecializationAsRows.boolValue);

            System.IO.File.WriteAllText(FileName, CSVstring, encoding);
        }
コード例 #8
0
        public WWW Export_Google_CreateWWWcall(eSpreadsheetUpdateMode UpdateMode = eSpreadsheetUpdateMode.Replace)
        {
            string  value   = Export_Google_CreateData();
            WWWForm wWWForm = new WWWForm();

            wWWForm.AddField("key", Google_SpreadsheetKey);
            wWWForm.AddField("action", "SetLanguageSource");
            wWWForm.AddField("data", value);
            wWWForm.AddField("updateMode", UpdateMode.ToString());
            return(new WWW(LocalizationManager.GetWebServiceURL(this), wWWForm));
        }
コード例 #9
0
        void OnGUI_GoogleButtons_ImportExport(string SpreadsheetKey)
        {
            GUI.enabled = !string.IsNullOrEmpty(SpreadsheetKey) && mConnection_WWW == null;

            GUILayout.BeginHorizontal();
            GUILayout.Space(10);

            eSpreadsheetUpdateMode Mode = SynchronizationButtons("Import");

            if (Mode != eSpreadsheetUpdateMode.None || InTestAction(eTest_ActionType.Button_GoogleSpreadsheet_Import))
            {
                if (mTestAction == eTest_ActionType.Button_GoogleSpreadsheet_Import)
                {
                    Mode = (eSpreadsheetUpdateMode)mTestActionArg;
                }

                serializedObject.ApplyModifiedProperties();

                var modeCopy = Mode;
                GUITools.DelayedCall(() => Import_Google(modeCopy));
            }

            GUILayout.FlexibleSpace();

            Mode = SynchronizationButtons("Export");
            if (Mode != eSpreadsheetUpdateMode.None || InTestAction(eTest_ActionType.Button_GoogleSpreadsheet_Export))
            {
                if (mTestAction == eTest_ActionType.Button_GoogleSpreadsheet_Export)
                {
                    Mode = (eSpreadsheetUpdateMode)mTestActionArg;
                }

                serializedObject.ApplyModifiedProperties();

                var modeCopy = Mode;
                GUITools.DelayedCall(() => Export_Google(modeCopy));
            }

            GUILayout.Space(10);
            GUILayout.EndHorizontal();

            GUILayout.BeginHorizontal();
            GUILayout.FlexibleSpace();
            EditorGUIUtility.labelWidth += 10;
            EditorGUILayout.PropertyField(mProp_Spreadsheet_SpecializationAsRows, new GUIContent("Show Specializations as Rows", "true: Make each specialization a separate row (e.g. Term[VR]..., Term[Touch]....\nfalse: Merge specializations into same cell separated by [i2s_XXX]"));
            EditorGUIUtility.labelWidth -= 10;
            GUILayout.EndHorizontal();
            GUILayout.Space(10);


            GUI.enabled = true;
        }
コード例 #10
0
        void Import_CSV(string FileName, eSpreadsheetUpdateMode UpdateMode)
        {
            LanguageSource source    = (LanguageSource)target;
            string         CSVstring = LocalizationReader.ReadCSVfile(FileName);

            char   Separator = mProp_Spreadsheet_LocalCSVSeparator.stringValue.Length > 0 ? mProp_Spreadsheet_LocalCSVSeparator.stringValue[0] : ',';
            string sError    = source.Import_CSV(string.Empty, CSVstring, UpdateMode, Separator);

            if (!string.IsNullOrEmpty(sError))
            {
                ShowError(sError);
            }

            LocalizationEditor.mSelectedCategories = source.GetCategories();
            mShouldDetectStoreIntegration          = true;
        }
コード例 #11
0
        eSpreadsheetUpdateMode SynchronizationButtons(string Operation, bool ForceReplace = false)
        {
            eSpreadsheetUpdateMode Result = eSpreadsheetUpdateMode.None;

            GUILayout.BeginVertical(EditorStyles.textArea, GUILayout.Width(1));
            GUI.backgroundColor = Color.white;

            GUILayout.BeginHorizontal();
            GUILayout.FlexibleSpace();
            GUILayout.Label(Operation, EditorStyles.miniLabel);
            GUILayout.FlexibleSpace();
            GUILayout.EndHorizontal();

            GUILayout.BeginHorizontal();
            if (GUILayout.Button("Replace", EditorStyles.toolbarButton, GUILayout.Width(60)))
            {
                Result = eSpreadsheetUpdateMode.Replace;
            }

            if (ForceReplace)
            {
                GUI.enabled = false;
            }
            if (GUILayout.Button("Merge", EditorStyles.toolbarButton, GUILayout.Width(60)))
            {
                Result = eSpreadsheetUpdateMode.Merge;
            }

            if (GUILayout.Button("Add New", EditorStyles.toolbarButton, GUILayout.Width(60)))
            {
                Result = eSpreadsheetUpdateMode.AddNewTerms;
            }
            GUI.enabled = mConnection_WWW == null;
            GUILayout.Space(1);
            GUILayout.EndHorizontal();

            GUILayout.Space(2);
            GUILayout.EndVertical();

            if (Result != eSpreadsheetUpdateMode.None)
            {
                ClearErrors();
            }

            return(Result);
        }
コード例 #12
0
        private void OnGUI_ExportButtons()
        {
            eSpreadsheetUpdateMode Mode = SynchronizationButtons("Export");

            if (Mode != eSpreadsheetUpdateMode.None || InTestAction(eTest_ActionType.Button_GoogleSpreadsheet_Export))
            {
                if (mTestAction == eTest_ActionType.Button_GoogleSpreadsheet_Export)
                {
                    Mode = (eSpreadsheetUpdateMode)mTestActionArg;
                }

                serializedObject.ApplyModifiedProperties();

                var modeCopy = Mode;
                GUITools.DelayedCall(() => Export_Google(modeCopy));
            }
        }
コード例 #13
0
        void Import_Local(string File, eLocalSpreadsheeet CurrentExtension, eSpreadsheetUpdateMode UpdateMode)
        {
            try
            {
                serializedObject.ApplyModifiedProperties();
                serializedObject.Update();
                LocalizationEditor.ClearErrors();

                if (string.IsNullOrEmpty(File))
                {
                    File = Application.dataPath + "/Localization.csv";
                }
                else
                if (!System.IO.Path.IsPathRooted(File))
                {
                    File = string.Concat(Application.dataPath, "/", File);
                }

                // On Mac there is an issue with previewing CSV files, so its forced to only TXT
                if (Application.platform == RuntimePlatform.OSXEditor)
                {
                    File = EditorUtility.OpenFilePanel("Select a CSV file renamed as TXT", File, "txt");
                }
                else
                {
                    File = EditorUtility.OpenFilePanel("Select a CSV file or a CSV file renamed as TXT", File, "csv;*.txt");
                }
                //File = EditorUtility.OpenFilePanel("Select CSV,  XLS or XLSX File", File, "csv;*.xls;*.xlsx");
                if (!string.IsNullOrEmpty(File))
                {
                    mLanguageSource.Spreadsheet_LocalFileName = TryMakingPathRelativeToProject(File);
                    switch (CurrentExtension)
                    {
                    case eLocalSpreadsheeet.CSV: Import_CSV(File, UpdateMode); break;
                    }
                    ParseTerms(true);
                    UnityEditor.EditorUtility.SetDirty(target);
                    AssetDatabase.SaveAssets();
                }
            }
            catch (System.Exception ex)
            {
                LocalizationEditor.ShowError("Unable to import file");
                Debug.LogError(ex.Message);
            }
        }
コード例 #14
0
        void Export_Google(eSpreadsheetUpdateMode UpdateMode)
        {
            StopConnectionWWW();
            LanguageSource source = ((LanguageSource)target);

            mConnection_WWW = source.Export_Google_CreateWWWcall(UpdateMode);
            if (mConnection_WWW == null)
            {
                OnExported_Google(string.Empty, "WebPlayer can't contact Google");
            }
            else
            {
                mConnection_Callback      = OnExported_Google;
                EditorApplication.update += CheckForConnection;
                mConnection_Text          = "Uploading spreadsheet";
                //mConnection_TimeOut = Time.realtimeSinceStartup + 10;
            }
        }
コード例 #15
0
        public WWW Export_Google_CreateWWWcall(eSpreadsheetUpdateMode UpdateMode = eSpreadsheetUpdateMode.Replace)
        {
                        #if UNITY_WEBPLAYER
            Debug.Log("Contacting google translation is not yet supported on WebPlayer");
            return(null);
                        #else
            string Data = Export_Google_CreateData();

            WWWForm form = new WWWForm();
            form.AddField("key", Google_SpreadsheetKey);
            form.AddField("action", "SetLanguageSource");
            form.AddField("data", Data);
            form.AddField("updateMode", UpdateMode.ToString());

            WWW www = new WWW(Google_WebServiceURL, form);
            return(www);
                        #endif
        }
コード例 #16
0
        void OnGUI_GoogleButtons_ImportExport(string SpreadsheetKey)
        {
            GUI.enabled = !string.IsNullOrEmpty(SpreadsheetKey) && mConnection_WWW == null;

            GUILayout.BeginHorizontal();
            GUILayout.Space(10);

            eSpreadsheetUpdateMode Mode = SynchronizationButtons("Import");

            if (Mode != eSpreadsheetUpdateMode.None || InTestAction(eTest_ActionType.Button_GoogleSpreadsheet_Import))
            {
                if (mTestAction == eTest_ActionType.Button_GoogleSpreadsheet_Import)
                {
                    Mode = (eSpreadsheetUpdateMode)mTestActionArg;
                }

                serializedObject.ApplyModifiedProperties();

                var modeCopy = Mode;
                GUITools.DelayedCall(() => Import_Google(modeCopy));
            }

            GUILayout.FlexibleSpace();

            Mode = SynchronizationButtons("Export");
            if (Mode != eSpreadsheetUpdateMode.None || InTestAction(eTest_ActionType.Button_GoogleSpreadsheet_Export))
            {
                if (mTestAction == eTest_ActionType.Button_GoogleSpreadsheet_Export)
                {
                    Mode = (eSpreadsheetUpdateMode)mTestActionArg;
                }

                serializedObject.ApplyModifiedProperties();

                var modeCopy = Mode;
                GUITools.DelayedCall(() => Export_Google(modeCopy));
            }

            GUILayout.Space(10);
            GUILayout.EndHorizontal();

            GUI.enabled = true;
        }
コード例 #17
0
        void Import_CSV(string FileName, eSpreadsheetUpdateMode UpdateMode)
        {
            LanguageSource source   = (LanguageSource)target;
            var            encoding = System.Text.Encoding.GetEncoding(mProp_Spreadsheet_LocalCSVEncoding.stringValue);

            if (encoding == null)
            {
                encoding = System.Text.Encoding.UTF8;
            }
            string CSVstring = LocalizationReader.ReadCSVfile(FileName, encoding);

            char   Separator = mProp_Spreadsheet_LocalCSVSeparator.stringValue.Length > 0 ? mProp_Spreadsheet_LocalCSVSeparator.stringValue[0] : ',';
            string sError    = source.Import_CSV(string.Empty, CSVstring, UpdateMode, Separator);

            if (!string.IsNullOrEmpty(sError))
            {
                ShowError(sError);
            }

            mSelectedCategories = source.GetCategories();
        }
コード例 #18
0
        void OnGUI_Spreadsheet_Local_ImportExport(eLocalSpreadsheeet CurrentExtension, string File)
        {
            GUI.enabled = (CurrentExtension != eLocalSpreadsheeet.NONE);

            GUILayout.BeginHorizontal();
            GUILayout.Space(10);

            GUI.backgroundColor = Color.Lerp(Color.gray, Color.white, 0.5f);
            eSpreadsheetUpdateMode Mode = SynchronizationButtons("Import");

            if (Mode != eSpreadsheetUpdateMode.None)
            {
                Import_Local(File, CurrentExtension, Mode);
            }

            GUILayout.FlexibleSpace();

            GUI.backgroundColor = Color.Lerp(Color.gray, Color.white, 0.5f);
            Mode = SynchronizationButtons("Export", true);
            if (Mode != eSpreadsheetUpdateMode.None)
            {
                Export_Local(File, CurrentExtension, Mode);
            }

            GUILayout.Space(10);
            GUILayout.EndHorizontal();

            GUILayout.BeginHorizontal();
            GUILayout.FlexibleSpace();
            EditorGUIUtility.labelWidth += 10;
            EditorGUILayout.PropertyField(mProp_Spreadsheet_SpecializationAsRows, new GUIContent("Show Specializations as Rows", "true: Make each specialization a separate row (e.g. Term[VR]..., Term[Touch]....\nfalse: Merge specializations into same cell separated by [i2s_XXX]"));
            EditorGUIUtility.labelWidth -= 10;
            GUILayout.EndHorizontal();


            GUI.enabled = true;
        }
コード例 #19
0
        public UnityWebRequest Export_Google_CreateWWWcall(eSpreadsheetUpdateMode UpdateMode = eSpreadsheetUpdateMode.Replace)
        {
            #if UNITY_WEBPLAYER
            Debug.Log("Contacting google translation is not yet supported on WebPlayer");
            return(null);
#else
            string Data = Export_Google_CreateData();

            WWWForm form = new WWWForm();
            form.AddField("key", Google_SpreadsheetKey);
            form.AddField("action", "SetLanguageSource");
            form.AddField("data", Data);
            form.AddField("updateMode", UpdateMode.ToString());

            #if UNITY_EDITOR
            form.AddField("password", Google_Password);
#endif


            UnityWebRequest www = UnityWebRequest.Post(LocalizationManager.GetWebServiceURL(this), form);
            I2Utils.SendWebRequest(www);
            return(www);
                        #endif
        }
コード例 #20
0
        public string Import_I2CSV(string Category, string I2CSVstring, eSpreadsheetUpdateMode UpdateMode = eSpreadsheetUpdateMode.Replace)
        {
            List <string[]> CSV = LocalizationReader.ReadI2CSV(I2CSVstring);

            return(Import_CSV(Category, CSV, UpdateMode));
        }
コード例 #21
0
        public string Import_CSV(string Category, List <string[]> CSV, eSpreadsheetUpdateMode UpdateMode = eSpreadsheetUpdateMode.Replace)
        {
            string[] Tokens = CSV[0];

            int LanguagesStartIdx = 1;
            int TypeColumnIdx     = -1;
            int DescColumnIdx     = -1;

            var ValidColumnName_Key  = new string[] { "Key" };
            var ValidColumnName_Type = new string[] { "Type" };
            var ValidColumnName_Desc = new string[] { "Desc", "Description" };

            if (Tokens.Length > 1 && ArrayContains(Tokens[0], ValidColumnName_Key))
            {
                if (UpdateMode == eSpreadsheetUpdateMode.Replace)
                {
                    ClearAllData();
                }

                if (Tokens.Length > 2)
                {
                    if (ArrayContains(Tokens[1], ValidColumnName_Type))
                    {
                        TypeColumnIdx     = 1;
                        LanguagesStartIdx = 2;
                    }
                    if (ArrayContains(Tokens[1], ValidColumnName_Desc))
                    {
                        DescColumnIdx     = 1;
                        LanguagesStartIdx = 2;
                    }
                }
                if (Tokens.Length > 3)
                {
                    if (ArrayContains(Tokens[2], ValidColumnName_Type))
                    {
                        TypeColumnIdx     = 2;
                        LanguagesStartIdx = 3;
                    }
                    if (ArrayContains(Tokens[2], ValidColumnName_Desc))
                    {
                        DescColumnIdx     = 2;
                        LanguagesStartIdx = 3;
                    }
                }
            }
            else
            {
                return("Bad Spreadsheet Format.\nFirst columns should be 'Key', 'Type' and 'Desc'");
            }

            int nLanguages = Mathf.Max(Tokens.Length - LanguagesStartIdx, 0);

            int[] LanIndices = new int[nLanguages];
            for (int i = 0; i < nLanguages; ++i)
            {
                if (string.IsNullOrEmpty(Tokens[i + LanguagesStartIdx]))
                {
                    LanIndices [i] = -1;
                    continue;
                }

                string langToken = Tokens[i + LanguagesStartIdx];

                string LanName, LanCode;
                bool   isLangEnabled = true;
                if (langToken.StartsWith("$"))
                {
                    isLangEnabled = false;
                    langToken     = langToken.Substring(1);
                }
                GoogleLanguages.UnPackCodeFromLanguageName(langToken, out LanName, out LanCode);

                int LanIdx = -1;
                if (!string.IsNullOrEmpty(LanCode))
                {
                    LanIdx = GetLanguageIndexFromCode(LanCode);
                }
                else
                {
                    LanIdx = GetLanguageIndex(LanName);
                }

                if (LanIdx < 0)
                {
                    LanguageData lanData = new LanguageData();
                    lanData.Name  = LanName;
                    lanData.Code  = LanCode;
                    lanData.Flags = (byte)(0 | (isLangEnabled?0:(int)eLanguageDataFlags.DISABLED));
                    mLanguages.Add(lanData);
                    LanIdx = mLanguages.Count - 1;
                }
                LanIndices[i] = LanIdx;
            }

            //--[ Update the Languages array in the existing terms]-----
            nLanguages = mLanguages.Count;
            for (int i = 0, imax = mTerms.Count; i < imax; ++i)
            {
                TermData termData = mTerms[i];
                if (termData.Languages.Length < nLanguages)
                {
                    Array.Resize(ref termData.Languages, nLanguages);
                    Array.Resize(ref termData.Languages_Touch, nLanguages);
                    Array.Resize(ref termData.Flags, nLanguages);
                }
            }

            //--[ Keys ]--------------

            for (int i = 1, imax = CSV.Count; i < imax; ++i)
            {
                Tokens = CSV[i];
                string sKey    = string.IsNullOrEmpty(Category) ? Tokens[0] : string.Concat(Category, "/", Tokens[0]);
                bool   isTouch = false;
                if (sKey.EndsWith("[touch]"))
                {
                    sKey    = sKey.Remove(sKey.Length - "[touch]".Length);
                    isTouch = true;
                }
                LanguageSource.ValidateFullTerm(ref sKey);
                if (string.IsNullOrEmpty(sKey))
                {
                    continue;
                }

                TermData termData = GetTermData(sKey);

                // Check to see if its a new term
                if (termData == null)
                {
                    termData      = new TermData();
                    termData.Term = sKey;

                    termData.Languages       = new string[mLanguages.Count];
                    termData.Languages_Touch = new string[mLanguages.Count];
                    termData.Flags           = new byte[mLanguages.Count];
                    for (int j = 0; j < mLanguages.Count; ++j)
                    {
                        termData.Languages[j] = termData.Languages_Touch[j] = string.Empty;
                    }

                    mTerms.Add(termData);
                    mDictionary.Add(sKey, termData);
                }
                else
                // This term already exist
                if (UpdateMode == eSpreadsheetUpdateMode.AddNewTerms)
                {
                    continue;
                }

                if (TypeColumnIdx > 0)
                {
                    termData.TermType = GetTermType(Tokens[TypeColumnIdx]);
                }

                if (DescColumnIdx > 0)
                {
                    termData.Description = Tokens[DescColumnIdx];
                }

                for (int j = 0; j < LanIndices.Length && j < Tokens.Length - LanguagesStartIdx; ++j)
                {
                    if (!string.IsNullOrEmpty(Tokens[j + LanguagesStartIdx]))                   // Only change the translation if there is a new value
                    {
                        var lanIdx = LanIndices[j];
                        if (lanIdx < 0)
                        {
                            continue;
                        }
                        var value = Tokens[j + LanguagesStartIdx];
                        //var isAuto = false;// value.Contains("[i2auto]");
                        //if (isAuto)
                        //value = value.Replace ("[i2auto]", string.Empty);

                        //if (value=="-")
                        //	value = string.Empty;

                        if (isTouch)
                        {
                            termData.Languages_Touch[lanIdx] = value;

                            /*if (isAuto)  termData.Flags[lanIdx] |= (byte)TranslationFlag.AutoTranslated_Touch;
                             *              else */termData.Flags[lanIdx] &= byte.MaxValue ^ ((byte)TranslationFlag.AutoTranslated_Touch);
                        }
                        else
                        {
                            termData.Languages[lanIdx] = value;

                            /*if (isAuto)  termData.Flags[lanIdx] |= (byte)TranslationFlag.AutoTranslated_Normal;
                             *              else*/termData.Flags[lanIdx] &= byte.MaxValue ^ ((byte)TranslationFlag.AutoTranslated_Normal);
                        }
                    }
                }
            }

            return(string.Empty);
        }
コード例 #22
0
        public string Import_Google_Result(string JsonString, eSpreadsheetUpdateMode UpdateMode, bool saveInPlayerPrefs = false)
        {
            try
            {
                string ErrorMsg = string.Empty;
                if (string.IsNullOrEmpty(JsonString) || JsonString == "\"\"")
                {
                    return(ErrorMsg);
                }

                int idxV  = JsonString.IndexOf("version=", StringComparison.Ordinal);
                int idxSV = JsonString.IndexOf("script_version=", StringComparison.Ordinal);
                if (idxV < 0 || idxSV < 0)
                {
                    return("Invalid Response from Google, Most likely the WebService needs to be updated");
                }

                idxV  += "version=".Length;
                idxSV += "script_version=".Length;

                string newSpreadsheetVersion = JsonString.Substring(idxV, JsonString.IndexOf(",", idxV, StringComparison.Ordinal) - idxV);
                var    scriptVersion         = int.Parse(JsonString.Substring(idxSV, JsonString.IndexOf(",", idxSV, StringComparison.Ordinal) - idxSV));

                if (newSpreadsheetVersion.Length > 19) // Check for corruption
                {
                    newSpreadsheetVersion = string.Empty;
                }

                if (scriptVersion != LocalizationManager.GetRequiredWebServiceVersion())
                {
                    return("The current Google WebService is not supported.\nPlease, delete the WebService from the Google Drive and Install the latest version.");
                }

                //Debug.Log (Google_LastUpdatedVersion + " - " + newSpreadsheetVersion);
                if (saveInPlayerPrefs && !IsNewerVersion(Google_LastUpdatedVersion, newSpreadsheetVersion))
#if UNITY_EDITOR
                { return(""); }
#else
                { return("LanguageSource is up-to-date"); }
#endif

                if (saveInPlayerPrefs)
                {
                    string PlayerPrefName = GetSourcePlayerPrefName();
                    PersistentStorage.SaveFile(PersistentStorage.eFileType.Persistent, "I2Source_" + PlayerPrefName, "[i2e]" + StringObfucator.Encode(JsonString) + ".loc");
                    PersistentStorage.SetSetting_String("I2SourceVersion_" + PlayerPrefName, newSpreadsheetVersion);
                    PersistentStorage.ForceSaveSettings();
                }
                Google_LastUpdatedVersion = newSpreadsheetVersion;

                if (UpdateMode == eSpreadsheetUpdateMode.Replace)
                {
                    ClearAllData();
                }

                int CSVstartIdx = JsonString.IndexOf("[i2category]", StringComparison.Ordinal);
                while (CSVstartIdx > 0)
                {
                    CSVstartIdx += "[i2category]".Length;
                    int    endCat   = JsonString.IndexOf("[/i2category]", CSVstartIdx, StringComparison.Ordinal);
                    string category = JsonString.Substring(CSVstartIdx, endCat - CSVstartIdx);
                    endCat += "[/i2category]".Length;

                    int    endCSV = JsonString.IndexOf("[/i2csv]", endCat, StringComparison.Ordinal);
                    string csv    = JsonString.Substring(endCat, endCSV - endCat);

                    CSVstartIdx = JsonString.IndexOf("[i2category]", endCSV, StringComparison.Ordinal);

                    Import_I2CSV(category, csv, UpdateMode);

                    // Only the first CSV should clear the Data
                    if (UpdateMode == eSpreadsheetUpdateMode.Replace)
                    {
                        UpdateMode = eSpreadsheetUpdateMode.Merge;
                    }
                }

                if (I2Utils.IsPlaying())
                {
                    SaveLanguages(true);
                }

#if UNITY_EDITOR
                if (!string.IsNullOrEmpty(ErrorMsg))
                {
                    UnityEditor.EditorUtility.SetDirty(this);
                }
#endif
                return(ErrorMsg);
            }
            catch (System.Exception e)
            {
                Debug.LogWarning(e);
                return(e.ToString());
            }
        }
コード例 #23
0
        public string Import_Google_Result(string JsonString, eSpreadsheetUpdateMode UpdateMode, bool saveInPlayerPrefs = false)
        {
            string empty = string.Empty;

            if (string.IsNullOrEmpty(JsonString) || JsonString == "\"\"")
            {
                return(empty);
            }
            int num  = JsonString.IndexOf("version=", StringComparison.Ordinal);
            int num2 = JsonString.IndexOf("script_version=", StringComparison.Ordinal);

            if (num < 0 || num2 < 0)
            {
                return("Invalid Response from Google, Most likely the WebService needs to be updated");
            }
            num  += "version=".Length;
            num2 += "script_version=".Length;
            string text = JsonString.Substring(num, JsonString.IndexOf(",", num, StringComparison.Ordinal) - num);
            int    num3 = int.Parse(JsonString.Substring(num2, JsonString.IndexOf(",", num2, StringComparison.Ordinal) - num2));

            if (text.Length > 19)
            {
                text = string.Empty;
            }
            if (num3 != LocalizationManager.GetRequiredWebServiceVersion())
            {
                return("The current Google WebService is not supported.\nPlease, delete the WebService from the Google Drive and Install the latest version.");
            }
            if (saveInPlayerPrefs && !IsNewerVersion(Google_LastUpdatedVersion, text))
            {
                return("LanguageSource is up-to-date");
            }
            if (saveInPlayerPrefs)
            {
                string sourcePlayerPrefName = GetSourcePlayerPrefName();
                PlayerPrefs.SetString("I2Source_" + sourcePlayerPrefName, JsonString);
                PlayerPrefs.SetString("I2SourceVersion_" + sourcePlayerPrefName, text);
                PlayerPrefs.Save();
            }
            Google_LastUpdatedVersion = text;
            if (UpdateMode == eSpreadsheetUpdateMode.Replace)
            {
                ClearAllData();
            }
            int num4 = JsonString.IndexOf("[i2category]", StringComparison.Ordinal);

            while (num4 > 0)
            {
                num4 += "[i2category]".Length;
                int    num5     = JsonString.IndexOf("[/i2category]", num4, StringComparison.Ordinal);
                string category = JsonString.Substring(num4, num5 - num4);
                num5 += "[/i2category]".Length;
                int    num6        = JsonString.IndexOf("[/i2csv]", num5, StringComparison.Ordinal);
                string i2CSVstring = JsonString.Substring(num5, num6 - num5);
                num4 = JsonString.IndexOf("[i2category]", num6, StringComparison.Ordinal);
                Import_I2CSV(category, i2CSVstring, UpdateMode);
                if (UpdateMode == eSpreadsheetUpdateMode.Replace)
                {
                    UpdateMode = eSpreadsheetUpdateMode.Merge;
                }
            }
            return(empty);
        }
コード例 #24
0
        public string Import_CSV(string Category, string CSVstring, eSpreadsheetUpdateMode UpdateMode = eSpreadsheetUpdateMode.Replace, char Separator = ',')
        {
            List <string[]> CSV = LocalizationReader.ReadCSV(CSVstring, Separator);

            return(Import_CSV(Category, CSV, UpdateMode));
        }
コード例 #25
0
        public string Import_CSV(string Category, List <string[]> CSV, eSpreadsheetUpdateMode UpdateMode = eSpreadsheetUpdateMode.Replace)
        {
            string[] array = CSV[0];
            int      num   = 1;
            int      num2  = -1;
            int      num3  = -1;

            string[] texts = new string[1]
            {
                "Key"
            };
            string[] texts2 = new string[1]
            {
                "Type"
            };
            string[] texts3 = new string[2]
            {
                "Desc",
                "Description"
            };
            if (array.Length > 1 && ArrayContains(array[0], texts))
            {
                if (UpdateMode == eSpreadsheetUpdateMode.Replace)
                {
                    ClearAllData();
                }
                if (array.Length > 2)
                {
                    if (ArrayContains(array[1], texts2))
                    {
                        num2 = 1;
                        num  = 2;
                    }
                    if (ArrayContains(array[1], texts3))
                    {
                        num3 = 1;
                        num  = 2;
                    }
                }
                if (array.Length > 3)
                {
                    if (ArrayContains(array[2], texts2))
                    {
                        num2 = 2;
                        num  = 3;
                    }
                    if (ArrayContains(array[2], texts3))
                    {
                        num3 = 2;
                        num  = 3;
                    }
                }
                int   num4   = Mathf.Max(array.Length - num, 0);
                int[] array2 = new int[num4];
                for (int i = 0; i < num4; i++)
                {
                    if (string.IsNullOrEmpty(array[i + num]))
                    {
                        array2[i] = -1;
                        continue;
                    }
                    string text = array[i + num];
                    bool   flag = true;
                    if (text.StartsWith("$"))
                    {
                        flag = false;
                        text = text.Substring(1);
                    }
                    GoogleLanguages.UnPackCodeFromLanguageName(text, out string Language, out string code);
                    int num5 = -1;
                    num5 = (string.IsNullOrEmpty(code) ? GetLanguageIndex(Language) : GetLanguageIndexFromCode(code));
                    if (num5 < 0)
                    {
                        LanguageData languageData = new LanguageData();
                        languageData.Name  = Language;
                        languageData.Code  = code;
                        languageData.Flags = (byte)(0 | ((!flag) ? 1 : 0));
                        mLanguages.Add(languageData);
                        num5 = mLanguages.Count - 1;
                    }
                    array2[i] = num5;
                }
                num4 = mLanguages.Count;
                int j = 0;
                for (int count = mTerms.Count; j < count; j++)
                {
                    TermData termData = mTerms[j];
                    if (termData.Languages.Length < num4)
                    {
                        Array.Resize(ref termData.Languages, num4);
                        Array.Resize(ref termData.Languages_Touch, num4);
                        Array.Resize(ref termData.Flags, num4);
                    }
                }
                int k = 1;
                for (int count2 = CSV.Count; k < count2; k++)
                {
                    array = CSV[k];
                    string Term  = string.IsNullOrEmpty(Category) ? array[0] : (Category + "/" + array[0]);
                    bool   flag2 = false;
                    if (Term.EndsWith("[touch]"))
                    {
                        Term  = Term.Remove(Term.Length - "[touch]".Length);
                        flag2 = true;
                    }
                    ValidateFullTerm(ref Term);
                    if (string.IsNullOrEmpty(Term))
                    {
                        continue;
                    }
                    TermData termData2 = GetTermData(Term);
                    if (termData2 == null)
                    {
                        termData2                 = new TermData();
                        termData2.Term            = Term;
                        termData2.Languages       = new string[mLanguages.Count];
                        termData2.Languages_Touch = new string[mLanguages.Count];
                        termData2.Flags           = new byte[mLanguages.Count];
                        for (int l = 0; l < mLanguages.Count; l++)
                        {
                            termData2.Languages[l] = (termData2.Languages_Touch[l] = string.Empty);
                        }
                        mTerms.Add(termData2);
                        mDictionary.Add(Term, termData2);
                    }
                    else if (UpdateMode == eSpreadsheetUpdateMode.AddNewTerms)
                    {
                        continue;
                    }
                    if (num2 > 0)
                    {
                        termData2.TermType = GetTermType(array[num2]);
                    }
                    if (num3 > 0)
                    {
                        termData2.Description = array[num3];
                    }
                    for (int m = 0; m < array2.Length && m < array.Length - num; m++)
                    {
                        if (string.IsNullOrEmpty(array[m + num]))
                        {
                            continue;
                        }
                        int num6 = array2[m];
                        if (num6 >= 0)
                        {
                            string text2 = array[m + num];
                            if (flag2)
                            {
                                termData2.Languages_Touch[num6] = text2;
                                termData2.Flags[num6]          &= 253;
                            }
                            else
                            {
                                termData2.Languages[num6] = text2;
                                termData2.Flags[num6]    &= 254;
                            }
                        }
                    }
                }
                return(string.Empty);
            }
            return("Bad Spreadsheet Format.\nFirst columns should be 'Key', 'Type' and 'Desc'");
        }
コード例 #26
0
        public string Import_Google_Result(string JsonString, eSpreadsheetUpdateMode UpdateMode, bool saveInPlayerPrefs = false)
        {
            string ErrorMsg = string.Empty;

            if (string.IsNullOrEmpty(JsonString) || JsonString == "\"\"")
            {
                return(ErrorMsg);
            }

            int idxV  = JsonString.IndexOf("version=");
            int idxSV = JsonString.IndexOf("script_version=");

            if (idxV < 0 || idxSV < 0)
            {
                return("Invalid Response from Google, Most likely the WebService needs to be updated");
            }

            idxV  += "version=".Length;
            idxSV += "script_version=".Length;

            string newSpreadsheetVersion = JsonString.Substring(idxV, JsonString.IndexOf(",", idxV) - idxV);
            var    scriptVersion         = int.Parse(JsonString.Substring(idxSV, JsonString.IndexOf(",", idxSV) - idxSV));

            if (scriptVersion != LocalizationManager.GetRequiredWebServiceVersion())
            {
                return("The current Google WebService is not supported.\nPlease, delete the WebService from the Google Drive and Install the latest version.");
            }

            //Debug.Log (Google_LastUpdatedVersion + " - " + newSpreadsheetVersion);
            if (!saveInPlayerPrefs && newSpreadsheetVersion.CompareTo(Google_LastUpdatedVersion) <= 0)
                        #if UNITY_EDITOR
            { return(""); }
                        #else
            { return("LanguageSource is up-to-date"); }
                        #endif

            if (saveInPlayerPrefs)
            {
                string PlayerPrefName = GetSourcePlayerPrefName();
                PlayerPrefs.SetString("I2Source_" + PlayerPrefName, JsonString);
                PlayerPrefs.SetString("I2SourceVersion_" + PlayerPrefName, newSpreadsheetVersion);
                PlayerPrefs.Save();
            }
            Google_LastUpdatedVersion = newSpreadsheetVersion;

            if (UpdateMode == eSpreadsheetUpdateMode.Replace)
            {
                ClearAllData();
            }

            int CSVstartIdx = JsonString.IndexOf("[i2category]");
            while (CSVstartIdx > 0)
            {
                CSVstartIdx += "[i2category]".Length;
                int    endCat   = JsonString.IndexOf("[/i2category]", CSVstartIdx);
                string category = JsonString.Substring(CSVstartIdx, endCat - CSVstartIdx);
                endCat += "[/i2category]".Length;

                int    endCSV = JsonString.IndexOf("[/i2csv]", endCat);
                string csv    = JsonString.Substring(endCat, endCSV - endCat);

                CSVstartIdx = JsonString.IndexOf("[i2category]", endCSV);

                Import_I2CSV(category, csv, UpdateMode);

                // Only the first CSV should clear the Data
                if (UpdateMode == eSpreadsheetUpdateMode.Replace)
                {
                    UpdateMode = eSpreadsheetUpdateMode.Merge;
                }
            }

#if UNITY_EDITOR
            if (!string.IsNullOrEmpty(ErrorMsg))
            {
                UnityEditor.EditorUtility.SetDirty(this);
            }
#endif
            return(ErrorMsg);
        }
コード例 #27
0
        public string Import_CSV(string Category, List <string[]> CSV, eSpreadsheetUpdateMode UpdateMode = eSpreadsheetUpdateMode.Replace)
        {
            string[] Tokens = CSV[0];

            int LanguagesStartIdx = 1;
            int TypeColumnIdx     = -1;
            int DescColumnIdx     = -1;

            var ValidColumnName_Key  = new string[] { "Key" };
            var ValidColumnName_Type = new string[] { "Type" };
            var ValidColumnName_Desc = new string[] { "Desc", "Description" };

            if (Tokens.Length > 1 && ArrayContains(Tokens[0], ValidColumnName_Key))
            {
                if (UpdateMode == eSpreadsheetUpdateMode.Replace)
                {
                    ClearAllData();
                }

                if (Tokens.Length > 2)
                {
                    if (ArrayContains(Tokens[1], ValidColumnName_Type))
                    {
                        TypeColumnIdx     = 1;
                        LanguagesStartIdx = 2;
                    }
                    if (ArrayContains(Tokens[1], ValidColumnName_Desc))
                    {
                        DescColumnIdx     = 1;
                        LanguagesStartIdx = 2;
                    }
                }
                if (Tokens.Length > 3)
                {
                    if (ArrayContains(Tokens[2], ValidColumnName_Type))
                    {
                        TypeColumnIdx     = 2;
                        LanguagesStartIdx = 3;
                    }
                    if (ArrayContains(Tokens[2], ValidColumnName_Desc))
                    {
                        DescColumnIdx     = 2;
                        LanguagesStartIdx = 3;
                    }
                }
            }
            else
            {
                return("Bad Spreadsheet Format.\nFirst columns should be 'Key', 'Type' and 'Desc'");
            }

            int nLanguages = Mathf.Max(Tokens.Length - LanguagesStartIdx, 0);

            int[] LanIndices = new int[nLanguages];
            for (int i = 0; i < nLanguages; ++i)
            {
                if (string.IsNullOrEmpty(Tokens[i + LanguagesStartIdx]))
                {
                    LanIndices [i] = -1;
                    continue;
                }

                string langToken = Tokens[i + LanguagesStartIdx];

                string LanName, LanCode;
                bool   isLangEnabled = true;
                if (langToken.StartsWith("$"))
                {
                    isLangEnabled = false;
                    langToken     = langToken.Substring(1);
                }
                GoogleLanguages.UnPackCodeFromLanguageName(langToken, out LanName, out LanCode);

                int LanIdx = -1;
                if (!string.IsNullOrEmpty(LanCode))
                {
                    LanIdx = GetLanguageIndexFromCode(LanCode);
                }
                else
                {
                    LanIdx = GetLanguageIndex(LanName, SkipDisabled: false);
                }

                if (LanIdx < 0)
                {
                    LanguageData lanData = new LanguageData();
                    lanData.Name  = LanName;
                    lanData.Code  = LanCode;
                    lanData.Flags = (byte)(0 | (isLangEnabled?0:(int)eLanguageDataFlags.DISABLED));
                    mLanguages.Add(lanData);
                    LanIdx = mLanguages.Count - 1;
                }
                LanIndices[i] = LanIdx;
            }

            //--[ Update the Languages array in the existing terms]-----
            nLanguages = mLanguages.Count;
            for (int i = 0, imax = mTerms.Count; i < imax; ++i)
            {
                TermData termData = mTerms[i];
                if (termData.Languages.Length < nLanguages)
                {
                    Array.Resize(ref termData.Languages, nLanguages);
                    Array.Resize(ref termData.Flags, nLanguages);
                }
            }

            //--[ Keys ]--------------

            for (int i = 1, imax = CSV.Count; i < imax; ++i)
            {
                Tokens = CSV[i];
                string sKey = string.IsNullOrEmpty(Category) ? Tokens[0] : string.Concat(Category, "/", Tokens[0]);

                string specialization = null;
                if (sKey.EndsWith("]"))
                {
                    int idx = sKey.LastIndexOf('[');
                    if (idx > 0)
                    {
                        specialization = sKey.Substring(idx + 1, sKey.Length - idx - 2);
                        if (specialization == "touch")
                        {
                            specialization = "Touch";
                        }
                        sKey = sKey.Remove(idx);
                    }
                }
                ValidateFullTerm(ref sKey);
                if (string.IsNullOrEmpty(sKey))
                {
                    continue;
                }

                TermData termData = GetTermData(sKey);

                // Check to see if its a new term
                if (termData == null)
                {
                    termData      = new TermData();
                    termData.Term = sKey;

                    termData.Languages = new string[mLanguages.Count];
                    termData.Flags     = new byte[mLanguages.Count];
                    for (int j = 0; j < mLanguages.Count; ++j)
                    {
                        termData.Languages[j] = string.Empty;
                    }

                    mTerms.Add(termData);
                    mDictionary.Add(sKey, termData);
                }
                else
                // This term already exist
                if (UpdateMode == eSpreadsheetUpdateMode.AddNewTerms)
                {
                    continue;
                }

                if (TypeColumnIdx > 0)
                {
                    termData.TermType = GetTermType(Tokens[TypeColumnIdx]);
                }

                if (DescColumnIdx > 0)
                {
                    termData.Description = Tokens[DescColumnIdx];
                }

                for (int j = 0; j < LanIndices.Length && j < Tokens.Length - LanguagesStartIdx; ++j)
                {
                    if (!string.IsNullOrEmpty(Tokens[j + LanguagesStartIdx]))   // Only change the translation if there is a new value
                    {
                        var lanIdx = LanIndices[j];
                        if (lanIdx < 0)
                        {
                            continue;
                        }
                        var value = Tokens[j + LanguagesStartIdx];

                        if (value == "-")
                        {
                            value = string.Empty;
                        }
                        else
                        if (value == "")
                        {
                            value = null;
                        }

                        termData.SetTranslation(lanIdx, value, specialization);
                    }
                }
            }
            if (Application.isPlaying)
            {
                SaveLanguages(HasUnloadedLanguages());
            }
            return(string.Empty);
        }
コード例 #28
0
        public string Import_Google_Result(string JsonString, eSpreadsheetUpdateMode UpdateMode)
        {
            string ErrorMsg = string.Empty;

            if (string.IsNullOrEmpty(JsonString) || JsonString == "\"\"")
            {
                Debug.Log("Language Source was up to date");
                return(ErrorMsg);
            }

            if (UpdateMode == eSpreadsheetUpdateMode.Replace)
            {
                ClearAllData();
            }

            int idxV  = JsonString.IndexOf("version=");
            int idxSV = JsonString.IndexOf("script_version=");

            if (idxV < 0 || idxSV < 0)
            {
                return("Invalid Response from Google, Most likely the WebService needs to be updated");
            }

            idxV  += "version=".Length;
            idxSV += "script_version=".Length;

            Google_LastUpdatedVersion = JsonString.Substring(idxV, JsonString.IndexOf(",", idxV) - idxV);
            var version = int.Parse(JsonString.Substring(idxSV, JsonString.IndexOf(",", idxSV) - idxSV));

            if (version < LocalizationManager.GetRequiredWebServiceVersion())
            {
                return("The current Google WebService is not supported.\nPlease, delete the WebService from the Google Drive and Install the latest version.");
            }

            int CSVstartIdx = JsonString.IndexOf("[i2category]");

            while (CSVstartIdx > 0)
            {
                CSVstartIdx += "[i2category]".Length;
                int    endCat   = JsonString.IndexOf("[/i2category]", CSVstartIdx);
                string category = JsonString.Substring(CSVstartIdx, endCat - CSVstartIdx);
                endCat += "[/i2category]".Length;

                int    endCSV = JsonString.IndexOf("[/i2csv]", endCat);
                string csv    = JsonString.Substring(endCat, endCSV - endCat);

                CSVstartIdx = JsonString.IndexOf("[i2category]", endCSV);

                Import_CSV(category, csv, UpdateMode, ',');

                // Only the first CSV should clear the Data
                if (UpdateMode == eSpreadsheetUpdateMode.Replace)
                {
                    UpdateMode = eSpreadsheetUpdateMode.Merge;
                }
            }

#if UNITY_EDITOR
            if (!string.IsNullOrEmpty(ErrorMsg))
            {
                UnityEditor.EditorUtility.SetDirty(this);
            }
#endif
            return(ErrorMsg);
        }