#if UNITY_EDITOR
namespace NiAkaDev.EzMirror.Editor
{
    using System;
    using UnityEditor;
    using UnityEngine;

    internal static class EzMirrorLocalization
    {
        internal enum Language
        {
            Japanese = 0,
            English = 1,
            Korean = 2,
            ChineseSimplified = 3
        }

        private const string LanguagePrefsKey = "NiAkaDev.EzMirror.EditorLanguage";

        internal static readonly string[] LanguageNames =
        {
            "日本語",
            "English",
            "한국어",
            "简体中文"
        };

        internal static readonly string[] RequiredLocalizationKeys =
        {
            "ProfileAssetEditorTitle",
            "ProfileAssetEditorDescription",
            "ProfileAssetEditorSectionBasic",
            "ProfileAssetEditorProfileName",
            "ProfileAssetEditorProfileNameTooltip",
            "ProfileAssetEditorIsDefault",
            "ProfileAssetEditorIsDefaultTooltip",
            "ProfileAssetEditorMirrorEnabled",
            "ProfileAssetEditorMirrorEnabledTooltip",
            "ProfileAssetEditorPcOnly",
            "ProfileAssetEditorPcOnlyTooltip",
            "ProfileAssetEditorSectionAppearance",
            "ProfileAssetEditorTransparency",
            "ProfileAssetEditorTransparencyTooltip",
            "ProfileAssetEditorBaseMaterial",
            "ProfileAssetEditorBaseMaterialTooltip",
            "ProfileAssetEditorIconSprite",
            "ProfileAssetEditorIconSpriteTooltip",
            "ProfileAssetEditorIconColor",
            "ProfileAssetEditorIconColorTooltip",
            "ProfileAssetEditorIconPreview",
            "ProfileAssetEditorSectionMirrorQuality",
            "ProfileAssetEditorReflectLayers",
            "ProfileAssetEditorReflectLayersTooltip",
            "ProfileAssetEditorDisablePixelLights",
            "ProfileAssetEditorDisablePixelLightsTooltip",
            "ProfileAssetEditorTurnOffMirrorOcclusion",
            "ProfileAssetEditorTurnOffMirrorOcclusionTooltip",
            "ProfileAssetEditorSectionBackground",
            "ProfileAssetEditorCameraClearFlags",
            "ProfileAssetEditorCameraClearFlagsTooltip",
            "ProfileAssetEditorCustomSkybox",
            "ProfileAssetEditorCustomSkyboxTooltip",
            "ProfileAssetEditorCustomClearColor",
            "ProfileAssetEditorCustomClearColorTooltip",
            "ProfileAssetEditorHideBackground",
            "ProfileAssetEditorHideBackgroundTooltip",
            "ProfileAssetEditorLqBackgroundHelp",
            "HealthCheckTitle",
            "HealthBrokenReferences",
            "HealthBrokenReferencesHint",
            "HealthMissingGeneratedMaterials",
            "HealthMissingGeneratedMaterialsHint",
            "HealthDuplicateSaveKey",
            "HealthDuplicateSaveKeyHint",
            "HealthNeedsSetup",
            "HealthNeedsSetupHint",
            "HealthReady",
            "HealthReadyHint",
            "HealthValidateSelected",
            "HealthRepairSafe",
            "HealthRegenerateMaterials",
            "HealthGeneratePersistKey",
            "HealthOpenReadme",
            "DeveloperHealthActions",
            "DeveloperHealthActionsHelp",
            "DeveloperProfileMaintenance",
            "DeveloperProfileMaintenanceHelp",
            "ProfileMaterialGenerationHeader",
            "ProfileMaterialGenerationHelp",
            "ContextualFixHelp",
            "FixMissingInputButton",
            "CreatePersistKeyButton",
            "FixProfileArraysButton",
            "AutoAssignAudioSourceButton",
            "RemoveProfileObjectButton",
            "DeveloperDangerZone",
            "DeveloperDangerZoneHelp",
            "ProfileAssetApplyExplicitHelp",
            "InteractAdvancedFoldout",
            "ContactAdvancedFoldout",
            "ProfileAdvancedFoldout",
            "PersistAdvancedFoldout",
            "SfxAdvancedFoldout",
            "HapticsAdvancedFoldout",
            "ProfileIconHeader",
            "IconObjectLabel",
            "LegacyIconFoldout",
            "LegacyIconHelp",
            "LegacyIconMigrateButton",
            "LegacyIconClearButton",
            "SwitchAnimatorBeginnerTitle",
            "SwitchAnimatorBeginnerHelp",
            "UseSwitchAnimatorLabel",
            "SwitchAnimatorStatusMultiEdit",
            "SwitchAnimatorStatusDisabled",
            "SwitchAnimatorStatusMissing",
            "SwitchAnimatorStatusNoController",
            "SwitchAnimatorStatusInvalidParameters",
            "SwitchAnimatorStatusReady",
            "RepairSwitchAnimatorButton",
            "SelectSwitchAnimatorButton",
            "DeveloperSwitchAnimator",
            "DeveloperSwitchAnimatorHelp",
            "ReferenceSwitchAnimator",
            "SwitchAnimatorProfileIndexParameter",
            "SwitchAnimatorStateParameter",
            "SwitchAnimatorPressParameter",
            "SwitchAnimatorCanSetProfileIndex",
            "SwitchAnimatorCanSetState",
            "SwitchAnimatorCanSetPress",
            "ValidateSwitchAnimatorButton",
            "ResetSwitchAnimatorDefaultsButton",
        };

        internal static Language CurrentLanguage
        {
            get
            {
                int stored = EditorPrefs.GetInt(
                    LanguagePrefsKey,
                    (int)GetDefaultLanguage(Application.systemLanguage)
                );
                if (stored < 0 || stored >= LanguageNames.Length)
                    return GetDefaultLanguage(Application.systemLanguage);
                return (Language)stored;
            }
            set
            {
                int index = Mathf.Clamp((int)value, 0, LanguageNames.Length - 1);
                EditorPrefs.SetInt(LanguagePrefsKey, index);
            }
        }

        internal static int CurrentLanguageIndex
        {
            get => (int)CurrentLanguage;
            set => CurrentLanguage = (Language)Mathf.Clamp(value, 0, LanguageNames.Length - 1);
        }

        internal static string Get(string key)
        {
            return Get(key, key);
        }

        internal static string Get(string key, string fallback)
        {
            switch (CurrentLanguage)
            {
                case Language.English:
                    return GetEnglish(key, fallback);
                case Language.Korean:
                    return GetKorean(key, fallback);
                case Language.ChineseSimplified:
                    return GetChineseSimplified(key, fallback);
                default:
                    return GetJapanese(key, fallback);
            }
        }

        internal static string Format(string key, string fallback, params object[] args)
        {
            return string.Format(Get(key, fallback), args);
        }

        internal static bool HasTranslationForEveryLanguage(string key)
        {
            return GetJapanese(key, null) != null
                && GetEnglish(key, null) != null
                && GetKorean(key, null) != null
                && GetChineseSimplified(key, null) != null;
        }

        private static Language GetDefaultLanguage(SystemLanguage systemLanguage)
        {
            switch (systemLanguage)
            {
                case SystemLanguage.English:
                    return Language.English;
                case SystemLanguage.Korean:
                    return Language.Korean;
                case SystemLanguage.Chinese:
                case SystemLanguage.ChineseSimplified:
                    return Language.ChineseSimplified;
                default:
                    return Language.Japanese;
            }
        }

