@praxisui/manual-form 3.0.0-beta.0 → 3.0.0-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { ensureIds, DynamicFormService, ASYNC_CONFIG_STORAGE, RULE_PROPERTY_SCHEMA, deepMerge, resolveControlTypeAlias, FieldControlType, normalizeControlTypeKey, FormHooksRegistry, ComponentKeyService, FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, FieldSelectorRegistry, API_URL } from '@praxisui/core';
1
+ import { ensureIds, DynamicFormService, ASYNC_CONFIG_STORAGE, RULE_PROPERTY_SCHEMA, deepMerge, resolveControlTypeAlias, FieldControlType, normalizeControlTypeKey, FormHooksRegistry, ComponentKeyService, FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, FieldSelectorRegistry, providePraxisI18n, PraxisI18nService, API_URL } from '@praxisui/core';
2
2
  import * as i0 from '@angular/core';
3
3
  import { inject, Optional, Inject, Injectable, input, output, ChangeDetectionStrategy, Component, Input, InjectionToken, isDevMode, EventEmitter, HostListener, ViewChild, Output, ChangeDetectorRef, DestroyRef, PLATFORM_ID, effect, ContentChildren, signal, computed, Directive } from '@angular/core';
4
4
  import { BehaviorSubject, debounceTime, fromEvent, of } from 'rxjs';
@@ -2614,8 +2614,321 @@ const DEFAULT_CONSTRUCTOR_TO_CONTROL_TYPE = {
2614
2614
  FileUpload: FieldControlType.FILE_UPLOAD,
2615
2615
  };
2616
2616
 
