/// <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"); }
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"); }