        private static string GetJapanese(string key, string fallback)
        {
            switch (key)
            {
                case "Language": return "言語";
                case "HeroTitle": return "EzMirror かんたん設定";
                case "HeroDescription": return "1つの Mirror に、Off / HQ / 透明 / LQ などのプロファイルを切り替えて適用します。通常は「まず押す」だけで基本設定が整います。";
                case "OneClickTitle": return "まず押す";
                case "OneClickDescription": return "子オブジェクトの Mirror / Trigger / Toggle を拾い、Off固定プロファイルとLQ背景クリア球、PC / Quest既定をまとめて整えます。";
                case "AutoSetupButton": return "基本セットアップを自動実行";
                case "StatusHeader": return "現在の状態";
                case "StatusOk": return "[OK]";
                case "StatusNeedCheck": return "[要確認]";
                case "StatusReadyText": return "設定済み";
                case "ExpandAllSteps": return "全STEPを展開";
                case "CollapseAllSteps": return "全STEPを閉じる";
                case "Step1Title": return "ミラーの大きさと位置を調整";
                case "Step2Title": return "切替方法とスイッチ位置を調整";
                case "Step3Title": return "表示させつづける範囲を設定";
                case "Step4Title": return "フェード距離設定";
                case "Step5Title": return "プロファイル確認・設定（任意）";
                case "Step6Title": return "保存設定（任意）";
                case "Step7Title": return "効果音・振動設定（任意）";
                case "InputUgui": return "UIボタンで切り替える（レーザー/クリック）";
                case "InputInteract": return "Useボタンで切り替える（近づいて押す）";
                case "InputContact": return "手で触れて切り替える";
                case "InteractAdvancedFoldout": return "Useの詳細設定";
                case "ContactAdvancedFoldout": return "触れる判定の詳細設定";
                case "InteractDetailsTitle": return "Useボタン設定";
                case "InteractDetailsHelp": return "近づいて Use したときに表示される文字と、Useできる距離です。通常はそのままで問題ありません。";
                case "InteractTextLabel": return "Use時に表示する文字";
                case "InteractProximityLabel": return "Useできる距離";
                case "ContactDetailsTitle": return "手のContact設定";
                case "ContactDetailsHelp": return "どのContactタグに反応するかを設定します。通常は Avatar の手・指タグだけを受け取る初期設定のままで問題ありません。";
                case "ContactAvatarOnlyHelp": return "送信元は Avatar の Contact Sender だけを受け取る設定を推奨します。World のContactには通常対応しません。";
                case "ContactShapeSizeLabel": return "判定サイズ";
                case "ContactContentTypesLabel": return "反応する送信元";
                case "ContactTagsLabel": return "反応するContactタグ";
                case "ContactAllowSelfLabel": return "自分のContactに反応";
                case "ContactAllowOthersLabel": return "他人のContactに反応";
                case "ContactLocalOnlyLabel": return "ローカルだけで判定";
                case "InputDetailsMultiEditHelp": return "複数選択中は詳細設定を個別に編集してください。切替方法のON/OFFはこのまままとめて変更できます。";
                case "MissingInteractProxy": return "Useできる場所が未設定です。開発者オプションで修復できます。";
                case "MissingContactReceiver": return "触れる判定が未設定です。開発者オプションで修復できます。";
                case "RepairInputButton": return "切替入力を自動修復";
                case "SelectRendererButton": return "ミラー面を選択";
                case "SelectTriggerButton": return "表示範囲の箱を選択";
                case "SelectToggleCanvasButton": return "スイッチUIを選択";
                case "SelectInputHitboxButton": return "Use/触る切替用の判定を選択";
                case "SelectInteractInputButton": return "Useできる場所を選択";
                case "SelectContactInputButton": return "触れる判定を選択";
                case "LocalOnlyMirrorHelp": return "ミラーの切り替え状態は各ユーザーごとに独立します。必要な場合だけ、同じユーザーが再入室した時の状態復元を有効にしてください。";
                case "PersistMixedHelp": return "複数選択中は、ローカル保存のON/OFFだけまとめて変更できます。保存キーの詳細は1つずつ確認してください。";
                case "PersistDisabledHelp": return "OFFのままなら保存キーは不要です。";
                case "PersistKeyStatusLabel": return "保存キー";
                case "PersistKeyMissing": return "未作成";
                case "PersistKeyConfigured": return "自動設定済み";
                case "PersistKeyMissingHelp": return "ローカル保存を使うには保存キーが必要です。通常は自動作成で問題ありません。";
                case "CreatePersistKeyButton": return "保存キーを自動作成";
                case "PersistAdvancedFoldout": return "保存キーの詳細設定";
                case "SfxAdvancedFoldout": return "効果音の詳細設定";
                case "HapticsAdvancedFoldout": return "振動の詳細設定";
                case "DeveloperOptions": return "開発者オプション";
                case "DeveloperDescription": return "通常は触らない設定です。生成Materialは EzMirror ごとに専用化され、Prefab コピー後も他Prefabと共有されないよう自動再生成します。基盤Materialを差し替えたい場合だけ変更してください。";
                case "DeveloperReferences": return "基本参照";
                case "DeveloperMethods": return "他ギミックから呼び出す公開メソッド";
                case "DeveloperProfileMaintenance": return "プロファイル保守";
                case "DeveloperProfileMaintenanceHelp": return "プロファイルアセット生成や内部配列の整合など、通常の設置では不要な保守操作です。";
                case "ProfileMaterialGenerationHeader": return "生成Material";
                case "ProfileMaterialGenerationHelp": return "プロファイル名や画質設定を確認したら、ここでMaterialを自動生成/更新できます。空やMissingのMaterialも再生成します。";
                case "ContextualFixHelp": return "不足している設定だけ、ここから安全に直せます。素材の掃除や強制再生成などの保守操作は開発者オプションにあります。";
                case "FixMissingInputButton": return "切替入力の不足を直す";
                case "FixProfileArraysButton": return "表示パターン設定をそろえる";
                case "AutoAssignAudioSourceButton": return "AudioSourceを探して設定";
                case "RemoveProfileObjectButton": return "リストから外す";
                case "DeveloperDangerZone": return "危険操作";
                case "DeveloperDangerZoneHelp": return "生成物の掃除や強制再生成など、通常は不要で影響範囲が大きい操作です。対象を確認してから実行してください。";
                case "ProfileAssetApplyExplicitHelp": return "アセットを割り当てただけでは現在の設定を上書きしません。内容を取り込みたい時だけ「アセットの設定を反映」を押してください。";
                case "SetupMissingRefs": return "主要参照が不足しています。「基本セットアップを自動実行」を押すと、子オブジェクトから自動で拾います。";
                case "SetupMissingProfiles": return "プロファイル 0（Off）と通常プロファイルが未設定です。HQ / 透明 / LQ などのプロファイルを追加してください。";
                case "SetupMissingMobile": return "通常プロファイルがすべてPC専用です。Quest / Android / iOS用にPC専用ではないプロファイルを1つ残してください。";
                case "SetupReady": return "基本設定は整っています。フェード距離と Trigger 境界は Scene Gizmo で確認してください。";
                case "GeneratedMaterialCleanupHelp": return "未参照の生成Materialだけを確認してから掃除できます。現在開いているScene / PrefabとProject内依存関係で参照中のMaterialは候補から除外します。";
                case "PreviewUnusedGeneratedMaterialsButton": return "未参照生成Materialを確認";
                case "UnusedGeneratedMaterialCountLabel": return "掃除候補数";
                case "DeleteUnusedGeneratedMaterialsButton": return "確認した候補をゴミ箱へ移動";
                case "DeleteUnusedGeneratedMaterialsDialogTitle": return "未参照生成Materialの掃除";
                case "DeleteUnusedGeneratedMaterialsDialogMessage": return "{0} 件の未参照生成Materialをゴミ箱へ移動します。参照状態を再確認してから実行します。";
                case "DeleteUnusedGeneratedMaterialsDialogOk": return "ゴミ箱へ移動";
                case "CancelButton": return "キャンセル";
                case "ProfileIconHeader": return "プロファイルアイコン";
                case "IconObjectLabel": return "旧アイコン表示オブジェクト（互換）";
                case "LegacyIconFoldout": return "旧アイコン互換設定";
                case "LegacyIconHelp": return "古い複数オブジェクト式のアイコン参照です。必要な場合だけ残し、通常は単一Image方式へ移行してください。";
                case "LegacyIconMigrateButton": return "このアイコンへ移行";
                case "LegacyIconClearButton": return "旧参照だけ外す";
                case "IconPreviewMixed": return "複数選択中はプレビューを省略します。";
                case "IconPreviewMissing": return "アイコン未設定です。標準アイコンも見つかりません。";
                case "IconCardOffTitle": return "OFF時のUIアイコン";
                case "IconCardProfileTitle": return "切替UIに出すアイコン";
                case "ProfileAdvancedFoldout": return "プロファイルの詳細設定";
                case "IconColorLabel": return "アイコン色";
                case "IconSourceProfileAsset": return "プロファイルアセットに保存されます。";
                case "IconSourceOff": return "OFFアイコンはこのEzMirrorだけに保存されます。";
                case "IconSourceLocal": return "このEzMirrorだけのアイコンとして保存されます。";
                case "IconSourceLegacyLocal": return "旧設定の個別アイコンを表示中です。変更するとプロファイルアセットへ保存されます。";
                case "IconMultiSelectDisabled": return "通常プロファイルのアイコンはプロファイルアセットに保存します。1つのEzMirrorだけを選択して編集してください。";
                case "IconUsingDefault": return "標準アイコン1枚を使用中";
                case "IconDefaultBadge": return "標準";
                case "IconSelectPlaceholder": return "選択";
                case "IconResetButton": return "標準に戻す";
                case "IconSelectAssetButton": return "アセット選択";
                case "ProfileAssetEditorTitle": return "EzMirror プロファイルアセット";
                case "ProfileAssetEditorDescription": return "複数の EzMirror で共有できる設定ファイルです。プロファイル名・画質・透明度など、Sceneに依存しない設定だけを保存します。Scene内オブジェクトは保存しません。";
                case "ProfileAssetEditorSectionBasic": return "基本";
                case "ProfileAssetEditorProfileName": return "プロファイル名";
                case "ProfileAssetEditorProfileNameTooltip": return "例: HQミラー、半透明ミラー、LQミラー";
                case "ProfileAssetEditorIsDefault": return "初期状態として使う";
                case "ProfileAssetEditorIsDefaultTooltip": return "Reset時やワールド開始時にこのプロファイルを使う場合はONにします。";
                case "ProfileAssetEditorMirrorEnabled": return "ミラーを表示する";
                case "ProfileAssetEditorMirrorEnabledTooltip": return "OFFにすると、このプロファイル選択中はミラー本体を非表示にします。";
                case "ProfileAssetEditorPcOnly": return "PC専用にする";
                case "ProfileAssetEditorPcOnlyTooltip": return "Quest / Android / iOS ではこのプロファイルをスキップします。";
                case "ProfileAssetEditorSectionAppearance": return "見た目";
                case "ProfileAssetEditorTransparency": return "透明度";
                case "ProfileAssetEditorTransparencyTooltip": return "0 は不透明、1 は透明です。半透明ミラーは 0.5 前後が目安です。";
                case "ProfileAssetEditorBaseMaterial": return "基盤マテリアル";
                case "ProfileAssetEditorBaseMaterialTooltip": return "プロファイル用Materialを自動生成するときの元になるMaterialです。";
                case "ProfileAssetEditorIconSprite": return "UIアイコン画像";
                case "ProfileAssetEditorIconSpriteTooltip": return "切り替えUIに表示する白線Spriteです。通常は付属の標準アイコン1枚を使います。";
                case "ProfileAssetEditorIconColor": return "UIアイコン色";
                case "ProfileAssetEditorIconColorTooltip": return "白線アイコンに乗せる色です。EzMirror 側の Image.color に反映されます。";
                case "ProfileAssetEditorIconPreview": return "アイコン色プレビュー";
                case "ProfileAssetEditorSectionMirrorQuality": return "ミラー画質";
                case "ProfileAssetEditorReflectLayers": return "映すレイヤー";
                case "ProfileAssetEditorReflectLayersTooltip": return "ミラーに映したいLayerを選びます。通常は既定値のままで問題ありません。";
                case "ProfileAssetEditorDisablePixelLights": return "Pixel Lightを無効化";
                case "ProfileAssetEditorDisablePixelLightsTooltip": return "重くなりやすいPixel Lightをミラー内で無効化します。";
                case "ProfileAssetEditorTurnOffMirrorOcclusion": return "Mirror Occlusionを無効化";
                case "ProfileAssetEditorTurnOffMirrorOcclusionTooltip": return "通常はONのままで問題ありません。";
                case "ProfileAssetEditorSectionBackground": return "背景";
                case "ProfileAssetEditorCameraClearFlags": return "背景の消し方";
                case "ProfileAssetEditorCameraClearFlagsTooltip": return "LQミラーで背景を消したい場合は Solid Color を使います。";
                case "ProfileAssetEditorCustomSkybox": return "Skyboxマテリアル";
                case "ProfileAssetEditorCustomSkyboxTooltip": return "背景に個別Skyboxを使う場合だけ設定します。";
                case "ProfileAssetEditorCustomClearColor": return "背景色";
                case "ProfileAssetEditorCustomClearColorTooltip": return "Solid Color の色です。背景を透明にする場合は Alpha を 0 にします。";
                case "ProfileAssetEditorHideBackground": return "背景を透明化";
                case "ProfileAssetEditorHideBackgroundTooltip": return "ミラー用マテリアル側でも背景を透明化する場合にONにします。";
                case "ProfileAssetEditorLqBackgroundHelp": return "LQミラーでは、背景クリア球と組み合わせることで空や背後のワールドを映しにくくします。";
                case "HealthCheckTitle": return "設定チェック";
                case "HealthBrokenReferences": return "参照切れがあります";
                case "HealthBrokenReferencesHint": return "基本セットアップを実行するか、不足している参照を設定してください。";
                case "HealthMissingGeneratedMaterials": return "生成Materialが不足しています";
                case "HealthMissingGeneratedMaterialsHint": return "安定パスへProfile Materialを再生成してください。";
                case "HealthDuplicateSaveKey": return "保存キーが重複しています";
                case "HealthDuplicateSaveKeyHint": return "ローカル保存を使う場合はEzMirrorごとに一意の保存キーにしてください。";
                case "HealthNeedsSetup": return "設定確認が必要です";
                case "HealthNeedsSetupHint": return "基本セットアップと任意の入力・Profile設定を確認してください。";
                case "HealthReady": return "問題なし";
                case "HealthReadyHint": return "重大な設定問題は見つかりませんでした。";
                case "HealthValidateSelected": return "選択中を検証";
                case "HealthRepairSafe": return "安全に修復";
                case "HealthRegenerateMaterials": return "マテリアルを再生成";
                case "HealthGeneratePersistKey": return "保存キーを生成";
                case "HealthOpenReadme": return "READMEを開く";
                case "DeveloperHealthActions": return "設定チェック操作";
                case "DeveloperHealthActionsHelp": return "READMEを開く、保存キー生成、検証、修復、マテリアル再生成などの保守向け操作です。通常の設置では必要になった時だけ使ってください。";
                case "SwitchAnimatorBeginnerTitle": return "3Dスイッチモデル";
                case "SwitchAnimatorBeginnerHelp": return "3Dスイッチの押し込み動作やランプ表示を、現在のプロファイルに合わせて自動で動かします。通常はONのままで問題ありません。";
                case "UseSwitchAnimatorLabel": return "3Dスイッチをアニメーションさせる";
                case "SwitchAnimatorStatusMultiEdit": return "複数選択時は個別の3Dスイッチ状態を確認してください。";
                case "SwitchAnimatorStatusDisabled": return "3DスイッチアニメーションはOFFです。";
                case "SwitchAnimatorStatusMissing": return "3DスイッチのAnimatorが未設定です。自動修復できます。";
                case "SwitchAnimatorStatusNoController": return "Animator Controller が未設定です。自動修復できます。";
                case "SwitchAnimatorStatusInvalidParameters": return "Animatorパラメーターに不足があります。開発者オプションで確認できます。";
                case "SwitchAnimatorStatusReady": return "3Dスイッチは現在のプロファイルと入力に追従できます。";
                case "RepairSwitchAnimatorButton": return "3Dスイッチを自動修復";
                case "SelectSwitchAnimatorButton": return "3Dスイッチを選択";
                case "DeveloperSwitchAnimator": return "3Dスイッチ Animator";
                case "DeveloperSwitchAnimatorHelp": return "3Dスイッチ用の高度な設定です。通常はStep2の自動修復だけで十分です。独自Animator Controllerを使う場合だけ調整してください。";
                case "ReferenceSwitchAnimator": return "3Dスイッチ Animator";
                case "SwitchAnimatorProfileIndexParameter": return "プロファイル番号パラメーター";
                case "SwitchAnimatorStateParameter": return "状態パラメーター";
                case "SwitchAnimatorPressParameter": return "押し込みパラメーター";
                case "SwitchAnimatorCanSetProfileIndex": return "プロファイル番号を送れる";
                case "SwitchAnimatorCanSetState": return "状態を送れる";
                case "SwitchAnimatorCanSetPress": return "押し込みを送れる";
                case "ValidateSwitchAnimatorButton": return "Animator設定を検証";
                case "ResetSwitchAnimatorDefaultsButton": return "既定値に戻して修復";

                default: return fallback;
            }
        }