2617
+ const MANUAL_FORM_EN_US = {
2618
+ 'praxis.manualForm.editor.title': 'Form settings',
2619
+ 'praxis.manualForm.editor.subtitle': 'Fields, actions, messages and behavior',
2620
+ 'praxis.manualForm.editor.close': 'Close',
2621
+ 'praxis.manualForm.editor.tabs.fields': 'Fields',
2622
+ 'praxis.manualForm.editor.tabs.actions': 'Actions',
2623
+ 'praxis.manualForm.editor.tabs.messages': 'Messages',
2624
+ 'praxis.manualForm.editor.tabs.behavior': 'Behavior',
2625
+ 'praxis.manualForm.editor.tabs.hints': 'Hints',
2626
+ 'praxis.manualForm.editor.tabs.hooks': 'Hooks',
2627
+ 'praxis.manualForm.editor.tabs.rules': 'Rules',
2628
+ 'praxis.manualForm.editor.tabs.cascade': 'Cascades',
2629
+ 'praxis.manualForm.editor.fields.onlyHidden': 'Show hidden only',
2630
+ 'praxis.manualForm.editor.fields.name': 'Field',
2631
+ 'praxis.manualForm.editor.fields.label': 'Label',
2632
+ 'praxis.manualForm.editor.fields.type': 'Type',
2633
+ 'praxis.manualForm.editor.fields.visible': 'Visible',
2634
+ 'praxis.manualForm.editor.fields.required': 'Required',
2635
+ 'praxis.manualForm.editor.fields.readOnly': 'Read-only',
2636
+ 'praxis.manualForm.editor.fields.disabled': 'Disabled',
2637
+ 'praxis.manualForm.editor.fields.hiddenState': 'Hidden',
2638
+ 'praxis.manualForm.editor.fields.visibleState': 'Visible',
2639
+ 'praxis.manualForm.editor.shared.yes': 'Yes',
2640
+ 'praxis.manualForm.editor.shared.no': 'No',
2641
+ 'praxis.manualForm.editor.shared.success': 'Success',
2642
+ 'praxis.manualForm.editor.shared.error': 'Error',
2643
+ 'praxis.manualForm.editor.actions.defaultTitle': 'Default buttons',
2644
+ 'praxis.manualForm.editor.actions.defaultHelp': 'Control labels, visibility and style for the basic buttons.',
2645
+ 'praxis.manualForm.editor.actions.layoutTitle': 'Actions layout',
2646
+ 'praxis.manualForm.editor.actions.layoutHelp': 'Defines alignment and disposition of the actions bar.',
2647
+ 'praxis.manualForm.editor.actions.customTitle': 'Custom actions',
2648
+ 'praxis.manualForm.editor.actions.customHelp': 'Create extra buttons with their own event.',
2649
+ 'praxis.manualForm.editor.actions.addCustom': 'Add action',
2650
+ 'praxis.manualForm.editor.actions.emptyCustom': 'No custom actions registered.',
2651
+ 'praxis.manualForm.editor.actions.field.visible': 'Visible',
2652
+ 'praxis.manualForm.editor.actions.field.label': 'Label',
2653
+ 'praxis.manualForm.editor.actions.field.id': 'ID',
2654
+ 'praxis.manualForm.editor.actions.field.icon': 'Icon',
2655
+ 'praxis.manualForm.editor.actions.field.eventAction': 'Event (action)',
2656
+ 'praxis.manualForm.editor.actions.field.variant': 'Variant',
2657
+ 'praxis.manualForm.editor.actions.field.color': 'Color',
2658
+ 'praxis.manualForm.editor.actions.field.shortcut': 'Shortcut',
2659
+ 'praxis.manualForm.editor.actions.field.tooltip': 'Tooltip',
2660
+ 'praxis.manualForm.editor.actions.variant.default': 'Default',
2661
+ 'praxis.manualForm.editor.actions.variant.raised': 'Raised',
2662
+ 'praxis.manualForm.editor.actions.variant.stroked': 'Stroked',
2663
+ 'praxis.manualForm.editor.actions.variant.flat': 'Flat',
2664
+ 'praxis.manualForm.editor.actions.variant.fab': 'Floating',
2665
+ 'praxis.manualForm.editor.actions.color.default': 'Default',
2666
+ 'praxis.manualForm.editor.actions.color.primary': 'Primary',
2667
+ 'praxis.manualForm.editor.actions.color.accent': 'Accent',
2668
+ 'praxis.manualForm.editor.actions.color.warn': 'Warn',
2669
+ 'praxis.manualForm.editor.actions.color.basic': 'Basic',
2670
+ 'praxis.manualForm.editor.actions.layout.position': 'Position',
2671
+ 'praxis.manualForm.editor.actions.layout.orientation': 'Orientation',
2672
+ 'praxis.manualForm.editor.actions.layout.spacing': 'Spacing',
2673
+ 'praxis.manualForm.editor.actions.layout.placement': 'Placement',
2674
+ 'praxis.manualForm.editor.actions.layout.sticky': 'Sticky actions',
2675
+ 'praxis.manualForm.editor.actions.layout.divider': 'Show divider',
2676
+ 'praxis.manualForm.editor.actions.layout.position.left': 'Left',
2677
+ 'praxis.manualForm.editor.actions.layout.position.center': 'Center',
2678
+ 'praxis.manualForm.editor.actions.layout.position.right': 'Right',
2679
+ 'praxis.manualForm.editor.actions.layout.position.justified': 'Justified',
2680
+ 'praxis.manualForm.editor.actions.layout.position.split': 'Split',
2681
+ 'praxis.manualForm.editor.actions.layout.orientation.horizontal': 'Horizontal',
2682
+ 'praxis.manualForm.editor.actions.layout.orientation.vertical': 'Vertical',
2683
+ 'praxis.manualForm.editor.actions.layout.spacing.compact': 'Compact',
2684
+ 'praxis.manualForm.editor.actions.layout.spacing.normal': 'Normal',
2685
+ 'praxis.manualForm.editor.actions.layout.spacing.spacious': 'Spacious',
2686
+ 'praxis.manualForm.editor.actions.layout.placement.afterSections': 'After sections',
2687
+ 'praxis.manualForm.editor.actions.layout.placement.insideLastSection': 'Inside last section',
2688
+ 'praxis.manualForm.editor.actions.layout.placement.top': 'Top',
2689
+ 'praxis.manualForm.editor.messages.defaultTitle': 'Default feedback',
2690
+ 'praxis.manualForm.editor.messages.defaultHelp': 'Success/error messages displayed by the host.',
2691
+ 'praxis.manualForm.editor.messages.createSuccess': 'Create success',
2692
+ 'praxis.manualForm.editor.messages.createError': 'Create error',
2693
+ 'praxis.manualForm.editor.messages.updateSuccess': 'Update success',
2694
+ 'praxis.manualForm.editor.messages.updateError': 'Update error',
2695
+ 'praxis.manualForm.editor.messages.confirmationsTitle': 'Confirmations',
2696
+ 'praxis.manualForm.editor.messages.confirmationsHelp': 'Texts shown before critical actions.',
2697
+ 'praxis.manualForm.editor.messages.loadingTitle': 'Loading',
2698
+ 'praxis.manualForm.editor.messages.loadingHelp': 'Messages displayed during operations.',
2699
+ 'praxis.manualForm.editor.messages.customTitle': 'Messages by custom action',
2700
+ 'praxis.manualForm.editor.messages.customHelp': 'Customize texts by action ID.',
2701
+ 'praxis.manualForm.editor.messages.emptyCustom': 'Register custom actions to configure specific messages.',
2702
+ 'praxis.manualForm.editor.behavior.title': 'Form behavior',
2703
+ 'praxis.manualForm.editor.behavior.help': 'Preferences applied by the host or runtime.',
2704
+ 'praxis.manualForm.editor.behavior.note': 'These options are persisted in config; the host decides how to apply them.',
2705
+ 'praxis.manualForm.editor.behavior.confirmUnsaved': 'Confirm unsaved changes before leaving',
2706
+ 'praxis.manualForm.editor.behavior.trackHistory': 'Track change history',
2707
+ 'praxis.manualForm.editor.behavior.focusFirstError': 'Focus the first error on submit',
2708
+ 'praxis.manualForm.editor.behavior.scrollToErrors': 'Scroll to errors on submit',
2709
+ 'praxis.manualForm.editor.behavior.clearAfterSave': 'Clear form after save',
2710
+ 'praxis.manualForm.editor.behavior.reactiveValidation': 'Reactive validation',
2711
+ 'praxis.manualForm.editor.behavior.redirectAfterSave': 'Redirect after save (URL)',
2712
+ 'praxis.manualForm.editor.behavior.reactiveValidationDebounce': 'Reactive validation debounce (ms)',
2713
+ 'praxis.manualForm.editor.hints.modeTitle': 'Mode messages',
2714
+ 'praxis.manualForm.editor.hints.modeHelp': 'Auxiliary texts displayed by the host.',
2715
+ 'praxis.manualForm.editor.hints.modeNote': 'Useful for i18n and user guidance.',
2716
+ 'praxis.manualForm.editor.hints.uiTitle': 'UI hints',
2717
+ 'praxis.manualForm.editor.hints.uiHelp': 'Contextual help for form states.',
2718
+ 'praxis.manualForm.editor.hints.mode.create': 'Create',
2719
+ 'praxis.manualForm.editor.hints.mode.edit': 'Edit',
2720
+ 'praxis.manualForm.editor.hints.mode.view': 'View',
2721
+ 'praxis.manualForm.editor.hints.ui.presentation': 'Presentation',
2722
+ 'praxis.manualForm.editor.hints.ui.readonly': 'Read-only',
2723
+ 'praxis.manualForm.editor.hints.ui.disabled': 'Disabled',
2724
+ 'praxis.manualForm.editor.hints.ui.visible': 'Visible',
2725
+ 'praxis.manualForm.editor.hooks.title': 'Lifecycle hooks',
2726
+ 'praxis.manualForm.editor.hooks.help': 'Define automated actions by stage.',
2727
+ 'praxis.manualForm.editor.hooks.reset': 'Reset',
2728
+ 'praxis.manualForm.editor.hooks.apply': 'Apply hooks',
2729
+ 'praxis.manualForm.editor.hooks.note': 'Runs only if the host registers available hooks.',
2730
+ 'praxis.manualForm.editor.hooks.tooltip': 'JSON array of hooks for {{stage}} (id, priority, timeoutMs, args).',
2731
+ 'praxis.manualForm.editor.hooks.placeholder': '[{ "id": "notifySuccess", "priority": 0, "args": {} }]',
2732
+ 'praxis.manualForm.editor.rules.title': 'Layout rules',
2733
+ 'praxis.manualForm.editor.rules.help': 'Advanced rules for visibility and behavior.',
2734
+ 'praxis.manualForm.editor.rules.apply': 'Apply rules',
2735
+ 'praxis.manualForm.editor.rules.note': 'Persisted in config; execution depends on the host.',
2736
+ 'praxis.manualForm.editor.rules.formRulesLabel': 'formRules (JSON)',
2737
+ 'praxis.manualForm.editor.rules.formRulesStateLabel': 'formRulesState (JSON)',
2738
+ 'praxis.manualForm.editor.rules.formRulesPlaceholder': '[{"id":"rule-1","name":"Required rule","targetType":"field","targets":["field"],"effect":{"condition":"{field} != null","properties":{"required":true}}}]',
2739
+ 'praxis.manualForm.editor.rules.tooltip': 'JSON array with rules (id, targetType, targets, effect).',
2740
+ 'praxis.manualForm.editor.rules.stateTooltip': 'Raw state from the visual editor (optional).',
2741
+ 'praxis.manualForm.editor.cascade.title': 'Field dependencies',
2742
+ 'praxis.manualForm.editor.cascade.help': 'Configure native cascades based on metadata.',
2743
+ 'praxis.manualForm.editor.cascade.note': 'Changes update metadata and are saved in the draft.',
2744
+ 'praxis.manualForm.editor.validation.jsonArray': 'Must be a JSON array.',
2745
+ 'praxis.manualForm.editor.validation.invalidJson': 'Invalid JSON.',
2746
+ 'praxis.manualForm.editor.validation.formRulesArray': 'formRules must be a JSON array.',
2747
+ 'praxis.manualForm.editor.validation.formRulesInvalid': 'Invalid JSON in formRules.',
2748
+ 'praxis.manualForm.editor.validation.formRulesStateInvalid': 'Invalid JSON in formRulesState.',
2749
+ 'praxis.manualForm.editor.defaults.submit': 'Save',
2750
+ 'praxis.manualForm.editor.defaults.cancel': 'Cancel',
2751
+ 'praxis.manualForm.editor.defaults.reset': 'Reset',
2752
+ 'praxis.manualForm.editor.defaults.action': 'Action',
2753
+ };
2754
+
2755
+ const MANUAL_FORM_PT_BR = {
2756
+ 'praxis.manualForm.editor.title': 'Configuracoes do formulario',
2757
+ 'praxis.manualForm.editor.subtitle': 'Campos, acoes, mensagens e comportamento',
2758
+ 'praxis.manualForm.editor.close': 'Fechar',
2759
+ 'praxis.manualForm.editor.tabs.fields': 'Campos',
2760
+ 'praxis.manualForm.editor.tabs.actions': 'Acoes',
2761
+ 'praxis.manualForm.editor.tabs.messages': 'Mensagens',
2762
+ 'praxis.manualForm.editor.tabs.behavior': 'Comportamento',
2763
+ 'praxis.manualForm.editor.tabs.hints': 'Dicas',
2764
+ 'praxis.manualForm.editor.tabs.hooks': 'Hooks',
2765
+ 'praxis.manualForm.editor.tabs.rules': 'Regras',
2766
+ 'praxis.manualForm.editor.tabs.cascade': 'Cascatas',
2767
+ 'praxis.manualForm.editor.fields.onlyHidden': 'Mostrar apenas ocultos',
2768
+ 'praxis.manualForm.editor.fields.name': 'Campo',
2769
+ 'praxis.manualForm.editor.fields.label': 'Rotulo',
2770
+ 'praxis.manualForm.editor.fields.type': 'Tipo',
2771
+ 'praxis.manualForm.editor.fields.visible': 'Visivel',
2772
+ 'praxis.manualForm.editor.fields.required': 'Obrigatorio',
2773
+ 'praxis.manualForm.editor.fields.readOnly': 'Somente leitura',
2774
+ 'praxis.manualForm.editor.fields.disabled': 'Desabilitado',
2775
+ 'praxis.manualForm.editor.fields.hiddenState': 'Oculto',
2776
+ 'praxis.manualForm.editor.fields.visibleState': 'Visivel',
2777
+ 'praxis.manualForm.editor.shared.yes': 'Sim',
2778
+ 'praxis.manualForm.editor.shared.no': 'Nao',
2779
+ 'praxis.manualForm.editor.shared.success': 'Sucesso',
2780
+ 'praxis.manualForm.editor.shared.error': 'Erro',
2781
+ 'praxis.manualForm.editor.actions.defaultTitle': 'Botoes padrao',
2782
+ 'praxis.manualForm.editor.actions.defaultHelp': 'Controle rotulos, visibilidade e estilo dos botoes basicos.',
2783
+ 'praxis.manualForm.editor.actions.layoutTitle': 'Layout das acoes',
2784
+ 'praxis.manualForm.editor.actions.layoutHelp': 'Define alinhamento e disposicao da barra de acoes.',
2785
+ 'praxis.manualForm.editor.actions.customTitle': 'Acoes customizadas',
2786
+ 'praxis.manualForm.editor.actions.customHelp': 'Crie botoes extras com evento proprio.',
2787
+ 'praxis.manualForm.editor.actions.addCustom': 'Adicionar acao',
2788
+ 'praxis.manualForm.editor.actions.emptyCustom': 'Nenhuma acao customizada cadastrada.',
2789
+ 'praxis.manualForm.editor.actions.field.visible': 'Visivel',
2790
+ 'praxis.manualForm.editor.actions.field.label': 'Label',
2791
+ 'praxis.manualForm.editor.actions.field.id': 'ID',
2792
+ 'praxis.manualForm.editor.actions.field.icon': 'Icone',
2793
+ 'praxis.manualForm.editor.actions.field.eventAction': 'Evento (action)',
2794
+ 'praxis.manualForm.editor.actions.field.variant': 'Variante',
2795
+ 'praxis.manualForm.editor.actions.field.color': 'Cor',
2796
+ 'praxis.manualForm.editor.actions.field.shortcut': 'Atalho',
2797
+ 'praxis.manualForm.editor.actions.field.tooltip': 'Tooltip',
2798
+ 'praxis.manualForm.editor.actions.variant.default': 'Padrao',
2799
+ 'praxis.manualForm.editor.actions.variant.raised': 'Elevado',
2800
+ 'praxis.manualForm.editor.actions.variant.stroked': 'Contornado',
2801
+ 'praxis.manualForm.editor.actions.variant.flat': 'Plano',
2802
+ 'praxis.manualForm.editor.actions.variant.fab': 'Flutuante',
2803
+ 'praxis.manualForm.editor.actions.color.default': 'Padrao',
2804
+ 'praxis.manualForm.editor.actions.color.primary': 'Primary',
2805
+ 'praxis.manualForm.editor.actions.color.accent': 'Accent',
2806
+ 'praxis.manualForm.editor.actions.color.warn': 'Warn',
2807
+ 'praxis.manualForm.editor.actions.color.basic': 'Basic',
2808
+ 'praxis.manualForm.editor.actions.layout.position': 'Posicao',
2809
+ 'praxis.manualForm.editor.actions.layout.orientation': 'Orientacao',
2810
+ 'praxis.manualForm.editor.actions.layout.spacing': 'Espacamento',
2811
+ 'praxis.manualForm.editor.actions.layout.placement': 'Posicionamento',
2812
+ 'praxis.manualForm.editor.actions.layout.sticky': 'Acoes fixas',
2813
+ 'praxis.manualForm.editor.actions.layout.divider': 'Mostrar divisor',
2814
+ 'praxis.manualForm.editor.actions.layout.position.left': 'Esquerda',
2815
+ 'praxis.manualForm.editor.actions.layout.position.center': 'Centro',
2816
+ 'praxis.manualForm.editor.actions.layout.position.right': 'Direita',
2817
+ 'praxis.manualForm.editor.actions.layout.position.justified': 'Justificado',
2818
+ 'praxis.manualForm.editor.actions.layout.position.split': 'Split',
2819
+ 'praxis.manualForm.editor.actions.layout.orientation.horizontal': 'Horizontal',
2820
+ 'praxis.manualForm.editor.actions.layout.orientation.vertical': 'Vertical',
2821
+ 'praxis.manualForm.editor.actions.layout.spacing.compact': 'Compacto',
2822
+ 'praxis.manualForm.editor.actions.layout.spacing.normal': 'Normal',
2823
+ 'praxis.manualForm.editor.actions.layout.spacing.spacious': 'Espacoso',
2824
+ 'praxis.manualForm.editor.actions.layout.placement.afterSections': 'Apos secoes',
2825
+ 'praxis.manualForm.editor.actions.layout.placement.insideLastSection': 'Dentro da ultima secao',
2826
+ 'praxis.manualForm.editor.actions.layout.placement.top': 'Topo',
2827
+ 'praxis.manualForm.editor.messages.defaultTitle': 'Feedback padrao',
2828
+ 'praxis.manualForm.editor.messages.defaultHelp': 'Mensagens de sucesso/erro exibidas pelo host.',
2829
+ 'praxis.manualForm.editor.messages.createSuccess': 'Sucesso ao criar',
2830
+ 'praxis.manualForm.editor.messages.createError': 'Erro ao criar',
2831
+ 'praxis.manualForm.editor.messages.updateSuccess': 'Sucesso ao atualizar',
2832
+ 'praxis.manualForm.editor.messages.updateError': 'Erro ao atualizar',
2833
+ 'praxis.manualForm.editor.messages.confirmationsTitle': 'Confirmacoes',
2834
+ 'praxis.manualForm.editor.messages.confirmationsHelp': 'Textos mostrados antes de acoes criticas.',
2835
+ 'praxis.manualForm.editor.messages.loadingTitle': 'Loading',
2836
+ 'praxis.manualForm.editor.messages.loadingHelp': 'Mensagens exibidas durante operacoes.',
2837
+ 'praxis.manualForm.editor.messages.customTitle': 'Mensagens por acao customizada',
2838
+ 'praxis.manualForm.editor.messages.customHelp': 'Personalize textos por ID de acao.',
2839
+ 'praxis.manualForm.editor.messages.emptyCustom': 'Cadastre acoes customizadas para configurar mensagens especificas.',
2840
+ 'praxis.manualForm.editor.behavior.title': 'Comportamento do formulario',
2841
+ 'praxis.manualForm.editor.behavior.help': 'Preferencias aplicadas pelo host ou runtime.',
2842
+ 'praxis.manualForm.editor.behavior.note': 'Estas opcoes sao persistidas no config; o host decide como aplicar.',
2843
+ 'praxis.manualForm.editor.behavior.confirmUnsaved': 'Confirmar ao sair com alteracoes nao salvas',
2844
+ 'praxis.manualForm.editor.behavior.trackHistory': 'Rastrear historico de alteracoes',
2845
+ 'praxis.manualForm.editor.behavior.focusFirstError': 'Focar no primeiro erro ao submeter',
2846
+ 'praxis.manualForm.editor.behavior.scrollToErrors': 'Rolar ate os erros ao submeter',
2847
+ 'praxis.manualForm.editor.behavior.clearAfterSave': 'Limpar formulario apos salvar',
2848
+ 'praxis.manualForm.editor.behavior.reactiveValidation': 'Validacao reativa',
2849
+ 'praxis.manualForm.editor.behavior.redirectAfterSave': 'Redirecionar apos salvar (URL)',
2850
+ 'praxis.manualForm.editor.behavior.reactiveValidationDebounce': 'Debounce validacao reativa (ms)',
2851
+ 'praxis.manualForm.editor.hints.modeTitle': 'Mensagens de modo',
2852
+ 'praxis.manualForm.editor.hints.modeHelp': 'Textos auxiliares exibidos pelo host.',
2853
+ 'praxis.manualForm.editor.hints.modeNote': 'Util para i18n e orientacao do usuario.',
2854
+ 'praxis.manualForm.editor.hints.uiTitle': 'Dicas de UI',
2855
+ 'praxis.manualForm.editor.hints.uiHelp': 'Ajuda contextual para estados do formulario.',
2856
+ 'praxis.manualForm.editor.hints.mode.create': 'Criar',
2857
+ 'praxis.manualForm.editor.hints.mode.edit': 'Editar',
2858
+ 'praxis.manualForm.editor.hints.mode.view': 'Visualizar',
2859
+ 'praxis.manualForm.editor.hints.ui.presentation': 'Apresentacao',
2860
+ 'praxis.manualForm.editor.hints.ui.readonly': 'Somente leitura',
2861
+ 'praxis.manualForm.editor.hints.ui.disabled': 'Desabilitado',
2862
+ 'praxis.manualForm.editor.hints.ui.visible': 'Visivel',
2863
+ 'praxis.manualForm.editor.hooks.title': 'Hooks de ciclo de vida',
2864
+ 'praxis.manualForm.editor.hooks.help': 'Defina acoes automatizadas por estagio.',
2865
+ 'praxis.manualForm.editor.hooks.reset': 'Restaurar',
2866
+ 'praxis.manualForm.editor.hooks.apply': 'Aplicar hooks',
2867
+ 'praxis.manualForm.editor.hooks.note': 'Executa apenas se o host registrar hooks disponiveis.',
2868
+ 'praxis.manualForm.editor.hooks.tooltip': 'Array JSON de hooks para {{stage}} (id, priority, timeoutMs, args).',
2869
+ 'praxis.manualForm.editor.hooks.placeholder': '[{ "id": "notifySuccess", "priority": 0, "args": {} }]',
2870
+ 'praxis.manualForm.editor.rules.title': 'Regras de layout',
2871
+ 'praxis.manualForm.editor.rules.help': 'Regras avancadas para visibilidade e comportamento.',
2872
+ 'praxis.manualForm.editor.rules.apply': 'Aplicar regras',
2873
+ 'praxis.manualForm.editor.rules.note': 'Persistido no config; a execucao depende do host.',
2874
+ 'praxis.manualForm.editor.rules.formRulesLabel': 'formRules (JSON)',
2875
+ 'praxis.manualForm.editor.rules.formRulesStateLabel': 'formRulesState (JSON)',
2876
+ 'praxis.manualForm.editor.rules.formRulesPlaceholder': '[{"id":"rule-1","name":"Obrigatoriedade","targetType":"field","targets":["campo"],"effect":{"condition":"{campo} != null","properties":{"required":true}}}]',
2877
+ 'praxis.manualForm.editor.rules.tooltip': 'Array JSON com regras (id, targetType, targets, effect).',
2878
+ 'praxis.manualForm.editor.rules.stateTooltip': 'Estado bruto do editor visual (opcional).',
2879
+ 'praxis.manualForm.editor.cascade.title': 'Dependencias entre campos',
2880
+ 'praxis.manualForm.editor.cascade.help': 'Configure cascatas nativas baseadas em metadados.',
2881
+ 'praxis.manualForm.editor.cascade.note': 'As alteracoes atualizam metadados e sao salvas no draft.',
2882
+ 'praxis.manualForm.editor.validation.jsonArray': 'Precisa ser um array JSON.',
2883
+ 'praxis.manualForm.editor.validation.invalidJson': 'JSON invalido.',
2884
+ 'praxis.manualForm.editor.validation.formRulesArray': 'formRules precisa ser um array JSON.',
2885
+ 'praxis.manualForm.editor.validation.formRulesInvalid': 'JSON invalido em formRules.',
2886
+ 'praxis.manualForm.editor.validation.formRulesStateInvalid': 'JSON invalido em formRulesState.',
2887
+ 'praxis.manualForm.editor.defaults.submit': 'Salvar',
2888
+ 'praxis.manualForm.editor.defaults.cancel': 'Cancelar',
2889
+ 'praxis.manualForm.editor.defaults.reset': 'Restaurar',
2890
+ 'praxis.manualForm.editor.defaults.action': 'Acao',
2891
+ };
2892
+
2893
+ function createPraxisManualFormI18nConfig(options = {}) {
2894
+ const dictionaries = {
2895
+ 'pt-BR': {
2896
+ ...MANUAL_FORM_PT_BR,
2897
+ ...(options.dictionaries?.['pt-BR'] ?? {}),
2898
+ },
2899
+ 'en-US': {
2900
+ ...MANUAL_FORM_EN_US,
2901
+ ...(options.dictionaries?.['en-US'] ?? {}),
2902
+ },
2903
+ };
2904
+ for (const [locale, dictionary] of Object.entries(options.dictionaries ?? {})) {
2905
+ if (locale === 'pt-BR' || locale === 'en-US') {
2906
+ continue;
2907
+ }
2908
+ dictionaries[locale] = {
2909
+ ...(dictionaries[locale] ?? {}),
2910
+ ...dictionary,
2911
+ };
2912
+ }
2913
+ return {
2914
+ locale: options.locale,
2915
+ fallbackLocale: options.fallbackLocale ?? 'pt-BR',
2916
+ dictionaries,
2917
+ };
2918
+ }
2919
+ function providePraxisManualFormI18n(options = {}) {
2920
+ return providePraxisI18n(createPraxisManualFormI18nConfig(options));
2921
+ }
2922
+ function resolvePraxisManualFormText(i18n, key, fallback) {
2923
+ const namespacedKey = key.startsWith('praxis.manualForm.')
2924
+ ? key
2925
+ : `praxis.manualForm.${key}`;
2926
+ return i18n.t(namespacedKey, undefined, fallback) || fallback;
2927
+ }
2928
+
2617
2929
  class ManualFormConfigEditorComponent {
2618
2930
  ref;
2931
+ i18n = inject(PraxisI18nService);
2619
2932
  instance;
2620
2933
  all = [];
2621
2934
  filtered = [];
@@ -2640,9 +2953,9 @@ class ManualFormConfigEditorComponent {
2640
2953
  'onError',
2641
2954
  ];
2642
2955
  actionBlocks = [
2643
- { key: 'submit', label: 'Salvar' },
2644
- { key: 'cancel', label: 'Cancelar' },
2645
- { key: 'reset', label: 'Resetar' },
2956
+ { key: 'submit', label: this.tx('editor.defaults.submit', 'Save') },
2957
+ { key: 'cancel', label: this.tx('editor.defaults.cancel', 'Cancel') },
2958
+ { key: 'reset', label: this.tx('editor.defaults.reset', 'Reset') },
2646
2959
  ];
2647
2960
  // SettingsValueProvider observables
2648
2961
  isDirty$ = new BehaviorSubject(false);
@@ -2652,6 +2965,18 @@ class ManualFormConfigEditorComponent {
2652
2965
  this.ref = ref;
2653
2966
  this.instance = inputs.instance;
2654
2967
  }
2968
+ tx(key, fallback) {
2969
+ return resolvePraxisManualFormText(this.i18n, key, fallback);
2970
+ }
2971
+ hookPlaceholder() {
2972
+ return this.tx('editor.hooks.placeholder', '[{ "id": "notifySuccess", "priority": 0, "args": {} }]');
2973
+ }
2974
+ hookTooltip(stage) {
2975
+ return this.tx('editor.hooks.tooltip', `JSON array of hooks for ${stage} (id, priority, timeoutMs, args).`).replace('{{stage}}', stage);
2976
+ }
2977
+ formRulesPlaceholder() {
2978
+ return this.tx('editor.rules.formRulesPlaceholder', '[{"id":"rule-1","name":"Required rule","targetType":"field","targets":["field"],"effect":{"condition":"{field} != null","properties":{"required":true}}}]');
2979
+ }
2655
2980
  ngOnInit() {
2656
2981
  this.refresh();
2657
2982
  }
@@ -2720,7 +3045,7 @@ class ManualFormConfigEditorComponent {
2720
3045
  }
2721
3046
  addCustomAction() {
2722
3047
  const nextId = this.generateCustomId();
2723
- const nextAction = makeAction({ id: nextId, label: 'Ação' });
3048
+ const nextAction = makeAction({ id: nextId, label: this.tx('editor.defaults.action', 'Action') });
2724
3049
  const custom = [...(this.actionsModel.custom || []), nextAction];
2725
3050
  this.actionsModel = { ...this.actionsModel, custom };
2726
3051
  this.applyConfigPatch({ actions: this.actionsModel });
@@ -2826,13 +3151,13 @@ class ManualFormConfigEditorComponent {
2826
3151
  try {
2827
3152
  const parsed = JSON.parse(raw);
2828
3153
  if (!Array.isArray(parsed)) {
2829
- errors[stage] = 'Precisa ser um array JSON.';
3154
+ errors[stage] = this.tx('editor.validation.jsonArray', 'Must be a JSON array.');
2830
3155
  continue;
2831
3156
  }
2832
3157
  next[stage] = parsed;
2833
3158
  }
2834
3159
  catch {
2835
- errors[stage] = 'JSON inválido.';
3160
+ errors[stage] = this.tx('editor.validation.invalidJson', 'Invalid JSON.');
2836
3161
  }
2837
3162
  }
2838
3163
  this.hooksErrors = errors;
@@ -2857,13 +3182,13 @@ class ManualFormConfigEditorComponent {
2857
3182
  try {
2858
3183
  const parsed = JSON.parse(rulesRaw);
2859
3184
  if (!Array.isArray(parsed)) {
2860
- this.formRulesError = 'formRules precisa ser um array JSON.';
3185
+ this.formRulesError = this.tx('editor.validation.formRulesArray', 'formRules must be a JSON array.');
2861
3186
  return;
2862
3187
  }
2863
3188
  rules = parsed;
2864
3189
  }
2865
3190
  catch {
2866
- this.formRulesError = 'JSON inválido em formRules.';
3191
+ this.formRulesError = this.tx('editor.validation.formRulesInvalid', 'Invalid JSON in formRules.');
2867
3192
  return;
2868
3193
  }
2869
3194
  }
@@ -2873,7 +3198,7 @@ class ManualFormConfigEditorComponent {
2873
3198
  rulesState = JSON.parse(stateRaw);
2874
3199
  }
2875
3200
  catch {
2876
- this.formRulesStateError = 'JSON inválido em formRulesState.';
3201
+ this.formRulesStateError = this.tx('editor.validation.formRulesStateInvalid', 'Invalid JSON in formRulesState.');
2877
3202
  return;
2878
3203
  }
2879
3204
  }
@@ -2984,33 +3309,33 @@ class ManualFormConfigEditorComponent {
2984
3309
  return next;
2985
3310
  }
2986
3311
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: ManualFormConfigEditorComponent, deps: [{ token: SETTINGS_PANEL_DATA }, { token: SETTINGS_PANEL_REF }], target: i0.ɵɵFactoryTarget.Component });
2987
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.17", type: ManualFormConfigEditorComponent, isStandalone: true, selector: "praxis-manual-form-config-editor", ngImport: i0, template: `
3312
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.17", type: ManualFormConfigEditorComponent, isStandalone: true, selector: "praxis-manual-form-config-editor", providers: [providePraxisManualFormI18n()], ngImport: i0, template: `
2988
3313
  <div class="mf-editor">
