공개 저장소 이슈 gnuboard/g7 (@bigmsg) 제보에서 출발한 작업이다. 브라우저가 화면을 그리려고 제3자 CDN 에 도달해야 하면, 그 도달 실패는 예외도 로그도 남기지 않고 화면 기능만 조용히 사라진다. 폐쇄망·방화벽·광고차단기에서 재현되는데 자체 서버 로그에는 흔적이 없어 운영자가 원인을 특정할 수 없다. 제보된 것은 편집기 하나였지만 같은 구조가 아이콘·글꼴·코드편집기·압축 라이브러리·설치 마법사·개발 대시보드에 똑같이 있었으므로, 번들 확장과 템플릿 전체를 자체 제공으로 옮겼다. 런타임에 외부로 나가는 것은 주소 검색 서비스 하나만 남았다. 자체 제공만으로는 부족하다 — 자기 서버에서 받는 파일도 실패할 수 있고, 종전에는 그 실패가 무음이었다. CSS 경로에 재시도 계층을 세우고(스크립트 경로와 동형), 서버가 HTML 에 직접 심는 externals 까지 실패를 붙잡아 안내 배너와 [다시 시도]로 표면화했다. 편집기·코드편집기는 확보 실패 시 평문 입력으로 내려앉되 저장 계약을 유지한다. 두 번째 축은 운영자가 CSS 를 덧붙일 자리가 없던 문제다(sir.kr 문의). 확장 디렉토리의 custom/ 을 운영자 소유로 정해, 확장 교체가 그 디렉토리만은 보존하게 했다. 출처에 의존하지 않는 서술자로 해석하므로 나중에 다른 출처가 붙어도 소비자는 바뀌지 않는다. 확장 자산과 같은 메커니즘으로 정적 게시되어 CSS 내부 상대 url 도 해석되고, 파일을 고치면 그 변경을 감지해 재게시까지 예약된다. FTP 접근이 없는 운영자에게는 그 자리도 없는 것과 같으므로 레이아웃 편집기에서 직접 넣고 고칠 수 있게 했다. 모듈·플러그인·템플릿이 한 엔드포인트를 공유한다 — 타입별로 나누면 같은 검증이 세 벌로 갈리고 그중 약한 하나가 우회로가 된다. 여기서 올린 스크립트는 그 레이아웃 한 장이 아니라 사이트 전 화면에서 실행되므로 레이아웃 편집과 분리된 전용 권한으로 연다. 운영자 CSS 가 화면을 조작 불능으로 만들면 그것을 고칠 화면에도 같은 CSS 가 실려 스스로 갇히므로, 서버가 목록을 비우는 탈출구(?custom=off)를 함께 뒀다. 동봉 자산은 재생성 경로에 버전 대조 가드를 붙였다. 선언과 다른 버전을 버전 디렉토리에 써 넣는 조용한 거짓말은 배포된 뒤에는 드러나지 않는다.
1389 lines
52 KiB
JSON
1389 lines
52 KiB
JSON
{
|
||
"chrome": {
|
||
"toolbar": {
|
||
"toggle_route_tree": "Toggle route tree",
|
||
"undo": "Undo",
|
||
"redo": "Redo",
|
||
"template_route_separator": " ▸ ",
|
||
"locale_switcher_label": "Content language",
|
||
"add_element": "Add element",
|
||
"device_desktop": "Desktop",
|
||
"device_tablet": "Tablet",
|
||
"device_mobile": "Mobile",
|
||
"zoom_out": "Zoom out",
|
||
"zoom_in": "Zoom in",
|
||
"zoom_reset": "Reset zoom",
|
||
"page_settings": "Page settings",
|
||
"preview": "Preview",
|
||
"previewing": "Opening…",
|
||
"version_history": "Version history",
|
||
"edit_code": "Edit code",
|
||
"save": "Save",
|
||
"saving": "Saving…",
|
||
"exit": "Exit",
|
||
"exit_base_edit": "Exit common layout editing",
|
||
"exit_modal_edit": "Exit modal editing",
|
||
"exit_extension_edit": "Exit extension editing",
|
||
"exit_iteration_item_edit": "Exit repeating item editing",
|
||
"mode_badge": {
|
||
"base": "Editing common layout",
|
||
"modal": "Editing modal",
|
||
"extension": "Editing extension",
|
||
"iteration_item": "Editing repeating item"
|
||
},
|
||
"images": "Images",
|
||
"translations": "Translations",
|
||
"data_sources": "Data",
|
||
"reset": "Reset",
|
||
"switch_template": "Switch to another template",
|
||
"custom_assets": "Custom assets",
|
||
"custom_assets_hint": "Manage operator-added CSS, JS, fonts and images.",
|
||
"custom_assets_off": "Disable custom assets",
|
||
"custom_assets_on": "Enable custom assets",
|
||
"custom_assets_off_hint": "Reopen this screen without operator-added CSS/JS. Use it when an added asset breaks the screen.",
|
||
"custom_assets_on_hint": "Operator-added assets are currently disabled. Click to apply them again."
|
||
},
|
||
"route_tree": {
|
||
"panel_title": "Screens / Routes",
|
||
"search_placeholder": "Search by name or route…",
|
||
"search_clear": "Clear search",
|
||
"search_no_results": "No matching routes",
|
||
"group": {
|
||
"base": "Common layouts",
|
||
"template": "Template",
|
||
"module": "Module: {name}",
|
||
"plugin": "Plugin: {name}",
|
||
"modal": "Modals",
|
||
"extension": "Extension injections"
|
||
},
|
||
"connected": {
|
||
"modals": "Modals on this screen ({count})",
|
||
"extensions": "Injected extensions ({count})"
|
||
},
|
||
"badge": {
|
||
"hidden": "Hidden",
|
||
"redirect": "Redirect",
|
||
"shared_layout": "Shared by {count} routes",
|
||
"modified": "Modified",
|
||
"version_tooltip": "Current saved version v{version}",
|
||
"extension_point": "Extension point",
|
||
"overlay": "Overlay",
|
||
"priority": "p:{priority}",
|
||
"inactive": "Inactive"
|
||
},
|
||
"empty": "No routes to display"
|
||
},
|
||
"fab": {
|
||
"label": "Edit layout",
|
||
"tooltip": "Open this screen in the layout editor"
|
||
},
|
||
"denied": {
|
||
"title": "Layout editing permission required",
|
||
"message": "Administrator permission is required to use this feature.",
|
||
"go_login": "Sign in",
|
||
"go_home": "Home"
|
||
},
|
||
"dirty_guard": {
|
||
"title": "Unsaved changes",
|
||
"message": "Exit without saving changes?",
|
||
"stay": "Keep editing",
|
||
"discard": "Discard changes"
|
||
},
|
||
"canvas": {
|
||
"placeholder": "Canvas area — will be filled in Phase 2"
|
||
},
|
||
"reset_guard": {
|
||
"title": "Reset this screen",
|
||
"message": "Discard changes on this screen and revert to the last saved state."
|
||
}
|
||
},
|
||
"preview": {
|
||
"empty": "Select a route on the left to start editing",
|
||
"empty_layout": "This layout has no components to display",
|
||
"loading": "Loading layout...",
|
||
"error": "Failed to load layout: {error}",
|
||
"assets_loading": "Loading editor template assets...",
|
||
"assets_error": "Failed to load editor template assets: {error}",
|
||
"sample_data_badge": "Sample data",
|
||
"extension_no_injection_title": "Nothing to edit on this screen",
|
||
"extension_no_injection_desc": "This extension does not add any visually editable elements to this screen. Please use code editing instead.",
|
||
"extension_gated_title": "No editable elements in this state",
|
||
"extension_gated_desc": "The area this extension injects into only appears in a specific screen state. That state is not defined in the editor settings, so it cannot be edited visually. Please use code editing instead.",
|
||
"extension_gated_desc_with_states": "The area this extension injects into only appears in a specific screen state. Switch to that state using the state selector at the top to edit it.",
|
||
"slot_area_label": "Content area"
|
||
},
|
||
"custom_assets": {
|
||
"target_label": "Target extension",
|
||
"type_template": "Template",
|
||
"type_module": "Module",
|
||
"type_plugin": "Plugin",
|
||
"title": "Custom assets",
|
||
"close": "Close",
|
||
"loading": "Loading…",
|
||
"empty": "No files yet. Type a path below and save, or upload a file to start.",
|
||
"forbidden": "You do not have permission to manage custom assets. Ask an administrator for the “Manage Custom Assets” permission.",
|
||
"new_path_placeholder": "e.g. 10-overrides.css",
|
||
"path_label": "File path",
|
||
"content_label": "File content",
|
||
"new_file": "New file",
|
||
"save": "Save",
|
||
"upload": "Upload file",
|
||
"delete": "Delete",
|
||
"delete_confirm": "This file will be deleted. This cannot be undone.",
|
||
"binary_hint": "This file type (:extension) cannot be edited directly. Upload a replacement with the same name.",
|
||
"apply_hint": "Saved changes apply from the next page load."
|
||
},
|
||
"version_history": {
|
||
"title": "Version history",
|
||
"close": "Close",
|
||
"loading": "Loading versions…",
|
||
"empty": "No saved versions yet.",
|
||
"restore": "Restore",
|
||
"restoring": "Restoring…",
|
||
"restore_confirm": "Restore this version? Your current unsaved changes will be lost.",
|
||
"restore_not_found": "That version could not be found. Please refresh the list.",
|
||
"latest": "Latest",
|
||
"added": "+{count} lines",
|
||
"removed": "-{count} lines",
|
||
"chars": "({diff} chars)",
|
||
"saved_by": "Saved by {name}",
|
||
"unknown_author": "Unknown",
|
||
"compare": "Compare",
|
||
"comparing": "Comparing…",
|
||
"diff_title": "Changes v{old} → v{new}",
|
||
"diff_back": "Back",
|
||
"diff_identical": "The two versions are identical.",
|
||
"diff_too_large": "The changes are too large to display.",
|
||
"load_more": "Load more"
|
||
},
|
||
"preview_action": {
|
||
"no_document": "No layout is selected to preview."
|
||
},
|
||
"access_error": {
|
||
"required_permission_label": "Required permission:",
|
||
"detail_summary": "Show error details",
|
||
"action": {
|
||
"sign_in": "Sign in",
|
||
"go_home": "Go to admin home",
|
||
"go_admin_home": "Go to admin home",
|
||
"retry": "Try again"
|
||
},
|
||
"unauthorized": {
|
||
"title": "Sign-in required",
|
||
"message": "Your session has expired or you are signed out. Redirecting to the sign-in page..."
|
||
},
|
||
"forbidden": {
|
||
"title": "You don't have access to this layout",
|
||
"message": "Your account doesn't have permission to edit this screen. Ask an administrator to grant access, or sign in with a different account."
|
||
},
|
||
"not_found": {
|
||
"title": "Layout not found",
|
||
"message": "The requested layout doesn't exist or has been removed. Please pick another route."
|
||
},
|
||
"server_error": {
|
||
"title": "Something went wrong on the server",
|
||
"message": "The server returned an error while loading this layout. Please try again in a moment."
|
||
},
|
||
"network": {
|
||
"title": "Check your network connection",
|
||
"message": "Unable to reach the server. Verify your connection and try again."
|
||
},
|
||
"unknown": {
|
||
"title": "Failed to load layout",
|
||
"message": "An unexpected problem occurred. Please try again or contact an administrator."
|
||
}
|
||
},
|
||
"device": {
|
||
"group_label": "Device preview",
|
||
"desktop": "🖥 Desktop",
|
||
"tablet": "📱 Tablet",
|
||
"mobile": "📲 Mobile",
|
||
"portable": "📱 Mobile+Tablet",
|
||
"custom": "📐 Custom",
|
||
"custom_width_label": "Width"
|
||
},
|
||
"zoom": {
|
||
"label": "Zoom",
|
||
"aria_label": "Canvas zoom slider"
|
||
},
|
||
"palette": {
|
||
"title": "Add element",
|
||
"search_placeholder": "Search elements…",
|
||
"group": {
|
||
"design": "Design elements",
|
||
"db": "Data elements"
|
||
},
|
||
"category": {
|
||
"all": "All",
|
||
"other": "Other",
|
||
"fallback": {
|
||
"basic": "Basic",
|
||
"composite": "Composite",
|
||
"layout": "Layout"
|
||
}
|
||
},
|
||
"empty": "No elements available for this location",
|
||
"spec_missing": "This template has no editor spec. Element insertion is disabled.",
|
||
"default_node_missing_badge": "No defaults",
|
||
"requires_default_node_missing": "This component cannot be added until the template defines its default style. Add componentPalette.entries.<name>.defaultNode in editor-spec.json.",
|
||
"table": {
|
||
"label": "Table",
|
||
"header_1": "Title",
|
||
"header_2": "Content",
|
||
"cell": "Content"
|
||
},
|
||
"select": {
|
||
"default_option1_label": "Option 1",
|
||
"default_option2_label": "Option 2"
|
||
}
|
||
},
|
||
"insertion": {
|
||
"above": "Add above",
|
||
"below": "Add below",
|
||
"left": "Add to the left",
|
||
"right": "Add to the right"
|
||
},
|
||
"context_menu": {
|
||
"edit_props": "Properties",
|
||
"duplicate": "Duplicate",
|
||
"delete": "Delete",
|
||
"separate_branch": "Make device-specific",
|
||
"merge_branch": "Remove device-specific layout",
|
||
"separate_branch_device": "Make this region {device}-only",
|
||
"merge_branch_device": "Remove {device}-only layout",
|
||
"separate_branch_hint": "Use this when this device needs a different set of elements. To change only style (color, spacing, etc.), use the Properties > Style tab instead.",
|
||
"merge_branch_hint": "Removes the device-specific layout and reverts to the default configuration.",
|
||
"device_desktop": "desktop",
|
||
"device_tablet": "tablet",
|
||
"device_mobile": "mobile",
|
||
"device_portable": "mobile+tablet",
|
||
"device_custom": "{range}"
|
||
},
|
||
"overlay": {
|
||
"edit_common_layout": "Edit common layout",
|
||
"edit_extension": "Edit extension",
|
||
"edit_iteration_item": "Edit repeating item",
|
||
"edit_destination_route": "→ Edit this screen",
|
||
"cannot_drop_here": "Cannot drop here",
|
||
"locked_data_bound": "Data-bound regions cannot be edited directly",
|
||
"select_parent": "Select parent element (↑)",
|
||
"branch_mobile": "Mobile layout",
|
||
"branch_tablet": "Tablet layout",
|
||
"branch_desktop": "Desktop layout",
|
||
"branch_custom": "{range} layout",
|
||
"branch_boundary_denied": "Cannot move between per-device layouts",
|
||
"jump_device": "Go to {device} layout",
|
||
"jump_device_hint": "This region has a separate layout defined for {device}. Click to switch to that device view and edit it.",
|
||
"on": "On",
|
||
"off": "Off",
|
||
"inherit_banner": "These settings are inherited from the common layout. Change them to override for this screen.",
|
||
"reset_inherit": "Reset to inherited",
|
||
"inherited_badge": "Inherited",
|
||
"overridden_badge": "Overridden",
|
||
"override_field": "Override here",
|
||
"enabled_label": "Loading screen",
|
||
"enabled_hint": "Show a placeholder while this screen loads its data.",
|
||
"scope_label": "Where to show it",
|
||
"scope_full": "Whole screen",
|
||
"scope_region": "A specific region",
|
||
"target_label": "Region to cover",
|
||
"fallback_label": "Fallback region",
|
||
"fallback_hint": "Used when the region above is not found.",
|
||
"style_label": "Style",
|
||
"skeleton_component": "Skeleton component",
|
||
"skeleton_animation": "Animation",
|
||
"skeleton_count": "Number of rows",
|
||
"spinner_component": "Spinner component",
|
||
"spinner_text": "Loading text",
|
||
"waitfor_label": "Wait for data",
|
||
"waitfor_hint": "Keep the loading screen until the selected data has loaded.",
|
||
"waitfor_empty": "No data sources to wait for.",
|
||
"loading_picker": {
|
||
"none": "None",
|
||
"select": "Choose",
|
||
"search": "Search components",
|
||
"empty": "No matching components."
|
||
},
|
||
"anim_none": "None",
|
||
"anim_pulse": "Pulse",
|
||
"anim_wave": "Wave",
|
||
"style_blur": "Blur",
|
||
"style_fade": "Fade in",
|
||
"style_opaque": "Solid cover",
|
||
"style_skeleton": "Skeleton",
|
||
"style_spinner": "Spinner"
|
||
},
|
||
"save": {
|
||
"success": "Layout saved",
|
||
"in_progress": "Saving…",
|
||
"validation_failed": "Validation failed",
|
||
"blocked_inactive_extension": "Cannot save — newly added components belong to a deactivated extension",
|
||
"network_error_title": "Network error while saving",
|
||
"guard_no_document": "No layout document loaded — nothing to save",
|
||
"concurrent": {
|
||
"title": "Another user saved first",
|
||
"message": "This layout was saved by another administrator. Load the latest version?",
|
||
"version_info": "Latest version: {current} / Your version: {yours}",
|
||
"load_latest": "Load latest",
|
||
"view_my_changes": "View my changes",
|
||
"cancel": "Cancel"
|
||
},
|
||
"conflict": "A conflict occurred because it was saved elsewhere first."
|
||
},
|
||
"control": {
|
||
"use": "Use",
|
||
"default": "Default",
|
||
"color_hex_placeholder": "#000000 / none",
|
||
"tag_add": "+ Add",
|
||
"background_image": {
|
||
"upload": "Upload image",
|
||
"clear": "Remove",
|
||
"mode_fill": "Fill",
|
||
"mode_fit": "Fit",
|
||
"mode_tile": "Tile",
|
||
"upload_failed": "Image upload failed"
|
||
},
|
||
"dimension": {
|
||
"placeholder": "e.g. 320px, 50%, 24rem, auto"
|
||
},
|
||
"spacing": {
|
||
"mode_all": "Uniform",
|
||
"mode_sides": "Per-side",
|
||
"all": "All",
|
||
"x": "Left/Right",
|
||
"y": "Top/Bottom",
|
||
"top": "Top",
|
||
"right": "Right",
|
||
"bottom": "Bottom",
|
||
"left": "Left"
|
||
}
|
||
},
|
||
"recipe": {
|
||
"custom_input": "Enter manually…",
|
||
"pick_from_list": "Pick from list",
|
||
"page_placeholder": "Destination path (e.g. /board)",
|
||
"datasource_placeholder": "Data name",
|
||
"state_key_placeholder": "State key",
|
||
"modal_placeholder": "Select modal to open",
|
||
"i18n_text_placeholder": "Text to show"
|
||
},
|
||
"action": {
|
||
"no_events": "This element has no configurable actions",
|
||
"no_recipes": "This template provides no available actions",
|
||
"add_action": "+ Add action",
|
||
"remove": "Remove action",
|
||
"advanced_action": "Action authored manually",
|
||
"advanced_preserved": "Action authored in the code editor (preserved)",
|
||
"event": {
|
||
"onClick": "When clicked",
|
||
"onHover": "When hovered",
|
||
"onChange": "When value changes",
|
||
"onSubmit": "When submitted",
|
||
"onClose": "When closed",
|
||
"onFilesChange": "When files change",
|
||
"onPageChange": "When the page changes",
|
||
"onReact": "When reacted",
|
||
"onTabChange": "When the tab changes",
|
||
"onUploadSuccess": "On upload success",
|
||
"onUploadError": "On upload error",
|
||
"onButtonClick": "When the button is clicked",
|
||
"onDismiss": "When dismissed",
|
||
"onItemAdd": "When an item is added",
|
||
"onItemClick": "When an item is clicked",
|
||
"onItemRemove": "When an item is removed",
|
||
"onLanguageChange": "When the language changes",
|
||
"onLayoutEditClick": "When layout edit is clicked",
|
||
"onLogoutClick": "When logout is clicked",
|
||
"onOrderChange": "When the order changes",
|
||
"onProfileClick": "When the profile is clicked",
|
||
"onReset": "When reset",
|
||
"onRowClick": "When a row is clicked",
|
||
"onSelect": "When selected",
|
||
"onSelectionChange": "When the selection changes",
|
||
"onToggle": "When toggled",
|
||
"onComponentEvent": "On a specific event"
|
||
},
|
||
"advanced": "Advanced",
|
||
"view_code": "View code",
|
||
"summary_missing_required": "Some required fields are empty.",
|
||
"source_core": "Built-in",
|
||
"add_search": "Search actions",
|
||
"add_no_match": "No matching actions.",
|
||
"group": {
|
||
"state": "State",
|
||
"nav": "Navigation",
|
||
"notify": "Notifications",
|
||
"data": "Data",
|
||
"locale": "Language",
|
||
"etc": "Other",
|
||
"flow": "Flow control",
|
||
"error": "Error handling",
|
||
"extension": "Extensions"
|
||
},
|
||
"source_base": "Shared",
|
||
"source_module": "Module",
|
||
"source_plugin": "Plugin",
|
||
"source_route": "This page",
|
||
"source_template": "Template"
|
||
},
|
||
"visibility": {
|
||
"no_recipes": "This template provides no available display conditions",
|
||
"show_when": "Show this element when",
|
||
"and": "AND",
|
||
"or": "OR",
|
||
"remove": "Remove condition",
|
||
"preview": "Preview",
|
||
"clear": "Clear condition",
|
||
"advanced_preserved": "Condition authored in the code editor (preserved)"
|
||
},
|
||
"flex": {
|
||
"container_title": "Alignment box",
|
||
"item_title": "Inside the alignment box",
|
||
"direction": "Direction",
|
||
"justify": "Children alignment (main axis)",
|
||
"align": "Children alignment (cross axis)",
|
||
"wrap": "Allow wrapping",
|
||
"gap": "Child spacing",
|
||
"item_grow": "Grow",
|
||
"item_align": "Align self",
|
||
"item_order": "Order",
|
||
"make_flex": "Make alignment box",
|
||
"unmake_flex": "Remove alignment box",
|
||
"not_flex": "This element is not an alignment box"
|
||
},
|
||
"property_modal": {
|
||
"title": "Edit properties: {name}",
|
||
"settings_title": "{name} settings",
|
||
"element": "Element",
|
||
"close": "Close",
|
||
"delete_element": "Delete this element",
|
||
"no_editable_props": "This element has no editable properties",
|
||
"injected_props": {
|
||
"title": "Properties injected by extensions",
|
||
"help": "Base properties apply to every screen; injected properties apply only while this extension is active.",
|
||
"origin": "Injected by {source}",
|
||
"save_target": "On save: recorded on this extension row.",
|
||
"save_button": "Save to {source}",
|
||
"saving": "Saving…",
|
||
"saved": "Saved.",
|
||
"invalid_json": "Invalid JSON format."
|
||
},
|
||
"tab_deferred": "This tab is supported in a later phase",
|
||
"advanced_deferred": "This advanced property is supported in a later phase",
|
||
"unsupported_widget": "Unsupported control",
|
||
"value_conflict": "Conflicting value",
|
||
"settings_group": "Group {index}",
|
||
"advanced_badge": "This element contains advanced settings authored in the code editor",
|
||
"branch_badge": "This element belongs to the {device}-only layout — other devices show a different layout.",
|
||
"advanced_preserved_title": "{count} advanced setting(s) authored in code (preserved)",
|
||
"advanced_kind_developer": "Developer property",
|
||
"advanced_kind_expression": "Complex expression",
|
||
"tab": {
|
||
"settings": "Settings",
|
||
"props": "Properties",
|
||
"style": "Style",
|
||
"action": "Action",
|
||
"visibility": "Visibility",
|
||
"translation": "Translation",
|
||
"advanced": "Advanced"
|
||
},
|
||
"advanced": {
|
||
"permissions": "Visibility permissions",
|
||
"blur_until_loaded": "Blur until data loads",
|
||
"blur_hint": "Show blurred while loading data",
|
||
"comment": "Note"
|
||
},
|
||
"scope": {
|
||
"scheme_light": "Light",
|
||
"scheme_dark": "Dark",
|
||
"device_base": "Default",
|
||
"device_desktop": "PC",
|
||
"device_tablet": "Tablet",
|
||
"device_mobile": "Mobile",
|
||
"device_portable": "Mobile+Tablet",
|
||
"add_custom": "Custom size",
|
||
"custom_min": "Min",
|
||
"custom_max": "Max",
|
||
"custom_priority_note": "A custom range takes priority over PC/Tablet/Mobile.",
|
||
"custom_invalid": "Invalid range (min ≤ max, numbers only).",
|
||
"reset_to_base": "Reset to default"
|
||
},
|
||
"dark_code_only": "This color can only be edited in code mode for dark mode",
|
||
"dark_preset_only": "In dark mode, pick a preset color from the panel to apply it (free typed values are light-only)"
|
||
},
|
||
"core_props": {
|
||
"id": {
|
||
"label": "Element ID",
|
||
"placeholder": "e.g. main-content",
|
||
"add_data": "Data",
|
||
"binding_hint": "Connect an index or row key from a repeating list as data to give each item a unique ID (e.g. item_{{$idx}})"
|
||
},
|
||
"dataKey": {
|
||
"label": "Form data binding",
|
||
"placeholder": "e.g. form",
|
||
"hint": "The name that groups the input fields. Prefix with _global. or _isolated. to bind to a global or isolated scope.",
|
||
"bound_degraded": "This value is set in the code editor."
|
||
},
|
||
"isolatedScopeId": {
|
||
"label": "Scope name",
|
||
"placeholder": "e.g. cart-scope",
|
||
"search": "Search scope names",
|
||
"duplicate": "Another element already uses this scope name. They will share the same state."
|
||
},
|
||
"isolatedState": {
|
||
"label": "Isolated region",
|
||
"off_hint": "Give this element its own state, separate from the rest of the page.",
|
||
"initial_label": "Initial values"
|
||
}
|
||
},
|
||
"icon_picker": {
|
||
"search_placeholder": "Search icons",
|
||
"none": "None",
|
||
"no_results": "No matching icons",
|
||
"free_input_hint": "Type an icon name"
|
||
},
|
||
"list_editor": {
|
||
"add": "Add item",
|
||
"remove": "Remove",
|
||
"move_up": "Move up",
|
||
"move_down": "Move down",
|
||
"empty": "No items",
|
||
"item": "Item",
|
||
"edit_translation": "Edit translation",
|
||
"option_value": "Value",
|
||
"option_label": "Label",
|
||
"bound_degraded": "Bound to data (edit in code)",
|
||
"items_title": "Items",
|
||
"item_text": "Item text",
|
||
"item_label": "Label",
|
||
"item_placeholder": "Placeholder text",
|
||
"new_item": "New item",
|
||
"add_child": "Add {component}",
|
||
"no_child_component": "No child component is configured to add"
|
||
},
|
||
"array_editor": {
|
||
"items_title": "Items",
|
||
"item": "item",
|
||
"add": "Add {item}",
|
||
"remove": "Remove",
|
||
"move_up": "Move up",
|
||
"move_down": "Move down",
|
||
"empty": "No items",
|
||
"icon_placeholder": "Icon name (e.g. user, cog)",
|
||
"bound_degraded": "Bound to data (edit in code)",
|
||
"no_array_prop": "No array property is configured to edit",
|
||
"number_list_placeholder": "Comma-separated numbers (e.g. 10, 20, 30)"
|
||
},
|
||
"cell_tree_editor": {
|
||
"columns_title": "Columns",
|
||
"id_placeholder": "Column identifier",
|
||
"expand_cells": "Edit cell content",
|
||
"collapse_cells": "Close cell content",
|
||
"add_column": "Add {item}"
|
||
},
|
||
"table_editor": {
|
||
"title": "Edit table",
|
||
"add_row": "Add row",
|
||
"add_col": "Add column",
|
||
"remove_row": "Remove row",
|
||
"remove_col": "Remove column",
|
||
"merge_cells": "Merge cells",
|
||
"unmerge_cells": "Unmerge",
|
||
"cell_border": "Cell border",
|
||
"cell_class_placeholder": "e.g. border border-gray-300",
|
||
"move_row_up": "Move row up",
|
||
"move_row_down": "Move row down",
|
||
"move_col_left": "Move column left",
|
||
"move_col_right": "Move column right",
|
||
"move_blocked_section": "Cannot move across the table header/body boundary",
|
||
"header_row": "Header row",
|
||
"cell_text": "Cell text",
|
||
"cell_i18n_label": "Selected cell translations",
|
||
"structural_cell": "Structural cell (edit on canvas)",
|
||
"grid_invalid": "Table structure is inconsistent (check merges/holes)",
|
||
"select_hint": "Click a cell to select, Shift+click to select a range, then merge",
|
||
"cell_fill": "Cell Background",
|
||
"cell_fill_none": "None (transparent)",
|
||
"cell_fill_custom": "Pick a color",
|
||
"cell_padding": "Cell Padding",
|
||
"cell_padding_custom": "Custom",
|
||
"cell_color": "Cell Color",
|
||
"dark_free_color_hint": "Dark mode supports preset colors only (custom colors are light-only)"
|
||
},
|
||
"table_inplace": {
|
||
"select_cell": "Select cell",
|
||
"add_row": "Add row",
|
||
"add_col": "Add column",
|
||
"remove_row": "Remove row",
|
||
"remove_col": "Remove column",
|
||
"move_row_up": "Move row up",
|
||
"move_row_down": "Move row down",
|
||
"move_col_left": "Move column left",
|
||
"move_col_right": "Move column right",
|
||
"merge": "Merge",
|
||
"unmerge": "Unmerge",
|
||
"select_all": "Select all",
|
||
"border_apply_count": "Apply to {count} cells",
|
||
"merge_right": "Merge with right",
|
||
"merge_down": "Merge with below",
|
||
"border_apply_all": "Apply to whole table",
|
||
"select_cell_hint": "Click a cell on the canvas to show merge/border tools.",
|
||
"merge_range": "Merge range",
|
||
"range_selected": "{count} cells selected",
|
||
"custom_color": "Custom color"
|
||
},
|
||
"attachment_manager": {
|
||
"title": "Manage images for this layout",
|
||
"recent": "Recent uploads",
|
||
"manage_link": "Manage images",
|
||
"upload": "Upload image",
|
||
"use_as_bg": "Background",
|
||
"delete": "Delete",
|
||
"delete_confirm": "Delete this image? This cannot be undone.",
|
||
"empty": "No images uploaded for this layout.",
|
||
"loading": "Loading…",
|
||
"close": "Close"
|
||
},
|
||
"translation_manager": {
|
||
"title": "Manage translation keys for this layout",
|
||
"filter_label": "Status filter",
|
||
"filter_all": "All",
|
||
"filter_active": "In use",
|
||
"filter_orphaned": "Unused",
|
||
"badge_orphaned": "Unused / orphaned",
|
||
"badge_live_in_use": "In use on canvas",
|
||
"badge_live_unused": "Not on canvas",
|
||
"select_aria": "Select {key}",
|
||
"delete_selected": "Delete selected ({count})",
|
||
"purge_orphaned": "Delete all unused ({count})",
|
||
"delete_confirm": "Delete {count} selected translation key(s)? This cannot be undone.",
|
||
"conflict": "It was modified elsewhere first. Refresh and try again.",
|
||
"save": "Save",
|
||
"saving": "Saving…",
|
||
"delete": "Delete",
|
||
"empty": "No translation keys created for this layout.",
|
||
"loading": "Loading…",
|
||
"close": "Close"
|
||
},
|
||
"data_sources": {
|
||
"title": "Data Sources",
|
||
"description": "Add, edit, or remove the data sources this screen loads. Once defined, a source can be selected in a component's data binding.",
|
||
"add": "Add data source",
|
||
"edit": "Edit",
|
||
"remove": "Remove",
|
||
"close": "Close",
|
||
"empty": "No data sources defined for this screen.",
|
||
"no_label": "Display name (label_key) not set",
|
||
"inherited_title": "Inherited sources (read-only)",
|
||
"source": {
|
||
"module": "Module",
|
||
"plugin": "Plugin"
|
||
},
|
||
"form": {
|
||
"add_title": "Add data source",
|
||
"edit_title": "Edit data source",
|
||
"save": "Save",
|
||
"cancel": "Cancel"
|
||
},
|
||
"field": {
|
||
"id": "ID",
|
||
"label_key": "Display name",
|
||
"label_key_placeholder": "e.g. Product list",
|
||
"label_key_hint": "Friendly name shown in the searchable data picker. Type plain text and a translation key is created automatically; use the 🌐 button to edit per-language values.",
|
||
"type": "Type",
|
||
"endpoint": "Endpoint",
|
||
"method": "HTTP method",
|
||
"auth_mode": "Auth mode",
|
||
"loading_strategy": "Loading strategy",
|
||
"auto_fetch": "Fetch automatically on screen load",
|
||
"params": "Request parameters",
|
||
"params_hint": "Values may use binding expressions such as {{query.page}}.",
|
||
"params_empty": "Add values to send with the API request — e.g. page, per_page, a search term.",
|
||
"params_preview": "Preview of values to send",
|
||
"params_mode_block": "Blocks",
|
||
"params_mode_code": "Code",
|
||
"param_key_placeholder": "Parameter name",
|
||
"param_add": "Add parameter",
|
||
"fallback": "Fallback value",
|
||
"fallback_add": "Add fallback",
|
||
"fallback_add_field": "Add field",
|
||
"fallback_clear": "Remove fallback",
|
||
"fallback_empty": "Value shown before data loads or when it fails — e.g. an empty list ([]) under data.",
|
||
"fallback_key_placeholder": "Field name (e.g. data)",
|
||
"fallback_preview": "Fallback preview",
|
||
"content_type": "Content type",
|
||
"refetch_on_mount": "Refetch on re-entry",
|
||
"channel": "Channel",
|
||
"event": "Event",
|
||
"channel_type": "Channel type",
|
||
"target_source": "Target source",
|
||
"on_receive": "On message received"
|
||
},
|
||
"ds_type": {
|
||
"api": "API call",
|
||
"static": "Static data",
|
||
"route_params": "Route params",
|
||
"query_params": "Query params",
|
||
"websocket": "WebSocket"
|
||
},
|
||
"auth_mode": {
|
||
"none": "None (public)",
|
||
"optional": "Optional (send token if present)",
|
||
"required": "Required (fail without token)"
|
||
},
|
||
"loading_strategy": {
|
||
"progressive": "Progressive",
|
||
"blocking": "Blocking",
|
||
"background": "Background"
|
||
},
|
||
"error": {
|
||
"id_required": "Please enter an ID.",
|
||
"id_invalid": "ID may contain letters, digits, and underscores only, and cannot start with a digit.",
|
||
"id_duplicate": "ID '{id}' is already in use.",
|
||
"params_json": "Request parameters are not valid JSON.",
|
||
"params_object": "Request parameters must be a JSON object.",
|
||
"fallback_json": "Fallback value is not valid JSON."
|
||
},
|
||
"global_headers": "Global headers",
|
||
"global_headers_empty": "No global headers defined.",
|
||
"global_headers_hint": "Headers sent automatically with requests. Defined in code.",
|
||
"scripts": "Scripts",
|
||
"scripts_empty": "No scripts defined.",
|
||
"scripts_hint": "Scripts loaded by this screen. Defined in code.",
|
||
"section": {
|
||
"websocket": "Realtime (WebSocket) settings",
|
||
"on_success": "On success",
|
||
"on_error": "On error",
|
||
"error_handling": "Error handling by code",
|
||
"load_condition": "Load condition"
|
||
},
|
||
"add_error_code": "+ Add error code"
|
||
},
|
||
"toolbar": {
|
||
"color_scheme_group": "Color theme",
|
||
"color_scheme_light": "☀ Light",
|
||
"color_scheme_dark": "🌙 Dark",
|
||
"state": "State:"
|
||
},
|
||
"locale": {
|
||
"ko": "한국어",
|
||
"en": "English",
|
||
"ja": "日本語",
|
||
"zh": "中文",
|
||
"vi": "Tiếng Việt"
|
||
},
|
||
"inline_edit": {
|
||
"aria_label": "Edit text inline",
|
||
"toolbar_label": "Text formatting",
|
||
"new_key_hint": "A translation key will be created on save",
|
||
"existing_key_hint": "Translation — only the current language value is updated",
|
||
"open_translations": "Edit all languages",
|
||
"empty_warning": "Please enter content",
|
||
"format": {
|
||
"fontWeight": "Bold",
|
||
"fontBold": "Bold",
|
||
"fontStyle": "Italic",
|
||
"fontItalic": "Italic",
|
||
"textDecoration": "Underline",
|
||
"textUnderline": "Underline",
|
||
"textAlign": "Align",
|
||
"fontSize": "Font size",
|
||
"textColor": "Text color"
|
||
},
|
||
"prompt": {
|
||
"fontSize": "Enter font size (e.g. 16px, 1.2rem)",
|
||
"textColor": "Enter text color (e.g. #2563eb)"
|
||
}
|
||
},
|
||
"prop_i18n": {
|
||
"placeholder": "Enter text",
|
||
"edit_languages": "Edit per language",
|
||
"bound_code_only": "Bound (edit in code)",
|
||
"create_first": "Enter the current language value first to create a translation key, then edit per language."
|
||
},
|
||
"value_tree": {
|
||
"show_source": "View source expression",
|
||
"raw_code_only": "Edit in code",
|
||
"segmented_hint": "This value is several parts joined together. Add or remove parts, or drag the handle to reorder.",
|
||
"drag_reorder": "Drag to reorder",
|
||
"change_data": "Change data",
|
||
"edit": "Edit",
|
||
"done": "Done",
|
||
"collapse": "Collapse",
|
||
"to_expression": "Switch to expression",
|
||
"to_plain": "Back to simple name",
|
||
"to_plain_lead": "Remove the expression and keep only this value:",
|
||
"to_plain_warn": "All other conditions, branches, and data links will be deleted and cannot be undone.",
|
||
"to_plain_ok": "Revert to this value",
|
||
"to_plain_cancel": "Cancel",
|
||
"raw_expression_hint": "This value is already written as an expression, so it can't be broken down into friendly editing. You can edit the expression directly above, or use [Edit code] at the top for more complex changes.",
|
||
"segment": {
|
||
"text": "Fixed text",
|
||
"expression": "Part that varies by condition",
|
||
"fallback": "Instead, when empty",
|
||
"data": "Data",
|
||
"remove": "Remove this part",
|
||
"data_pick_hint": "Search and select the data to display.",
|
||
"data_no_candidates": "No data is available to connect on this screen."
|
||
},
|
||
"cond": {
|
||
"label": "Condition",
|
||
"code_only": "Edit in code",
|
||
"field_placeholder": "Base value (e.g. edit mode)",
|
||
"value_placeholder": "Value to compare",
|
||
"when_true": "When this condition",
|
||
"when_false": "Otherwise",
|
||
"op_truthy": "has a value",
|
||
"op_falsy": "has no value",
|
||
"op_eq": "equals",
|
||
"op_neq": "is not",
|
||
"op_gt": "greater than",
|
||
"op_lt": "less than",
|
||
"op_gte": "at least",
|
||
"op_lte": "at most"
|
||
},
|
||
"fallback": {
|
||
"primary": "Default value",
|
||
"when_empty": "Instead, when empty",
|
||
"when_falsy": "Instead, when blank"
|
||
},
|
||
"concat": {
|
||
"hint": "Joins multiple values in order.",
|
||
"part": "Part {n}"
|
||
}
|
||
},
|
||
"translation": {
|
||
"key_label": "Translation key",
|
||
"needs_translation": "Needs translation",
|
||
"not_a_key": "This element is not a translation key. Double-click the text on the canvas to edit it inline and create a key.",
|
||
"loading": "Loading…",
|
||
"load_failed": "Failed to load translation values",
|
||
"save": "Save",
|
||
"saving": "Saving…",
|
||
"saved": "Saved",
|
||
"save_failed": "Failed to save",
|
||
"conflict": "Another user edited this first. Reload and try again.",
|
||
"token_mismatch": "You cannot change or delete the data binding ({{ }}) inside a translation. Edit data bindings in the [Properties] tab.",
|
||
"placeholder_mismatch": "You cannot delete or change the data placeholders ({p0}, etc.) in a translation. Translate the sentence freely but keep the placeholders intact.",
|
||
"placeholder_locked": "Data chips cannot be deleted like text. Drag to reposition, and disconnect from the [Properties] tab."
|
||
},
|
||
"shortcuts": {
|
||
"title": "Shortcuts",
|
||
"close": "Close",
|
||
"or": "or",
|
||
"footnote": "Shortcuts are disabled while an input or modal has focus.",
|
||
"group": {
|
||
"clipboard": "Clipboard",
|
||
"element": "Element",
|
||
"history": "History",
|
||
"view": "View/Tools",
|
||
"document": "Document"
|
||
},
|
||
"action": {
|
||
"copy": "Copy",
|
||
"cut": "Cut",
|
||
"paste": "Paste (across layouts)",
|
||
"open_props": "Open properties",
|
||
"delete": "Delete",
|
||
"select_parent": "Select parent",
|
||
"deselect": "Deselect",
|
||
"add_element": "Add element",
|
||
"undo": "Undo",
|
||
"redo": "Redo",
|
||
"edit_code": "Edit code",
|
||
"preview": "Preview",
|
||
"translations": "Translations",
|
||
"help": "Shortcut map",
|
||
"reset": "Reset",
|
||
"save": "Save",
|
||
"exit": "Exit"
|
||
}
|
||
},
|
||
"binding": {
|
||
"section_title": "Data Binding",
|
||
"search": "Search data",
|
||
"search_placeholder": "Search by name or path…",
|
||
"no_results": "No matching data",
|
||
"not_connected": "Not connected",
|
||
"clear": "Clear",
|
||
"complex": "Complex binding (edit in code)",
|
||
"required": "Required",
|
||
"item_fields": "Item fields",
|
||
"shape_scalar": "Scalar",
|
||
"shape_array": "Array",
|
||
"shape_object": "Object",
|
||
"iteration_title": "Repeat data binding",
|
||
"iteration_label": "Repeat data source",
|
||
"iteration_hint": "This region repeats over an array. One item template is rendered once per data row.",
|
||
"iteration_item_var": "Item variable",
|
||
"iteration_index_var": "Index variable"
|
||
},
|
||
"inline_binding": {
|
||
"section_title": "Text data binding",
|
||
"none": "No data is bound to this text",
|
||
"search": "Search data",
|
||
"search_placeholder": "Search by name or path…",
|
||
"no_results": "No matching data",
|
||
"clear": "Remove",
|
||
"complex": "Complex binding (edit in code)",
|
||
"append_hint": "Insert data at end of text",
|
||
"insert_data": "Data",
|
||
"param_hint": "Edit the sentence in the [Translation] tab (drag data chips to reposition); here you can change, add, or disconnect the connected data sources."
|
||
},
|
||
"host_picker": {
|
||
"title": "Select representative host layout",
|
||
"description": "This extension is injected into multiple screens. Choose which screen to edit on. Saved changes apply to every screen this extension is injected into.",
|
||
"description_with_label": "The \"{label}\" extension is injected into multiple screens. Choose which screen to edit on."
|
||
},
|
||
"computed": {
|
||
"add": "Add value",
|
||
"empty": "No computed values yet.",
|
||
"custom_open": "Build a custom value",
|
||
"custom_add": "Add this value",
|
||
"revert": "Revert",
|
||
"source_base": "From common layout",
|
||
"source_overridden": "Overridden",
|
||
"overridden_hint": "This value overrides the common layout.",
|
||
"override_notice": "This name overrides a value from the common layout.",
|
||
"key_duplicate": "This name is already in use.",
|
||
"preview_label": "Result",
|
||
"preview_error": "Could not calculate a preview.",
|
||
"effect_preview": "Preview effect",
|
||
"value_none": "None",
|
||
"list_more": "+{count} more",
|
||
"custom_step1": "Which data",
|
||
"custom_step2": "What to do with it",
|
||
"custom_step3": "Name the result",
|
||
"custom_sum_field": "Field to add up",
|
||
"custom_value_field": "Value field",
|
||
"custom_label_field": "Label field",
|
||
"custom_prop": "Field to read",
|
||
"custom_candidates": "Fields to check, in order",
|
||
"custom_fallback": "Fallback value",
|
||
"cond_add": "Add condition",
|
||
"cond_field": "Field",
|
||
"cond_value": "Value",
|
||
"op_count": "Count items",
|
||
"op_sum": "Add up a field",
|
||
"op_filter": "Keep matching items",
|
||
"op_to_options": "Turn into options",
|
||
"op_nth": "Pick one by position",
|
||
"op_first_of": "First available value",
|
||
"op_literal": "A fixed value",
|
||
"kind_string": "Text",
|
||
"kind_number": "Number",
|
||
"kind_boolean": "True / false",
|
||
"type_number": "Number",
|
||
"type_string": "Text",
|
||
"type_boolean": "True / false",
|
||
"type_list": "List",
|
||
"type_object": "Object",
|
||
"type_null": "Empty",
|
||
"group_common": "Common",
|
||
"group_more": "More"
|
||
},
|
||
"init_actions": {
|
||
"empty": "No actions run when this screen opens.",
|
||
"empty_self": "No actions added for this screen yet.",
|
||
"group_base": "From common layout",
|
||
"group_self": "This screen",
|
||
"merge_order": "Common layout actions run first, then this screen’s actions.",
|
||
"base_readonly_hint": "Common layout actions are edited in the common (base) layout’s page settings.",
|
||
"edit": "Edit",
|
||
"remove": "Remove",
|
||
"drag_reorder": "Drag to reorder",
|
||
"locked_parent": "Defined in the common layout",
|
||
"cond_badge": "Conditional",
|
||
"if_label": "Only run when",
|
||
"if_placeholder": "e.g. {{user.isAdmin}}",
|
||
"advanced_param_hint": "These settings are edited in code."
|
||
},
|
||
"action_param": {
|
||
"key_placeholder": "Name",
|
||
"value_placeholder": "Value (data binding / expression supported)",
|
||
"add_pair": "Add value",
|
||
"number_placeholder": "Number or data binding"
|
||
},
|
||
"initstate": {
|
||
"section_local": "This screen",
|
||
"section_global": "Whole app",
|
||
"section_isolated": "Isolated scopes",
|
||
"section_isolated_desc": "Starting values for elements that have their own isolated state.",
|
||
"isolated_dynamic_hint": "Isolated scopes created while the screen runs are not listed here.",
|
||
"isolated_orphan": "No element on this screen uses this scope name.",
|
||
"legacy_state": "This screen still uses an older state format.",
|
||
"no_values": "No values set.",
|
||
"value_name": "Value name",
|
||
"value_kind": "Value type",
|
||
"add_value": "Add value",
|
||
"revert": "Revert",
|
||
"subkey_name": "Key name",
|
||
"add_subkey": "Add key",
|
||
"add_item": "Add item",
|
||
"kind_string": "Text",
|
||
"kind_number": "Number",
|
||
"kind_boolean": "True / false",
|
||
"kind_null": "Empty",
|
||
"kind_list": "List",
|
||
"kind_object": "Object",
|
||
"name_required": "Enter a value name.",
|
||
"name_duplicate": "A value with this name already exists.",
|
||
"name_invalid": "Names must start with a letter and use only letters, digits, and _."
|
||
},
|
||
"action_chip": {
|
||
"response_data": "Response data",
|
||
"response_message": "Response message",
|
||
"error_status": "Error status code",
|
||
"error_message": "Error message",
|
||
"error_errors": "Validation errors",
|
||
"error_data": "Error response data",
|
||
"error_status_text": "Error status text",
|
||
"payload_data": "Received data"
|
||
},
|
||
"error": {
|
||
"intro": "Choose what happens when this screen runs into an error.",
|
||
"degrade": "When nothing is set here, errors are shown using the default behavior.",
|
||
"message_placeholder": "Message to show (use 🔍 to insert error details)",
|
||
"handler_none": "Do nothing",
|
||
"target_content": "Content area",
|
||
"target_full": "Whole screen",
|
||
"setstate_key": "State name",
|
||
"handler_navigate": "Go to another page",
|
||
"handler_openModal": "Open a modal",
|
||
"handler_parallel": "Run actions at once",
|
||
"handler_sequence": "Run actions in order",
|
||
"handler_setState": "Change state",
|
||
"handler_showErrorPage": "Show error page",
|
||
"handler_toast": "Show a notification"
|
||
},
|
||
"page_settings": {
|
||
"title": "{name} settings",
|
||
"close": "Close",
|
||
"advanced_summary": "{count} setting(s) are edited in code and shown here as read-only.",
|
||
"tab": {
|
||
"meta": "Page",
|
||
"seo": "SEO",
|
||
"init": "On load",
|
||
"overlay": "Loading",
|
||
"computed": "Computed values",
|
||
"state": "Initial state",
|
||
"error": "Errors",
|
||
"data": "Data"
|
||
},
|
||
"banner": {
|
||
"advanced": "In code",
|
||
"inline_hint": "Press Enter to save, Esc to cancel.",
|
||
"dblclick_hint": "Double-click to edit",
|
||
"open_settings": "Page settings"
|
||
},
|
||
"meta": {
|
||
"title": "Page name",
|
||
"description": "Page description",
|
||
"dynamic_hint": "Set in code",
|
||
"icon": "Menu icon",
|
||
"icon_placeholder": "e.g. fa-home",
|
||
"editor_label": "Name in the editor",
|
||
"editor_label_hint": "Only shown in the editor screen tree, not to visitors.",
|
||
"permissions": "Required permissions",
|
||
"permissions_hint": "Visitors need these permissions to view the page."
|
||
},
|
||
"computed": {
|
||
"heading": "Computed values"
|
||
},
|
||
"error": {
|
||
"heading": "Error handling"
|
||
},
|
||
"init_actions": {
|
||
"heading": "Run when the screen opens"
|
||
},
|
||
"initstate": {
|
||
"heading": "Initial state"
|
||
},
|
||
"seo": {
|
||
"title": "SEO title",
|
||
"description": "SEO description",
|
||
"enabled": "Generate an SEO-friendly page for search engines",
|
||
"disabled_note": "SEO generation is off for this screen.",
|
||
"use_default": "Use default",
|
||
"revert_default": "Revert",
|
||
"value_placeholder": "Enter a value",
|
||
"remove": "Remove",
|
||
"page_type": "Page type",
|
||
"page_type_none": "Not set",
|
||
"page_type_free_placeholder": "Enter a page type",
|
||
"page_type_free_note": "No matching page type was found, so this is treated as a custom value.",
|
||
"extensions": "SEO extensions",
|
||
"add_extension": "Add extension",
|
||
"no_extension_candidate": "No extensions available.",
|
||
"missing_extensions": "No SEO extension selected.",
|
||
"missing_page_type": "No page type selected.",
|
||
"defaults_precondition": "Set the items below to fill in SEO defaults:",
|
||
"toggle_setting": "Toggle setting",
|
||
"toggle_setting_search": "Search settings",
|
||
"data_sources": "Data sources",
|
||
"data_sources_hint": "Select the data that SEO variables and structured data will reference.",
|
||
"data_sources_empty": "No data sources on this screen.",
|
||
"priority": "Sitemap priority",
|
||
"changefreq": "Update frequency",
|
||
"structured_data": "Structured data",
|
||
"vars": "SEO variables",
|
||
"og_section": "Open Graph (social sharing)",
|
||
"og_type": "Type",
|
||
"og_title": "Title",
|
||
"og_description": "Description",
|
||
"og_image": "Image",
|
||
"og_image_alt": "Image alt text",
|
||
"og_image_adv": "Advanced image options (height·type·secure URL)",
|
||
"og_image_height": "Image height (px)",
|
||
"og_image_type": "Image type (e.g. image/png)",
|
||
"og_image_secure_url": "Image secure URL (https)",
|
||
"og_site_name": "Site name",
|
||
"og_locale": "Language",
|
||
"og_extra": "Extra tags",
|
||
"og_locked": "Set by an extension",
|
||
"og_intro": "Empty fields use the default set by the core/extension (source shown). Typing overrides it for this screen.",
|
||
"og_source_core": "Built-in",
|
||
"og_source_filter": "Extension",
|
||
"og_source_inherited": "Shared layout",
|
||
"og_source_module": "From {name}",
|
||
"auto_chip_source": "From extension",
|
||
"auto_chip_replace": "Use different data",
|
||
"tw_section": "Twitter card",
|
||
"tw_fallback_note": "Empty fields fall back to the Open Graph values above.",
|
||
"tw_card": "Card type",
|
||
"tw_site": "Site account",
|
||
"tw_creator": "Author account",
|
||
"tw_title": "Title",
|
||
"tw_description": "Description",
|
||
"tw_image": "Image",
|
||
"tw_image_alt": "Image alt text",
|
||
"tw_extra": "Extra tags",
|
||
"extra_property": "property",
|
||
"extra_name": "name",
|
||
"extra_content": "content",
|
||
"add_extra": "Add tag",
|
||
"sd_mode": "Structured data",
|
||
"sd_filter_locked": "Set by an extension",
|
||
"sd_filter_locked_note": "An extension is providing this structured data, so it cannot be edited here.",
|
||
"sd_manual_toggle": "Add my own structured data",
|
||
"sd_auto_title": "Provided automatically",
|
||
"sd_auto_empty": "Nothing provided automatically.",
|
||
"sd_replace_pre_warn": "Adding your own structured data replaces what is provided automatically.",
|
||
"sd_replace_warn": "Your structured data replaces the automatic one.",
|
||
"sd_type": "Type",
|
||
"sd_prop_key": "Property",
|
||
"sd_prop_value": "Value",
|
||
"sd_add_prop": "Add property",
|
||
"sd_seed_from_module": "Start from the automatic one",
|
||
"sd_empty_note": "Leave empty to use the automatic structured data.",
|
||
"sd_has_empty": "Some values are empty.",
|
||
"vars_precondition": "Select a page type and SEO extension first to see available variables.",
|
||
"vars_auto_group": "Filled automatically",
|
||
"vars_auto": "auto",
|
||
"vars_data_group": "From data sources",
|
||
"vars_custom_group": "Custom",
|
||
"vars_required_empty": "This required variable has no value.",
|
||
"vars_add": "Add variable",
|
||
"vars_add_name": "Variable name",
|
||
"vars_name_reserved": "\"{name}\" is a reserved name.",
|
||
"vars_name_duplicate": "\"{name}\" already exists.",
|
||
"vars_name_not_provided": "\"{name}\" is not provided by the selected extension.",
|
||
"vars_value_hint": "Variable values can use data from this screen.",
|
||
"bot_preview_title": "Search engine preview",
|
||
"bot_preview_refresh": "Refresh",
|
||
"bot_preview_disabled": "Turn on SEO generation to see the preview.",
|
||
"bot_preview_empty": "No preview yet.",
|
||
"bot_preview_mode_code": "Source",
|
||
"bot_preview_mode_render": "Preview",
|
||
"bot_preview_sample_note": "This preview uses sample data.",
|
||
"page_type_free": "Enter manually"
|
||
}
|
||
},
|
||
"target_picker": {
|
||
"cancel": "Cancel",
|
||
"canvas_pick_hint": "Click an element on the canvas to link",
|
||
"select_area": "Select area",
|
||
"id_placeholder": "Enter an element ID or select an area",
|
||
"none": "Not selected",
|
||
"minimized_hint": "Click an element on the canvas to link it",
|
||
"needs_id": "An ID is required to link this element"
|
||
},
|
||
"action_recipe": {
|
||
"set_state": {
|
||
"label": "Set or change screen state",
|
||
"param_target": "Target (local/global)",
|
||
"param_state": "State value",
|
||
"param_merge": "Merge with existing value"
|
||
},
|
||
"load_local": {
|
||
"label": "Load saved settings",
|
||
"param_key": "Storage key",
|
||
"param_state_key": "State key to fill",
|
||
"param_default": "Default value"
|
||
},
|
||
"save_local": {
|
||
"label": "Save settings",
|
||
"param_key": "Storage key",
|
||
"param_value": "Value to save"
|
||
},
|
||
"navigate": {
|
||
"label": "Go to another page",
|
||
"param_path": "Destination page",
|
||
"param_query": "Query values",
|
||
"param_merge_query": "Keep existing query",
|
||
"param_scroll": "Scroll position",
|
||
"param_replace": "Replace history",
|
||
"param_overlay_target": "Loading overlay area"
|
||
},
|
||
"open_window": {
|
||
"label": "Open in a new window",
|
||
"param_target": "Page to open",
|
||
"param_window_target": "Open mode (new/current window)"
|
||
},
|
||
"navigate_back": {
|
||
"label": "Go back"
|
||
},
|
||
"navigate_forward": {
|
||
"label": "Go forward"
|
||
},
|
||
"replace_url": {
|
||
"label": "Change URL only",
|
||
"param_path": "Page",
|
||
"param_query": "Query values"
|
||
},
|
||
"toast": {
|
||
"label": "Show a notice message",
|
||
"param_message": "Message",
|
||
"param_type": "Type (info/success/warning/error)",
|
||
"param_duration": "Duration (ms)",
|
||
"param_icon": "Icon"
|
||
},
|
||
"open_modal": {
|
||
"label": "Open a dialog",
|
||
"param_target": "Dialog to open"
|
||
},
|
||
"close_modal": {
|
||
"label": "Close a dialog"
|
||
},
|
||
"show_alert": {
|
||
"label": "Show a browser alert",
|
||
"param_message": "Message"
|
||
},
|
||
"set_error": {
|
||
"label": "Set error state",
|
||
"param_message": "Message",
|
||
"param_state_target": "Target (local/global)"
|
||
},
|
||
"refetch": {
|
||
"label": "Refresh list",
|
||
"param_data_source": "Data source",
|
||
"param_sync": "Run synchronously"
|
||
},
|
||
"append_data": {
|
||
"label": "Add data to list",
|
||
"param_data_source": "Data source",
|
||
"param_data_path": "Data path",
|
||
"param_new_data": "Data to add"
|
||
},
|
||
"update_data": {
|
||
"label": "Replace list data",
|
||
"param_data_source": "Data source",
|
||
"param_data": "New data",
|
||
"param_merge": "Merge with existing"
|
||
},
|
||
"scroll": {
|
||
"label": "Scroll to a position",
|
||
"param_selector": "Target selector",
|
||
"param_behavior": "Scroll mode (smooth/instant)",
|
||
"param_block": "Alignment"
|
||
},
|
||
"login": {
|
||
"label": "Handle login",
|
||
"param_body": "Login info"
|
||
},
|
||
"logout": {
|
||
"label": "Handle logout",
|
||
"param_target": "Destination"
|
||
},
|
||
"set_locale": {
|
||
"label": "Change language",
|
||
"param_target": "Language"
|
||
},
|
||
"emit_event": {
|
||
"label": "Send a component event",
|
||
"param_event": "Event name",
|
||
"param_data": "Payload"
|
||
},
|
||
"api_call": {
|
||
"label": "Send to server and handle result",
|
||
"param_target": "Request address",
|
||
"param_method": "Method (GET/POST, etc.)",
|
||
"param_body": "Request body",
|
||
"param_query": "Query values",
|
||
"param_identity_target_email": "Identity verification email",
|
||
"param_identity_target_phone": "Identity verification phone",
|
||
"param_on_success": "On success",
|
||
"param_on_error": "On error"
|
||
},
|
||
"conditions": {
|
||
"label": "Branch by condition",
|
||
"param_branches": "Branches",
|
||
"param_if": "Condition",
|
||
"param_then": "Actions to run",
|
||
"branch_when": "When",
|
||
"branch_else": "Otherwise",
|
||
"add_branch": "Add branch",
|
||
"remove_branch": "Remove branch",
|
||
"move_up": "Move up",
|
||
"move_down": "Move down"
|
||
},
|
||
"sequence": {
|
||
"label": "Run actions in order",
|
||
"param_actions": "Action list"
|
||
},
|
||
"parallel": {
|
||
"label": "Run actions at the same time",
|
||
"param_actions": "Action list"
|
||
},
|
||
"switch": {
|
||
"label": "Branch by value",
|
||
"param_value": "Value to check",
|
||
"param_cases": "Actions per case"
|
||
},
|
||
"suppress": {
|
||
"label": "Do nothing (suppress error)"
|
||
}
|
||
},
|
||
"action_list": {
|
||
"drag_reorder": "Drag to reorder",
|
||
"remove": "Remove",
|
||
"unknown": "Unknown action",
|
||
"view_code": "View code"
|
||
},
|
||
"error_rows": {
|
||
"default": "Default (all other errors)",
|
||
"clear": "Clear setting",
|
||
"no_action": "Not set",
|
||
"default_warning": "Applies to all errors not set above and overrides the template's default behavior.",
|
||
"source_self": "Set on this page",
|
||
"source_inherited": "Inherited from shared layout",
|
||
"source_template": "Template default",
|
||
"source_none": "Template default",
|
||
"revert": "Revert",
|
||
"override_here": "Override here",
|
||
"override_inherited": "Changing this overrides the parent setting for this page only.",
|
||
"override_template": "This action is set template-wide. Changing it here overrides the template setting for this page only."
|
||
},
|
||
"modal": {
|
||
"minimized_default": "Page settings",
|
||
"restore": "Restore"
|
||
},
|
||
"json_block": {
|
||
"mode_code": "As code",
|
||
"mode_block": "As blocks",
|
||
"invalid": "Not a valid JSON format.",
|
||
"must_be_object": "Must be a JSON object, e.g. { \"name\": value }",
|
||
"invalid_keys": "Names must start with a letter and use only letters, digits, _: {keys}"
|
||
}
|
||
}
|