        private static string GetEnglish(string key, string fallback)
        {
            switch (key)
            {
                case "Language": return "Language";
                case "HeroTitle": return "EzMirror Simple Setup";
                case "HeroDescription": return "Switch Off / HQ / Transparent / LQ profiles on one Mirror. In most cases, start with the first setup button.";
                case "OneClickTitle": return "Start here";
                case "OneClickDescription": return "Find child Mirror / Trigger / Toggle objects, then prepare Off, LQ background clearing, and PC / Quest defaults.";
                case "AutoSetupButton": return "Run basic setup automatically";
                case "StatusHeader": return "Current status";
                case "StatusOk": return "[OK]";
                case "StatusNeedCheck": return "[Check]";
                case "StatusReadyText": return "Ready";
                case "ExpandAllSteps": return "Expand all steps";
                case "CollapseAllSteps": return "Collapse all steps";
                case "Step1Title": return "Adjust mirror size and position";
                case "Step2Title": return "Adjust switch methods and position";
                case "Step3Title": return "Set the keep-visible area";
                case "Step4Title": return "Fade distance settings";
                case "Step5Title": return "Review and edit profiles (optional)";
                case "Step6Title": return "Save settings (optional)";
                case "Step7Title": return "Sound and haptics (optional)";
                case "InputUgui": return "Switch with UI button (laser/click)";
                case "InputInteract": return "Switch with Use button";
                case "InputContact": return "Switch by hand contact";
                case "InteractAdvancedFoldout": return "Use details";
                case "ContactAdvancedFoldout": return "Contact details";
                case "InteractDetailsTitle": return "Use button settings";
                case "InteractDetailsHelp": return "Set the text shown when the player uses this input, and the distance where Use is available. The defaults are usually fine.";
                case "InteractTextLabel": return "Text shown on Use";
                case "InteractProximityLabel": return "Use distance";
                case "ContactDetailsTitle": return "Hand Contact settings";
                case "ContactDetailsHelp": return "Set which Contact tags can trigger this input. Usually, keep the default Avatar hand/finger tags.";
                case "ContactAvatarOnlyHelp": return "Avatar Contact Senders are recommended. World Contacts are usually not supported here.";
                case "ContactShapeSizeLabel": return "Detection size";
                case "ContactContentTypesLabel": return "Accepted sender type";
                case "ContactTagsLabel": return "Accepted Contact tags";
                case "ContactAllowSelfLabel": return "React to your own Contact";
                case "ContactAllowOthersLabel": return "React to other players";
                case "ContactLocalOnlyLabel": return "Local-only detection";
                case "InputDetailsMultiEditHelp": return "Edit detailed settings one object at a time. You can still change the switch method toggles in multi-edit.";
                case "MissingInteractProxy": return "Use input is not set. You can repair it from Developer options.";
                case "MissingContactReceiver": return "Contact input is not set. You can repair it from Developer options.";
                case "RepairInputButton": return "Auto-repair switch input";
                case "SelectRendererButton": return "Select mirror surface";
                case "SelectTriggerButton": return "Select visibility box";
                case "SelectToggleCanvasButton": return "Select switch UI";
                case "SelectInputHitboxButton": return "Select Use/contact hitbox";
                case "SelectInteractInputButton": return "Select Use area";
                case "SelectContactInputButton": return "Select touch area";
                case "PersistMixedHelp": return "When multiple EzMirrors are selected, only the local-save toggle can be edited together. Check save keys one by one.";
                case "PersistDisabledHelp": return "No save key is needed while local save is off.";
                case "PersistKeyStatusLabel": return "Save key";
                case "PersistKeyMissing": return "Not created";
                case "PersistKeyConfigured": return "Auto configured";
                case "PersistKeyMissingHelp": return "Local save needs a save key. Auto-create is usually fine.";
                case "CreatePersistKeyButton": return "Auto-create save key";
                case "PersistAdvancedFoldout": return "Save key details";
                case "SfxAdvancedFoldout": return "Sound details";
                case "HapticsAdvancedFoldout": return "Haptics details";
                case "DeveloperOptions": return "Developer options";
                case "DeveloperDescription": return "Advanced settings. Generated materials are dedicated per EzMirror so prefab copies do not share them. Change base materials only for special setups.";
                case "DeveloperReferences": return "Core references";
                case "DeveloperMethods": return "Public methods for other gimmicks";
                case "DeveloperProfileMaintenance": return "Profile maintenance";
                case "DeveloperProfileMaintenanceHelp": return "Maintenance actions such as profile asset generation and internal array alignment. Normal setup does not need them.";
                case "ProfileMaterialGenerationHeader": return "Generated materials";
                case "ProfileMaterialGenerationHelp": return "Generate or update profile materials after checking names and quality settings. Empty or missing materials are recreated too.";
                case "ContextualFixHelp": return "Only missing setup items can be fixed safely here. Material cleanup and forced regeneration are in Developer options.";
                case "FixMissingInputButton": return "Fix missing switch input";
                case "FixProfileArraysButton": return "Align display pattern settings";
                case "AutoAssignAudioSourceButton": return "Find and assign AudioSource";
                case "RemoveProfileObjectButton": return "Remove from list";
                case "DeveloperDangerZone": return "Danger Zone";
                case "DeveloperDangerZoneHelp": return "High-impact maintenance actions such as generated asset cleanup and forced regeneration. Check the targets before running them.";
                case "SetupMissingRefs": return "Core references are missing. Press the automatic setup button to find them from child objects.";
                case "SetupMissingProfiles": return "Profile 0 (Off) and normal profiles are missing. Add HQ / Transparent / LQ profiles.";
                case "SetupMissingMobile": return "All normal profiles are PC-only. Keep at least one non-PC-only profile for Quest / Android / iOS.";
                case "SetupReady": return "Basic setup is ready. Check fade distances and Trigger boundaries with Scene gizmos.";
                case "StatusReferencesTitle": return "Mirror / Renderer / visible range";
                case "StatusReferencesHint": return "If this is not set, press Run basic setup automatically.";
                case "StatusProfilesTitle": return "Profile list";
                case "StatusProfilesHint": return "Profile 0 fixed to Off and at least one normal profile are required.";
                case "StatusMobileTitle": return "Quest / Android / iOS profile";
                case "StatusMobileHint": return "Keep at least one normal profile that is not PC-only.";
                case "StatusLqBackgroundTitle": return "LQ background clearing sphere";
                case "StatusLqBackgroundHint": return "Used when an LQ profile should hide the skybox.";
                case "StatusToggleTitle": return "Toggle UI connection";
                case "StatusToggleHint": return "If a Toggle exists, connect it to SendCustomEvent(SelectNextFromUgui) on the main component.";
                case "StatusInputTitle": return "Interact / Contact input";
                case "StatusInputHint": return "If SwitchUI / InteractInput / ContactInput is missing, press Auto-repair switch input.";
                case "Step1Help": return "Select the mirror surface in the Scene view, then adjust its position, rotation, and size.";
                case "Step2Help": return "You can combine switch methods: laser/click UI, nearby Use, and hand contact.";
                case "Step2PositionHelp": return "Switch UI is the reference position for UI button, Use area, and touch area.";
                case "Step3RendererHint": return "The mirror is shown while the player is inside this box. Resize it in the Scene view.";
                case "Step3GizmoHelp": return "Select the main object or a child in the Scene view to show the visible range frame.";
                case "Step5Help": return "By default this is HQ -> Transparent -> LQ mirror. Non-PC platforms use LQ only.";
                case "MissingRenderer": return "The mirror surface is not set. Run basic setup first or assign it in Developer options.";
                case "MissingTrigger": return "The visibility box is not set. Run basic setup first or assign it in Developer options.";
                case "MissingToggle": return "The Toggle UI is not set. Run basic setup first or assign it in Developer options.";
                case "MissingToggleCanvas": return "No Canvas was found in the ToggleUI parent hierarchy.";
                case "MissingSwitchInput": return "Use area is not set. Run basic setup first or repair it in Developer options.";
                case "NotSet": return "Not set";
                case "ProfileListHelp": return "Profile 0 is fixed to Off. Switching starts from Profile 1. Usually, check only the name, visibility, transparency, and icon.";
                case "AddProfileButton": return "Add profile";
                case "AlignProfileArraysButton": return "Align profile array sizes";
                case "ProfileAssetHeader": return "Profile asset";
                case "ProfileAssetHelp": return "Only scene-independent profile settings are stored as assets. Scene references such as ON/OFF objects and icon objects stay on this EzMirror.";
                case "GenerateDefaultProfileAssetsButton": return "Generate default profile assets";
                case "ProfileAssetSingleTargetOnly": return "Profile asset assignment and creation are available only when one EzMirror is selected.";
                case "ProfileAssetScopeHelp": return "Profile assets store only scene-independent settings such as profile name, quality, transparency, PC-only, base material, and icon image. Scene references are not saved.";
                case "ProfileAssetApplyExplicitHelp": return "Assigning an asset does not overwrite the current settings. Press Apply asset settings only when you want to import its contents.";
                case "ApplyProfileAssetButton": return "Apply asset settings";
                case "CreateProfileAssetButton": return "Create asset from this profile";
                case "CannotDeleteButton": return "Cannot delete";
                case "DeleteButton": return "Delete";
                case "LockedLabel": return "Locked";
                case "OffProfileHelp": return "The Off profile is a fixed state that hides the mirror.";
                case "OffProfileDetailHelp": return "The Off profile does not show Material, quality, or PC-only settings. Profile assets are managed by normal profiles.";
                case "GroupOffVisual": return "Group: Off appearance";
                case "GroupOffObjects": return "Group: Objects switched only while Off";
                case "GroupProfileAsset": return "Group: Profile asset (shared settings)";
                case "GroupDisplay": return "Group: Display";
                case "GroupMirrorQuality": return "Group: Mirror quality";
                case "GroupIcon": return "Group: UI icon";
                case "GroupObjects": return "Group: Profile-specific objects";
                case "MirrorEnabledLabel": return "Show mirror";
                case "TransparencyLabel": return "Transparency";
                case "HideBackgroundLabel": return "Make background transparent";
                case "PcOnlyLabel": return "PC only";
                case "ProfileNameLabel": return "Profile name";
                case "ProfileNameFallbackHelp": return "Because this is blank, the display name is treated as \"{0}\".";
                case "DefaultProfileLabel": return "Default / reset target";
                case "DefaultProfileCurrent": return "This profile";
                case "DefaultProfileOther": return "Another profile";
                case "SetDefaultProfileButton": return "Use this profile as default";
                case "DefaultPcOnlyWarning": return "This profile is the default but PC-only. Quest / Android / iOS will fall back to Profile 0 (Off).";
                case "HideBackgroundHelp": return "Make background transparent turns on Hide Background on the material when the profile is applied.";
                case "OffProfileTitle": return "Profile 0 (fixed Off) - {0}";
                case "ProfileTitlePrefix": return "Profile {0}";
                case "MaterialMissingSuffix": return " - Material not generated";
                case "MaterialGeneratedSuffix": return " - Material generated";
                case "FallbackHqMirror": return "HQ Mirror";
                case "FallbackTransparentMirror": return "Transparent Mirror";
                case "FallbackLqMirror": return "LQ Mirror";
                case "MaterialMissingHelp": return "Generated materials are hidden in normal settings. Press Generate/update material if needed.";
                case "NoFadePropertyHelp": return "This material has no distance fade properties, so fade distance settings and gizmos do not apply.";
                case "GeneratedMaterialHiddenHelp": return "Generated materials are hidden in normal settings. Adjust fade distances together in Step 4.";
                case "FadeWidthHelp": return "You only set fade width. The fade end is automatically aligned to the outer edge of the visible range.";
                case "GenerateMaterialPrompt": return "No generated material exists yet. Press Generate/update material to create it at the stable path from the base material.";
                case "TargetMaterialCount": return "Target material count";
                case "ForeignGeneratedMaterialWarning": return "A material generated for another EzMirror was detected. Generate/update material will replace it with a dedicated material for this EzMirror.";
                case "MissingFadeReferences": return "The visible range or Renderer is not set. Run basic setup first.";
                case "GenerateMaterialButton": return "Generate material / update to outer edge";
                case "GeneratedMaterialCleanupHelp": return "Preview and clean only unused generated materials. Materials referenced by open Scenes / Prefabs or project dependencies are excluded.";
                case "PreviewUnusedGeneratedMaterialsButton": return "Preview unused generated materials";
                case "UnusedGeneratedMaterialCountLabel": return "Cleanup candidates";
                case "DeleteUnusedGeneratedMaterialsButton": return "Move previewed candidates to Trash";
                case "DeleteUnusedGeneratedMaterialsDialogTitle": return "Clean unused generated materials";
                case "DeleteUnusedGeneratedMaterialsDialogMessage": return "Move {0} unused generated materials to Trash. References will be checked again before deleting.";
                case "DeleteUnusedGeneratedMaterialsDialogOk": return "Move to Trash";
                case "CancelButton": return "Cancel";
                case "DistanceFadeWidthLabel": return "Front/back fade width";
                case "DistanceFadeWidthTooltip": return "Distance over which the mirror fades toward the front outer edge of the visible range.";
                case "HorizontalFadeWidthLabel": return "Left/right fade width";
                case "HorizontalFadeWidthTooltip": return "Distance over which the mirror fades toward the left/right outer edges of the visible range.";
                case "FadePreviewText": return "Front/back: fade starts at {0:0.##}m and ends at {1:0.##}m (visible range outer edge).\nLeft/right: center {2:0.##}m, fade starts at width {3:0.##}m and ends at width {4:0.##}m (outer edge).";
                case "RegenerateFromBaseButton": return "Regenerate at stable paths from base materials";
                case "DeveloperReferencesHelp": return "Internal references hidden from normal steps. Adjust them manually only for special setups that automatic setup cannot resolve.";
                case "ReferenceMirror": return "Mirror component";
                case "ReferenceMirrorHint": return "VRCMirrorReflection. Profile quality settings are applied here.";
                case "ReferenceRenderer": return "Display Renderer";
                case "ReferenceRendererHint": return "Renderer used to switch material and display ON/OFF.";
                case "ReferenceRange": return "Visible range";
                case "ReferenceRangeHint": return "Range where the mirror is shown while the player is inside.";
                case "ReferenceToggle": return "Toggle UI";
                case "ReferenceToggleHint": return "UI that calls SelectNextFromUgui from OnValueChanged. Leave empty if unused.";
                case "ReferenceInputProxy": return "Contact input proxy";
                case "ReferenceInputProxyHint": return "UdonSharp on ContactInput that relays hand-contact switching to the main component.";
                case "ReferenceInteractProxy": return "Use input proxy";
                case "ReferenceInteractProxyHint": return "UdonSharp on InteractInput that relays Use switching to the main component.";
                case "ReferenceInteractHitbox": return "Interact hitbox";
                case "ReferenceInteractHitboxHint": return "Non-trigger BoxCollider used for Interact.";
                case "ReferenceContact": return "Contact receiver";
                case "ReferenceContactHint": return "VRCContactReceiver used for hand-contact switching.";
                case "TriggerRefreshIntervalLabel": return "Visible range refresh interval";
                case "ContactCooldownLabel": return "Contact repeat cooldown";
                case "WireToggleButton": return "Auto-wire Toggle OnValueChanged";
                case "DeveloperMethodsHelp": return "From UI or SendCustomEvent, call only no-argument methods. To select a specific profile directly, hold a EzMirror reference from external UdonSharp and call SelectProfile(int profileIndex).";
                case "MethodUguiNext": return "Next from uGUI Toggle";
                case "MethodNext": return "Next profile (external control)";
                case "MethodOff": return "Turn Off";
                case "MethodReset": return "Reset to default";
                case "MethodSelectProfile": return "Select a specific profile";
                case "UdonSharpExample": return "UdonSharp example";
                case "UdonSharpExampleCode": return "// ezMirror is an EzMirror component reference.\n";
                case "UdonSharpExampleSelectLine": return "ezMirror.SelectProfile(4); // 0=Off, 1=Profile 1\n";
                case "CopyButton": return "Copy";
                case "BaseMaterialLabel": return "Base Material";
                case "GeneratedMaterialLabel": return "Generated Material";
                case "MirrorQualityHeader": return "Mirror quality settings";
                case "DisablePixelLightsLabel": return "Disable Pixel Lights";
                case "TurnOffMirrorOcclusionLabel": return "Disable mirror occlusion";
                case "ReflectLayersLabel": return "Reflected layers";
                case "CameraClearFlagsLabel": return "Background clear mode";
                case "CustomSkyboxLabel": return "Custom Skybox";
                case "ClearColorLabel": return "Background color";
                case "ProfileIconHeader": return "Profile icon";
                case "IconObjectLabel": return "Legacy icon object (compatibility)";
                case "LegacyIconFoldout": return "Legacy icon compatibility";
                case "LegacyIconHelp": return "This is an old multi-object icon reference. Keep it only when needed; otherwise migrate to the single Image setup.";
                case "LegacyIconMigrateButton": return "Migrate to this icon";
                case "LegacyIconClearButton": return "Clear legacy reference";
                case "IconPreviewMixed": return "Preview is skipped while multiple EzMirror objects are selected.";
                case "IconPreviewMissing": return "No icon is set, and no standard icon was found.";
                case "IconCardOffTitle": return "OFF UI icon";
                case "IconCardProfileTitle": return "Switch UI icon";
                case "ProfileAdvancedFoldout": return "Profile details";
                case "IconColorLabel": return "Icon color";
                case "IconSourceProfileAsset": return "Saved in the profile asset.";
                case "IconSourceOff": return "The OFF icon is saved only on this EzMirror.";
                case "IconSourceLocal": return "Saved as an icon only for this EzMirror.";
                case "IconSourceLegacyLocal": return "Showing a legacy per-EzMirror icon. Changes will be saved to the profile asset.";
                case "IconMultiSelectDisabled": return "Regular profile icons are saved to profile assets. Select only one EzMirror to edit them.";
                case "IconUsingDefault": return "Using the shared default line icon";
                case "IconDefaultBadge": return "Standard";
                case "IconSelectPlaceholder": return "Select";
                case "IconResetButton": return "Reset";
                case "IconSelectAssetButton": return "Select asset";
                case "ProfileActiveObjectsLabel": return "Objects turned ON by this profile";
                case "ProfileInactiveObjectsLabel": return "Objects turned OFF by this profile";
                case "ProfileActiveObjectsEmpty": return "No extra objects are set to turn ON only for this profile.";
                case "ProfileInactiveObjectsEmpty": return "No extra objects are set to turn OFF only for this profile.";
                case "AddProfileActiveObjectButton": return "Add object to turn ON in this profile";
                case "AddProfileInactiveObjectButton": return "Add object to turn OFF in this profile";
                case "ProfileObjectConflictError": return "The same GameObject is listed as both ON and OFF for this profile. Keep it in only one list.";
                case "LocalOnlyMirrorHelp": return "Mirror switching is independent for each user. Enable local save only if the same user should restore their state after rejoining.";
                case "LocalSaveLabel": return "Save locally";
                case "PersistKeyLabel": return "Save key";
                case "DefaultProfileHelp": return "Set the default/reset target with Use this profile as default on each profile card. If multiple profiles are marked, the first is used; if none are marked, Off is used.";
                case "EnableClickSoundLabel": return "Enable sound effect";
                case "ClickClipLabel": return "Click sound";
                case "SfxAudioSourceLabel": return "Audio Source for sound";
                case "EnableHapticsLabel": return "Enable controller haptics";
                case "HapticDurationLabel": return "Haptic duration";
                case "HapticAmplitudeLabel": return "Haptic strength";
                case "HapticFrequencyLabel": return "Haptic frequency";
                case "ProfileAssetEditorTitle": return "EzMirror Profile Asset";
                case "ProfileAssetEditorDescription": return "A shared settings asset for multiple EzMirror instances. It stores only scene-independent settings such as profile name, quality, and transparency. Scene objects are not saved here.";
                case "ProfileAssetEditorSectionBasic": return "Basic";
                case "ProfileAssetEditorProfileName": return "Profile name";
                case "ProfileAssetEditorProfileNameTooltip": return "Examples: HQ Mirror, Transparent Mirror, LQ Mirror";
                case "ProfileAssetEditorIsDefault": return "Use as default";
                case "ProfileAssetEditorIsDefaultTooltip": return "Enable this when Reset or world start should use this profile.";
                case "ProfileAssetEditorMirrorEnabled": return "Show mirror";
                case "ProfileAssetEditorMirrorEnabledTooltip": return "Turn this off to hide the mirror while this profile is selected.";
                case "ProfileAssetEditorPcOnly": return "PC only";
                case "ProfileAssetEditorPcOnlyTooltip": return "Quest / Android / iOS will skip this profile.";
                case "ProfileAssetEditorSectionAppearance": return "Appearance";
                case "ProfileAssetEditorTransparency": return "Transparency";
                case "ProfileAssetEditorTransparencyTooltip": return "0 is opaque, 1 is transparent. Around 0.5 is a good start for transparent mirrors.";
                case "ProfileAssetEditorBaseMaterial": return "Base Material";
                case "ProfileAssetEditorBaseMaterialTooltip": return "The source Material used when generated profile Materials are created.";
                case "ProfileAssetEditorIconSprite": return "UI icon image";
                case "ProfileAssetEditorIconSpriteTooltip": return "A white line Sprite shown in the switch UI. Usually use the included standard icon.";
                case "ProfileAssetEditorIconColor": return "UI icon color";
                case "ProfileAssetEditorIconColorTooltip": return "The color applied to the white line icon on EzMirror Image.color.";
                case "ProfileAssetEditorIconPreview": return "Icon color preview";
                case "ProfileAssetEditorSectionMirrorQuality": return "Mirror quality";
                case "ProfileAssetEditorReflectLayers": return "Reflected layers";
                case "ProfileAssetEditorReflectLayersTooltip": return "Choose which Layers the mirror reflects. The default is usually fine.";
                case "ProfileAssetEditorDisablePixelLights": return "Disable Pixel Lights";
                case "ProfileAssetEditorDisablePixelLightsTooltip": return "Disables expensive Pixel Lights inside the mirror.";
                case "ProfileAssetEditorTurnOffMirrorOcclusion": return "Disable Mirror Occlusion";
                case "ProfileAssetEditorTurnOffMirrorOcclusionTooltip": return "Usually leave this enabled as-is.";
                case "ProfileAssetEditorSectionBackground": return "Background";
                case "ProfileAssetEditorCameraClearFlags": return "Background clear mode";
                case "ProfileAssetEditorCameraClearFlagsTooltip": return "Use Solid Color when an LQ mirror should clear the background.";
                case "ProfileAssetEditorCustomSkybox": return "Skybox Material";
                case "ProfileAssetEditorCustomSkyboxTooltip": return "Set only when this profile needs a custom Skybox.";
                case "ProfileAssetEditorCustomClearColor": return "Background color";
                case "ProfileAssetEditorCustomClearColorTooltip": return "Solid Color background color. Set Alpha to 0 for transparency.";
                case "ProfileAssetEditorHideBackground": return "Make background transparent";
                case "ProfileAssetEditorHideBackgroundTooltip": return "Enable this when the mirror Material should also hide the background.";
                case "ProfileAssetEditorLqBackgroundHelp": return "For LQ mirrors, combine this with the background clearing sphere to reduce skybox and world background reflections.";
                case "HealthCheckTitle": return "Health Check";
                case "HealthBrokenReferences": return "Broken References";
                case "HealthBrokenReferencesHint": return "Run basic setup or assign missing references.";
                case "HealthMissingGeneratedMaterials": return "Missing Generated Materials";
                case "HealthMissingGeneratedMaterialsHint": return "Regenerate profile materials at stable paths.";
                case "HealthDuplicateSaveKey": return "Duplicate Save Key";
                case "HealthDuplicateSaveKeyHint": return "Use a unique save key for each EzMirror when local save is enabled.";
                case "HealthNeedsSetup": return "Needs Setup";
                case "HealthNeedsSetupHint": return "Run setup and check optional input/profile settings.";
                case "HealthReady": return "Ready";
                case "HealthReadyHint": return "No critical setup issues were found.";
                case "HealthValidateSelected": return "Validate Selected";
                case "HealthRepairSafe": return "Repair Safe Issues";
                case "HealthRegenerateMaterials": return "Regenerate Materials";
                case "HealthGeneratePersistKey": return "Generate Persist Key";
                case "HealthOpenReadme": return "Open README";
                case "DeveloperHealthActions": return "Setup Check Actions";
                case "DeveloperHealthActionsHelp": return "Maintenance actions such as opening the README, generating a save key, validation, safe repair, and regenerating materials. Use them only when needed during normal setup.";
                case "SwitchAnimatorBeginnerTitle": return "3D switch model";
                case "SwitchAnimatorBeginnerHelp": return "Automatically drives the 3D switch press motion and lamp display from the current profile. Usually leave this on.";
                case "UseSwitchAnimatorLabel": return "Animate the 3D switch";
                case "SwitchAnimatorStatusMultiEdit": return "When multiple objects are selected, check each 3D switch state individually.";
                case "SwitchAnimatorStatusDisabled": return "3D switch animation is off.";
                case "SwitchAnimatorStatusMissing": return "The 3D switch Animator is not assigned. It can be repaired automatically.";
                case "SwitchAnimatorStatusNoController": return "The Animator Controller is not assigned. It can be repaired automatically.";
                case "SwitchAnimatorStatusInvalidParameters": return "Some Animator parameters are missing. Check them in Developer options.";
                case "SwitchAnimatorStatusReady": return "The 3D switch can follow the current profile and input.";
                case "RepairSwitchAnimatorButton": return "Auto-repair 3D switch";
                case "SelectSwitchAnimatorButton": return "Select 3D switch";
                case "DeveloperSwitchAnimator": return "3D Switch Animator";
                case "DeveloperSwitchAnimatorHelp": return "Advanced settings for the 3D switch. Step 2 auto-repair is enough in most cases. Adjust these only when using a custom Animator Controller.";
                case "ReferenceSwitchAnimator": return "3D Switch Animator";
                case "SwitchAnimatorProfileIndexParameter": return "Profile index parameter";
                case "SwitchAnimatorStateParameter": return "State parameter";
                case "SwitchAnimatorPressParameter": return "Press parameter";
                case "SwitchAnimatorCanSetProfileIndex": return "Can send profile index";
                case "SwitchAnimatorCanSetState": return "Can send state";
                case "SwitchAnimatorCanSetPress": return "Can send press";
                case "ValidateSwitchAnimatorButton": return "Validate Animator settings";
                case "ResetSwitchAnimatorDefaultsButton": return "Reset and repair defaults";

                default: return fallback;
            }
        }

