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,
}
}