Example #1
0
    public static T LoadUsingKey <T>(string key) where T : new()
    {
        SpreadsheetListFeed listFeed = GDocService.GetSpreadsheetContents(key);

        if (listFeed == null)
        {
            Debug.LogWarning("GameConfig spreadsheet was not loaded. Loading gameconfig.txt instead.");
            return(LoadFromResources <T>());
        }

        Hashtable tableRows = listFeed.GetRows();
        T         config    = new T();

        PropertyInfo[] properties = config.GetType().GetProperties();
        for (int i = 0; i < properties.Length; ++i)
        {
            PropertyInfo property = properties[i];
            if (tableRows.ContainsKey(property.Name))
            {
                Hashtable tableColumns = tableRows[property.Name] as Hashtable;
                if (tableColumns.Contains("value"))
                {
                    Log("Value of " + property.Name + " : " + tableColumns["value"]);
                    Log("Before: " + property.GetValue(config, null));
                    property.SetValue(config, Convert.ChangeType(tableColumns["value"], property.PropertyType), null);
                    Log("After: " + property.GetValue(config, null));
                }
            }
        }
        return(config);
    }
Example #2
0
        /// <summary>
        /// Reads the Google Spreadsheet and generates/updates the StringSet asset files
        /// </summary>
        public void Generate()
        {
            ListFeed test        = GDocService.GetSpreadsheet(GoogleLink);
            var      languageMap = new Dictionary <string, StringSet>();
            var      keys        = CreateInstance <StringSet>();

            languageMap.Add("Keys", keys);
            var ignore = new HashSet <string>(_ignoreColumns);

            foreach (ListEntry row in test.Entries)
            {
                keys.Add(row.Title.Text);
                foreach (ListEntry.Custom element in row.Elements)
                {
                    string lang = element.LocalName;
                    if (ignore.Contains(lang))
                    {
                        continue;
                    }
                    if (!languageMap.ContainsKey(lang))
                    {
                        languageMap[lang] = CreateInstance <StringSet>();
                    }
                    languageMap[lang].Add(element.Value);
                }
            }
            string folderPath = _saveFolder ? AssetDatabase.GetAssetPath(_saveFolder) : "Assets/Resources/Lang";

            foreach (var lang in languageMap)
            {
                var    method   = "Generating";
                string path     = string.Format("{0}/{1}.asset", folderPath, lang.Key);
                var    language = AssetDatabase.LoadAssetAtPath <StringSet>(path);
                if (language)
                {
                    method = "Updating";
                    language.Copy(lang.Value);
                    EditorUtility.SetDirty(language);
                }
                else
                {
                    AssetDatabase.CreateAsset(lang.Value, path);
                }
                Debug.Log(string.Format("{0} language files for: {1}", method, lang.Key));
            }
            EditorApplication.SaveAssets();
            AssetDatabase.SaveAssets();
        }
        /// <summary> Reads the Google Spreadsheet and generates/updates the StringSet asset files </summary>
        public void Generate()
        {
            ListFeed test        = GDocService.GetSpreadsheet(GoogleLink);
            var      languageMap = new Dictionary <string, Dictionary <string, string> >();
            var      ignore      = new HashSet <string>(_ignoreColumns);

            foreach (ListEntry row in test.Entries)
            {
                var keyEntry =
                    row.Elements.OfType <ListEntry.Custom>()
                    .FirstOrDefault(e => e.LocalName.ToLower() == _defaultLanguage.ToLower());
                if (keyEntry == null)
                {
                    continue;
                }
                var key = keyEntry.Value;
                foreach (ListEntry.Custom element in row.Elements)
                {
                    string lang = element.LocalName;
                    if (ignore.Contains(lang))
                    {
                        continue;
                    }
                    if (!languageMap.ContainsKey(lang))
                    {
                        languageMap[lang] = new Dictionary <string, string>();
                    }
                    languageMap[lang].Add(key, element.Value);
                }
            }
            var baseFolder = Path.Combine(Application.streamingAssetsPath, "lang");

            if (!Directory.Exists(baseFolder))
            {
                Directory.CreateDirectory(baseFolder);
            }
            foreach (var lang in languageMap)
            {
                File.WriteAllText(Path.Combine(baseFolder, lang.Key + LanguageManager.FileExtension),
                                  JsonConvert.SerializeObject(lang.Value, Formatting.Indented));
                Log.Info("Generating language files for: {0}", lang.Key);
            }
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
        }
    public void updateLanguages()
    {
        var languages = new Dictionary <string, SerializedNestedStrings>();

        for (int i = 1; i <= subsheetCount; i++)
        {
            var sheet = GDocService.GetSpreadsheet(spreadsheetId, i);
            if (i == 1)
            {
                languages = generateLanguageDict(sheet);
            }

            foreach (ListEntry row in sheet.Entries)
            {
                string rowKey = "";
                foreach (ListEntry.Custom element in row.Elements)
                {
                    if (element.LocalName.Equals(KeyIdentifier))
                    {
                        rowKey = element.Value;
                    }
                    else if (languages.ContainsKey(element.LocalName) && !string.IsNullOrEmpty(element.Value))
                    {
                        languages[element.LocalName][rowKey] = cleanseEntry(element.Value);
                    }
                }
            }
        }

        string fullLanguagesPath = Path.Combine(Application.dataPath, languagesPath);

        foreach (var languageData in languages)
        {
            string name = getLanguageIdName(languageData.Value);
            File.WriteAllText(Path.Combine(fullLanguagesPath, name), languageData.Value.ToString());
        }

        Debug.Log("Language content updated");
    }