        private static string GetKorean(string key, string fallback)
        {
            switch (key)
            {
                case "Language": return "언어";
                case "HeroTitle": return "EzMirror 간단 설정";
                case "HeroDescription": return "하나의 Mirror에서 Off / HQ / 투명 / LQ 프로필을 전환합니다. 보통은 첫 설정 버튼만 누르면 기본 설정이 끝납니다.";
                case "OneClickTitle": return "먼저 누르기";
                case "OneClickDescription": return "자식 Mirror / Trigger / Toggle을 찾고 Off, LQ 배경 제거, PC / Quest 기본값을 정리합니다.";
                case "AutoSetupButton": return "기본 설정 자동 실행";
                case "StatusHeader": return "현재 상태";
                case "StatusOk": return "[OK]";
                case "StatusNeedCheck": return "[확인 필요]";
                case "StatusReadyText": return "설정됨";
                case "ExpandAllSteps": return "모든 STEP 펼치기";
                case "CollapseAllSteps": return "모든 STEP 닫기";
                case "Step1Title": return "미러 크기와 위치 조정";
                case "Step2Title": return "전환 방식과 스위치 위치 조정";
                case "Step3Title": return "계속 표시할 범위 설정";
                case "Step4Title": return "페이드 거리 설정";
                case "Step5Title": return "프로필 확인/설정(선택)";
                case "Step6Title": return "저장 설정(선택)";
                case "Step7Title": return "효과음/진동 설정(선택)";
                case "InputUgui": return "UI 버튼으로 전환(레이저/클릭)";
                case "InputInteract": return "Use 버튼으로 전환";
                case "InputContact": return "손 접촉으로 전환";
                case "InteractAdvancedFoldout": return "Use 상세 설정";
                case "ContactAdvancedFoldout": return "접촉 판정 상세 설정";
                case "InteractDetailsTitle": return "Use 버튼 설정";
                case "InteractDetailsHelp": return "가까이서 Use할 때 표시되는 문구와 Use 가능한 거리를 설정합니다. 보통 기본값 그대로 두면 됩니다.";
                case "InteractTextLabel": return "Use 시 표시 문구";
                case "InteractProximityLabel": return "Use 가능 거리";
                case "ContactDetailsTitle": return "손 Contact 설정";
                case "ContactDetailsHelp": return "어떤 Contact 태그에 반응할지 설정합니다. 보통 Avatar의 손/손가락 태그 기본값 그대로 두면 됩니다.";
                case "ContactAvatarOnlyHelp": return "송신원은 Avatar Contact Sender만 받는 설정을 권장합니다. 여기서는 보통 World Contact를 지원하지 않습니다.";
                case "ContactShapeSizeLabel": return "판정 크기";
                case "ContactContentTypesLabel": return "반응할 송신원";
                case "ContactTagsLabel": return "반응할 Contact 태그";
                case "ContactAllowSelfLabel": return "자신의 Contact에 반응";
                case "ContactAllowOthersLabel": return "다른 사람의 Contact에 반응";
                case "ContactLocalOnlyLabel": return "로컬에서만 판정";
                case "InputDetailsMultiEditHelp": return "상세 설정은 오브젝트별로 하나씩 편집해 주세요. 전환 방식 ON/OFF는 여러 선택 상태에서도 변경할 수 있습니다.";
                case "MissingInteractProxy": return "Use 위치가 설정되지 않았습니다. 개발자 옵션에서 복구할 수 있습니다.";
                case "MissingContactReceiver": return "접촉 판정이 설정되지 않았습니다. 개발자 옵션에서 복구할 수 있습니다.";
                case "RepairInputButton": return "전환 입력 자동 복구";
                case "SelectRendererButton": return "미러 면 선택";
                case "SelectTriggerButton": return "표시 범위 상자 선택";
                case "SelectToggleCanvasButton": return "스위치 UI 선택";
                case "SelectInputHitboxButton": return "Use/접촉 판정 선택";
                case "SelectInteractInputButton": return "Use 위치 선택";
                case "SelectContactInputButton": return "접촉 판정 선택";
                case "PersistMixedHelp": return "여러 EzMirror 선택 중에는 로컬 저장 ON/OFF만 함께 변경할 수 있습니다. 저장 키 상세는 하나씩 확인하세요.";
                case "PersistDisabledHelp": return "OFF 상태라면 저장 키는 필요 없습니다.";
                case "PersistKeyStatusLabel": return "저장 키";
                case "PersistKeyMissing": return "미작성";
                case "PersistKeyConfigured": return "자동 설정됨";
                case "PersistKeyMissingHelp": return "로컬 저장을 사용하려면 저장 키가 필요합니다. 보통 자동 생성으로 충분합니다.";
                case "CreatePersistKeyButton": return "저장 키 자동 생성";
                case "PersistAdvancedFoldout": return "저장 키 상세 설정";
                case "SfxAdvancedFoldout": return "효과음 상세 설정";
                case "HapticsAdvancedFoldout": return "진동 상세 설정";
                case "DeveloperOptions": return "개발자 옵션";
                case "DeveloperDescription": return "일반적으로 건드리지 않는 설정입니다. 생성 Material은 EzMirror마다 전용화되어 Prefab 복사 후에도 공유되지 않습니다.";
                case "DeveloperReferences": return "기본 참조";
                case "DeveloperMethods": return "다른 기믹에서 호출할 공개 메서드";
                case "DeveloperProfileMaintenance": return "프로필 유지보수";
                case "DeveloperProfileMaintenanceHelp": return "프로필 에셋 생성이나 내부 배열 정합 등 일반 설치에서는 필요 없는 유지보수 작업입니다.";
                case "ProfileMaterialGenerationHeader": return "생성 Material";
                case "ProfileMaterialGenerationHelp": return "프로필 이름과 화질 설정을 확인한 뒤 여기서 Material을 자동 생성/갱신할 수 있습니다. 비어 있거나 Missing인 Material도 다시 생성합니다.";
                case "ContextualFixHelp": return "부족한 설정만 여기서 안전하게 복구할 수 있습니다. 소재 정리나 강제 재생성은 개발자 옵션에 있습니다.";
                case "FixMissingInputButton": return "전환 입력 부족분 복구";
                case "FixProfileArraysButton": return "표시 패턴 설정 맞추기";
                case "AutoAssignAudioSourceButton": return "AudioSource 찾아 설정";
                case "RemoveProfileObjectButton": return "목록에서 제거";
                case "DeveloperDangerZone": return "위험 작업";
                case "DeveloperDangerZoneHelp": return "생성물 정리나 강제 재생성처럼 일반적으로 필요 없고 영향 범위가 큰 작업입니다. 대상을 확인한 뒤 실행하세요.";
                case "SetupMissingRefs": return "주요 참조가 없습니다. 자동 설정 버튼을 누르면 자식 오브젝트에서 찾습니다.";
                case "SetupMissingProfiles": return "Profile 0(Off)과 일반 프로필이 없습니다. HQ / 투명 / LQ 프로필을 추가하세요.";
                case "SetupMissingMobile": return "일반 프로필이 모두 PC 전용입니다. Quest / Android / iOS용으로 PC 전용이 아닌 프로필을 하나 남겨 주세요.";
                case "SetupReady": return "기본 설정이 끝났습니다. 페이드 거리와 Trigger 경계는 Scene Gizmo로 확인하세요.";
                case "StatusReferencesTitle": return "미러 / 표시 Renderer / 표시 범위";
                case "StatusReferencesHint": return "미설정이면 기본 설정 자동 실행을 눌러 주세요.";
                case "StatusProfilesTitle": return "프로필 목록";
                case "StatusProfilesHint": return "Off 고정 Profile 0과 일반 프로필이 최소 1개 필요합니다.";
                case "StatusMobileTitle": return "Quest / Android / iOS용 프로필";
                case "StatusMobileHint": return "PC 전용이 아닌 일반 프로필을 최소 1개 남기면 안전합니다.";
                case "StatusLqBackgroundTitle": return "LQ 배경 제거 구체";
                case "StatusLqBackgroundHint": return "LQ 프로필에서 Skybox를 숨기고 싶을 때 사용합니다.";
                case "StatusToggleTitle": return "전환 UI 연결";
                case "StatusToggleHint": return "Toggle이 있으면 본체의 SendCustomEvent(SelectNextFromUgui)에 연결합니다.";
                case "StatusInputTitle": return "Interact / Contact 입력";
                case "StatusInputHint": return "SwitchUI / InteractInput / ContactInput이 없으면 전환 입력 자동 복구를 눌러 주세요.";
                case "Step1Help": return "Scene 뷰에서 미러 면을 선택한 뒤 위치, 회전, 크기를 조정합니다.";
                case "Step2Help": return "전환 방식은 조합해서 사용할 수 있습니다. 레이저/클릭 UI, 가까이서 Use, 손 접촉을 선택할 수 있습니다.";
                case "Step2PositionHelp": return "스위치 UI 위치를 기준으로 UI 버튼, Use 위치, 접촉 판정을 함께 조정합니다.";
                case "Step3RendererHint": return "이 상자 안에 들어가면 미러가 표시됩니다. Scene 뷰에서 상자 크기를 조정하세요.";
                case "Step3GizmoHelp": return "Scene 뷰에서 본체 또는 자식 오브젝트를 선택하면 표시 범위 테두리가 Gizmo로 표시됩니다.";
                case "Step5Help": return "기본값은 HQ -> 반투명 -> LQ 미러입니다. PC 이외는 LQ만 사용합니다.";
                case "MissingRenderer": return "미러 면이 설정되지 않았습니다. 먼저 기본 설정 자동 실행을 하거나 개발자 옵션에서 설정해 주세요.";
                case "MissingTrigger": return "표시 범위 상자가 설정되지 않았습니다. 먼저 기본 설정 자동 실행을 하거나 개발자 옵션에서 설정해 주세요.";
                case "MissingToggle": return "전환 UI Toggle이 설정되지 않았습니다. 먼저 기본 설정 자동 실행을 하거나 개발자 옵션에서 설정해 주세요.";
                case "MissingToggleCanvas": return "ToggleUI 부모에서 Canvas를 찾을 수 없습니다.";
                case "MissingSwitchInput": return "Use 위치가 설정되지 않았습니다. 먼저 기본 설정 자동 실행을 하거나 개발자 옵션에서 복구해 주세요.";
                case "NotSet": return "미설정";
                case "ProfileListHelp": return "Profile 0은 Off 고정입니다. Profile 1부터 순서대로 전환됩니다. 보통은 이름, 표시 여부, 투명도, 아이콘만 확인하면 됩니다.";
                case "AddProfileButton": return "프로필 추가";
                case "AlignProfileArraysButton": return "프로필 관련 배열 수 맞추기";
                case "ProfileAssetHeader": return "프로필 에셋";
                case "ProfileAssetHelp": return "Scene에 의존하지 않는 프로필 설정만 에셋화합니다. ON/OFF 오브젝트나 아이콘 표시 오브젝트 같은 Scene 참조는 이 EzMirror에 남깁니다.";
                case "GenerateDefaultProfileAssetsButton": return "기본 프로필 에셋 생성";
                case "ProfileAssetSingleTargetOnly": return "프로필 에셋 할당과 생성은 EzMirror를 하나만 선택했을 때 사용할 수 있습니다.";
                case "ProfileAssetScopeHelp": return "프로필 에셋에는 프로필명, 화질, 투명도, PC 전용, 기반 Material, 아이콘 이미지 같은 Scene 비의존 설정만 저장합니다.";
                case "ProfileAssetApplyExplicitHelp": return "에셋을 할당하는 것만으로 현재 설정을 덮어쓰지 않습니다. 내용을 가져오고 싶을 때만 에셋 설정 반영을 누르세요.";
                case "ApplyProfileAssetButton": return "에셋 설정 반영";
                case "CreateProfileAssetButton": return "이 프로필에서 에셋 생성";
                case "CannotDeleteButton": return "삭제 불가";
                case "DeleteButton": return "삭제";
                case "LockedLabel": return "고정";
                case "OffProfileHelp": return "Off 프로필은 미러를 표시하지 않는 고정 상태입니다.";
                case "GroupOffVisual": return "설정 그룹: Off일 때의 모습";
                case "GroupOffObjects": return "설정 그룹: Off일 때만 전환하는 오브젝트";
                case "GroupProfileAsset": return "설정 그룹: 프로필 에셋(공유 설정)";
                case "GroupDisplay": return "설정 그룹: 표시";
                case "GroupMirrorQuality": return "설정 그룹: 미러 화질";
                case "GroupIcon": return "설정 그룹: UI 아이콘";
                case "GroupObjects": return "설정 그룹: 프로필 전용 오브젝트";
                case "MirrorEnabledLabel": return "미러 표시";
                case "TransparencyLabel": return "투명도";
                case "HideBackgroundLabel": return "배경 투명화";
                case "PcOnlyLabel": return "PC 전용";
                case "ProfileNameLabel": return "프로필 이름";
                case "ProfileNameFallbackHelp": return "빈칸이므로 표시 이름은 \"{0}\"로 처리됩니다.";
                case "DefaultProfileLabel": return "초기 상태 / Reset 대상";
                case "DefaultProfileCurrent": return "이 프로필입니다";
                case "DefaultProfileOther": return "다른 프로필입니다";
                case "SetDefaultProfileButton": return "이 프로필을 초기 상태로 사용";
                case "DefaultPcOnlyWarning": return "이 프로필은 초기 상태이지만 PC 전용입니다. Quest / Android / iOS에서는 Profile 0(Off)으로 돌아갑니다.";
                case "HideBackgroundHelp": return "배경 투명화는 프로필 적용 시 Material의 Hide Background를 켭니다.";
                case "OffProfileTitle": return "Profile 0(Off 고정) - {0}";
                case "ProfileTitlePrefix": return "Profile {0}";
                case "MaterialMissingSuffix": return " - Material 미생성";
                case "MaterialGeneratedSuffix": return " - Material 자동 생성됨";
                case "FallbackHqMirror": return "HQ 미러";
                case "FallbackTransparentMirror": return "반투명 미러";
                case "FallbackLqMirror": return "LQ 미러";
                case "GenerateMaterialButton": return "Material 자동 생성 / 외곽에 맞춰 업데이트";
                case "GeneratedMaterialCleanupHelp": return "참조되지 않는 생성 Material만 미리 확인한 뒤 정리합니다. 열린 Scene / Prefab 및 프로젝트 의존성에서 참조 중인 Material은 제외됩니다.";
                case "PreviewUnusedGeneratedMaterialsButton": return "미참조 생성 Material 확인";
                case "UnusedGeneratedMaterialCountLabel": return "정리 후보 수";
                case "DeleteUnusedGeneratedMaterialsButton": return "확인한 후보를 휴지통으로 이동";
                case "DeleteUnusedGeneratedMaterialsDialogTitle": return "미참조 생성 Material 정리";
                case "DeleteUnusedGeneratedMaterialsDialogMessage": return "미참조 생성 Material {0}개를 휴지통으로 이동합니다. 실행 전 참조 상태를 다시 확인합니다.";
                case "DeleteUnusedGeneratedMaterialsDialogOk": return "휴지통으로 이동";
                case "CancelButton": return "취소";
                case "DeveloperReferencesHelp": return "일반 STEP에서는 숨긴 내부 참조입니다. 자동 설정으로 해결되지 않는 특수 구성일 때만 수동 조정하세요.";
                case "CopyButton": return "복사";
                case "BaseMaterialLabel": return "기반 Material";
                case "GeneratedMaterialLabel": return "생성 Material";
                case "MirrorQualityHeader": return "미러 화질 설정";
                case "ProfileIconHeader": return "프로필 아이콘";
                case "IconObjectLabel": return "이전 아이콘 표시 오브젝트(호환)";
                case "LegacyIconFoldout": return "이전 아이콘 호환 설정";
                case "LegacyIconHelp": return "이전의 여러 오브젝트 방식 아이콘 참조입니다. 필요한 경우에만 남기고, 보통은 단일 Image 방식으로 이전하세요.";
                case "LegacyIconMigrateButton": return "이 아이콘으로 이전";
                case "LegacyIconClearButton": return "이전 참조만 해제";
                case "IconPreviewMixed": return "여러 EzMirror를 선택한 동안에는 미리보기를 생략합니다.";
                case "IconPreviewMissing": return "아이콘이 설정되지 않았고 기본 아이콘도 찾을 수 없습니다.";
                case "IconCardOffTitle": return "OFF 시 UI 아이콘";
                case "IconCardProfileTitle": return "전환 UI 아이콘";
                case "ProfileAdvancedFoldout": return "프로필 상세 설정";
                case "IconColorLabel": return "아이콘 색";
                case "IconSourceProfileAsset": return "프로필 에셋에 저장됩니다.";
                case "IconSourceOff": return "OFF 아이콘은 이 EzMirror에만 저장됩니다.";
                case "IconSourceLocal": return "이 EzMirror 전용 아이콘으로 저장됩니다.";
                case "IconSourceLegacyLocal": return "이전 방식의 개별 아이콘을 표시 중입니다. 변경하면 프로필 에셋에 저장됩니다.";
                case "IconMultiSelectDisabled": return "일반 프로필 아이콘은 프로필 에셋에 저장됩니다. EzMirror를 하나만 선택해서 수정하세요.";
                case "IconUsingDefault": return "공통 기본 선 아이콘 사용 중";
                case "IconDefaultBadge": return "기본";
                case "IconSelectPlaceholder": return "선택";
                case "IconResetButton": return "기본으로";
                case "IconSelectAssetButton": return "에셋 선택";
                case "LocalOnlyMirrorHelp": return "미러 전환 상태는 사용자마다 독립적입니다. 같은 사용자가 재입장했을 때 상태를 복원하고 싶을 때만 로컬 저장을 켜세요.";
                case "LocalSaveLabel": return "로컬 저장";
                case "EnableClickSoundLabel": return "효과음 사용";
                case "EnableHapticsLabel": return "컨트롤러 진동 사용";
                case "ProfileAssetEditorTitle": return "EzMirror 프로필 에셋";
                case "ProfileAssetEditorDescription": return "여러 EzMirror에서 공유할 수 있는 설정 파일입니다. 프로필 이름, 화질, 투명도처럼 Scene에 의존하지 않는 설정만 저장합니다. Scene 안의 오브젝트는 저장하지 않습니다.";
                case "ProfileAssetEditorSectionBasic": return "기본";
                case "ProfileAssetEditorProfileName": return "프로필 이름";
                case "ProfileAssetEditorProfileNameTooltip": return "예: HQ 미러, 반투명 미러, LQ 미러";
                case "ProfileAssetEditorIsDefault": return "초기 상태로 사용";
                case "ProfileAssetEditorIsDefaultTooltip": return "Reset 또는 월드 시작 시 이 프로필을 사용할 경우 켭니다.";
                case "ProfileAssetEditorMirrorEnabled": return "미러 표시";
                case "ProfileAssetEditorMirrorEnabledTooltip": return "끄면 이 프로필 선택 중에는 미러 본체를 숨깁니다.";
                case "ProfileAssetEditorPcOnly": return "PC 전용";
                case "ProfileAssetEditorPcOnlyTooltip": return "Quest / Android / iOS에서는 이 프로필을 건너뜁니다.";
                case "ProfileAssetEditorSectionAppearance": return "외형";
                case "ProfileAssetEditorTransparency": return "투명도";
                case "ProfileAssetEditorTransparencyTooltip": return "0은 불투명, 1은 투명입니다. 반투명 미러는 0.5 전후가 기준입니다.";
                case "ProfileAssetEditorBaseMaterial": return "기반 Material";
                case "ProfileAssetEditorBaseMaterialTooltip": return "프로필용 Material을 자동 생성할 때 원본이 되는 Material입니다.";
                case "ProfileAssetEditorIconSprite": return "UI 아이콘 이미지";
                case "ProfileAssetEditorIconSpriteTooltip": return "전환 UI에 표시하는 흰 선 Sprite입니다. 보통 포함된 표준 아이콘 1장을 사용합니다.";
                case "ProfileAssetEditorIconColor": return "UI 아이콘 색";
                case "ProfileAssetEditorIconColorTooltip": return "흰 선 아이콘에 적용할 색입니다. EzMirror의 Image.color에 반영됩니다.";
                case "ProfileAssetEditorIconPreview": return "아이콘 색 미리보기";
                case "ProfileAssetEditorSectionMirrorQuality": return "미러 화질";
                case "ProfileAssetEditorReflectLayers": return "비출 레이어";
                case "ProfileAssetEditorReflectLayersTooltip": return "미러에 비출 Layer를 선택합니다. 보통 기본값 그대로 두면 됩니다.";
                case "ProfileAssetEditorDisablePixelLights": return "Pixel Light 비활성화";
                case "ProfileAssetEditorDisablePixelLightsTooltip": return "무거워지기 쉬운 Pixel Light를 미러 안에서 비활성화합니다.";
                case "ProfileAssetEditorTurnOffMirrorOcclusion": return "Mirror Occlusion 비활성화";
                case "ProfileAssetEditorTurnOffMirrorOcclusionTooltip": return "보통 기본값 그대로 두면 됩니다.";
                case "ProfileAssetEditorSectionBackground": return "배경";
                case "ProfileAssetEditorCameraClearFlags": return "배경 지우기 방식";
                case "ProfileAssetEditorCameraClearFlagsTooltip": return "LQ 미러에서 배경을 지우고 싶을 때 Solid Color를 사용합니다.";
                case "ProfileAssetEditorCustomSkybox": return "Skybox Material";
                case "ProfileAssetEditorCustomSkyboxTooltip": return "개별 Skybox를 사용할 때만 설정합니다.";
                case "ProfileAssetEditorCustomClearColor": return "배경색";
                case "ProfileAssetEditorCustomClearColorTooltip": return "Solid Color의 색입니다. 배경을 투명하게 하려면 Alpha를 0으로 합니다.";
                case "ProfileAssetEditorHideBackground": return "배경 투명화";
                case "ProfileAssetEditorHideBackgroundTooltip": return "미러용 Material에서도 배경을 투명화할 때 켭니다.";
                case "ProfileAssetEditorLqBackgroundHelp": return "LQ 미러에서는 배경 제거 구체와 조합해 하늘이나 뒤쪽 월드가 비치는 것을 줄입니다.";
                case "HealthCheckTitle": return "설정 점검";
                case "HealthBrokenReferences": return "참조가 끊어졌습니다";
                case "HealthBrokenReferencesHint": return "기본 설정을 실행하거나 누락된 참조를 지정하세요.";
                case "HealthMissingGeneratedMaterials": return "생성 Material이 부족합니다";
                case "HealthMissingGeneratedMaterialsHint": return "안정 경로에 프로필 Material을 다시 생성하세요.";
                case "HealthDuplicateSaveKey": return "저장 키가 중복되었습니다";
                case "HealthDuplicateSaveKeyHint": return "로컬 저장을 사용할 때는 EzMirror마다 고유한 저장 키를 사용하세요.";
                case "HealthNeedsSetup": return "설정 확인 필요";
                case "HealthNeedsSetupHint": return "기본 설정과 선택 입력/프로필 설정을 확인하세요.";
                case "HealthReady": return "문제 없음";
                case "HealthReadyHint": return "중요한 설정 문제는 발견되지 않았습니다.";
                case "HealthValidateSelected": return "선택 항목 검증";
                case "HealthRepairSafe": return "안전하게 복구";
                case "HealthRegenerateMaterials": return "머티리얼 다시 생성";
                case "HealthGeneratePersistKey": return "저장 키 생성";
                case "HealthOpenReadme": return "README 열기";
                case "DeveloperHealthActions": return "설정 점검 작업";
                case "DeveloperHealthActionsHelp": return "README 열기, 저장 키 생성, 검증, 안전 복구, 머티리얼 다시 생성 등의 유지보수용 작업입니다. 일반 설치 중에는 필요할 때만 사용하세요.";
                case "SwitchAnimatorBeginnerTitle": return "3D 스위치 모델";
                case "SwitchAnimatorBeginnerHelp": return "현재 프로필에 맞춰 3D 스위치의 눌림 동작과 램프 표시를 자동으로 움직입니다. 보통은 켜 둔 상태로 충분합니다.";
                case "UseSwitchAnimatorLabel": return "3D 스위치를 애니메이션하기";
                case "SwitchAnimatorStatusMultiEdit": return "여러 개를 선택한 경우 각 3D 스위치 상태를 개별적으로 확인하세요.";
                case "SwitchAnimatorStatusDisabled": return "3D 스위치 애니메이션이 꺼져 있습니다.";
                case "SwitchAnimatorStatusMissing": return "3D 스위치 Animator가 설정되지 않았습니다. 자동 복구할 수 있습니다.";
                case "SwitchAnimatorStatusNoController": return "Animator Controller가 설정되지 않았습니다. 자동 복구할 수 있습니다.";
                case "SwitchAnimatorStatusInvalidParameters": return "Animator 파라미터가 일부 부족합니다. 개발자 옵션에서 확인할 수 있습니다.";
                case "SwitchAnimatorStatusReady": return "3D 스위치가 현재 프로필과 입력을 따라갈 수 있습니다.";
                case "RepairSwitchAnimatorButton": return "3D 스위치 자동 복구";
                case "SelectSwitchAnimatorButton": return "3D 스위치 선택";
                case "DeveloperSwitchAnimator": return "3D 스위치 Animator";
                case "DeveloperSwitchAnimatorHelp": return "3D 스위치용 고급 설정입니다. 보통은 Step2의 자동 복구만으로 충분합니다. 직접 만든 Animator Controller를 쓸 때만 조정하세요.";
                case "ReferenceSwitchAnimator": return "3D 스위치 Animator";
                case "SwitchAnimatorProfileIndexParameter": return "프로필 번호 파라미터";
                case "SwitchAnimatorStateParameter": return "상태 파라미터";
                case "SwitchAnimatorPressParameter": return "눌림 파라미터";
                case "SwitchAnimatorCanSetProfileIndex": return "프로필 번호를 보낼 수 있음";
                case "SwitchAnimatorCanSetState": return "상태를 보낼 수 있음";
                case "SwitchAnimatorCanSetPress": return "눌림을 보낼 수 있음";
                case "ValidateSwitchAnimatorButton": return "Animator 설정 검증";
                case "ResetSwitchAnimatorDefaultsButton": return "기본값으로 복구";

                default: return fallback;
            }
        }