2989
3314
  <div class="mf-editor__toolbar">
2990
3315
  <div class="mf-editor__title">
2991
- <span>Configurações do formulário</span>
2992
- <small class="mf-editor__subtitle">Campos, ações, mensagens e comportamento</small>
3316
+ <span>{{ tx('editor.title', 'Form settings') }}</span>
3317
+ <small class="mf-editor__subtitle">{{ tx('editor.subtitle', 'Fields, actions, messages and behavior') }}</small>
2993
3318
  </div>
2994
3319
  <div class="spacer"></div>
2995
- <button type="button" class="mf-btn" (click)="close()">Fechar</button>
3320
+ <button type="button" class="mf-btn" (click)="close()">{{ tx('editor.close', 'Close') }}</button>
2996
3321
  </div>
2997
3322
 
2998
3323
  <mat-tab-group class="mf-tabs">
2999
- <mat-tab label="Campos">
3324
+ <mat-tab [label]="tx('editor.tabs.fields', 'Fields')">
3000
3325
  <div class="mf-tab">
3001
3326
  <label class="mf-editor__filter">
3002
3327
  <input type="checkbox" [(ngModel)]="onlyHidden" (change)="applyFilter()" />
3003
- <span>Mostrar apenas ocultos</span>
3328
+ <span>{{ tx('editor.fields.onlyHidden', 'Show hidden only') }}</span>
3004
3329
  </label>
3005
3330
  <div class="mf-editor__list">
3006
3331
  <div class="mf-editor__row mf-editor__row--head">
3007
- <div class="col col--name">Campo</div>
3008
- <div class="col col--label">Rótulo</div>
3009
- <div class="col col--type">Tipo</div>
3010
- <div class="col col--vis">Visível</div>
3011
- <div class="col col--req">Obrigatório</div>
3012
- <div class="col col--ro">Som. leitura</div>
3013
- <div class="col col--dis">Desabilitado</div>
3332
+ <div class="col col--name">{{ tx('editor.fields.name', 'Field') }}</div>
3333
+ <div class="col col--label">{{ tx('editor.fields.label', 'Label') }}</div>
3334
+ <div class="col col--type">{{ tx('editor.fields.type', 'Type') }}</div>
3335
+ <div class="col col--vis">{{ tx('editor.fields.visible', 'Visible') }}</div>
3336
+ <div class="col col--req">{{ tx('editor.fields.required', 'Required') }}</div>
3337
+ <div class="col col--ro">{{ tx('editor.fields.readOnly', 'Read-only') }}</div>
3338
+ <div class="col col--dis">{{ tx('editor.fields.disabled', 'Disabled') }}</div>
3014
3339
  </div>
3015
3340
 
