using System; using System.Collections.Generic; using System.Linq; using UnityEditor; namespace MeshUtility.M17N { /// /// 多言語対応 /// public enum Languages { ja, en, } [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = true, Inherited = false)] public class LangMsgAttribute : System.Attribute { public Languages Language; public string Message; public LangMsgAttribute(Languages language, string msg) { Language = language; Message = msg; } } public static class MsgCache where T : Enum { static Dictionary> s_cache = new Dictionary>(); static LangMsgAttribute GetAttribute(T value, Languages language) { var t = typeof(T); var memberInfos = t.GetMember(value.ToString()); var enumValueMemberInfo = memberInfos.FirstOrDefault(m => m.DeclaringType == t); var attr = enumValueMemberInfo.GetCustomAttributes(typeof(LangMsgAttribute), false).Select(x => (LangMsgAttribute)x).ToArray(); if (attr == null || attr.Length == 0) { return null; } var match = attr.FirstOrDefault(x => x.Language == language); if (match != null) { return match; } return attr.First(); } public static string Get(Languages language, T key) { if (!s_cache.TryGetValue(language, out Dictionary map)) { map = new Dictionary(); var t = typeof(T); foreach (T value in Enum.GetValues(t)) { var match = GetAttribute(value, language); // Attribute。無かったら enum の ToString map.Add(value, match != null ? match.Message : key.ToString()); } s_cache.Add(language, map); } return map[key]; } } public static class Getter { const string LANG_KEY = "VRM_LANG"; static Languages? m_lang; public static Languages Lang { get { return m_lang.GetValueOrDefault(); } } public static string Msg(this T key) where T : Enum { return M17N.MsgCache.Get(Lang, key); } public static void OnGuiSelectLang() { var lang = (M17N.Languages)EditorGUILayout.EnumPopup("lang", Lang); if (lang != Lang) { m_lang = lang; EditorPrefs.SetString(LANG_KEY, M17N.Getter.Lang.ToString()); } } } }