public override void OnInspectorGUI() { SupportedLanguages t = target as SupportedLanguages; if (t == null) { return; } if (t != SupportedLanguages.Instance) { GUILayout.Label("You should only have one asset of\ntype SupportedLanguages in your project!"); GUILayout.Label("Delete this asset."); return; } bool possibleTranslation = true; //will be set to false if default language is not supported by AutoTranslation //Setting default language: GUILayout.Label("Select your own default language."); GUILayout.Label("This is the language you make your\ninterfaces in Unity in."); GUILayout.Label("For example if you have UI Texts with\ntheir text property in French, select French."); t.defaultLanguage = (Language)EditorGUILayout.EnumPopup(t.defaultLanguage); if (AutoTranslation.TranslationLanguageCode(t.defaultLanguage) == "") { //impossible to translate from this one! GUILayout.Label(t.defaultLanguage + " will not support automatic translations."); possibleTranslation = false; } if (t.defaultLanguage == Language.Default) { t.defaultLanguage = Language.English; } //check that default language is among supported languages: bool contains = false; foreach (SupportedLanguages.SupportedLanguage sl in t.supportedLanguages) { if (sl.language == t.defaultLanguage) { contains = true; break; } } if (!contains) { t.supportedLanguages.Add(new SupportedLanguages.SupportedLanguage(t.defaultLanguage)); } GUILayout.Space(30); //Displaying available languages: GUILayout.Label("Languages your game will be available in:"); foreach (SupportedLanguages.SupportedLanguage lang in t.supportedLanguages) { GUILayout.BeginHorizontal(); GUILayout.Label("- " + lang.language); bool defaultLang = lang.language == t.defaultLanguage; if (defaultLang) { GUIStyle style = new GUIStyle(); style.normal.textColor = new Color(0.5f, 0.5f, 0.5f); GUILayout.Label("(Can't remove default language)", style); } else { if (GUILayout.Button("Remove " + lang.language)) { t.supportedLanguages.Remove(lang); break; } } GUILayout.EndHorizontal(); //Select font: GUILayout.BeginHorizontal(); GUILayout.Label("\tFont for " + lang.language); lang.font = (Font)EditorGUILayout.ObjectField(lang.font, typeof(Font), true); GUILayout.EndHorizontal(); //Select automatic translation: if (!defaultLang && possibleTranslation && AutoTranslation.TranslationLanguageCode(lang.language) != "") { GUILayout.BeginHorizontal(); GUILayout.Label("\tAuto-translate to " + lang.language); lang.translate = GUILayout.Toggle(lang.translate, ""); GUILayout.EndHorizontal(); } else { lang.translate = false; //can't have translations from default to default (or if default can't be translated) } GUILayout.Space(5); } GUILayout.Space(15); //Adding a language: GUILayout.Label("Add a language:"); GUILayout.BeginHorizontal(); selected = (Language)EditorGUILayout.EnumPopup(selected); if (selected == Language.Default) { selected = Language.English; } //check whether it contains it contains = false; foreach (SupportedLanguages.SupportedLanguage sl in t.supportedLanguages) { if (sl.language == selected) { contains = true; break; } } if (contains) { GUILayout.Label(selected + " is already supported."); } else { if (GUILayout.Button("Add " + selected)) { t.supportedLanguages.Add(new SupportedLanguages.SupportedLanguage(selected)); } } GUILayout.EndHorizontal(); GUILayout.Space(20); GUILayout.Label("Note: when you modify this asset, it's a\ngood idea to go through all translated\nelements in your project to make sure\neverything looks and behaves fine."); GUILayout.Space(20); //Sample: if (GUILayout.Button(sample != null ? "Update sample text" : "Show sample text")) { sample = new LanguageSamples.Sample(); foreach (SupportedLanguages.SupportedLanguage lang in t.supportedLanguages) { sample.AddLanguage(lang.language, lang.font); } sample.Prepare(); } if (sample != null) { sampleFont = (Font)EditorGUILayout.ObjectField("Font used for sample", sampleFont, typeof(Font), true); Font display = sampleFont; if (display == null) { display = (Font)Resources.GetBuiltinResource <Font>("Arial.ttf"); } sampleFontSize = (int)EditorGUILayout.Slider("Font size", sampleFontSize, 10, 100); GUILayout.Label("Note: this sample might not contain all\ncharacters used in your game and should\nsimply be used as a first idea."); sample.DisplayResults(display, sampleFontSize); } EditorUtility.SetDirty(t); }
public override void OnInspectorGUI() { serializedObject.Update(); TranslatedElement elem = target as TranslatedElement; Undo.RecordObject(elem, "Modified translation"); if (SupportedLanguages.Instance != null) { //display what this TranslatedElement will translate: string willTranslate = "Will translate "; if (elem.GetComponent <Text>()) { willTranslate += "UI Text component on"; } else if (elem.GetComponent <TextMesh>()) { willTranslate += "Text Mesh component on"; } else { willTranslate += "name of"; } willTranslate += "\nthis GameObject."; GUILayout.Label(willTranslate); GUILayout.Space(10); foreach (SupportedLanguages.SupportedLanguage language in SupportedLanguages.Instance.supportedLanguages) { GUILayout.BeginHorizontal(); GUILayout.Label("" + language.language); if (language.font != null) { GUIStyle style = new GUIStyle(); style.normal.textColor = new Color(0.5f, 0.5f, 0.5f); GUILayout.Label("(uses font " + language.font.name + ")", style); } GUILayout.EndHorizontal(); bool found = false; foreach (TranslatedElement.Translation t in elem.translations) { if (t.language == language.language) { found = true; t.font = language.font; if (language.language == SupportedLanguages.Instance.defaultLanguage) { if (!EditorApplication.isPlaying) { t.contents = defaultContents(elem); } GUILayout.Label(t.contents); } else { t.contents = EditorGUILayout.TextField(t.contents); if (language.translate && t.contents == "") { if (autoTranslation == null && defaultContents(elem) != "") { //let's start auto-translating this! //Attempt to find an active monobehaviour in the scene to handle the coroutine. Transform coroutineElem = elem.transform; while (!coroutineElem.gameObject.activeInHierarchy) { if (coroutineElem.parent == null) { break; } coroutineElem = coroutineElem.parent; } while (coroutineElem.GetComponent <MonoBehaviour>() == null) { //find the first active child with a monobehaviour if (coroutineElem.childCount <= 0) { break; //no luck :'( } foreach (Transform child in coroutineElem) { if (child.gameObject.activeInHierarchy) { if (child.GetComponent <MonoBehaviour>() != null) { coroutineElem = child; break; } } } } autoTranslation = new AutoTranslation(defaultContents(elem), SupportedLanguages.Instance.defaultLanguage, t.language, coroutineElem.GetComponent <MonoBehaviour>()); } else if (autoTranslation.Finished && autoTranslation.TargetLanguage == t.language) { //done translating this language! t.contents = autoTranslation.Translated; autoTranslation = null; } } } break; } } if (!found) { TranslatedElement.Translation t = new TranslatedElement.Translation(); t.language = language.language; if (language.language == SupportedLanguages.Instance.defaultLanguage) { if (!EditorApplication.isPlaying) { t.contents = defaultContents(elem); } GUILayout.Label(t.contents); } else { t.contents = EditorGUILayout.TextField(""); } elem.translations.Add(t); } } //check whether any translations are provided for unsupported languages, and delete them. foreach (TranslatedElement.Translation t in elem.translations) { bool found = false; foreach (SupportedLanguages.SupportedLanguage lang in SupportedLanguages.Instance.supportedLanguages) { if (lang.language == t.language) { found = true; break; } } if (!found) { elem.translations.Remove(t); Debug.LogWarning("Removed translation " + t.language + " from " + elem.name); break; } } if (GUILayout.Button("Edit supported languages")) { SupportedLanguages.ShowSupportedLanguagesMenu(); } } else { if (GUILayout.Button("Create supported languages")) { SupportedLanguages.ShowSupportedLanguagesMenu(); } } serializedObject.ApplyModifiedProperties(); }