        private static string GetChineseSimplified(string key, string fallback)
        {
            switch (key)
            {
                case "Language": return "语言";
                case "HeroTitle": return "EzMirror 简易设置";
                case "HeroDescription": return "在一个 Mirror 上切换 Off / HQ / 透明 / LQ 等配置。通常先按第一个设置按钮即可完成基础设置。";
                case "OneClickTitle": return "先按这里";
                case "OneClickDescription": return "查找子物体中的 Mirror / Trigger / Toggle，并整理 Off、LQ 背景清除、PC / Quest 默认值。";
                case "AutoSetupButton": return "自动执行基础设置";
                case "StatusHeader": return "当前状态";
                case "StatusOk": return "[OK]";
                case "StatusNeedCheck": return "[需确认]";
                case "StatusReadyText": return "已设置";
                case "ExpandAllSteps": return "展开全部 STEP";
                case "CollapseAllSteps": return "关闭全部 STEP";
                case "Step1Title": return "调整镜子大小和位置";
                case "Step2Title": return "调整切换方式和开关位置";
                case "Step3Title": return "设置持续显示范围";
                case "Step4Title": return "淡出距离设置";
                case "Step5Title": return "确认/编辑配置（可选）";
                case "Step6Title": return "保存设置（可选）";
                case "Step7Title": return "音效和震动设置（可选）";
                case "InputUgui": return "用 UI 按钮切换（激光/点击）";
                case "InputInteract": return "用 Use 按钮切换";
                case "InputContact": return "用手部接触切换";
                case "InteractAdvancedFoldout": return "Use 详细设置";
                case "ContactAdvancedFoldout": return "接触判定详细设置";
                case "InteractDetailsTitle": return "Use 按钮设置";
                case "InteractDetailsHelp": return "设置靠近并 Use 时显示的文字，以及可 Use 的距离。通常保持默认即可。";
                case "InteractTextLabel": return "Use 时显示的文字";
                case "InteractProximityLabel": return "Use 距离";
                case "ContactDetailsTitle": return "手部 Contact 设置";
                case "ContactDetailsHelp": return "设置哪些 Contact 标签会触发输入。通常保持默认的 Avatar 手部/手指标签即可。";
                case "ContactAvatarOnlyHelp": return "建议只接收 Avatar Contact Sender。这里通常不支持 World Contact。";
                case "ContactShapeSizeLabel": return "判定尺寸";
                case "ContactContentTypesLabel": return "响应的发送源";
                case "ContactTagsLabel": return "响应的 Contact 标签";
                case "ContactAllowSelfLabel": return "响应自己的 Contact";
                case "ContactAllowOthersLabel": return "响应他人的 Contact";
                case "ContactLocalOnlyLabel": return "仅本地判定";
                case "InputDetailsMultiEditHelp": return "详细设置请逐个对象编辑。切换方式的开关仍可在多选状态下统一修改。";
                case "MissingInteractProxy": return "未设置 Use 位置。可在开发者选项中修复。";
                case "MissingContactReceiver": return "未设置接触判定。可在开发者选项中修复。";
                case "RepairInputButton": return "自动修复切换输入";
                case "SelectRendererButton": return "选择镜面";
                case "SelectTriggerButton": return "选择显示范围箱";
                case "SelectToggleCanvasButton": return "选择开关 UI";
                case "SelectInputHitboxButton": return "选择 Use/接触判定";
                case "SelectInteractInputButton": return "选择 Use 位置";
                case "SelectContactInputButton": return "选择接触判定";
                case "PersistMixedHelp": return "选择多个 EzMirror 时，只能统一修改本地保存开关。保存键详情请逐个确认。";
                case "PersistDisabledHelp": return "关闭时不需要保存键。";
                case "PersistKeyStatusLabel": return "保存键";
                case "PersistKeyMissing": return "未创建";
                case "PersistKeyConfigured": return "已自动设置";
                case "PersistKeyMissingHelp": return "使用本地保存需要保存键。通常自动创建即可。";
                case "CreatePersistKeyButton": return "自动创建保存键";
                case "PersistAdvancedFoldout": return "保存键详细设置";
                case "SfxAdvancedFoldout": return "音效详细设置";
                case "HapticsAdvancedFoldout": return "震动详细设置";
                case "DeveloperOptions": return "开发者选项";
                case "DeveloperDescription": return "通常不需要修改。生成的 Material 会按 EzMirror 专用化，避免复制 Prefab 后与其他 Prefab 共用。";
                case "DeveloperReferences": return "基础引用";
                case "DeveloperMethods": return "供其他机关调用的公开方法";
                case "DeveloperProfileMaintenance": return "配置维护";
                case "DeveloperProfileMaintenanceHelp": return "配置资产生成、内部数组对齐等通常安装时不需要的维护操作。";
                case "ProfileMaterialGenerationHeader": return "生成 Material";
                case "ProfileMaterialGenerationHelp": return "确认配置名称和画质设置后，可在这里自动生成或更新 Material。空引用或 Missing 的 Material 也会重新生成。";
                case "ContextualFixHelp": return "这里只会安全修复缺少的设置。素材清理和强制重新生成在开发者选项中。";
                case "FixMissingInputButton": return "修复缺少的切换输入";
                case "FixProfileArraysButton": return "对齐显示模式设置";
                case "AutoAssignAudioSourceButton": return "查找并设置 AudioSource";
                case "RemoveProfileObjectButton": return "从列表移除";
                case "DeveloperDangerZone": return "危险操作";
                case "DeveloperDangerZoneHelp": return "清理生成物、强制重新生成等通常不需要且影响较大的维护操作。请确认对象后再执行。";
                case "SetupMissingRefs": return "缺少主要引用。按自动设置按钮可从子物体中查找。";
                case "SetupMissingProfiles": return "缺少 Profile 0（Off）和普通配置。请添加 HQ / 透明 / LQ 等配置。";
                case "SetupMissingMobile": return "普通配置全部为 PC 专用。请至少保留一个非 PC 专用配置用于 Quest / Android / iOS。";
                case "SetupReady": return "基础设置已完成。请用 Scene Gizmo 确认淡出距离和 Trigger 边界。";
                case "StatusReferencesTitle": return "镜子 / 显示 Renderer / 显示范围";
                case "StatusReferencesHint": return "如果尚未设置，请按“自动执行基础设置”。";
                case "StatusProfilesTitle": return "配置列表";
                case "StatusProfilesHint": return "需要固定为 Off 的 Profile 0，以及至少一个普通配置。";
                case "StatusMobileTitle": return "Quest / Android / iOS 用配置";
                case "StatusMobileHint": return "请至少保留一个非 PC 专用的普通配置。";
                case "StatusLqBackgroundTitle": return "LQ 背景清除球";
                case "StatusLqBackgroundHint": return "用于在 LQ 配置中隐藏 Skybox。";
                case "StatusToggleTitle": return "切换 UI 连接";
                case "StatusToggleHint": return "如果有 Toggle，请连接到本体的 SendCustomEvent(SelectNextFromUgui)。";
                case "StatusInputTitle": return "Interact / Contact 输入";
                case "StatusInputHint": return "如果缺少 SwitchUI / InteractInput / ContactInput，请按“自动修复切换输入”。";
                case "Step1Help": return "在 Scene 视图中选择镜面，然后调整位置、旋转和大小。";
                case "Step2Help": return "切换方式可以组合使用：激光/点击 UI、靠近后 Use、手部触碰。";
                case "Step2PositionHelp": return "开关 UI 的位置会作为 UI 按钮、Use 位置和接触判定的基准。";
                case "Step3RendererHint": return "玩家进入这个箱子内时会显示镜子。请在 Scene 视图中调整箱子大小。";
                case "Step3GizmoHelp": return "在 Scene 视图中选择本体或子物体，即可显示显示范围边框 Gizmo。";
                case "Step5Help": return "默认顺序为 HQ -> 半透明 -> LQ 镜子。非 PC 平台仅使用 LQ。";
                case "MissingRenderer": return "镜面未设置。请先执行基础设置，或在开发者选项中指定。";
                case "MissingTrigger": return "显示范围箱未设置。请先执行基础设置，或在开发者选项中指定。";
                case "MissingToggle": return "切换 UI Toggle 未设置。请先执行基础设置，或在开发者选项中指定。";
                case "MissingToggleCanvas": return "ToggleUI 的父级中找不到 Canvas。";
                case "MissingSwitchInput": return "Use 位置未设置。请先执行基础设置，或在开发者选项中修复。";
                case "NotSet": return "未设置";
                case "ProfileListHelp": return "Profile 0 固定为 Off。从 Profile 1 开始依次切换。通常只需确认名称、显示、透明度和图标。";
                case "AddProfileButton": return "添加配置";
                case "AlignProfileArraysButton": return "对齐配置相关数组数量";
                case "ProfileAssetHeader": return "配置资产";
                case "ProfileAssetHelp": return "只把不依赖 Scene 的配置设置保存为资产。ON/OFF 物体、图标显示物体等 Scene 引用会保留在此 EzMirror 上。";
                case "GenerateDefaultProfileAssetsButton": return "生成默认配置资产";
                case "ProfileAssetSingleTargetOnly": return "只有选中一个 EzMirror 时，才能分配和创建配置资产。";
                case "ProfileAssetScopeHelp": return "配置资产只保存配置名、画质、透明度、PC 专用、基础 Material、图标图片等不依赖 Scene 的设置。";
                case "ProfileAssetApplyExplicitHelp": return "仅分配资产不会覆盖当前设置。只有想导入其内容时，才按“应用资产设置”。";
                case "ApplyProfileAssetButton": return "应用资产设置";
                case "CreateProfileAssetButton": return "从此配置创建资产";
                case "CannotDeleteButton": return "不可删除";
                case "DeleteButton": return "删除";
                case "LockedLabel": return "固定";
                case "OffProfileHelp": return "Off 配置是隐藏镜子的固定状态。";
                case "GroupOffVisual": return "设置组：Off 时的外观";
                case "GroupOffObjects": return "设置组：仅 Off 时切换的物体";
                case "GroupProfileAsset": return "设置组：配置资产（共享设置）";
                case "GroupDisplay": return "设置组：显示";
                case "GroupMirrorQuality": return "设置组：镜子画质";
                case "GroupIcon": return "设置组：UI 图标";
                case "GroupObjects": return "设置组：配置专用物体";
                case "MirrorEnabledLabel": return "显示镜子";
                case "TransparencyLabel": return "透明度";
                case "HideBackgroundLabel": return "背景透明化";
                case "PcOnlyLabel": return "仅 PC";
                case "ProfileNameLabel": return "配置名称";
                case "ProfileNameFallbackHelp": return "因为为空，显示名称会视为“{0}”。";
                case "DefaultProfileLabel": return "初始状态 / Reset 目标";
                case "DefaultProfileCurrent": return "此配置";
                case "DefaultProfileOther": return "其他配置";
                case "SetDefaultProfileButton": return "将此配置设为初始状态";
                case "DefaultPcOnlyWarning": return "此配置是初始状态但仅限 PC。Quest / Android / iOS 会回退到 Profile 0（Off）。";
                case "HideBackgroundHelp": return "背景透明化会在应用配置时打开 Material 的 Hide Background。";
                case "OffProfileTitle": return "Profile 0（固定 Off）- {0}";
                case "ProfileTitlePrefix": return "Profile {0}";
                case "MaterialMissingSuffix": return " - Material 未生成";
                case "MaterialGeneratedSuffix": return " - Material 已生成";
                case "FallbackHqMirror": return "HQ 镜子";
                case "FallbackTransparentMirror": return "半透明镜子";
                case "FallbackLqMirror": return "LQ 镜子";
                case "GenerateMaterialButton": return "自动生成 Material / 按外周更新";
                case "GeneratedMaterialCleanupHelp": return "可先预览再清理未引用的生成 Material。正在被打开的 Scene / Prefab 或项目依赖引用的 Material 会被排除。";
                case "PreviewUnusedGeneratedMaterialsButton": return "预览未引用生成 Material";
                case "UnusedGeneratedMaterialCountLabel": return "清理候选数";
                case "DeleteUnusedGeneratedMaterialsButton": return "将已确认候选移到回收站";
                case "DeleteUnusedGeneratedMaterialsDialogTitle": return "清理未引用生成 Material";
                case "DeleteUnusedGeneratedMaterialsDialogMessage": return "将 {0} 个未引用生成 Material 移到回收站。执行前会再次检查引用状态。";
                case "DeleteUnusedGeneratedMaterialsDialogOk": return "移到回收站";
                case "CancelButton": return "取消";
                case "DeveloperReferencesHelp": return "这些是从普通步骤中隐藏的内部引用。仅在自动设置无法处理的特殊结构中手动调整。";
                case "CopyButton": return "复制";
                case "BaseMaterialLabel": return "基础 Material";
                case "GeneratedMaterialLabel": return "生成 Material";
                case "MirrorQualityHeader": return "镜子画质设置";
                case "ProfileIconHeader": return "配置图标";
                case "IconObjectLabel": return "旧版图标显示物体（兼容）";
                case "LegacyIconFoldout": return "旧版图标兼容设置";
                case "LegacyIconHelp": return "这是旧版多物体图标引用。仅在需要兼容时保留，通常请迁移到单一 Image 方式。";
                case "LegacyIconMigrateButton": return "迁移为此图标";
                case "LegacyIconClearButton": return "仅清除旧引用";
                case "IconPreviewMixed": return "选择多个 EzMirror 时会省略预览。";
                case "IconPreviewMissing": return "未设置图标，也找不到标准图标。";
                case "IconCardOffTitle": return "OFF 时的 UI 图标";
                case "IconCardProfileTitle": return "切换 UI 图标";
                case "ProfileAdvancedFoldout": return "配置详细设置";
                case "IconColorLabel": return "图标颜色";
                case "IconSourceProfileAsset": return "会保存到配置资产中。";
                case "IconSourceOff": return "OFF 图标只保存到这个 EzMirror。";
                case "IconSourceLocal": return "会作为此 EzMirror 专用图标保存。";
                case "IconSourceLegacyLocal": return "正在显示旧版的单独图标。修改后会保存到配置资产中。";
                case "IconMultiSelectDisabled": return "普通配置的图标会保存到配置资产中。请只选择一个 EzMirror 后再编辑。";
                case "IconUsingDefault": return "正在使用共享的默认线框图标";
                case "IconDefaultBadge": return "标准";
                case "IconSelectPlaceholder": return "选择";
                case "IconResetButton": return "恢复标准";
                case "IconSelectAssetButton": return "选择资产";
                case "LocalOnlyMirrorHelp": return "镜子切换状态会按用户独立处理。只有希望同一用户重新进入时恢复状态，才需要启用本地保存。";
                case "LocalSaveLabel": return "本地保存";
                case "EnableClickSoundLabel": return "启用音效";
                case "EnableHapticsLabel": return "启用手柄震动";
                case "ProfileAssetEditorTitle": return "EzMirror 配置资产";
                case "ProfileAssetEditorDescription": return "可在多个 EzMirror 之间共享的设置文件。只保存配置名、画质、透明度等不依赖 Scene 的设置，不保存 Scene 内物体。";
                case "ProfileAssetEditorSectionBasic": return "基础";
                case "ProfileAssetEditorProfileName": return "配置名称";
                case "ProfileAssetEditorProfileNameTooltip": return "例：HQ 镜子、半透明镜子、LQ 镜子";
                case "ProfileAssetEditorIsDefault": return "作为初始状态";
                case "ProfileAssetEditorIsDefaultTooltip": return "Reset 或世界开始时使用此配置则开启。";
                case "ProfileAssetEditorMirrorEnabled": return "显示镜子";
                case "ProfileAssetEditorMirrorEnabledTooltip": return "关闭后，选择此配置时会隐藏镜子本体。";
                case "ProfileAssetEditorPcOnly": return "仅 PC";
                case "ProfileAssetEditorPcOnlyTooltip": return "Quest / Android / iOS 会跳过此配置。";
                case "ProfileAssetEditorSectionAppearance": return "外观";
                case "ProfileAssetEditorTransparency": return "透明度";
                case "ProfileAssetEditorTransparencyTooltip": return "0 为不透明，1 为透明。半透明镜子建议从 0.5 左右开始。";
                case "ProfileAssetEditorBaseMaterial": return "基础 Material";
                case "ProfileAssetEditorBaseMaterialTooltip": return "自动生成配置 Material 时使用的源 Material。";
                case "ProfileAssetEditorIconSprite": return "UI 图标图片";
                case "ProfileAssetEditorIconSpriteTooltip": return "显示在切换 UI 中的白线 Sprite。通常使用内置标准图标即可。";
                case "ProfileAssetEditorIconColor": return "UI 图标颜色";
                case "ProfileAssetEditorIconColorTooltip": return "应用到白线图标的颜色，会反映到 EzMirror 的 Image.color。";
                case "ProfileAssetEditorIconPreview": return "图标颜色预览";
                case "ProfileAssetEditorSectionMirrorQuality": return "镜子画质";
                case "ProfileAssetEditorReflectLayers": return "反射图层";
                case "ProfileAssetEditorReflectLayersTooltip": return "选择镜子要反射的 Layer。通常保持默认即可。";
                case "ProfileAssetEditorDisablePixelLights": return "禁用 Pixel Light";
                case "ProfileAssetEditorDisablePixelLightsTooltip": return "在镜子内禁用较重的 Pixel Light。";
                case "ProfileAssetEditorTurnOffMirrorOcclusion": return "禁用 Mirror Occlusion";
                case "ProfileAssetEditorTurnOffMirrorOcclusionTooltip": return "通常保持默认即可。";
                case "ProfileAssetEditorSectionBackground": return "背景";
                case "ProfileAssetEditorCameraClearFlags": return "背景清除方式";
                case "ProfileAssetEditorCameraClearFlagsTooltip": return "LQ 镜子需要清除背景时使用 Solid Color。";
                case "ProfileAssetEditorCustomSkybox": return "Skybox Material";
                case "ProfileAssetEditorCustomSkyboxTooltip": return "仅在需要单独 Skybox 时设置。";
                case "ProfileAssetEditorCustomClearColor": return "背景色";
                case "ProfileAssetEditorCustomClearColorTooltip": return "Solid Color 的颜色。需要透明背景时将 Alpha 设为 0。";
                case "ProfileAssetEditorHideBackground": return "背景透明化";
                case "ProfileAssetEditorHideBackgroundTooltip": return "镜子 Material 也需要隐藏背景时开启。";
                case "ProfileAssetEditorLqBackgroundHelp": return "LQ 镜子中可与背景清除球配合，减少天空盒或背后世界被反射。";
                case "HealthCheckTitle": return "设置检查";
                case "HealthBrokenReferences": return "引用缺失";
                case "HealthBrokenReferencesHint": return "请执行基础设置，或指定缺失的引用。";
                case "HealthMissingGeneratedMaterials": return "缺少生成 Material";
                case "HealthMissingGeneratedMaterialsHint": return "请在稳定路径重新生成配置 Material。";
                case "HealthDuplicateSaveKey": return "保存键重复";
                case "HealthDuplicateSaveKeyHint": return "启用本地保存时，每个 EzMirror 请使用唯一保存键。";
                case "HealthNeedsSetup": return "需要确认设置";
                case "HealthNeedsSetupHint": return "请执行设置并确认可选输入和配置。";
                case "HealthReady": return "无问题";
                case "HealthReadyHint": return "未发现重要设置问题。";
                case "HealthValidateSelected": return "验证所选对象";
                case "HealthRepairSafe": return "安全修复";
                case "HealthRegenerateMaterials": return "重新生成材质";
                case "HealthGeneratePersistKey": return "生成保存键";
                case "HealthOpenReadme": return "打开 README";
                case "DeveloperHealthActions": return "设置检查操作";
                case "DeveloperHealthActionsHelp": return "用于维护的操作，例如打开 README、生成保存键、验证、安全修复和重新生成材质。正常设置时仅在需要时使用。";
                case "SwitchAnimatorBeginnerTitle": return "3D 开关模型";
                case "SwitchAnimatorBeginnerHelp": return "根据当前配置自动驱动 3D 开关的按下动作和指示灯显示。通常保持开启即可。";
                case "UseSwitchAnimatorLabel": return "让 3D 开关播放动画";
                case "SwitchAnimatorStatusMultiEdit": return "多选时请分别确认每个 3D 开关的状态。";
                case "SwitchAnimatorStatusDisabled": return "3D 开关动画已关闭。";
                case "SwitchAnimatorStatusMissing": return "未设置 3D 开关 Animator。可以自动修复。";
                case "SwitchAnimatorStatusNoController": return "未设置 Animator Controller。可以自动修复。";
                case "SwitchAnimatorStatusInvalidParameters": return "Animator 参数不完整。可在开发者选项中确认。";
                case "SwitchAnimatorStatusReady": return "3D 开关可以跟随当前配置和输入。";
                case "RepairSwitchAnimatorButton": return "自动修复 3D 开关";
                case "SelectSwitchAnimatorButton": return "选择 3D 开关";
                case "DeveloperSwitchAnimator": return "3D 开关 Animator";
                case "DeveloperSwitchAnimatorHelp": return "3D 开关的高级设置。通常使用 Step2 的自动修复即可。仅在使用自定义 Animator Controller 时调整。";
                case "ReferenceSwitchAnimator": return "3D 开关 Animator";
                case "SwitchAnimatorProfileIndexParameter": return "配置编号参数";
                case "SwitchAnimatorStateParameter": return "状态参数";
                case "SwitchAnimatorPressParameter": return "按下参数";
                case "SwitchAnimatorCanSetProfileIndex": return "可发送配置编号";
                case "SwitchAnimatorCanSetState": return "可发送状态";
                case "SwitchAnimatorCanSetPress": return "可发送按下动作";
                case "ValidateSwitchAnimatorButton": return "验证 Animator 设置";
                case "ResetSwitchAnimatorDefaultsButton": return "恢复默认并修复";

                default: return fallback;
            }
        }
    }
}
#endif
