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);
        }
コード例 #2
0
        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();
        }