3016
3341
  @for (f of filtered; track f.name) {
@@ -3021,25 +3346,25 @@ class ManualFormConfigEditorComponent {
3021
3346
  <div class="col col--vis">
3022
3347
  <label class="toggle">
3023
3348
  <input type="checkbox" [checked]="!f.hidden" (change)="toggleVisibility(f, $any($event.target).checked)" />
3024
- <span>{{ f.hidden ? 'Oculto' : 'Visível' }}</span>
3349
+ <span>{{ f.hidden ? tx('editor.fields.hiddenState', 'Hidden') : tx('editor.fields.visibleState', 'Visible') }}</span>
3025
3350
  </label>
3026
3351
  </div>
3027
3352
  <div class="col col--req">
3028
3353
  <label class="toggle">
3029
3354
  <input type="checkbox" [checked]="!!f.required" (change)="toggleRequired(f, $any($event.target).checked)" />
3030
- <span>{{ f.required ? 'Sim' : 'Não' }}</span>
3355
+ <span>{{ f.required ? tx('editor.shared.yes', 'Yes') : tx('editor.shared.no', 'No') }}</span>
3031
3356
  </label>
3032
3357
  </div>
3033
3358
  <div class="col col--ro">
3034
3359
  <label class="toggle">
3035
3360
  <input type="checkbox" [checked]="!!f.readOnly" (change)="toggleReadOnly(f, $any($event.target).checked)" />
3036
- <span>{{ f.readOnly ? 'Sim' : 'Não' }}</span>
3361
+ <span>{{ f.readOnly ? tx('editor.shared.yes', 'Yes') : tx('editor.shared.no', 'No') }}</span>
3037
3362
  </label>
3038
3363
  </div>
3039
3364
  <div class="col col--dis">
3040
3365
  <label class="toggle">
3041
3366
  <input type="checkbox" [checked]="!!f.disabled" (change)="toggleDisabled(f, $any($event.target).checked)" />
3042
- <span>{{ f.disabled ? 'Sim' : 'Não' }}</span>
3367
+ <span>{{ f.disabled ? tx('editor.shared.yes', 'Yes') : tx('editor.shared.no', 'No') }}</span>
3043
3368
  </label>
3044
3369
  </div>
3045
3370
  </div>
@@ -3048,13 +3373,13 @@ class ManualFormConfigEditorComponent {
3048
3373
  </div>
3049
3374
  </mat-tab>
3050
3375
 
3051
- <mat-tab label="Ações">
3376
+ <mat-tab [label]="tx('editor.tabs.actions', 'Actions')">
3052
3377
  <div class="mf-tab">
3053
3378
  <section class="mf-section">
3054
3379
  <div class="mf-section__header">
3055
3380
  <div>
3056
- <h3>Botões padrão</h3>
3057
- <p class="mf-help">Controle rótulos, visibilidade e estilo dos botões básicos.</p>
3381
+ <h3>{{ tx('editor.actions.defaultTitle', 'Default buttons') }}</h3>
3382
+ <p class="mf-help">{{ tx('editor.actions.defaultHelp', 'Control labels, visibility and style for the basic buttons.') }}</p>
3058
3383
  </div>
3059
3384
  </div>
3060
3385
  <div class="mf-actions-grid">
@@ -3065,10 +3390,10 @@ class ManualFormConfigEditorComponent {
3065
3390
  [checked]="actionsModel[block.key].visible"
3066
3391
  (change)="updateActionField(block.key, 'visible', $event.checked)"
3067
3392
  >
3068
- Visível
3393
+ {{ tx('editor.actions.field.visible', 'Visible') }}
3069
3394
  </mat-slide-toggle>
3070
3395
  <mat-form-field appearance="outline">
3071
- <mat-label>Label</mat-label>
3396
+ <mat-label>{{ tx('editor.actions.field.label', 'Label') }}</mat-label>
3072
3397
  <input
3073
3398
  matInput
3074
3399
  [value]="actionsModel[block.key].label"
@@ -3076,7 +3401,7 @@ class ManualFormConfigEditorComponent {
3076
3401
  />
3077
3402
  </mat-form-field>
3078
3403
  <mat-form-field appearance="outline">
3079
- <mat-label>Ícone</mat-label>
3404
+ <mat-label>{{ tx('editor.actions.field.icon', 'Icon') }}</mat-label>
3080
3405
  <input
3081
3406
  matInput
3082
3407
  [value]="actionsModel[block.key].icon || ''"
@@ -3084,33 +3409,33 @@ class ManualFormConfigEditorComponent {
3084
3409
  />
3085
3410
  </mat-form-field>
3086
3411
  <mat-form-field appearance="outline">
3087
- <mat-label>Variante</mat-label>
3412
+ <mat-label>{{ tx('editor.actions.field.variant', 'Variant') }}</mat-label>
3088
3413
  <mat-select
3089
3414
  [value]="actionsModel[block.key].variant || null"
3090
3415
  (selectionChange)="updateActionField(block.key, 'variant', $event.value)"
3091
3416
  >
3092
- <mat-option [value]="null">Padrão</mat-option>
3093
- <mat-option value="raised">Elevado</mat-option>
3094
- <mat-option value="stroked">Contornado</mat-option>
3095
- <mat-option value="flat">Plano</mat-option>
3096
- <mat-option value="fab">Flutuante</mat-option>
3417
+ <mat-option [value]="null">{{ tx('editor.actions.variant.default', 'Default') }}</mat-option>
3418
+ <mat-option value="raised">{{ tx('editor.actions.variant.raised', 'Raised') }}</mat-option>
3419
+ <mat-option value="stroked">{{ tx('editor.actions.variant.stroked', 'Stroked') }}</mat-option>
3420
+ <mat-option value="flat">{{ tx('editor.actions.variant.flat', 'Flat') }}</mat-option>
3421
+ <mat-option value="fab">{{ tx('editor.actions.variant.fab', 'Floating') }}</mat-option>
3097
3422
  </mat-select>
3098
3423
  </mat-form-field>
3099
3424
  <mat-form-field appearance="outline">
3100
- <mat-label>Cor</mat-label>
3425
+ <mat-label>{{ tx('editor.actions.field.color', 'Color') }}</mat-label>
3101
3426
  <mat-select
3102
3427
  [value]="actionsModel[block.key].color || null"
3103
3428
  (selectionChange)="updateActionField(block.key, 'color', $event.value)"
3104
3429
  >
3105
- <mat-option [value]="null">Padrão</mat-option>
3106
- <mat-option value="primary">Primary</mat-option>
3107
- <mat-option value="accent">Accent</mat-option>
3108
- <mat-option value="warn">Warn</mat-option>
3109
- <mat-option value="basic">Basic</mat-option>
3430
+ <mat-option [value]="null">{{ tx('editor.actions.color.default', 'Default') }}</mat-option>
3431
+ <mat-option value="primary">{{ tx('editor.actions.color.primary', 'Primary') }}</mat-option>
3432
+ <mat-option value="accent">{{ tx('editor.actions.color.accent', 'Accent') }}</mat-option>
3433
+ <mat-option value="warn">{{ tx('editor.actions.color.warn', 'Warn') }}</mat-option>
3434
+ <mat-option value="basic">{{ tx('editor.actions.color.basic', 'Basic') }}</mat-option>
3110
3435
  </mat-select>
3111
3436
  </mat-form-field>
3112
3437
  <mat-form-field appearance="outline">
3113
- <mat-label>Atalho</mat-label>
3438
+ <mat-label>{{ tx('editor.actions.field.shortcut', 'Shortcut') }}</mat-label>
3114
3439
  <input
3115
3440
  matInput
3116
3441
  [value]="actionsModel[block.key].shortcut || ''"
@@ -3125,67 +3450,67 @@ class ManualFormConfigEditorComponent {
3125
3450
  <section class="mf-section">
3126
3451
  <div class="mf-section__header">
3127
3452
  <div>
3128
- <h3>Layout das ações</h3>
3129
- <p class="mf-help">Define alinhamento e disposição da barra de ações.</p>
3453
+ <h3>{{ tx('editor.actions.layoutTitle', 'Actions layout') }}</h3>
3454
+ <p class="mf-help">{{ tx('editor.actions.layoutHelp', 'Defines alignment and disposition of the actions bar.') }}</p>
3130
3455
  </div>
3131
3456
  </div>
3132
3457
  <div class="mf-actions-layout">
3133
3458
  <mat-form-field appearance="outline">
3134
- <mat-label>Posição</mat-label>
3459
+ <mat-label>{{ tx('editor.actions.layout.position', 'Position') }}</mat-label>
3135
3460
  <mat-select
3136
3461
  [value]="actionsModel.position || null"
3137
3462
  (selectionChange)="updateActionsLayout('position', $event.value)"
3138
3463
  >
3139
- <mat-option value="left">Esquerda</mat-option>
3140
- <mat-option value="center">Centro</mat-option>
3141
- <mat-option value="right">Direita</mat-option>
3142
- <mat-option value="justified">Justificado</mat-option>
3143
- <mat-option value="split">Split</mat-option>
3464
+ <mat-option value="left">{{ tx('editor.actions.layout.position.left', 'Left') }}</mat-option>
3465
+ <mat-option value="center">{{ tx('editor.actions.layout.position.center', 'Center') }}</mat-option>
3466
+ <mat-option value="right">{{ tx('editor.actions.layout.position.right', 'Right') }}</mat-option>
3467
+ <mat-option value="justified">{{ tx('editor.actions.layout.position.justified', 'Justified') }}</mat-option>
3468
+ <mat-option value="split">{{ tx('editor.actions.layout.position.split', 'Split') }}</mat-option>
3144
3469
  </mat-select>
3145
3470
  </mat-form-field>
3146
3471
  <mat-form-field appearance="outline">
3147
- <mat-label>Orientação</mat-label>
3472
+ <mat-label>{{ tx('editor.actions.layout.orientation', 'Orientation') }}</mat-label>
3148
3473
  <mat-select
3149
3474
  [value]="actionsModel.orientation || null"
3150
3475
  (selectionChange)="updateActionsLayout('orientation', $event.value)"
3151
3476
  >
3152
- <mat-option value="horizontal">Horizontal</mat-option>
3153
- <mat-option value="vertical">Vertical</mat-option>
3477
+ <mat-option value="horizontal">{{ tx('editor.actions.layout.orientation.horizontal', 'Horizontal') }}</mat-option>
3478
+ <mat-option value="vertical">{{ tx('editor.actions.layout.orientation.vertical', 'Vertical') }}</mat-option>
3154
3479
  </mat-select>
3155
3480
  </mat-form-field>
3156
3481
  <mat-form-field appearance="outline">
3157
- <mat-label>Espaçamento</mat-label>
3482
+ <mat-label>{{ tx('editor.actions.layout.spacing', 'Spacing') }}</mat-label>
3158
3483
  <mat-select
3159
3484
  [value]="actionsModel.spacing || null"
3160
3485
  (selectionChange)="updateActionsLayout('spacing', $event.value)"
3161
3486
  >
3162
- <mat-option value="compact">Compacto</mat-option>
3163
- <mat-option value="normal">Normal</mat-option>
3164
- <mat-option value="spacious">Espaçoso</mat-option>
3487
+ <mat-option value="compact">{{ tx('editor.actions.layout.spacing.compact', 'Compact') }}</mat-option>
3488
+ <mat-option value="normal">{{ tx('editor.actions.layout.spacing.normal', 'Normal') }}</mat-option>
3489
+ <mat-option value="spacious">{{ tx('editor.actions.layout.spacing.spacious', 'Spacious') }}</mat-option>
3165
3490
  </mat-select>
3166
3491
  </mat-form-field>
3167
3492
  <mat-form-field appearance="outline">
3168
- <mat-label>Posicionamento</mat-label>
3493
+ <mat-label>{{ tx('editor.actions.layout.placement', 'Placement') }}</mat-label>
3169
3494
  <mat-select
3170
3495
  [value]="actionsModel.placement || null"
3171
3496
  (selectionChange)="updateActionsLayout('placement', $event.value)"
3172
3497
  >
3173
- <mat-option value="afterSections">Após seções</mat-option>
3174
- <mat-option value="insideLastSection">Dentro da última seção</mat-option>
3175
- <mat-option value="top">Topo</mat-option>
3498
+ <mat-option value="afterSections">{{ tx('editor.actions.layout.placement.afterSections', 'After sections') }}</mat-option>
3499
+ <mat-option value="insideLastSection">{{ tx('editor.actions.layout.placement.insideLastSection', 'Inside last section') }}</mat-option>
3500
+ <mat-option value="top">{{ tx('editor.actions.layout.placement.top', 'Top') }}</mat-option>
3176
3501
  </mat-select>
3177
3502
  </mat-form-field>
3178
3503
  <mat-slide-toggle
3179
3504
  [checked]="!!actionsModel.sticky"
3180
3505
  (change)="updateActionsLayout('sticky', $event.checked)"
3181
3506
  >
3182
- Ações fixas
3507
+ {{ tx('editor.actions.layout.sticky', 'Sticky actions') }}
3183
3508
  </mat-slide-toggle>
3184
3509
  <mat-slide-toggle
3185
3510
  [checked]="!!actionsModel.divider"
3186
3511
  (change)="updateActionsLayout('divider', $event.checked)"
3187
3512
  >
3188
- Mostrar divisor
3513
+ {{ tx('editor.actions.layout.divider', 'Show divider') }}
3189
3514
  </mat-slide-toggle>
3190
3515
  </div>
3191
3516
  </section>
@@ -3193,12 +3518,12 @@ class ManualFormConfigEditorComponent {
3193
3518
  <section class="mf-section">
3194
3519
  <div class="mf-section__header mf-section__header--row">
3195
3520
  <div>
3196
- <h3>Ações customizadas</h3>
3197
- <p class="mf-help">Crie botões extras com evento próprio.</p>
3521
+ <h3>{{ tx('editor.actions.customTitle', 'Custom actions') }}</h3>
3522
+ <p class="mf-help">{{ tx('editor.actions.customHelp', 'Create extra buttons with their own event.') }}</p>
3198
3523
  </div>
3199
3524
  <button mat-stroked-button type="button" (click)="addCustomAction()">
3200
3525
  <mat-icon>add</mat-icon>
3201
- Adicionar ação
3526
+ {{ tx('editor.actions.addCustom', 'Add action') }}
3202
3527
  </button>
3203
3528
  </div>
3204
3529
  <div class="mf-custom-actions">
@@ -3213,7 +3538,7 @@ class ManualFormConfigEditorComponent {
3213
3538
  </div>
3214
3539
  <div class="mf-custom-card__grid">
3215
3540
  <mat-form-field appearance="outline">
3216
- <mat-label>ID</mat-label>
3541
+ <mat-label>{{ tx('editor.actions.field.id', 'ID') }}</mat-label>
3217
3542
  <input
3218
3543
  matInput
3219
3544
  [value]="action.id || ''"
@@ -3221,7 +3546,7 @@ class ManualFormConfigEditorComponent {
3221
3546
  />
3222
3547
  </mat-form-field>
3223
3548
  <mat-form-field appearance="outline">
3224
- <mat-label>Label</mat-label>
3549
+ <mat-label>{{ tx('editor.actions.field.label', 'Label') }}</mat-label>
3225
3550
  <input
3226
3551
  matInput
3227
3552
  [value]="action.label || ''"
@@ -3229,7 +3554,7 @@ class ManualFormConfigEditorComponent {
3229
3554
  />
3230
3555
  </mat-form-field>
3231
3556
  <mat-form-field appearance="outline">
3232
- <mat-label>Evento (action)</mat-label>
3557
+ <mat-label>{{ tx('editor.actions.field.eventAction', 'Event (action)') }}</mat-label>
3233
3558
  <input
3234
3559
  matInput
3235
3560
  [value]="action.action || ''"
@@ -3237,7 +3562,7 @@ class ManualFormConfigEditorComponent {
3237
3562
  />
3238
3563
  </mat-form-field>
3239
3564
  <mat-form-field appearance="outline">
3240
- <mat-label>Ícone</mat-label>
3565
+ <mat-label>{{ tx('editor.actions.field.icon', 'Icon') }}</mat-label>
3241
3566
  <input
3242
3567
  matInput
3243
3568
  [value]="action.icon || ''"
@@ -3245,33 +3570,33 @@ class ManualFormConfigEditorComponent {
3245
3570
  />
3246
3571
  </mat-form-field>
3247
3572
  <mat-form-field appearance="outline">
3248
- <mat-label>Variante</mat-label>
3573
+ <mat-label>{{ tx('editor.actions.field.variant', 'Variant') }}</mat-label>
3249
3574
  <mat-select
3250
3575
  [value]="action.variant || null"
3251
3576
  (selectionChange)="updateCustomActionField(action, 'variant', $event.value)"
3252
3577
  >
3253
- <mat-option [value]="null">Padrão</mat-option>
3254
- <mat-option value="raised">Elevado</mat-option>
3255
- <mat-option value="stroked">Contornado</mat-option>
3256
- <mat-option value="flat">Plano</mat-option>
3257
- <mat-option value="fab">Flutuante</mat-option>
3578
+ <mat-option [value]="null">{{ tx('editor.actions.variant.default', 'Default') }}</mat-option>
3579
+ <mat-option value="raised">{{ tx('editor.actions.variant.raised', 'Raised') }}</mat-option>
3580
+ <mat-option value="stroked">{{ tx('editor.actions.variant.stroked', 'Stroked') }}</mat-option>
3581
+ <mat-option value="flat">{{ tx('editor.actions.variant.flat', 'Flat') }}</mat-option>
3582
+ <mat-option value="fab">{{ tx('editor.actions.variant.fab', 'Floating') }}</mat-option>
3258
3583
  </mat-select>
3259
3584
  </mat-form-field>
3260
3585
  <mat-form-field appearance="outline">
3261
- <mat-label>Cor</mat-label>
3586
+ <mat-label>{{ tx('editor.actions.field.color', 'Color') }}</mat-label>
3262
3587
  <mat-select
3263
3588
  [value]="action.color || null"
3264
3589
  (selectionChange)="updateCustomActionField(action, 'color', $event.value)"
3265
3590
  >
3266
- <mat-option [value]="null">Padrão</mat-option>
3267
- <mat-option value="primary">Primary</mat-option>
3268
- <mat-option value="accent">Accent</mat-option>
3269
- <mat-option value="warn">Warn</mat-option>
3270
- <mat-option value="basic">Basic</mat-option>
3591
+ <mat-option [value]="null">{{ tx('editor.actions.color.default', 'Default') }}</mat-option>
3592
+ <mat-option value="primary">{{ tx('editor.actions.color.primary', 'Primary') }}</mat-option>
3593
+ <mat-option value="accent">{{ tx('editor.actions.color.accent', 'Accent') }}</mat-option>
3594
+ <mat-option value="warn">{{ tx('editor.actions.color.warn', 'Warn') }}</mat-option>
3595
+ <mat-option value="basic">{{ tx('editor.actions.color.basic', 'Basic') }}</mat-option>
3271
3596
  </mat-select>
3272
3597
  </mat-form-field>
3273
3598
  <mat-form-field appearance="outline">
3274
- <mat-label>Atalho</mat-label>
3599
+ <mat-label>{{ tx('editor.actions.field.shortcut', 'Shortcut') }}</mat-label>
3275
3600
  <input
3276
3601
  matInput
3277
3602
  [value]="action.shortcut || ''"
@@ -3279,7 +3604,7 @@ class ManualFormConfigEditorComponent {
3279
3604
  />
3280
3605
  </mat-form-field>
3281
3606
  <mat-form-field appearance="outline">
3282
- <mat-label>Tooltip</mat-label>
3607
+ <mat-label>{{ tx('editor.actions.field.tooltip', 'Tooltip') }}</mat-label>
3283
3608
  <input
3284
3609
  matInput
3285
3610
  [value]="action.tooltip || ''"
@@ -3290,31 +3615,31 @@ class ManualFormConfigEditorComponent {
3290
3615
  [checked]="action.visible !== false"
3291
3616
  (change)="updateCustomActionField(action, 'visible', $event.checked)"
3292
3617
  >
3293
- Visível
3618
+ {{ tx('editor.actions.field.visible', 'Visible') }}
3294
3619
  </mat-slide-toggle>
3295
3620
  </div>
3296
3621
  </div>
3297
3622
  }
3298
3623
  } @else {
3299
- <p class="mf-empty">Nenhuma ação customizada cadastrada.</p>
3624
+ <p class="mf-empty">{{ tx('editor.actions.emptyCustom', 'No custom actions registered.') }}</p>
3300
3625
  }
3301
3626
  </div>
3302
3627
  </section>
3303
3628
  </div>
3304
3629
  </mat-tab>
3305
3630
 
3306
- <mat-tab label="Mensagens">
3631
+ <mat-tab [label]="tx('editor.tabs.messages', 'Messages')">
3307
3632
  <div class="mf-tab">
3308
3633
  <section class="mf-section">
3309
3634
  <div class="mf-section__header">
3310
3635
  <div>
3311
- <h3>Feedback padrão</h3>
3312
- <p class="mf-help">Mensagens de sucesso/erro exibidas pelo host.</p>
3636
+ <h3>{{ tx('editor.messages.defaultTitle', 'Default feedback') }}</h3>
3637
+ <p class="mf-help">{{ tx('editor.messages.defaultHelp', 'Success/error messages displayed by the host.') }}</p>
3313
3638
  </div>
3314
3639
  </div>
3315
3640
  <div class="mf-messages-grid">
3316
3641
  <mat-form-field appearance="outline">
3317
- <mat-label>Sucesso ao criar</mat-label>
3642
+ <mat-label>{{ tx('editor.messages.createSuccess', 'Create success') }}</mat-label>
3318
3643
  <input
3319
3644
  matInput
3320
3645
  [value]="messagesModel.createRegistrySuccess || ''"
@@ -3322,7 +3647,7 @@ class ManualFormConfigEditorComponent {
3322
3647
  />
3323
3648
  </mat-form-field>
3324
3649
  <mat-form-field appearance="outline">
3325
- <mat-label>Erro ao criar</mat-label>
3650
+ <mat-label>{{ tx('editor.messages.createError', 'Create error') }}</mat-label>
3326
3651
  <input
3327
3652
  matInput
3328
3653
  [value]="messagesModel.createRegistryError || ''"
@@ -3330,7 +3655,7 @@ class ManualFormConfigEditorComponent {
3330
3655
  />
3331
3656
  </mat-form-field>
3332
3657
  <mat-form-field appearance="outline">
3333
- <mat-label>Sucesso ao atualizar</mat-label>
3658
+ <mat-label>{{ tx('editor.messages.updateSuccess', 'Update success') }}</mat-label>
3334
3659
  <input
3335
3660
  matInput
3336
3661
  [value]="messagesModel.updateRegistrySuccess || ''"
@@ -3338,7 +3663,7 @@ class ManualFormConfigEditorComponent {
3338
3663
  />
3339
3664
  </mat-form-field>
3340
3665
  <mat-form-field appearance="outline">
3341
- <mat-label>Erro ao atualizar</mat-label>
3666
+ <mat-label>{{ tx('editor.messages.updateError', 'Update error') }}</mat-label>
3342
3667
  <input
3343
3668
  matInput
3344
3669
  [value]="messagesModel.updateRegistryError || ''"
@@ -3351,13 +3676,13 @@ class ManualFormConfigEditorComponent {
3351
3676
  <section class="mf-section">
3352
3677
  <div class="mf-section__header">
3353
3678
  <div>
3354
- <h3>Confirmações</h3>
3355
- <p class="mf-help">Textos mostrados antes de ações críticas.</p>
3679
+ <h3>{{ tx('editor.messages.confirmationsTitle', 'Confirmations') }}</h3>
3680
+ <p class="mf-help">{{ tx('editor.messages.confirmationsHelp', 'Texts shown before critical actions.') }}</p>
3356
3681
  </div>
3357
3682
  </div>
3358
3683
  <div class="mf-messages-grid">
3359
3684
  <mat-form-field appearance="outline">
3360
- <mat-label>Enviar</mat-label>
3685
+ <mat-label>{{ tx('editor.defaults.submit', 'Save') }}</mat-label>
3361
3686
  <input
3362
3687
  matInput
3363
3688
  [value]="messagesModel.confirmations?.submit || ''"
@@ -3365,7 +3690,7 @@ class ManualFormConfigEditorComponent {
3365
3690
  />
3366
3691
  </mat-form-field>
3367
3692
  <mat-form-field appearance="outline">
3368
- <mat-label>Cancelar</mat-label>
3693
+ <mat-label>{{ tx('editor.defaults.cancel', 'Cancel') }}</mat-label>
3369
3694
  <input
3370
3695
  matInput
3371
3696
  [value]="messagesModel.confirmations?.cancel || ''"
@@ -3373,7 +3698,7 @@ class ManualFormConfigEditorComponent {
3373
3698
  />
3374
3699
  </mat-form-field>
3375
3700
  <mat-form-field appearance="outline">
3376
- <mat-label>Resetar</mat-label>
3701
+ <mat-label>{{ tx('editor.defaults.reset', 'Reset') }}</mat-label>
3377
3702
  <input
3378
3703
  matInput
3379
3704
  [value]="messagesModel.confirmations?.reset || ''"
@@ -3386,13 +3711,13 @@ class ManualFormConfigEditorComponent {
3386
3711
  <section class="mf-section">
3387
3712
  <div class="mf-section__header">
3388
3713
  <div>
3389
- <h3>Loading</h3>
3390
- <p class="mf-help">Mensagens exibidas durante operações.</p>
3714
+ <h3>{{ tx('editor.messages.loadingTitle', 'Loading') }}</h3>
3715
+ <p class="mf-help">{{ tx('editor.messages.loadingHelp', 'Messages displayed during operations.') }}</p>
3391
3716
  </div>
3392
3717
  </div>
3393
3718
  <div class="mf-messages-grid">
3394
3719
  <mat-form-field appearance="outline">
3395
- <mat-label>Salvar</mat-label>
3720
+ <mat-label>{{ tx('editor.defaults.submit', 'Save') }}</mat-label>
3396
3721
  <input
3397
3722
  matInput
3398
3723
  [value]="messagesModel.loading?.submit || ''"
@@ -3400,7 +3725,7 @@ class ManualFormConfigEditorComponent {
3400
3725
  />
3401
3726
  </mat-form-field>
3402
3727
  <mat-form-field appearance="outline">
3403
- <mat-label>Cancelar</mat-label>
3728
+ <mat-label>{{ tx('editor.defaults.cancel', 'Cancel') }}</mat-label>
3404
3729
  <input
3405
3730
  matInput
3406
3731
  [value]="messagesModel.loading?.cancel || ''"
@@ -3408,7 +3733,7 @@ class ManualFormConfigEditorComponent {
3408
3733
  />
3409
3734
  </mat-form-field>
3410
3735
  <mat-form-field appearance="outline">
3411
- <mat-label>Resetar</mat-label>
3736
+ <mat-label>{{ tx('editor.defaults.reset', 'Reset') }}</mat-label>
3412
3737
  <input
3413
3738
  matInput
3414
3739
  [value]="messagesModel.loading?.reset || ''"
@@ -3421,8 +3746,8 @@ class ManualFormConfigEditorComponent {
3421
3746
  <section class="mf-section">
3422
3747
  <div class="mf-section__header">
3423
3748
  <div>
3424
- <h3>Mensagens por ação customizada</h3>
3425
- <p class="mf-help">Personalize textos por ID de ação.</p>
3749
+ <h3>{{ tx('editor.messages.customTitle', 'Messages by custom action') }}</h3>
3750
+ <p class="mf-help">{{ tx('editor.messages.customHelp', 'Customize texts by action ID.') }}</p>
3426
3751
  </div>
3427
3752
  </div>
3428
3753
  <div class="mf-custom-messages">
@@ -3432,7 +3757,7 @@ class ManualFormConfigEditorComponent {
3432
3757
  <div class="mf-custom-card__title">{{ action.label || action.id }}</div>
3433
3758
  <div class="mf-custom-card__grid">
3434
3759
  <mat-form-field appearance="outline">
3435
- <mat-label>Confirmação</mat-label>
3760
+ <mat-label>{{ tx('editor.messages.confirmationsTitle', 'Confirmations') }}</mat-label>
3436
3761
  <input
3437
3762
  matInput
3438
3763
  [value]="messagesModel.customActions?.[action.id || '']?.confirmation || ''"
@@ -3440,7 +3765,7 @@ class ManualFormConfigEditorComponent {
3440
3765
  />
3441
3766
  </mat-form-field>
3442
3767
  <mat-form-field appearance="outline">
3443
- <mat-label>Sucesso</mat-label>
3768
+ <mat-label>{{ tx('editor.shared.success', 'Success') }}</mat-label>
3444
3769
  <input
3445
3770
  matInput
3446
3771
  [value]="messagesModel.customActions?.[action.id || '']?.success || ''"
@@ -3448,7 +3773,7 @@ class ManualFormConfigEditorComponent {
3448
3773
  />
3449
3774
  </mat-form-field>
3450
3775
  <mat-form-field appearance="outline">
3451
- <mat-label>Erro</mat-label>
3776
+ <mat-label>{{ tx('editor.shared.error', 'Error') }}</mat-label>
3452
3777
  <input
3453
3778
  matInput
3454
3779
  [value]="messagesModel.customActions?.[action.id || '']?.error || ''"
@@ -3459,64 +3784,64 @@ class ManualFormConfigEditorComponent {
3459
3784
  </div>
3460
3785
  }
3461
3786
  } @else {
3462
- <p class="mf-empty">Cadastre ações customizadas para configurar mensagens específicas.</p>
3787
+ <p class="mf-empty">{{ tx('editor.messages.emptyCustom', 'Register custom actions to configure specific messages.') }}</p>
3463
3788
  }
3464
3789
  </div>
3465
3790
  </section>
3466
3791
  </div>
3467
3792
  </mat-tab>
3468
3793
 
3469
- <mat-tab label="Comportamento">
3794
+ <mat-tab [label]="tx('editor.tabs.behavior', 'Behavior')">
3470
3795
  <div class="mf-tab">
3471
3796
  <section class="mf-section">
3472
3797
  <div class="mf-section__header">
3473
3798
  <div>
3474
- <h3>Comportamento do formulário</h3>
3475
- <p class="mf-help">Preferências aplicadas pelo host ou runtime.</p>
3799
+ <h3>{{ tx('editor.behavior.title', 'Form behavior') }}</h3>
3800
+ <p class="mf-help">{{ tx('editor.behavior.help', 'Preferences applied by the host or runtime.') }}</p>
3476
3801
  </div>
3477
3802
  </div>
3478
- <div class="mf-note">Estas opções são persistidas no config; o host decide como aplicar.</div>
3803
+ <div class="mf-note">{{ tx('editor.behavior.note', 'These options are persisted in config; the host decides how to apply them.') }}</div>
3479
3804
  <div class="mf-toggle-grid">
3480
3805
  <mat-slide-toggle
3481
3806
  [checked]="!!behaviorModel.confirmOnUnsavedChanges"
3482
3807
  (change)="updateBehavior('confirmOnUnsavedChanges', $event.checked)"
3483
3808
  >
3484
- Confirmar ao sair com alterações não salvas
3809
+ {{ tx('editor.behavior.confirmUnsaved', 'Confirm unsaved changes before leaving') }}
3485
3810
  </mat-slide-toggle>
3486
3811
  <mat-slide-toggle
3487
3812
  [checked]="!!behaviorModel.trackHistory"
3488
3813
  (change)="updateBehavior('trackHistory', $event.checked)"
3489
3814
  >
3490
- Rastrear histórico de alterações
3815
+ {{ tx('editor.behavior.trackHistory', 'Track change history') }}
3491
3816
  </mat-slide-toggle>
3492
3817
  <mat-slide-toggle
3493
3818
  [checked]="!!behaviorModel.focusFirstError"
3494
3819
  (change)="updateBehavior('focusFirstError', $event.checked)"
3495
3820
  >
3496
- Focar no primeiro erro ao submeter
3821
+ {{ tx('editor.behavior.focusFirstError', 'Focus the first error on submit') }}
3497
3822
  </mat-slide-toggle>
3498
3823
  <mat-slide-toggle
3499
3824
  [checked]="!!behaviorModel.scrollToErrors"
3500
3825
  (change)="updateBehavior('scrollToErrors', $event.checked)"
3501
3826
  >
3502
- Rolar até os erros ao submeter
3827
+ {{ tx('editor.behavior.scrollToErrors', 'Scroll to errors on submit') }}
3503
3828
  </mat-slide-toggle>
3504
3829
  <mat-slide-toggle
3505
3830
  [checked]="!!behaviorModel.clearAfterSave"
3506
3831
  (change)="updateBehavior('clearAfterSave', $event.checked)"
3507
3832
  >
3508
- Limpar formulário após salvar
3833
+ {{ tx('editor.behavior.clearAfterSave', 'Clear form after save') }}
3509
3834
  </mat-slide-toggle>
3510
3835
  <mat-slide-toggle
3511
3836
  [checked]="!!behaviorModel.reactiveValidation"
3512
3837
  (change)="updateBehavior('reactiveValidation', $event.checked)"
3513
3838
  >
3514
- Validação reativa
3839
+ {{ tx('editor.behavior.reactiveValidation', 'Reactive validation') }}
3515
3840
  </mat-slide-toggle>
3516
3841
  </div>
3517
3842
  <div class="mf-actions-layout">
3518
3843
  <mat-form-field appearance="outline">
3519
- <mat-label>Redirecionar após salvar (URL)</mat-label>
3844
+ <mat-label>{{ tx('editor.behavior.redirectAfterSave', 'Redirect after save (URL)') }}</mat-label>
3520
3845
  <input
3521
3846
  matInput
3522
3847
  [value]="behaviorModel.redirectAfterSave || ''"
@@ -3524,7 +3849,7 @@ class ManualFormConfigEditorComponent {
3524
3849
  />
3525
3850
  </mat-form-field>
3526
3851
  <mat-form-field appearance="outline">
3527
- <mat-label>Debounce validação reativa (ms)</mat-label>
3852
+ <mat-label>{{ tx('editor.behavior.reactiveValidationDebounce', 'Reactive validation debounce (ms)') }}</mat-label>
3528
3853
  <input
3529
3854
  matInput
3530
3855
  type="number"
@@ -3538,19 +3863,19 @@ class ManualFormConfigEditorComponent {
3538
3863
  </div>
3539
3864
  </mat-tab>
3540
3865
 
3541
- <mat-tab label="Dicas">
3866
+ <mat-tab [label]="tx('editor.tabs.hints', 'Hints')">
3542
3867
  <div class="mf-tab">
3543
3868
  <section class="mf-section">
3544
3869
  <div class="mf-section__header">
3545
3870
  <div>
3546
- <h3>Mensagens de modo</h3>
3547
- <p class="mf-help">Textos auxiliares exibidos pelo host.</p>
3871
+ <h3>{{ tx('editor.hints.modeTitle', 'Mode messages') }}</h3>
3872
+ <p class="mf-help">{{ tx('editor.hints.modeHelp', 'Auxiliary texts displayed by the host.') }}</p>
3548
3873
  </div>
3549
3874
  </div>
3550
- <div class="mf-note">Útil para i18n e orientação do usuário.</div>
3875
+ <div class="mf-note">{{ tx('editor.hints.modeNote', 'Useful for i18n and user guidance.') }}</div>
3551
3876
  <div class="mf-messages-grid">
3552
3877
  <mat-form-field appearance="outline">
3553
- <mat-label>Criar</mat-label>
3878
+ <mat-label>{{ tx('editor.hints.mode.create', 'Create') }}</mat-label>
3554
3879
  <input
3555
3880
  matInput
3556
3881
  [value]="hintsModel.dataModes.create"
@@ -3558,7 +3883,7 @@ class ManualFormConfigEditorComponent {
3558
3883
  />
3559
3884
  </mat-form-field>
3560
3885
  <mat-form-field appearance="outline">
3561
- <mat-label>Editar</mat-label>
3886
+ <mat-label>{{ tx('editor.hints.mode.edit', 'Edit') }}</mat-label>
3562
3887
  <input
3563
3888
  matInput
3564
3889
  [value]="hintsModel.dataModes.edit"
@@ -3566,7 +3891,7 @@ class ManualFormConfigEditorComponent {
3566
3891
  />
3567
3892
  </mat-form-field>
3568
3893
  <mat-form-field appearance="outline">
3569
- <mat-label>Visualizar</mat-label>
3894
+ <mat-label>{{ tx('editor.hints.mode.view', 'View') }}</mat-label>
3570
3895
  <input
3571
3896
  matInput
3572
3897
  [value]="hintsModel.dataModes.view"
@@ -3579,13 +3904,13 @@ class ManualFormConfigEditorComponent {
3579
3904
  <section class="mf-section">
3580
3905
  <div class="mf-section__header">
3581
3906
  <div>
3582
- <h3>Dicas de UI</h3>
3583
- <p class="mf-help">Ajuda contextual para estados do formulário.</p>
3907
+ <h3>{{ tx('editor.hints.uiTitle', 'UI hints') }}</h3>
3908
+ <p class="mf-help">{{ tx('editor.hints.uiHelp', 'Contextual help for form states.') }}</p>
3584
3909
  </div>
3585
3910
  </div>
3586
3911
  <div class="mf-messages-grid">
3587
3912
  <mat-form-field appearance="outline">
3588
- <mat-label>Apresentação</mat-label>
3913
+ <mat-label>{{ tx('editor.hints.ui.presentation', 'Presentation') }}</mat-label>
3589
3914
  <textarea
3590
3915
  matInput
3591
3916
  rows="2"
@@ -3594,7 +3919,7 @@ class ManualFormConfigEditorComponent {
3594
3919
  ></textarea>
3595
3920
  </mat-form-field>
3596
3921
  <mat-form-field appearance="outline">
3597
- <mat-label>Somente leitura</mat-label>
3922
+ <mat-label>{{ tx('editor.hints.ui.readonly', 'Read-only') }}</mat-label>
3598
3923
  <textarea
3599
3924
  matInput
3600
3925
  rows="2"
@@ -3603,7 +3928,7 @@ class ManualFormConfigEditorComponent {
3603
3928
  ></textarea>
3604
3929
  </mat-form-field>
3605
3930
  <mat-form-field appearance="outline">
3606
- <mat-label>Desabilitado</mat-label>
3931
+ <mat-label>{{ tx('editor.hints.ui.disabled', 'Disabled') }}</mat-label>
3607
3932
  <textarea
3608
3933
  matInput
3609
3934
  rows="2"
@@ -3612,7 +3937,7 @@ class ManualFormConfigEditorComponent {
3612
3937
  ></textarea>
3613
3938
  </mat-form-field>
3614
3939
  <mat-form-field appearance="outline">
3615
- <mat-label>Visível</mat-label>
3940
+ <mat-label>{{ tx('editor.hints.ui.visible', 'Visible') }}</mat-label>
3616
3941
  <textarea
3617
3942
  matInput
3618
3943
  rows="2"
@@ -3625,24 +3950,24 @@ class ManualFormConfigEditorComponent {
3625
3950
  </div>
3626
3951
  </mat-tab>
3627
3952
 
3628
- <mat-tab label="Hooks">
3953
+ <mat-tab [label]="tx('editor.tabs.hooks', 'Hooks')">
3629
3954
  <div class="mf-tab">
3630
3955
  <section class="mf-section">
3631
3956
  <div class="mf-section__header">
3632
3957
  <div>
3633
- <h3>Hooks de ciclo de vida</h3>
3634
- <p class="mf-help">Defina ações automatizadas por estágio.</p>
3958
+ <h3>{{ tx('editor.hooks.title', 'Lifecycle hooks') }}</h3>
3959
+ <p class="mf-help">{{ tx('editor.hooks.help', 'Define automated actions by stage.') }}</p>
3635
3960
  </div>
3636
3961
  <div class="mf-actions-row">
3637
3962
  <button mat-stroked-button type="button" (click)="resetHooks()">
3638
- Restaurar
3963
+ {{ tx('editor.hooks.reset', 'Reset') }}
3639
3964
  </button>
3640
3965
  <button mat-flat-button color="primary" type="button" (click)="applyHooks()">
3641
- Aplicar hooks
3966
+ {{ tx('editor.hooks.apply', 'Apply hooks') }}
3642
3967
  </button>
3643
3968
  </div>
3644
3969
  </div>
3645
- <div class="mf-note">Executa apenas se o host registrar hooks disponíveis.</div>
3970
+ <div class="mf-note">{{ tx('editor.hooks.note', 'Runs only if the host registers available hooks.') }}</div>
3646
3971
  <div class="mf-hooks-grid">
3647
3972
  @for (stage of hookStages; track stage) {
3648
3973
  <mat-form-field appearance="outline" class="mf-hook-field">
@@ -3652,14 +3977,14 @@ class ManualFormConfigEditorComponent {
3652
3977
  rows="4"
3653
3978
  [value]="hooksText[stage]"
3654
3979
  (input)="onHookTextChange(stage, $any($event.target).value)"
3655
- placeholder='[{ "id": "notifySuccess", "priority": 0, "args": {} }]'
3980
+ [placeholder]="hookPlaceholder()"
3656
3981
  ></textarea>
3657
3982
  <button
3658
3983
  mat-icon-button
3659
3984
  matSuffix
3660
3985
  class="help-icon-button"
3661
3986
  type="button"
3662
- [matTooltip]="'Array JSON de hooks para ' + stage + ' (id, priority, timeoutMs, args).'"
3987
+ [matTooltip]="hookTooltip(stage)"
3663
3988
  matTooltipPosition="above"
3664
3989
  >
3665
3990
  <mat-icon>help_outline</mat-icon>
@@ -3674,36 +3999,36 @@ class ManualFormConfigEditorComponent {
3674
3999
  </div>
3675
4000
  </mat-tab>
3676
4001
 
3677
- <mat-tab label="Regras">
4002
+ <mat-tab [label]="tx('editor.tabs.rules', 'Rules')">
3678
4003
  <div class="mf-tab">
3679
4004
  <section class="mf-section">
3680
4005
  <div class="mf-section__header">
3681
4006
  <div>
3682
- <h3>Regras de layout</h3>
3683
- <p class="mf-help">Regras avançadas para visibilidade e comportamento.</p>
4007
+ <h3>{{ tx('editor.rules.title', 'Layout rules') }}</h3>
4008
+ <p class="mf-help">{{ tx('editor.rules.help', 'Advanced rules for visibility and behavior.') }}</p>
3684
4009
  </div>
3685
4010
  <div class="mf-actions-row">
3686
4011
  <button mat-flat-button color="primary" type="button" (click)="applyRules()">
3687
- Aplicar regras
4012
+ {{ tx('editor.rules.apply', 'Apply rules') }}
3688
4013
  </button>
3689
4014
  </div>
3690
4015
  </div>
3691
- <div class="mf-note">Persistido no config; a execução depende do host.</div>
4016
+ <div class="mf-note">{{ tx('editor.rules.note', 'Persisted in config; execution depends on the host.') }}</div>
3692
4017
  <mat-form-field appearance="outline">
3693
- <mat-label>formRules (JSON)</mat-label>
4018
+ <mat-label>{{ tx('editor.rules.formRulesLabel', 'formRules (JSON)') }}</mat-label>
3694
4019
  <textarea
3695
4020
  matInput
3696
4021
  rows="6"
3697
4022
  [value]="formRulesText"
3698
4023
  (input)="onRulesTextChange($any($event.target).value)"
3699
- placeholder='[{"id":"rule-1","name":"Obrigatoriedade","targetType":"field","targets":["campo"],"effect":{"condition":"{campo} != null","properties":{"required":true}}}]'
4024
+ [placeholder]="formRulesPlaceholder()"
3700
4025
  ></textarea>
3701
4026
  <button
3702
4027
  mat-icon-button
3703
4028
  matSuffix
3704
4029
  class="help-icon-button"
3705
4030
  type="button"
3706
- [matTooltip]="'Array JSON com regras (id, targetType, targets, effect).'"
4031
+ [matTooltip]="tx('editor.rules.tooltip', 'JSON array with rules (id, targetType, targets, effect).')"
3707
4032
  matTooltipPosition="above"
3708
4033
  >
3709
4034
  <mat-icon>help_outline</mat-icon>
@@ -3713,7 +4038,7 @@ class ManualFormConfigEditorComponent {
3713
4038
  }
3714
4039
  </mat-form-field>
3715
4040
  <mat-form-field appearance="outline">
3716
- <mat-label>formRulesState (JSON)</mat-label>
4041
+ <mat-label>{{ tx('editor.rules.formRulesStateLabel', 'formRulesState (JSON)') }}</mat-label>
3717
4042
  <textarea
3718
4043
  matInput
3719
4044
  rows="6"
@@ -3726,7 +4051,7 @@ class ManualFormConfigEditorComponent {
3726
4051
  matSuffix
3727
4052
  class="help-icon-button"
3728
4053
  type="button"
3729
- [matTooltip]="'Estado bruto do editor visual (opcional).'"
4054
+ [matTooltip]="tx('editor.rules.stateTooltip', 'Raw state from the visual editor (optional).')"
3730
4055
  matTooltipPosition="above"
3731
4056
  >
3732
4057
  <mat-icon>help_outline</mat-icon>
@@ -3737,23 +4062,23 @@ class ManualFormConfigEditorComponent {
3737
4062
  </mat-form-field>
3738
4063
  <div class="mf-actions-row mf-actions-row--end">
3739
4064
  <button mat-flat-button color="primary" type="button" (click)="applyRules()">
3740
- Aplicar regras
4065
+ {{ tx('editor.rules.apply', 'Apply rules') }}
3741
4066
  </button>
3742
4067
  </div>
3743
4068
  </section>
3744
4069
  </div>
3745
4070
  </mat-tab>
3746
4071
 
3747
- <mat-tab label="Cascatas">
4072
+ <mat-tab [label]="tx('editor.tabs.cascade', 'Cascades')">
3748
4073
  <div class="mf-tab">
3749
4074
  <section class="mf-section mf-section--full">
3750
4075
  <div class="mf-section__header">
3751
4076
  <div>
3752
- <h3>Dependências entre campos</h3>
3753
- <p class="mf-help">Configure cascatas nativas baseadas em metadados.</p>
4077
+ <h3>{{ tx('editor.cascade.title', 'Field dependencies') }}</h3>
4078
+ <p class="mf-help">{{ tx('editor.cascade.help', 'Configure native cascades based on metadata.') }}</p>
3754
4079
  </div>
3755
4080
  </div>
3756
- <div class="mf-note">As alterações atualizam metadados e são salvas no draft.</div>
4081
+ <div class="mf-note">{{ tx('editor.cascade.note', 'Changes update metadata and are saved in the draft.') }}</div>
3757
4082
  <praxis-cascade-manager-tab
3758
4083
  [fields]="cascadeFields"
3759
4084
  (apply)="applyCascadePatch($event)"
@@ -3779,33 +4104,33 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
3779
4104
  MatIconModule,
3780
4105
  MatTooltipModule,
3781
4106
  CascadeManagerTabComponent,
3782
- ], template: `
4107
+ ], providers: [providePraxisManualFormI18n()], template: `
3783
4108
  <div class="mf-editor">
3784
4109
  <div class="mf-editor__toolbar">
3785
4110
  <div class="mf-editor__title">
3786
- <span>Configurações do formulário</span>
3787
- <small class="mf-editor__subtitle">Campos, ações, mensagens e comportamento</small>
4111
+ <span>{{ tx('editor.title', 'Form settings') }}</span>
4112
+ <small class="mf-editor__subtitle">{{ tx('editor.subtitle', 'Fields, actions, messages and behavior') }}</small>
3788
4113
  </div>
3789
4114
  <div class="spacer"></div>
3790
- <button type="button" class="mf-btn" (click)="close()">Fechar</button>
4115
+ <button type="button" class="mf-btn" (click)="close()">{{ tx('editor.close', 'Close') }}</button>
3791
4116
  </div>
3792
4117
 
3793
4118
  <mat-tab-group class="mf-tabs">
3794
- <mat-tab label="Campos">
4119
+ <mat-tab [label]="tx('editor.tabs.fields', 'Fields')">
3795
4120
  <div class="mf-tab">
3796
4121
  <label class="mf-editor__filter">
3797
4122
  <input type="checkbox" [(ngModel)]="onlyHidden" (change)="applyFilter()" />
3798
- <span>Mostrar apenas ocultos</span>
4123
+ <span>{{ tx('editor.fields.onlyHidden', 'Show hidden only') }}</span>
3799
4124
  </label>
3800
4125
  <div class="mf-editor__list">
3801
4126
  <div class="mf-editor__row mf-editor__row--head">
3802
- <div class="col col--name">Campo</div>
3803
- <div class="col col--label">Rótulo</div>
3804
- <div class="col col--type">Tipo</div>
3805
- <div class="col col--vis">Visível</div>
3806
- <div class="col col--req">Obrigatório</div>
3807
- <div class="col col--ro">Som. leitura</div>
3808
- <div class="col col--dis">Desabilitado</div>
4127
+ <div class="col col--name">{{ tx('editor.fields.name', 'Field') }}</div>
4128
+ <div class="col col--label">{{ tx('editor.fields.label', 'Label') }}</div>
4129
+ <div class="col col--type">{{ tx('editor.fields.type', 'Type') }}</div>
4130
+ <div class="col col--vis">{{ tx('editor.fields.visible', 'Visible') }}</div>
4131
+ <div class="col col--req">{{ tx('editor.fields.required', 'Required') }}</div>
4132
+ <div class="col col--ro">{{ tx('editor.fields.readOnly', 'Read-only') }}</div>
4133
+ <div class="col col--dis">{{ tx('editor.fields.disabled', 'Disabled') }}</div>
3809
4134
  </div>
3810
4135
 
3811
4136
  @for (f of filtered; track f.name) {
@@ -3816,25 +4141,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
3816
4141
  <div class="col col--vis">
3817
4142
  <label class="toggle">
3818
4143
  <input type="checkbox" [checked]="!f.hidden" (change)="toggleVisibility(f, $any($event.target).checked)" />
3819
- <span>{{ f.hidden ? 'Oculto' : 'Visível' }}</span>
4144
+ <span>{{ f.hidden ? tx('editor.fields.hiddenState', 'Hidden') : tx('editor.fields.visibleState', 'Visible') }}</span>
3820
4145
  </label>
3821
4146
  </div>
3822
4147
  <div class="col col--req">
3823
4148
  <label class="toggle">
3824
4149
  <input type="checkbox" [checked]="!!f.required" (change)="toggleRequired(f, $any($event.target).checked)" />
3825
- <span>{{ f.required ? 'Sim' : 'Não' }}</span>
4150
+ <span>{{ f.required ? tx('editor.shared.yes', 'Yes') : tx('editor.shared.no', 'No') }}</span>
3826
4151
  </label>
3827
4152
  </div>
3828
4153
  <div class="col col--ro">
3829
4154
  <label class="toggle">
3830
4155
  <input type="checkbox" [checked]="!!f.readOnly" (change)="toggleReadOnly(f, $any($event.target).checked)" />
3831
- <span>{{ f.readOnly ? 'Sim' : 'Não' }}</span>
4156
+ <span>{{ f.readOnly ? tx('editor.shared.yes', 'Yes') : tx('editor.shared.no', 'No') }}</span>
3832
4157
  </label>
3833
4158
  </div>
3834
4159
  <div class="col col--dis">
3835
4160
  <label class="toggle">
3836
4161
  <input type="checkbox" [checked]="!!f.disabled" (change)="toggleDisabled(f, $any($event.target).checked)" />
3837
- <span>{{ f.disabled ? 'Sim' : 'Não' }}</span>
4162
+ <span>{{ f.disabled ? tx('editor.shared.yes', 'Yes') : tx('editor.shared.no', 'No') }}</span>
3838
4163
  </label>
3839
4164
  </div>
3840
4165
  </div>
@@ -3843,13 +4168,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
3843
4168
  </div>
3844
4169
  </mat-tab>
3845
4170
 
3846
- <mat-tab label="Ações">
4171
+ <mat-tab [label]="tx('editor.tabs.actions', 'Actions')">
3847
4172
  <div class="mf-tab">
3848
4173
  <section class="mf-section">
3849
4174
  <div class="mf-section__header">
3850
4175
  <div>
3851
- <h3>Botões padrão</h3>
3852
- <p class="mf-help">Controle rótulos, visibilidade e estilo dos botões básicos.</p>
4176
+ <h3>{{ tx('editor.actions.defaultTitle', 'Default buttons') }}</h3>
4177
+ <p class="mf-help">{{ tx('editor.actions.defaultHelp', 'Control labels, visibility and style for the basic buttons.') }}</p>
3853
4178
  </div>
3854
4179
  </div>
3855
4180
  <div class="mf-actions-grid">
@@ -3860,10 +4185,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
3860
4185
  [checked]="actionsModel[block.key].visible"
3861
4186
  (change)="updateActionField(block.key, 'visible', $event.checked)"
3862
4187
  >
3863
- Visível
4188
+ {{ tx('editor.actions.field.visible', 'Visible') }}
3864
4189
  </mat-slide-toggle>
3865
4190
  <mat-form-field appearance="outline">
3866
- <mat-label>Label</mat-label>
4191
+ <mat-label>{{ tx('editor.actions.field.label', 'Label') }}</mat-label>
3867
4192
  <input
3868
4193
  matInput
3869
4194
  [value]="actionsModel[block.key].label"
@@ -3871,7 +4196,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
3871
4196
  />
3872
4197
  </mat-form-field>
3873
4198
  <mat-form-field appearance="outline">
3874
- <mat-label>Ícone</mat-label>
4199
+ <mat-label>{{ tx('editor.actions.field.icon', 'Icon') }}</mat-label>
3875
4200
  <input
3876
4201
  matInput
3877
4202
  [value]="actionsModel[block.key].icon || ''"
@@ -3879,33 +4204,33 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
3879
4204
  />
3880
4205
  </mat-form-field>
3881
4206
  <mat-form-field appearance="outline">
3882
- <mat-label>Variante</mat-label>
4207
+ <mat-label>{{ tx('editor.actions.field.variant', 'Variant') }}</mat-label>
3883
4208
  <mat-select
3884
4209
  [value]="actionsModel[block.key].variant || null"
3885
4210
  (selectionChange)="updateActionField(block.key, 'variant', $event.value)"
3886
4211
  >
3887
- <mat-option [value]="null">Padrão</mat-option>
3888
- <mat-option value="raised">Elevado</mat-option>
3889
- <mat-option value="stroked">Contornado</mat-option>
3890
- <mat-option value="flat">Plano</mat-option>
3891
- <mat-option value="fab">Flutuante</mat-option>
4212
+ <mat-option [value]="null">{{ tx('editor.actions.variant.default', 'Default') }}</mat-option>
4213
+ <mat-option value="raised">{{ tx('editor.actions.variant.raised', 'Raised') }}</mat-option>
4214
+ <mat-option value="stroked">{{ tx('editor.actions.variant.stroked', 'Stroked') }}</mat-option>
4215
+ <mat-option value="flat">{{ tx('editor.actions.variant.flat', 'Flat') }}</mat-option>
4216
+ <mat-option value="fab">{{ tx('editor.actions.variant.fab', 'Floating') }}</mat-option>
3892
4217
  </mat-select>
3893
4218
  </mat-form-field>
3894
4219
  <mat-form-field appearance="outline">
3895
- <mat-label>Cor</mat-label>
4220
+ <mat-label>{{ tx('editor.actions.field.color', 'Color') }}</mat-label>
3896
4221
  <mat-select
3897
4222
  [value]="actionsModel[block.key].color || null"
3898
4223
  (selectionChange)="updateActionField(block.key, 'color', $event.value)"
3899
4224
  >
3900
- <mat-option [value]="null">Padrão</mat-option>
3901
- <mat-option value="primary">Primary</mat-option>
3902
- <mat-option value="accent">Accent</mat-option>
3903
- <mat-option value="warn">Warn</mat-option>
3904
- <mat-option value="basic">Basic</mat-option>
4225
+ <mat-option [value]="null">{{ tx('editor.actions.color.default', 'Default') }}</mat-option>
4226
+ <mat-option value="primary">{{ tx('editor.actions.color.primary', 'Primary') }}</mat-option>
4227
+ <mat-option value="accent">{{ tx('editor.actions.color.accent', 'Accent') }}</mat-option>
4228
+ <mat-option value="warn">{{ tx('editor.actions.color.warn', 'Warn') }}</mat-option>
4229
+ <mat-option value="basic">{{ tx('editor.actions.color.basic', 'Basic') }}</mat-option>
3905
4230
  </mat-select>
3906
4231
  </mat-form-field>
3907
4232
  <mat-form-field appearance="outline">
3908
- <mat-label>Atalho</mat-label>
4233
+ <mat-label>{{ tx('editor.actions.field.shortcut', 'Shortcut') }}</mat-label>
3909
4234
  <input
3910
4235
  matInput
3911
4236
  [value]="actionsModel[block.key].shortcut || ''"
@@ -3920,67 +4245,67 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
3920
4245
  <section class="mf-section">
3921
4246
  <div class="mf-section__header">
3922
4247
  <div>
3923
- <h3>Layout das ações</h3>
3924
- <p class="mf-help">Define alinhamento e disposição da barra de ações.</p>
4248
+ <h3>{{ tx('editor.actions.layoutTitle', 'Actions layout') }}</h3>
4249
+ <p class="mf-help">{{ tx('editor.actions.layoutHelp', 'Defines alignment and disposition of the actions bar.') }}</p>
3925
4250
  </div>
3926
4251
  </div>
3927
4252
  <div class="mf-actions-layout">
3928
4253
  <mat-form-field appearance="outline">
3929
- <mat-label>Posição</mat-label>
4254
+ <mat-label>{{ tx('editor.actions.layout.position', 'Position') }}</mat-label>
3930
4255
  <mat-select
3931
4256
  [value]="actionsModel.position || null"
3932
4257
  (selectionChange)="updateActionsLayout('position', $event.value)"
3933
4258
  >
3934
- <mat-option value="left">Esquerda</mat-option>
3935
- <mat-option value="center">Centro</mat-option>
3936
- <mat-option value="right">Direita</mat-option>
3937
- <mat-option value="justified">Justificado</mat-option>
3938
- <mat-option value="split">Split</mat-option>
4259
+ <mat-option value="left">{{ tx('editor.actions.layout.position.left', 'Left') }}</mat-option>
4260
+ <mat-option value="center">{{ tx('editor.actions.layout.position.center', 'Center') }}</mat-option>
4261
+ <mat-option value="right">{{ tx('editor.actions.layout.position.right', 'Right') }}</mat-option>
4262
+ <mat-option value="justified">{{ tx('editor.actions.layout.position.justified', 'Justified') }}</mat-option>
4263
+ <mat-option value="split">{{ tx('editor.actions.layout.position.split', 'Split') }}</mat-option>
3939
4264
  </mat-select>
3940
4265
  </mat-form-field>
3941
4266
  <mat-form-field appearance="outline">
3942
- <mat-label>Orientação</mat-label>
4267
+ <mat-label>{{ tx('editor.actions.layout.orientation', 'Orientation') }}</mat-label>
3943
4268
  <mat-select
3944
4269
  [value]="actionsModel.orientation || null"
3945
4270
  (selectionChange)="updateActionsLayout('orientation', $event.value)"
3946
4271
  >
3947
- <mat-option value="horizontal">Horizontal</mat-option>
3948
- <mat-option value="vertical">Vertical</mat-option>
4272
+ <mat-option value="horizontal">{{ tx('editor.actions.layout.orientation.horizontal', 'Horizontal') }}</mat-option>
4273
+ <mat-option value="vertical">{{ tx('editor.actions.layout.orientation.vertical', 'Vertical') }}</mat-option>
3949
4274
  </mat-select>
3950
4275
  </mat-form-field>
3951
4276
  <mat-form-field appearance="outline">
3952
- <mat-label>Espaçamento</mat-label>
4277
+ <mat-label>{{ tx('editor.actions.layout.spacing', 'Spacing') }}</mat-label>
3953
4278
  <mat-select
3954
4279
  [value]="actionsModel.spacing || null"
3955
4280
  (selectionChange)="updateActionsLayout('spacing', $event.value)"
3956
4281
  >
3957
- <mat-option value="compact">Compacto</mat-option>
3958
- <mat-option value="normal">Normal</mat-option>
3959
- <mat-option value="spacious">Espaçoso</mat-option>
4282
+ <mat-option value="compact">{{ tx('editor.actions.layout.spacing.compact', 'Compact') }}</mat-option>
4283
+ <mat-option value="normal">{{ tx('editor.actions.layout.spacing.normal', 'Normal') }}</mat-option>
4284
+ <mat-option value="spacious">{{ tx('editor.actions.layout.spacing.spacious', 'Spacious') }}</mat-option>
3960
4285
  </mat-select>
3961
4286
  </mat-form-field>
3962
4287
  <mat-form-field appearance="outline">
3963
- <mat-label>Posicionamento</mat-label>
4288
+ <mat-label>{{ tx('editor.actions.layout.placement', 'Placement') }}</mat-label>
3964
4289
  <mat-select
3965
4290
  [value]="actionsModel.placement || null"
3966
4291
  (selectionChange)="updateActionsLayout('placement', $event.value)"
3967
4292
  >
3968
- <mat-option value="afterSections">Após seções</mat-option>
3969
- <mat-option value="insideLastSection">Dentro da última seção</mat-option>
3970
- <mat-option value="top">Topo</mat-option>
4293
+ <mat-option value="afterSections">{{ tx('editor.actions.layout.placement.afterSections', 'After sections') }}</mat-option>
4294
+ <mat-option value="insideLastSection">{{ tx('editor.actions.layout.placement.insideLastSection', 'Inside last section') }}</mat-option>
4295
+ <mat-option value="top">{{ tx('editor.actions.layout.placement.top', 'Top') }}</mat-option>
3971
4296
  </mat-select>
3972
4297
  </mat-form-field>
3973
4298
  <mat-slide-toggle
3974
4299
  [checked]="!!actionsModel.sticky"
3975
4300
  (change)="updateActionsLayout('sticky', $event.checked)"
3976
4301
  >
3977
- Ações fixas
4302
+ {{ tx('editor.actions.layout.sticky', 'Sticky actions') }}
3978
4303
  </mat-slide-toggle>
3979
4304
  <mat-slide-toggle
3980
4305
  [checked]="!!actionsModel.divider"
3981
4306
  (change)="updateActionsLayout('divider', $event.checked)"
3982
4307
  >
3983
- Mostrar divisor
4308
+ {{ tx('editor.actions.layout.divider', 'Show divider') }}
3984
4309
  </mat-slide-toggle>
3985
4310
  </div>
3986
4311
  </section>
@@ -3988,12 +4313,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
3988
4313
  <section class="mf-section">
3989
4314
  <div class="mf-section__header mf-section__header--row">
3990
4315
  <div>
3991
- <h3>Ações customizadas</h3>
3992
- <p class="mf-help">Crie botões extras com evento próprio.</p>
4316
+ <h3>{{ tx('editor.actions.customTitle', 'Custom actions') }}</h3>
4317
+ <p class="mf-help">{{ tx('editor.actions.customHelp', 'Create extra buttons with their own event.') }}</p>
3993
4318
  </div>
3994
4319
  <button mat-stroked-button type="button" (click)="addCustomAction()">
3995
4320
  <mat-icon>add</mat-icon>
3996
- Adicionar ação
4321
+ {{ tx('editor.actions.addCustom', 'Add action') }}
3997
4322
  </button>
3998
4323
  </div>
3999
4324
  <div class="mf-custom-actions">
@@ -4008,7 +4333,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4008
4333
  </div>
4009
4334
  <div class="mf-custom-card__grid">
4010
4335
  <mat-form-field appearance="outline">
4011
- <mat-label>ID</mat-label>
4336
+ <mat-label>{{ tx('editor.actions.field.id', 'ID') }}</mat-label>
4012
4337
  <input
4013
4338
  matInput
4014
4339
  [value]="action.id || ''"
@@ -4016,7 +4341,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4016
4341
  />
4017
4342
  </mat-form-field>
4018
4343
  <mat-form-field appearance="outline">
4019
- <mat-label>Label</mat-label>
4344
+ <mat-label>{{ tx('editor.actions.field.label', 'Label') }}</mat-label>
4020
4345
  <input
4021
4346
  matInput
4022
4347
  [value]="action.label || ''"
@@ -4024,7 +4349,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4024
4349
  />
4025
4350
  </mat-form-field>
4026
4351
  <mat-form-field appearance="outline">
4027
- <mat-label>Evento (action)</mat-label>
4352
+ <mat-label>{{ tx('editor.actions.field.eventAction', 'Event (action)') }}</mat-label>
4028
4353
  <input
4029
4354
  matInput
4030
4355
  [value]="action.action || ''"
@@ -4032,7 +4357,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4032
4357
  />
4033
4358
  </mat-form-field>
4034
4359
  <mat-form-field appearance="outline">
4035
- <mat-label>Ícone</mat-label>
4360
+ <mat-label>{{ tx('editor.actions.field.icon', 'Icon') }}</mat-label>
4036
4361
  <input
4037
4362
  matInput
4038
4363
  [value]="action.icon || ''"
@@ -4040,33 +4365,33 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4040
4365
  />
4041
4366
  </mat-form-field>
4042
4367
  <mat-form-field appearance="outline">
4043
- <mat-label>Variante</mat-label>
4368
+ <mat-label>{{ tx('editor.actions.field.variant', 'Variant') }}</mat-label>
4044
4369
  <mat-select
4045
4370
  [value]="action.variant || null"
4046
4371
  (selectionChange)="updateCustomActionField(action, 'variant', $event.value)"
4047
4372
  >
4048
- <mat-option [value]="null">Padrão</mat-option>
4049
- <mat-option value="raised">Elevado</mat-option>
4050
- <mat-option value="stroked">Contornado</mat-option>
4051
- <mat-option value="flat">Plano</mat-option>
4052
- <mat-option value="fab">Flutuante</mat-option>
4373
+ <mat-option [value]="null">{{ tx('editor.actions.variant.default', 'Default') }}</mat-option>
4374
+ <mat-option value="raised">{{ tx('editor.actions.variant.raised', 'Raised') }}</mat-option>
4375
+ <mat-option value="stroked">{{ tx('editor.actions.variant.stroked', 'Stroked') }}</mat-option>
4376
+ <mat-option value="flat">{{ tx('editor.actions.variant.flat', 'Flat') }}</mat-option>
4377
+ <mat-option value="fab">{{ tx('editor.actions.variant.fab', 'Floating') }}</mat-option>
4053
4378
  </mat-select>
4054
4379
  </mat-form-field>
4055
4380
  <mat-form-field appearance="outline">
4056
- <mat-label>Cor</mat-label>
4381
+ <mat-label>{{ tx('editor.actions.field.color', 'Color') }}</mat-label>
4057
4382
  <mat-select
4058
4383
  [value]="action.color || null"
4059
4384
  (selectionChange)="updateCustomActionField(action, 'color', $event.value)"
4060
4385
  >
4061
- <mat-option [value]="null">Padrão</mat-option>
4062
- <mat-option value="primary">Primary</mat-option>
4063
- <mat-option value="accent">Accent</mat-option>
4064
- <mat-option value="warn">Warn</mat-option>
4065
- <mat-option value="basic">Basic</mat-option>
4386
+ <mat-option [value]="null">{{ tx('editor.actions.color.default', 'Default') }}</mat-option>
4387
+ <mat-option value="primary">{{ tx('editor.actions.color.primary', 'Primary') }}</mat-option>
4388
+ <mat-option value="accent">{{ tx('editor.actions.color.accent', 'Accent') }}</mat-option>
4389
+ <mat-option value="warn">{{ tx('editor.actions.color.warn', 'Warn') }}</mat-option>
4390
+ <mat-option value="basic">{{ tx('editor.actions.color.basic', 'Basic') }}</mat-option>
4066
4391
  </mat-select>
4067
4392
  </mat-form-field>
4068
4393
  <mat-form-field appearance="outline">
4069
- <mat-label>Atalho</mat-label>
4394
+ <mat-label>{{ tx('editor.actions.field.shortcut', 'Shortcut') }}</mat-label>
4070
4395
  <input
4071
4396
  matInput
4072
4397
  [value]="action.shortcut || ''"
@@ -4074,7 +4399,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4074
4399
  />
4075
4400
  </mat-form-field>
4076
4401
  <mat-form-field appearance="outline">
4077
- <mat-label>Tooltip</mat-label>
4402
+ <mat-label>{{ tx('editor.actions.field.tooltip', 'Tooltip') }}</mat-label>
4078
4403
  <input
4079
4404
  matInput
4080
4405
  [value]="action.tooltip || ''"
@@ -4085,31 +4410,31 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4085
4410
  [checked]="action.visible !== false"
4086
4411
  (change)="updateCustomActionField(action, 'visible', $event.checked)"
4087
4412
  >
4088
- Visível
4413
+ {{ tx('editor.actions.field.visible', 'Visible') }}
4089
4414
  </mat-slide-toggle>
4090
4415
  </div>
4091
4416
  </div>
4092
4417
  }
4093
4418
  } @else {
4094
- <p class="mf-empty">Nenhuma ação customizada cadastrada.</p>
4419
+ <p class="mf-empty">{{ tx('editor.actions.emptyCustom', 'No custom actions registered.') }}</p>
4095
4420
  }
4096
4421
  </div>
4097
4422
  </section>
4098
4423
  </div>
4099
4424
  </mat-tab>
4100
4425
 
4101
- <mat-tab label="Mensagens">
4426
+ <mat-tab [label]="tx('editor.tabs.messages', 'Messages')">
4102
4427
  <div class="mf-tab">
4103
4428
  <section class="mf-section">
4104
4429
  <div class="mf-section__header">
4105
4430
  <div>
4106
- <h3>Feedback padrão</h3>
4107
- <p class="mf-help">Mensagens de sucesso/erro exibidas pelo host.</p>
4431
+ <h3>{{ tx('editor.messages.defaultTitle', 'Default feedback') }}</h3>
4432
+ <p class="mf-help">{{ tx('editor.messages.defaultHelp', 'Success/error messages displayed by the host.') }}</p>
4108
4433
  </div>
4109
4434
  </div>
4110
4435
  <div class="mf-messages-grid">
4111
4436
  <mat-form-field appearance="outline">
4112
- <mat-label>Sucesso ao criar</mat-label>
4437
+ <mat-label>{{ tx('editor.messages.createSuccess', 'Create success') }}</mat-label>
4113
4438
  <input
4114
4439
  matInput
4115
4440
  [value]="messagesModel.createRegistrySuccess || ''"
@@ -4117,7 +4442,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4117
4442
  />
4118
4443
  </mat-form-field>
4119
4444
  <mat-form-field appearance="outline">
4120
- <mat-label>Erro ao criar</mat-label>
4445
+ <mat-label>{{ tx('editor.messages.createError', 'Create error') }}</mat-label>
4121
4446
  <input
4122
4447
  matInput
4123
4448
  [value]="messagesModel.createRegistryError || ''"
@@ -4125,7 +4450,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4125
4450
  />
4126
4451
  </mat-form-field>
4127
4452
  <mat-form-field appearance="outline">
4128
- <mat-label>Sucesso ao atualizar</mat-label>
4453
+ <mat-label>{{ tx('editor.messages.updateSuccess', 'Update success') }}</mat-label>
4129
4454
  <input
4130
4455
  matInput
4131
4456
  [value]="messagesModel.updateRegistrySuccess || ''"
@@ -4133,7 +4458,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4133
4458
  />
4134
4459
  </mat-form-field>
4135
4460
  <mat-form-field appearance="outline">
4136
- <mat-label>Erro ao atualizar</mat-label>
4461
+ <mat-label>{{ tx('editor.messages.updateError', 'Update error') }}</mat-label>
4137
4462
  <input
4138
4463
  matInput
4139
4464
  [value]="messagesModel.updateRegistryError || ''"
@@ -4146,13 +4471,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4146
4471
  <section class="mf-section">
4147
4472
  <div class="mf-section__header">
4148
4473
  <div>
4149
- <h3>Confirmações</h3>
4150
- <p class="mf-help">Textos mostrados antes de ações críticas.</p>
4474
+ <h3>{{ tx('editor.messages.confirmationsTitle', 'Confirmations') }}</h3>
4475
+ <p class="mf-help">{{ tx('editor.messages.confirmationsHelp', 'Texts shown before critical actions.') }}</p>
4151
4476
  </div>
4152
4477
  </div>
4153
4478
  <div class="mf-messages-grid">
4154
4479
  <mat-form-field appearance="outline">
4155
- <mat-label>Enviar</mat-label>
4480
+ <mat-label>{{ tx('editor.defaults.submit', 'Save') }}</mat-label>
4156
4481
  <input
4157
4482
  matInput
4158
4483
  [value]="messagesModel.confirmations?.submit || ''"
@@ -4160,7 +4485,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4160
4485
  />
4161
4486
  </mat-form-field>
4162
4487
  <mat-form-field appearance="outline">
4163
- <mat-label>Cancelar</mat-label>
4488
+ <mat-label>{{ tx('editor.defaults.cancel', 'Cancel') }}</mat-label>
4164
4489
  <input
4165
4490
  matInput
4166
4491
  [value]="messagesModel.confirmations?.cancel || ''"
@@ -4168,7 +4493,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4168
4493
  />
4169
4494
  </mat-form-field>
4170
4495
  <mat-form-field appearance="outline">
4171
- <mat-label>Resetar</mat-label>
4496
+ <mat-label>{{ tx('editor.defaults.reset', 'Reset') }}</mat-label>
4172
4497
  <input
4173
4498
  matInput
4174
4499
  [value]="messagesModel.confirmations?.reset || ''"
@@ -4181,13 +4506,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4181
4506
  <section class="mf-section">
4182
4507
  <div class="mf-section__header">
4183
4508
  <div>
4184
- <h3>Loading</h3>
4185
- <p class="mf-help">Mensagens exibidas durante operações.</p>
4509
+ <h3>{{ tx('editor.messages.loadingTitle', 'Loading') }}</h3>
4510
+ <p class="mf-help">{{ tx('editor.messages.loadingHelp', 'Messages displayed during operations.') }}</p>
4186
4511
  </div>
4187
4512
  </div>
4188
4513
  <div class="mf-messages-grid">
4189
4514
  <mat-form-field appearance="outline">
4190
- <mat-label>Salvar</mat-label>
4515
+ <mat-label>{{ tx('editor.defaults.submit', 'Save') }}</mat-label>
4191
4516
  <input
4192
4517
  matInput
4193
4518
  [value]="messagesModel.loading?.submit || ''"
@@ -4195,7 +4520,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4195
4520
  />
4196
4521
  </mat-form-field>
4197
4522
  <mat-form-field appearance="outline">
4198
- <mat-label>Cancelar</mat-label>
4523
+ <mat-label>{{ tx('editor.defaults.cancel', 'Cancel') }}</mat-label>
4199
4524
  <input
4200
4525
  matInput
4201
4526
  [value]="messagesModel.loading?.cancel || ''"
@@ -4203,7 +4528,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4203
4528
  />
4204
4529
  </mat-form-field>
4205
4530
  <mat-form-field appearance="outline">
4206
- <mat-label>Resetar</mat-label>
4531
+ <mat-label>{{ tx('editor.defaults.reset', 'Reset') }}</mat-label>
4207
4532
  <input
4208
4533
  matInput
4209
4534
  [value]="messagesModel.loading?.reset || ''"
@@ -4216,8 +4541,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4216
4541
  <section class="mf-section">
4217
4542
  <div class="mf-section__header">
4218
4543
  <div>
4219
- <h3>Mensagens por ação customizada</h3>
4220
- <p class="mf-help">Personalize textos por ID de ação.</p>
4544
+ <h3>{{ tx('editor.messages.customTitle', 'Messages by custom action') }}</h3>
4545
+ <p class="mf-help">{{ tx('editor.messages.customHelp', 'Customize texts by action ID.') }}</p>
4221
4546
  </div>
4222
4547
  </div>
4223
4548
  <div class="mf-custom-messages">
@@ -4227,7 +4552,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4227
4552
  <div class="mf-custom-card__title">{{ action.label || action.id }}</div>
4228
4553
  <div class="mf-custom-card__grid">
4229
4554
  <mat-form-field appearance="outline">
4230
- <mat-label>Confirmação</mat-label>
4555
+ <mat-label>{{ tx('editor.messages.confirmationsTitle', 'Confirmations') }}</mat-label>
4231
4556
  <input
4232
4557
  matInput
4233
4558
  [value]="messagesModel.customActions?.[action.id || '']?.confirmation || ''"
@@ -4235,7 +4560,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4235
4560
  />
4236
4561
  </mat-form-field>
4237
4562
  <mat-form-field appearance="outline">
4238
- <mat-label>Sucesso</mat-label>
4563
+ <mat-label>{{ tx('editor.shared.success', 'Success') }}</mat-label>
4239
4564
  <input
4240
4565
  matInput
4241
4566
  [value]="messagesModel.customActions?.[action.id || '']?.success || ''"
@@ -4243,7 +4568,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4243
4568
  />
4244
4569
  </mat-form-field>
4245
4570
  <mat-form-field appearance="outline">
4246
- <mat-label>Erro</mat-label>
4571
+ <mat-label>{{ tx('editor.shared.error', 'Error') }}</mat-label>
4247
4572
  <input
4248
4573
  matInput
4249
4574
  [value]="messagesModel.customActions?.[action.id || '']?.error || ''"
@@ -4254,64 +4579,64 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4254
4579
  </div>
4255
4580
  }
4256
4581
  } @else {
4257
- <p class="mf-empty">Cadastre ações customizadas para configurar mensagens específicas.</p>
4582
+ <p class="mf-empty">{{ tx('editor.messages.emptyCustom', 'Register custom actions to configure specific messages.') }}</p>
4258
4583
  }
4259
4584
  </div>
4260
4585
  </section>
4261
4586
  </div>
4262
4587
  </mat-tab>
4263
4588
 
4264
- <mat-tab label="Comportamento">
4589
+ <mat-tab [label]="tx('editor.tabs.behavior', 'Behavior')">
4265
4590
  <div class="mf-tab">
4266
4591
  <section class="mf-section">
4267
4592
  <div class="mf-section__header">
4268
4593
  <div>
4269
- <h3>Comportamento do formulário</h3>
4270
- <p class="mf-help">Preferências aplicadas pelo host ou runtime.</p>
4594
+ <h3>{{ tx('editor.behavior.title', 'Form behavior') }}</h3>
4595
+ <p class="mf-help">{{ tx('editor.behavior.help', 'Preferences applied by the host or runtime.') }}</p>
4271
4596
  </div>
4272
4597
  </div>
4273
- <div class="mf-note">Estas opções são persistidas no config; o host decide como aplicar.</div>
4598
+ <div class="mf-note">{{ tx('editor.behavior.note', 'These options are persisted in config; the host decides how to apply them.') }}</div>
4274
4599
  <div class="mf-toggle-grid">
4275
4600
  <mat-slide-toggle
4276
4601
  [checked]="!!behaviorModel.confirmOnUnsavedChanges"
4277
4602
  (change)="updateBehavior('confirmOnUnsavedChanges', $event.checked)"
4278
4603
  >
4279
- Confirmar ao sair com alterações não salvas
4604
+ {{ tx('editor.behavior.confirmUnsaved', 'Confirm unsaved changes before leaving') }}
4280
4605
  </mat-slide-toggle>
4281
4606
  <mat-slide-toggle
4282
4607
  [checked]="!!behaviorModel.trackHistory"
4283
4608
  (change)="updateBehavior('trackHistory', $event.checked)"
4284
4609
  >
4285
- Rastrear histórico de alterações
4610
+ {{ tx('editor.behavior.trackHistory', 'Track change history') }}
4286
4611
  </mat-slide-toggle>
4287
4612
  <mat-slide-toggle
4288
4613
  [checked]="!!behaviorModel.focusFirstError"
4289
4614
  (change)="updateBehavior('focusFirstError', $event.checked)"
4290
4615
  >
4291
- Focar no primeiro erro ao submeter
4616
+ {{ tx('editor.behavior.focusFirstError', 'Focus the first error on submit') }}
4292
4617
  </mat-slide-toggle>
4293
4618
  <mat-slide-toggle
4294
4619
  [checked]="!!behaviorModel.scrollToErrors"
4295
4620
  (change)="updateBehavior('scrollToErrors', $event.checked)"
4296
4621
  >
4297
- Rolar até os erros ao submeter
4622
+ {{ tx('editor.behavior.scrollToErrors', 'Scroll to errors on submit') }}
4298
4623
  </mat-slide-toggle>
4299
4624
  <mat-slide-toggle
4300
4625
  [checked]="!!behaviorModel.clearAfterSave"
4301
4626
  (change)="updateBehavior('clearAfterSave', $event.checked)"
4302
4627
  >
4303
- Limpar formulário após salvar
4628
+ {{ tx('editor.behavior.clearAfterSave', 'Clear form after save') }}
4304
4629
  </mat-slide-toggle>
4305
4630
  <mat-slide-toggle
4306
4631
  [checked]="!!behaviorModel.reactiveValidation"
4307
4632
  (change)="updateBehavior('reactiveValidation', $event.checked)"
4308
4633
  >
4309
- Validação reativa
4634
+ {{ tx('editor.behavior.reactiveValidation', 'Reactive validation') }}
4310
4635
  </mat-slide-toggle>
4311
4636
  </div>
4312
4637
  <div class="mf-actions-layout">
4313
4638
  <mat-form-field appearance="outline">
4314
- <mat-label>Redirecionar após salvar (URL)</mat-label>
4639
+ <mat-label>{{ tx('editor.behavior.redirectAfterSave', 'Redirect after save (URL)') }}</mat-label>
4315
4640
  <input
4316
4641
  matInput
4317
4642
  [value]="behaviorModel.redirectAfterSave || ''"
@@ -4319,7 +4644,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4319
4644
  />
4320
4645
  </mat-form-field>
4321
4646
  <mat-form-field appearance="outline">
4322
- <mat-label>Debounce validação reativa (ms)</mat-label>
4647
+ <mat-label>{{ tx('editor.behavior.reactiveValidationDebounce', 'Reactive validation debounce (ms)') }}</mat-label>
4323
4648
  <input
4324
4649
  matInput
4325
4650
  type="number"
@@ -4333,19 +4658,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4333
4658
  </div>
4334
4659
  </mat-tab>
4335
4660
 
4336
- <mat-tab label="Dicas">
4661
+ <mat-tab [label]="tx('editor.tabs.hints', 'Hints')">
4337
4662
  <div class="mf-tab">
4338
4663
  <section class="mf-section">
4339
4664
  <div class="mf-section__header">
4340
4665
  <div>
4341
- <h3>Mensagens de modo</h3>
4342
- <p class="mf-help">Textos auxiliares exibidos pelo host.</p>
4666
+ <h3>{{ tx('editor.hints.modeTitle', 'Mode messages') }}</h3>
4667
+ <p class="mf-help">{{ tx('editor.hints.modeHelp', 'Auxiliary texts displayed by the host.') }}</p>
4343
4668
  </div>
4344
4669
  </div>
4345
- <div class="mf-note">Útil para i18n e orientação do usuário.</div>
4670
+ <div class="mf-note">{{ tx('editor.hints.modeNote', 'Useful for i18n and user guidance.') }}</div>
4346
4671
  <div class="mf-messages-grid">
4347
4672
  <mat-form-field appearance="outline">
4348
- <mat-label>Criar</mat-label>
4673
+ <mat-label>{{ tx('editor.hints.mode.create', 'Create') }}</mat-label>
4349
4674
  <input
4350
4675
  matInput
4351
4676
  [value]="hintsModel.dataModes.create"
@@ -4353,7 +4678,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4353
4678
  />
4354
4679
  </mat-form-field>
4355
4680
  <mat-form-field appearance="outline">
4356
- <mat-label>Editar</mat-label>
4681
+ <mat-label>{{ tx('editor.hints.mode.edit', 'Edit') }}</mat-label>
4357
4682
  <input
4358
4683
  matInput
4359
4684
  [value]="hintsModel.dataModes.edit"
@@ -4361,7 +4686,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4361
4686
  />
4362
4687
  </mat-form-field>
4363
4688
  <mat-form-field appearance="outline">
4364
- <mat-label>Visualizar</mat-label>
4689
+ <mat-label>{{ tx('editor.hints.mode.view', 'View') }}</mat-label>
4365
4690
  <input
4366
4691
  matInput
4367
4692
  [value]="hintsModel.dataModes.view"
@@ -4374,13 +4699,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4374
4699
  <section class="mf-section">
4375
4700
  <div class="mf-section__header">
4376
4701
  <div>
4377
- <h3>Dicas de UI</h3>
4378
- <p class="mf-help">Ajuda contextual para estados do formulário.</p>
4702
+ <h3>{{ tx('editor.hints.uiTitle', 'UI hints') }}</h3>
4703
+ <p class="mf-help">{{ tx('editor.hints.uiHelp', 'Contextual help for form states.') }}</p>
4379
4704
  </div>
4380
4705
  </div>
4381
4706
  <div class="mf-messages-grid">
4382
4707
  <mat-form-field appearance="outline">
4383
- <mat-label>Apresentação</mat-label>
4708
+ <mat-label>{{ tx('editor.hints.ui.presentation', 'Presentation') }}</mat-label>
4384
4709
  <textarea
4385
4710
  matInput
4386
4711
  rows="2"
@@ -4389,7 +4714,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4389
4714
  ></textarea>
4390
4715
  </mat-form-field>
4391
4716
  <mat-form-field appearance="outline">
4392
- <mat-label>Somente leitura</mat-label>
4717
+ <mat-label>{{ tx('editor.hints.ui.readonly', 'Read-only') }}</mat-label>
4393
4718
  <textarea
4394
4719
  matInput
4395
4720
  rows="2"
@@ -4398,7 +4723,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4398
4723
  ></textarea>
4399
4724
  </mat-form-field>
4400
4725
  <mat-form-field appearance="outline">
4401
- <mat-label>Desabilitado</mat-label>
4726
+ <mat-label>{{ tx('editor.hints.ui.disabled', 'Disabled') }}</mat-label>
4402
4727
  <textarea
4403
4728
  matInput
4404
4729
  rows="2"
@@ -4407,7 +4732,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4407
4732
  ></textarea>
4408
4733
  </mat-form-field>
4409
4734
  <mat-form-field appearance="outline">
4410
- <mat-label>Visível</mat-label>
4735
+ <mat-label>{{ tx('editor.hints.ui.visible', 'Visible') }}</mat-label>
4411
4736
  <textarea
4412
4737
  matInput
4413
4738
  rows="2"
@@ -4420,24 +4745,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4420
4745
  </div>
4421
4746
  </mat-tab>
4422
4747
 
4423
- <mat-tab label="Hooks">
4748
+ <mat-tab [label]="tx('editor.tabs.hooks', 'Hooks')">
4424
4749
  <div class="mf-tab">
4425
4750
  <section class="mf-section">
4426
4751
  <div class="mf-section__header">
4427
4752
  <div>
4428
- <h3>Hooks de ciclo de vida</h3>
4429
- <p class="mf-help">Defina ações automatizadas por estágio.</p>
4753
+ <h3>{{ tx('editor.hooks.title', 'Lifecycle hooks') }}</h3>
4754
+ <p class="mf-help">{{ tx('editor.hooks.help', 'Define automated actions by stage.') }}</p>
4430
4755
  </div>
4431
4756
  <div class="mf-actions-row">
4432
4757
  <button mat-stroked-button type="button" (click)="resetHooks()">
4433
- Restaurar
4758
+ {{ tx('editor.hooks.reset', 'Reset') }}
4434
4759
  </button>
4435
4760
  <button mat-flat-button color="primary" type="button" (click)="applyHooks()">
4436
- Aplicar hooks
4761
+ {{ tx('editor.hooks.apply', 'Apply hooks') }}
4437
4762
  </button>
4438
4763
  </div>
4439
4764
  </div>
4440
- <div class="mf-note">Executa apenas se o host registrar hooks disponíveis.</div>
4765
+ <div class="mf-note">{{ tx('editor.hooks.note', 'Runs only if the host registers available hooks.') }}</div>
4441
4766
  <div class="mf-hooks-grid">
4442
4767
  @for (stage of hookStages; track stage) {
4443
4768
  <mat-form-field appearance="outline" class="mf-hook-field">
@@ -4447,14 +4772,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4447
4772
  rows="4"
4448
4773
  [value]="hooksText[stage]"
4449
4774
  (input)="onHookTextChange(stage, $any($event.target).value)"
4450
- placeholder='[{ "id": "notifySuccess", "priority": 0, "args": {} }]'
4775
+ [placeholder]="hookPlaceholder()"
4451
4776
  ></textarea>
4452
4777
  <button
4453
4778
  mat-icon-button
4454
4779
  matSuffix
4455
4780
  class="help-icon-button"
4456
4781
  type="button"
4457
- [matTooltip]="'Array JSON de hooks para ' + stage + ' (id, priority, timeoutMs, args).'"
4782
+ [matTooltip]="hookTooltip(stage)"
4458
4783
  matTooltipPosition="above"
4459
4784
  >
4460
4785
  <mat-icon>help_outline</mat-icon>
@@ -4469,36 +4794,36 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4469
4794
  </div>
4470
4795
  </mat-tab>
4471
4796
 
4472
- <mat-tab label="Regras">
4797
+ <mat-tab [label]="tx('editor.tabs.rules', 'Rules')">
4473
4798
  <div class="mf-tab">
4474
4799
  <section class="mf-section">
4475
4800
  <div class="mf-section__header">
4476
4801
  <div>
4477
- <h3>Regras de layout</h3>
4478
- <p class="mf-help">Regras avançadas para visibilidade e comportamento.</p>
4802
+ <h3>{{ tx('editor.rules.title', 'Layout rules') }}</h3>
4803
+ <p class="mf-help">{{ tx('editor.rules.help', 'Advanced rules for visibility and behavior.') }}</p>
4479
4804
  </div>
4480
4805
  <div class="mf-actions-row">
4481
4806
  <button mat-flat-button color="primary" type="button" (click)="applyRules()">
4482
- Aplicar regras
4807
+ {{ tx('editor.rules.apply', 'Apply rules') }}
4483
4808
  </button>
4484
4809
  </div>
4485
4810
  </div>
4486
- <div class="mf-note">Persistido no config; a execução depende do host.</div>
4811
+ <div class="mf-note">{{ tx('editor.rules.note', 'Persisted in config; execution depends on the host.') }}</div>
4487
4812
  <mat-form-field appearance="outline">
4488
- <mat-label>formRules (JSON)</mat-label>
4813
+ <mat-label>{{ tx('editor.rules.formRulesLabel', 'formRules (JSON)') }}</mat-label>
4489
4814
  <textarea
4490
4815
  matInput
4491
4816
  rows="6"
4492
4817
  [value]="formRulesText"
4493
4818
  (input)="onRulesTextChange($any($event.target).value)"
4494
- placeholder='[{"id":"rule-1","name":"Obrigatoriedade","targetType":"field","targets":["campo"],"effect":{"condition":"{campo} != null","properties":{"required":true}}}]'
4819
+ [placeholder]="formRulesPlaceholder()"
4495
4820
  ></textarea>
4496
4821
  <button
4497
4822
  mat-icon-button
4498
4823
  matSuffix
4499
4824
  class="help-icon-button"
4500
4825
  type="button"
4501
- [matTooltip]="'Array JSON com regras (id, targetType, targets, effect).'"
4826
+ [matTooltip]="tx('editor.rules.tooltip', 'JSON array with rules (id, targetType, targets, effect).')"
4502
4827
  matTooltipPosition="above"
4503
4828
  >
4504
4829
  <mat-icon>help_outline</mat-icon>
@@ -4508,7 +4833,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4508
4833
  }
4509
4834
  </mat-form-field>
4510
4835
  <mat-form-field appearance="outline">
4511
- <mat-label>formRulesState (JSON)</mat-label>
4836
+ <mat-label>{{ tx('editor.rules.formRulesStateLabel', 'formRulesState (JSON)') }}</mat-label>
4512
4837
  <textarea
4513
4838
  matInput
4514
4839
  rows="6"
@@ -4521,7 +4846,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4521
4846
  matSuffix
4522
4847
  class="help-icon-button"
4523
4848
  type="button"
4524
- [matTooltip]="'Estado bruto do editor visual (opcional).'"
4849
+ [matTooltip]="tx('editor.rules.stateTooltip', 'Raw state from the visual editor (optional).')"
4525
4850
  matTooltipPosition="above"
4526
4851
  >
4527
4852
  <mat-icon>help_outline</mat-icon>
@@ -4532,23 +4857,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4532
4857
  </mat-form-field>
4533
4858
  <div class="mf-actions-row mf-actions-row--end">
4534
4859
  <button mat-flat-button color="primary" type="button" (click)="applyRules()">
4535
- Aplicar regras
4860
+ {{ tx('editor.rules.apply', 'Apply rules') }}
4536
4861
  </button>
4537
4862
  </div>
4538
4863
  </section>
4539
4864
  </div>
4540
4865
  </mat-tab>
4541
4866
 
4542
- <mat-tab label="Cascatas">
4867
+ <mat-tab [label]="tx('editor.tabs.cascade', 'Cascades')">
4543
4868
  <div class="mf-tab">
4544
4869
  <section class="mf-section mf-section--full">
4545
4870
  <div class="mf-section__header">
4546
4871
  <div>
4547
- <h3>Dependências entre campos</h3>
4548
- <p class="mf-help">Configure cascatas nativas baseadas em metadados.</p>
4872
+ <h3>{{ tx('editor.cascade.title', 'Field dependencies') }}</h3>
4873
+ <p class="mf-help">{{ tx('editor.cascade.help', 'Configure native cascades based on metadata.') }}</p>
4549
4874
  </div>
4550
4875
  </div>
4551
- <div class="mf-note">As alterações atualizam metadados e são salvas no draft.</div>
4876
+ <div class="mf-note">{{ tx('editor.cascade.note', 'Changes update metadata and are saved in the draft.') }}</div>
4552
4877
  <praxis-cascade-manager-tab
4553
4878
  [fields]="cascadeFields"
4554
4879
  (apply)="applyCascadePatch($event)"
@@ -4567,9 +4892,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
4567
4892
  args: [SETTINGS_PANEL_REF]
4568
4893
  }] }] });
4569
4894
  const DEFAULT_ACTIONS = {
4570
- submit: makeAction({ id: 'submit', label: 'Salvar', visible: true, type: 'submit', color: 'primary' }),
4571
- cancel: makeAction({ id: 'cancel', label: 'Cancelar', visible: false, type: 'button' }),
4572
- reset: makeAction({ id: 'reset', label: 'Restaurar', visible: true, type: 'reset' }),
4895
+ submit: makeAction({ id: 'submit', label: 'Save', visible: true, type: 'submit', color: 'primary' }),
4896
+ cancel: makeAction({ id: 'cancel', label: 'Cancel', visible: false, type: 'button' }),
4897
+ reset: makeAction({ id: 'reset', label: 'Reset', visible: true, type: 'reset' }),
4573
4898
  custom: [],
4574
4899
  position: 'right',
4575
4900
  orientation: 'horizontal',
@@ -4579,7 +4904,7 @@ function makeAction(action, index) {
4579
4904
  const fallbackId = typeof index === 'number' ? `custom-${index + 1}` : 'action';
4580
4905
  return {
4581
4906
  id: action.id ?? fallbackId,
4582
- label: action.label ?? 'Ação',
4907
+ label: action.label ?? 'Action',
4583
4908
  visible: action.visible !== false,
4584
4909
  type: action.type ?? 'button',
4585
4910
  color: action.color,
@@ -5043,4 +5368,3 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
5043
5368
  */
5044
5369
 
5045
5370
  export { MANUAL_FORM_AI_CAPABILITIES, MANUAL_FORM_CONSTRUCTOR_TO_CONTROL_TYPE, MANUAL_FORM_SELECTOR_TO_CONTROL_TYPE, ManualFieldDirective, ManualFieldEditorOnDblclickDirective, ManualFieldKeyService, ManualFieldMetadataBridgeService, ManualFormActionsComponent, ManualFormComponent, ManualFormConfigEditorComponent, ManualFormDocExampleComponent, ManualFormDocExampleShowcaseComponent, ManualFormHeaderComponent, ManualFormInstance, ManualFormInstanceFactory, createManualFormSeed, toFieldMetadataMap };
5046
- //# sourceMappingURL=praxisui-manual-form.mjs.map