Example #5
0
    public void updateLanguages()
    {
        var languages = new Dictionary <string, SerializedNestedStrings>();
        SerializedNestedStrings englishData = null;

        var sheetTitles = new List <string>();

        var missingValues = new Dictionary <string, Dictionary <string, int> >();

        for (int i = 1; i <= subsheetCount; i++)
        {
            var sheet      = GDocService.GetSpreadsheet(spreadsheetId, i);
            var sheetTitle = sheet.Title.Text;
            sheetTitles.Add(sheetTitle);

            // Ran only at start of loop, but necessary here so we don't have to read the first sheet twice
            if (i == 1)
            {
                languages   = generateLanguageDict(sheet);
                englishData = languages.FirstOrDefault().Value;
                foreach (var language in languages)
                {
                    missingValues[language.Key] = new Dictionary <string, int>();
                }
            }

            // Missing values structure is initially populated with every language and sheet title set to 0 missing values
            foreach (var language in languages)
            {
                missingValues[language.Key][sheetTitle] = 0;
            }

            foreach (ListEntry row in sheet.Entries)
            {
                string rowKey = "";
                foreach (ListEntry.Custom element in row.Elements)
                {
                    if (element.LocalName.Equals(KeyIdentifier))
                    {
                        rowKey = element.Value;
                    }
                    else if (languages.ContainsKey(element.LocalName))
                    {
                        var languageData = languages[element.LocalName];

                        if (!string.IsNullOrEmpty(element.Value))
                        {
                            var cleansedEntry = cleanseEntry(element.Value);

                            if (checkEntryIntegrity(languageData, rowKey, cleansedEntry, englishData))
                            {
                                languageData[rowKey] = cleansedEntry;
                            }
                        }
                        else
                        {
                            if (!string.IsNullOrEmpty(englishData[rowKey]))
                            {
                                missingValues[element.LocalName][sheetTitle]++;
                            }
                        }
                    }
                }
            }
        }

        string fullLanguagesPath = Path.Combine(Application.dataPath, languagesPath);

        foreach (var languageData in languages)
        {
            string name = getLanguageIdName(languageData.Value);
            File.WriteAllText(Path.Combine(fullLanguagesPath, name), languageData.Value.ToString());

            var languageId = languageData.Value["generic.idname"];
            if (string.IsNullOrEmpty(languageId) || !languagesData.languages.Any(a => a.getLanguageID().Equals(languageId)))
            {
                Debug.LogWarning($"Language {languageData.Key} not found in languages data.");
            }
            else
            {
                var metaRecordedStatus = languageData.Value["meta.recorded"];
                if (string.IsNullOrEmpty(metaRecordedStatus) || !metaRecordedStatus.Equals("Y", System.StringComparison.OrdinalIgnoreCase))
                {
                    Debug.LogWarning($"Language {languageData.Key} does not have metadata recorded in google sheets");
                }
            }
        }

        // Format missing text report
        var missingValuesLanguageReports = missingValues
                                                                                                                                      //.Where(language => language.Value.Any(sheet => sheet.Value > 0))    // Select from languages who have missing values whatsoever
                                           .Select(language => language.Key + ": " + language.Value.Sum(sheet => sheet.Value) + " - " // Sum up all missing values in a language
                                                   + string.Join(", ", language.Value                                                 // Then list out each subsheet in that language and its amount of missing values
                                                                 .Where(sheet => sheet.Value > 0)                                     // Exclude any sheets with no missing values
                                                                 .Select(sheet => sheet.Key + ": " + sheet.Value.ToString())));

        // Write to log
        var reportText = "Push this file with any localization updates.\n\n";

        reportText += $"Last pulled:\n{System.DateTime.Now.ToString()}\n";
        reportText += "\nThis is the order the sheets were found in. If github tries to change them, rearrange the cells so they match this and update language content again.\n"
                      + string.Join("\n", sheetTitles) + "\n";
        reportText += "\nHow many values are missing translations from each language (doesn't count non-game pages such as Steam Store):\n"
                      + string.Join("\n", missingValuesLanguageReports) + "\n";
        File.WriteAllText(Path.Combine(Application.dataPath, reportFile), reportText);

        Debug.Log("Language content updated");
    }