diff --git a/Assets/VRM/UniVRM/Editor/EditorLanguages.cs b/Assets/VRM/UniVRM/Editor/EditorLanguages.cs new file mode 100644 index 000000000..7b496cfc5 --- /dev/null +++ b/Assets/VRM/UniVRM/Editor/EditorLanguages.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace VRM.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 enum VRMExporterWizardMessages + { + [LangMsg(Languages.ja, "ExportRootをセットしてください")] + [LangMsg(Languages.en, "Please set up a ExportRoot for model export")] + ROOT_EXISTS, + + + [LangMsg(Languages.ja, "ExportRootに親はオブジェクトは持てません")] + [LangMsg(Languages.en, "ExportRoot must be topmost parent")] + NO_PARENT, + + [LangMsg(Languages.ja, "ExportRootに回転・拡大縮小は持てません。子階層で回転・拡大縮小してください")] + [LangMsg(Languages.en, "ExportRoot's rotation and scaling are not allowed to change. Please set up rotation and scaling in child node")] + ROOT_WITHOUT_ROTATION_AND_SCALING_CHANGED, + + [LangMsg(Languages.ja, "シーンに出していない Prefab はエクスポートできません(細かい挙動が違い、想定外の動作をところがあるため)。シーンに展開してからエクスポートしてください")] + [LangMsg(Languages.en, "Prefab Asset cannot be exported. Prefab Asset has different behaviour with Scene GameObject. Please put the prefab into the scene")] + PREFAB_CANNOT_EXPORT, + + [LangMsg(Languages.ja, "回転・拡大縮小を持つノードが含まれています。正規化が必用です。Setting の PoseFreeze を有効にしてください")] + [LangMsg(Languages.en, " Normalization is required. There are nodes (child GameObject) where rotation and scaling are not default. Please enable PoseFreeze")] + ROTATION_OR_SCALEING_INCLUDED_IN_NODE, + + [LangMsg(Languages.ja, "正規化済みです。Setting の PoseFreeze は不要です")] + [LangMsg(Languages.en, "Normalization has been done. PoseFreeze is not required")] + IS_POSE_FREEZE_DONE, + + [LangMsg(Languages.ja, "ExportRootに Animator がありません")] + [LangMsg(Languages.en, "No Animator in ExportRoot")] + NO_ANIMATOR, + + [LangMsg(Languages.ja, "Z+ 向きにしてください")] + [LangMsg(Languages.en, "The model needs to face the positive Z-axis")] + FACE_Z_POSITIVE_DIRECTION, + + [LangMsg(Languages.ja, "ExportRootの Animator に Avatar がありません")] + [LangMsg(Languages.en, "No Avatar in ExportRoot's Animator")] + NO_AVATAR_IN_ANIMATOR, + + [LangMsg(Languages.ja, "ExportRootの Animator.Avatar が不正です")] + [LangMsg(Languages.en, "Animator.avatar in ExportRoot is not valid")] + AVATAR_IS_NOT_VALID, + + [LangMsg(Languages.ja, "ExportRootの Animator.Avatar がヒューマノイドではありません。FBX importer の Rig で設定してください")] + [LangMsg(Languages.en, "Animator.avatar is not humanoid. Please change model's AnimationType to humanoid")] + AVATAR_IS_NOT_HUMANOID, + + [LangMsg(Languages.ja, "humanoid設定に顎が含まれている。FBX importer の rig 設定に戻って設定を解除することをおすすめします")] + [LangMsg(Languages.en, "Jaw bone is included. It may not what you intended. Please check the humanoid avatar setting screen")] + JAW_BONE_IS_INCLUDED, + + [LangMsg(Languages.ja, "ヒエラルキーの中に同じ名前のGameObjectが含まれている。 エクスポートした場合に自動でリネームする")] + [LangMsg(Languages.en, "There are bones with the same name in the hierarchy. They will be automatically renamed after export")] + DUPLICATE_BONE_NAME_EXISTS, + + [LangMsg(Languages.ja, "VRMBlendShapeProxyが必要です。先にVRMフォーマットに変換してください")] + [LangMsg(Languages.en, "VRMBlendShapeProxy is required. Please convert to VRM format first")] + NEEDS_VRM_BLENDSHAPE_PROXY, + + [LangMsg(Languages.en, "This model contains vertex color")] + [LangMsg(Languages.ja, "ヒエラルキーに含まれる mesh に頂点カラーが含まれている")] + VERTEX_COLOR_IS_INCLUDED, + + [LangMsg(Languages.ja, "ヒエラルキーに active なメッシュが含まれていない")] + [LangMsg(Languages.en, "No active mesh")] + NO_ACTIVE_MESH, + + [LangMsg(Languages.ja, "Standard, Unlit, MToon 以外のマテリアルは、Standard になります")] + [LangMsg(Languages.en, "It will export as `Standard` fallback")] + UNKNOWN_SHADER, + + [LangMsg(Languages.ja, "名前が長すぎる。リネームしてください: ")] + [LangMsg(Languages.en, "FileName is too long: ")] + FILENAME_TOO_LONG, + } + + 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); + map.Add(value, match != null ? match.Message : ""); + } + + s_cache.Add(language, map); + } + return map[key]; + } + } + public static class Getter + { + public static M17N.Languages Lang; + + public static string Msg(T key) where T : Enum + { + return M17N.MsgCache.Get(Lang, key); + } + } +} diff --git a/Assets/VRM/UniVRM/Editor/EditorLanguages.cs.meta b/Assets/VRM/UniVRM/Editor/EditorLanguages.cs.meta new file mode 100644 index 000000000..179168ee0 --- /dev/null +++ b/Assets/VRM/UniVRM/Editor/EditorLanguages.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7829d135d35830f4bb9235eb10b3de1f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/VRM/UniVRM/Editor/Format/VRMExporterWizard.cs b/Assets/VRM/UniVRM/Editor/Format/VRMExporterWizard.cs index 9820deb65..87f162cc7 100644 --- a/Assets/VRM/UniVRM/Editor/Format/VRMExporterWizard.cs +++ b/Assets/VRM/UniVRM/Editor/Format/VRMExporterWizard.cs @@ -153,6 +153,11 @@ namespace VRM return true; } + static string Msg(VRMExporterWizardMessages key) + { + return M17N.Getter.Msg(key); + } + /// /// エクスポート可能か検証する /// @@ -166,18 +171,18 @@ namespace VRM if (DuplicateBoneNameExists()) { - yield return Validation.Warning(Msg.DUPLICATE_BONE_NAME_EXISTS); + yield return Validation.Warning(Msg(VRMExporterWizardMessages.DUPLICATE_BONE_NAME_EXISTS)); } if (m_settings.ReduceBlendshape && ExportRoot.GetComponent() == null) { - yield return Validation.Error(Msg.NEEDS_VRM_BLENDSHAPE_PROXY); + yield return Validation.Error(Msg(VRMExporterWizardMessages.NEEDS_VRM_BLENDSHAPE_PROXY)); } var vertexColor = ExportRoot.GetComponentsInChildren().Any(x => x.sharedMesh.colors.Length > 0); if (vertexColor) { - yield return Validation.Warning(Msg.VERTEX_COLOR_IS_INCLUDED); + yield return Validation.Warning(Msg(VRMExporterWizardMessages.VERTEX_COLOR_IS_INCLUDED)); } var renderers = ExportRoot.GetComponentsInChildren(); @@ -202,13 +207,13 @@ namespace VRM continue; } - yield return Validation.Warning($"Material: {material.name}. Unknown Shader: \"{material.shader.name}\" is used. {Msg.UNKNOWN_SHADER}"); + yield return Validation.Warning($"Material: {material.name}. Unknown Shader: \"{material.shader.name}\" is used. {Msg(VRMExporterWizardMessages.UNKNOWN_SHADER)}"); } foreach (var material in materials) { if (IsFileNameLengthTooLong(material.name)) - yield return Validation.Error(Msg.FILENAME_TOO_LONG + material.name); + yield return Validation.Error(Msg(VRMExporterWizardMessages.FILENAME_TOO_LONG) + material.name); } var textureNameList = new List(); @@ -233,7 +238,7 @@ namespace VRM foreach (var textureName in textureNameList) { if (IsFileNameLengthTooLong(textureName)) - yield return Validation.Error(Msg.FILENAME_TOO_LONG + textureName); + yield return Validation.Error(Msg(VRMExporterWizardMessages.FILENAME_TOO_LONG) + textureName); } var vrmMeta = ExportRoot.GetComponent(); @@ -241,7 +246,7 @@ namespace VRM { var thumbnailName = vrmMeta.Meta.Thumbnail.name; if (IsFileNameLengthTooLong(thumbnailName)) - yield return Validation.Error(Msg.FILENAME_TOO_LONG + thumbnailName); + yield return Validation.Error(Msg(VRMExporterWizardMessages.FILENAME_TOO_LONG) + thumbnailName); } var meshFilters = ExportRoot.GetComponentsInChildren(); @@ -249,7 +254,7 @@ namespace VRM foreach (var meshName in meshesName) { if (IsFileNameLengthTooLong(meshName)) - yield return Validation.Error(Msg.FILENAME_TOO_LONG + meshName); + yield return Validation.Error(Msg(VRMExporterWizardMessages.FILENAME_TOO_LONG) + meshName); } var skinnedmeshRenderers = ExportRoot.GetComponentsInChildren(); @@ -257,7 +262,7 @@ namespace VRM foreach (var skinnedmeshName in skinnedmeshesName) { if (IsFileNameLengthTooLong(skinnedmeshName)) - yield return Validation.Error(Msg.FILENAME_TOO_LONG + skinnedmeshName); + yield return Validation.Error(Msg(VRMExporterWizardMessages.FILENAME_TOO_LONG) + skinnedmeshName); } } @@ -291,7 +296,7 @@ namespace VRM m_Inspector = Editor.CreateEditor(m_settings); } - m_lang = EnumUtil.TryParseOrDefault(EditorPrefs.GetString(LANG_KEY, default(VRMExporterWizardMessages.Languages).ToString())); + M17N.Getter.Lang = EnumUtil.TryParseOrDefault(EditorPrefs.GetString(LANG_KEY, default(M17N.Languages).ToString())); } const string LANG_KEY = "VRM_LANG"; @@ -344,11 +349,6 @@ namespace VRM } } - VRMExporterWizardMessages.Languages m_lang; - VRMExporterWizardMessages.LangMessages Msg => VRMExporterWizardMessages.M17N[m_lang]; - - //@TODO: Force repaint if scripts recompile - private void OnGUI() { if (m_tmpMeta == null) @@ -360,11 +360,11 @@ namespace VRM EditorGUIUtility.labelWidth = 150; // lang - var lang = (VRMExporterWizardMessages.Languages)EditorGUILayout.EnumPopup("lang", m_lang); - if (lang != m_lang) + var lang = (M17N.Languages)EditorGUILayout.EnumPopup("lang", M17N.Getter.Lang); + if (lang != M17N.Getter.Lang) { - m_lang = lang; - EditorPrefs.SetString(LANG_KEY, m_lang.ToString()); + M17N.Getter.Lang = lang; + EditorPrefs.SetString(LANG_KEY, M17N.Getter.Lang.ToString()); } EditorGUILayout.LabelField("ExportRoot"); @@ -382,24 +382,24 @@ namespace VRM // if (ExportRoot == null) { - Validation.Error(Msg.ROOT_EXISTS).DrawGUI(); + Validation.Error(Msg(VRMExporterWizardMessages.ROOT_EXISTS)).DrawGUI(); return; } if (ExportRoot.transform.parent != null) { - Validation.Error(Msg.NO_PARENT).DrawGUI(); + Validation.Error(Msg(VRMExporterWizardMessages.NO_PARENT)).DrawGUI(); return; } if (ExportRoot.transform.localRotation != Quaternion.identity || ExportRoot.transform.localScale != Vector3.one) { - Validation.Error(Msg.ROOT_WITHOUT_ROTATION_AND_SCALING_CHANGED).DrawGUI(); + Validation.Error(Msg(VRMExporterWizardMessages.ROOT_WITHOUT_ROTATION_AND_SCALING_CHANGED)).DrawGUI(); return; } var renderers = ExportRoot.GetComponentsInChildren(); if (renderers.All(x => !EnableRenderer(x))) { - Validation.Error(Msg.NO_ACTIVE_MESH).DrawGUI(); + Validation.Error(Msg(VRMExporterWizardMessages.NO_ACTIVE_MESH)).DrawGUI(); return; } @@ -411,14 +411,14 @@ namespace VRM } else { - Validation.Warning(Msg.ROTATION_OR_SCALEING_INCLUDED_IN_NODE).DrawGUI(); + Validation.Warning(Msg(VRMExporterWizardMessages.ROTATION_OR_SCALEING_INCLUDED_IN_NODE)).DrawGUI(); } } else { if (m_settings.PoseFreeze) { - Validation.Warning(Msg.IS_POSE_FREEZE_DONE).DrawGUI(); + Validation.Warning(Msg(VRMExporterWizardMessages.IS_POSE_FREEZE_DONE)).DrawGUI(); } else { @@ -432,7 +432,7 @@ namespace VRM var animator = ExportRoot.GetComponent(); if (animator == null) { - Validation.Error(Msg.NO_ANIMATOR).DrawGUI(); + Validation.Error(Msg(VRMExporterWizardMessages.NO_ANIMATOR)).DrawGUI(); return; } @@ -441,30 +441,30 @@ namespace VRM var f = GetForward(l, r); if (Vector3.Dot(f, Vector3.forward) < 0.8f) { - Validation.Error(Msg.FACE_Z_POSITIVE_DIRECTION).DrawGUI(); + Validation.Error(Msg(VRMExporterWizardMessages.FACE_Z_POSITIVE_DIRECTION)).DrawGUI(); return; } var avatar = animator.avatar; if (avatar == null) { - Validation.Error(Msg.NO_AVATAR_IN_ANIMATOR).DrawGUI(); + Validation.Error(Msg(VRMExporterWizardMessages.NO_AVATAR_IN_ANIMATOR)).DrawGUI(); return; } if (!avatar.isValid) { - Validation.Error(Msg.AVATAR_IS_NOT_VALID).DrawGUI(); + Validation.Error(Msg(VRMExporterWizardMessages.AVATAR_IS_NOT_VALID)).DrawGUI(); return; } if (!avatar.isHuman) { - Validation.Error(Msg.AVATAR_IS_NOT_HUMANOID).DrawGUI(); + Validation.Error(Msg(VRMExporterWizardMessages.AVATAR_IS_NOT_HUMANOID)).DrawGUI(); return; } var jaw = animator.GetBoneTransform(HumanBodyBones.Jaw); if (jaw != null) { - Validation.Warning(Msg.JAW_BONE_IS_INCLUDED).DrawGUI(); + Validation.Warning(Msg(VRMExporterWizardMessages.JAW_BONE_IS_INCLUDED)).DrawGUI(); } else { diff --git a/Assets/VRM/UniVRM/Editor/Format/VRMExporterWizardMessages.cs b/Assets/VRM/UniVRM/Editor/Format/VRMExporterWizardMessages.cs index 668c50215..16f4c53ba 100644 --- a/Assets/VRM/UniVRM/Editor/Format/VRMExporterWizardMessages.cs +++ b/Assets/VRM/UniVRM/Editor/Format/VRMExporterWizardMessages.cs @@ -1,84 +1,80 @@ -using System.Collections.Generic; +using VRM.M17N; namespace VRM { - /// - /// エクスポートダイアログ用の簡易なメッセージカタログ - /// - public static class VRMExporterWizardMessages + public enum VRMExporterWizardMessages { - public enum Languages - { - ja, - en, - } + [LangMsg(Languages.ja, "ExportRootをセットしてください")] + [LangMsg(Languages.en, "Please set up a ExportRoot for model export")] + ROOT_EXISTS, - public struct LangMessages - { - public string ROOT_EXISTS; - public string NO_PARENT; - public string ROOT_WITHOUT_ROTATION_AND_SCALING_CHANGED; - public string PREFAB_CANNOT_EXPORT; - public string ROTATION_OR_SCALEING_INCLUDED_IN_NODE; - public string IS_POSE_FREEZE_DONE; - public string NO_ANIMATOR; - public string FACE_Z_POSITIVE_DIRECTION; - public string NO_AVATAR_IN_ANIMATOR; - public string AVATAR_IS_NOT_VALID; - public string AVATAR_IS_NOT_HUMANOID; - public string JAW_BONE_IS_INCLUDED; - public string DUPLICATE_BONE_NAME_EXISTS; - public string NEEDS_VRM_BLENDSHAPE_PROXY; - public string VERTEX_COLOR_IS_INCLUDED; - public string NO_ACTIVE_MESH; - public string UNKNOWN_SHADER; - public string FILENAME_TOO_LONG; - } - public static readonly Dictionary M17N = new Dictionary - { - {Languages.ja, new LangMessages{ - ROOT_EXISTS ="ExportRootをセットしてください", - NO_PARENT = "ExportRootに親はオブジェクトは持てません", - ROOT_WITHOUT_ROTATION_AND_SCALING_CHANGED = "ExportRootに回転・拡大縮小は持てません。子階層で回転・拡大縮小してください", - PREFAB_CANNOT_EXPORT = "シーンに出していない Prefab はエクスポートできません(細かい挙動が違い、想定外の動作をところがあるため)。シーンに展開してからエクスポートしてください", - ROTATION_OR_SCALEING_INCLUDED_IN_NODE = "回転・拡大縮小を持つノードが含まれています。正規化が必用です。Setting の PoseFreeze を有効にしてください", - IS_POSE_FREEZE_DONE = "正規化済みです。Setting の PoseFreeze は不要です", - NO_ANIMATOR = "ExportRootに Animator がありません", - FACE_Z_POSITIVE_DIRECTION = "Z+ 向きにしてください", - NO_AVATAR_IN_ANIMATOR = "ExportRootの Animator に Avatar がありません", - AVATAR_IS_NOT_VALID = "ExportRootの Animator.Avatar が不正です", - AVATAR_IS_NOT_HUMANOID = "ExportRootの Animator.Avatar がヒューマノイドではありません。FBX importer の Rig で設定してください", - JAW_BONE_IS_INCLUDED = "humanoid設定に顎が含まれている。FBX importer の rig 設定に戻って設定を解除することをおすすめします", - DUPLICATE_BONE_NAME_EXISTS = "ヒエラルキーの中に同じ名前のGameObjectが含まれている。 エクスポートした場合に自動でリネームする", - NEEDS_VRM_BLENDSHAPE_PROXY = "VRMBlendShapeProxyが必要です。先にVRMフォーマットに変換してください", - VERTEX_COLOR_IS_INCLUDED = "ヒエラルキーに含まれる mesh に頂点カラーが含まれている", - NO_ACTIVE_MESH = "ヒエラルキーに active なメッシュが含まれていない", - UNKNOWN_SHADER = "Standard, Unlit, MToon 以外のマテリアルは、Standard になります", - FILENAME_TOO_LONG = "名前が長すぎる。リネームしてください: ", - } - }, - {Languages.en, new LangMessages{ - ROOT_EXISTS = "Please set up a ExportRoot for model export", - NO_PARENT = "ExportRoot must be topmost parent", - ROOT_WITHOUT_ROTATION_AND_SCALING_CHANGED = "ExportRoot's rotation and scaling are not allowed to change. Please set up rotation and scaling in child node", - PREFAB_CANNOT_EXPORT = "Prefab Asset cannot be exported. Prefab Asset has different behaviour with Scene GameObject. Please put the prefab into the scene", - ROTATION_OR_SCALEING_INCLUDED_IN_NODE = " Normalization is required. There are nodes (child GameObject) where rotation and scaling are not default. Please enable PoseFreeze", - IS_POSE_FREEZE_DONE = "Normalization has been done. PoseFreeze is not required", - NO_ANIMATOR = "No Animator in ExportRoot", - FACE_Z_POSITIVE_DIRECTION = "The model needs to face the positive Z-axis", - NO_AVATAR_IN_ANIMATOR = "No Avatar in ExportRoot's Animator", - AVATAR_IS_NOT_VALID = "Animator.avatar in ExportRoot is not valid", - AVATAR_IS_NOT_HUMANOID = "Animator.avatar is not humanoid. Please change model's AnimationType to humanoid", - JAW_BONE_IS_INCLUDED = "Jaw bone is included. It may not what you intended. Please check the humanoid avatar setting screen", - DUPLICATE_BONE_NAME_EXISTS = "There are bones with the same name in the hierarchy. They will be automatically renamed after export", - NEEDS_VRM_BLENDSHAPE_PROXY = "VRMBlendShapeProxy is required. Please convert to VRM format first", - VERTEX_COLOR_IS_INCLUDED = "This model contains vertex color", - NO_ACTIVE_MESH = "No active mesh", - UNKNOWN_SHADER = "It will export as `Standard` fallback", - FILENAME_TOO_LONG = "FileName is too long: ", - } - }, - }; + [LangMsg(Languages.ja, "ExportRootに親はオブジェクトは持てません")] + [LangMsg(Languages.en, "ExportRoot must be topmost parent")] + NO_PARENT, + + [LangMsg(Languages.ja, "ExportRootに回転・拡大縮小は持てません。子階層で回転・拡大縮小してください")] + [LangMsg(Languages.en, "ExportRoot's rotation and scaling are not allowed to change. Please set up rotation and scaling in child node")] + ROOT_WITHOUT_ROTATION_AND_SCALING_CHANGED, + + [LangMsg(Languages.ja, "シーンに出していない Prefab はエクスポートできません(細かい挙動が違い、想定外の動作をところがあるため)。シーンに展開してからエクスポートしてください")] + [LangMsg(Languages.en, "Prefab Asset cannot be exported. Prefab Asset has different behaviour with Scene GameObject. Please put the prefab into the scene")] + PREFAB_CANNOT_EXPORT, + + [LangMsg(Languages.ja, "回転・拡大縮小を持つノードが含まれています。正規化が必用です。Setting の PoseFreeze を有効にしてください")] + [LangMsg(Languages.en, " Normalization is required. There are nodes (child GameObject) where rotation and scaling are not default. Please enable PoseFreeze")] + ROTATION_OR_SCALEING_INCLUDED_IN_NODE, + + [LangMsg(Languages.ja, "正規化済みです。Setting の PoseFreeze は不要です")] + [LangMsg(Languages.en, "Normalization has been done. PoseFreeze is not required")] + IS_POSE_FREEZE_DONE, + + [LangMsg(Languages.ja, "ExportRootに Animator がありません")] + [LangMsg(Languages.en, "No Animator in ExportRoot")] + NO_ANIMATOR, + + [LangMsg(Languages.ja, "Z+ 向きにしてください")] + [LangMsg(Languages.en, "The model needs to face the positive Z-axis")] + FACE_Z_POSITIVE_DIRECTION, + + [LangMsg(Languages.ja, "ExportRootの Animator に Avatar がありません")] + [LangMsg(Languages.en, "No Avatar in ExportRoot's Animator")] + NO_AVATAR_IN_ANIMATOR, + + [LangMsg(Languages.ja, "ExportRootの Animator.Avatar が不正です")] + [LangMsg(Languages.en, "Animator.avatar in ExportRoot is not valid")] + AVATAR_IS_NOT_VALID, + + [LangMsg(Languages.ja, "ExportRootの Animator.Avatar がヒューマノイドではありません。FBX importer の Rig で設定してください")] + [LangMsg(Languages.en, "Animator.avatar is not humanoid. Please change model's AnimationType to humanoid")] + AVATAR_IS_NOT_HUMANOID, + + [LangMsg(Languages.ja, "humanoid設定に顎が含まれている。FBX importer の rig 設定に戻って設定を解除することをおすすめします")] + [LangMsg(Languages.en, "Jaw bone is included. It may not what you intended. Please check the humanoid avatar setting screen")] + JAW_BONE_IS_INCLUDED, + + [LangMsg(Languages.ja, "ヒエラルキーの中に同じ名前のGameObjectが含まれている。 エクスポートした場合に自動でリネームする")] + [LangMsg(Languages.en, "There are bones with the same name in the hierarchy. They will be automatically renamed after export")] + DUPLICATE_BONE_NAME_EXISTS, + + [LangMsg(Languages.ja, "VRMBlendShapeProxyが必要です。先にVRMフォーマットに変換してください")] + [LangMsg(Languages.en, "VRMBlendShapeProxy is required. Please convert to VRM format first")] + NEEDS_VRM_BLENDSHAPE_PROXY, + + [LangMsg(Languages.en, "This model contains vertex color")] + [LangMsg(Languages.ja, "ヒエラルキーに含まれる mesh に頂点カラーが含まれている")] + VERTEX_COLOR_IS_INCLUDED, + + [LangMsg(Languages.ja, "ヒエラルキーに active なメッシュが含まれていない")] + [LangMsg(Languages.en, "No active mesh")] + NO_ACTIVE_MESH, + + [LangMsg(Languages.ja, "Standard, Unlit, MToon 以外のマテリアルは、Standard になります")] + [LangMsg(Languages.en, "It will export as `Standard` fallback")] + UNKNOWN_SHADER, + + [LangMsg(Languages.ja, "名前が長すぎる。リネームしてください: ")] + [LangMsg(Languages.en, "FileName is too long: ")] + FILENAME_TOO_LONG, } }