{ "$schema": "http://json-schema.org/draft-07/schema#", "title": "Home Assistant Translation File Schema", "description": "Schema for Home Assistant custom integration translation files based on https://developers.home-assistant.io/docs/internationalization/core", "type": "object", "properties": { "title": { "type": "string", "description": "Title of the integration (optional, will fallback to integration name if omitted). Only include if not a product brand." }, "common": { "type": "object", "description": "Shared strings that can be referenced using [%key:component::domain::common::key_path%]", "additionalProperties": true }, "config": { "type": "object", "description": "Translations for the configuration flow", "properties": { "flow_title": { "type": "string", "description": "Title shown in list (only rendered if placeholders required), e.g. 'Discovered Device ({host})'" }, "entry_type": { "type": "string", "description": "Label explaining what an entry represents (optional, only if default translations are misleading)" }, "initiate_flow": { "type": "object", "description": "Menu or button labels for starting flows", "properties": { "reconfigure": { "type": "string", "description": "Label for reconfigure flow" }, "user": { "type": "string", "description": "Label for user flow" } } }, "step": { "type": "object", "description": "Translations for each config flow step", "additionalProperties": { "type": "object", "properties": { "title": { "type": "string", "description": "User-visible title of the step (will show integration name if omitted)" }, "description": { "type": "string", "description": "Markdown description shown with the step (optional)" }, "data": { "type": "object", "description": "Labels for input fields", "additionalProperties": { "type": "string" } }, "data_description": { "type": "object", "description": "Descriptions for input fields", "additionalProperties": { "type": "string" } }, "sections": { "type": "object", "description": "Labels for form sections (only if form has sections)", "additionalProperties": { "type": "object", "properties": { "name": { "type": "string", "description": "Section label" } } } } } } }, "error": { "type": "object", "description": "Error messages returned by the flow", "additionalProperties": { "type": "string" } }, "abort": { "type": "object", "description": "Abort messages (supports Markdown)", "additionalProperties": { "type": "string" } }, "progress": { "type": "object", "description": "Progress messages for async_show_progress (supports Markdown)", "additionalProperties": { "type": "string" } }, "create_entry": { "type": "object", "description": "Success dialog messages (supports Markdown)", "properties": { "default": { "type": "string", "description": "Default message if async_create_entry called with description=None" } }, "additionalProperties": { "type": "string", "description": "Custom messages for specific description keys" } } } }, "options": { "type": "object", "description": "Translations for the options flow (same format as config)" }, "config_subentries": { "type": "object", "description": "Translations for config subentry flows (map of subentry types, each with same format as config)", "additionalProperties": { "type": "object" } }, "selector": { "type": "object", "description": "Translations for selector options. The key is the translation_key set in SelectSelectorConfig. CRITICAL: Use selector.{translation_key}.options.{value}, NOT selector.select.{translation_key}", "additionalProperties": { "type": "object", "properties": { "options": { "type": "object", "description": "Option label translations for select selectors. Keys must match the values passed in the options list.", "additionalProperties": { "type": "string" } }, "unit_of_measurement": { "type": "object", "description": "Unit translations for number selectors", "additionalProperties": { "type": "string" } } } } }, "services": { "type": "object", "description": "Translations for service actions", "additionalProperties": { "type": "object", "properties": { "name": { "type": "string", "description": "Service action name" }, "description": { "type": "string", "description": "Service action description" }, "fields": { "type": "object", "description": "Field translations", "additionalProperties": { "type": "object", "properties": { "name": { "type": "string", "description": "Field name" }, "description": { "type": "string", "description": "Field description" } } } }, "sections": { "type": "object", "description": "Collapsible section labels", "additionalProperties": { "type": "object", "properties": { "name": { "type": "string", "description": "Section name" } } } } } } }, "entity": { "type": "object", "description": "Translations for entities", "additionalProperties": { "type": "object", "description": "Entity domain (sensor, binary_sensor, etc.)", "additionalProperties": { "type": "object", "description": "Entity translation_key", "properties": { "name": { "type": "string", "description": "Entity name (only for entities with has_entity_name=True)" }, "state": { "type": "object", "description": "State translations", "additionalProperties": { "type": "string" } }, "state_attributes": { "type": "object", "description": "Entity state attribute translations", "additionalProperties": { "type": "object", "properties": { "name": { "type": "string", "description": "Attribute name" }, "state": { "type": "object", "description": "Attribute state translations", "additionalProperties": { "type": "string" } } } } }, "unit_of_measurement": { "type": "string", "description": "Unit of measurement translation (for sensor/number entities)" } } } } }, "entity_component": { "type": "object", "description": "Translations for entity components (if integration provides entities under its domain)", "additionalProperties": { "type": "object", "description": "Device class or '_' for default", "properties": { "state": { "type": "object", "description": "State translations for this device class", "additionalProperties": { "type": "string" } }, "state_attributes": { "type": "object", "description": "Attribute name and state translations", "additionalProperties": { "type": "object", "properties": { "name": { "type": "string", "description": "Attribute name" }, "state": { "type": "object", "description": "Attribute state values", "additionalProperties": { "type": "string" } } } } } } } }, "device": { "type": "object", "description": "Translations for device names", "additionalProperties": { "type": "object", "properties": { "name": { "type": "string", "description": "Device name (set device's translation_key to use this)" } } } }, "device_automation": { "type": "object", "description": "Translations for device automations", "properties": { "action_type": { "type": "object", "description": "Device action translations", "additionalProperties": { "type": "string" } }, "condition_type": { "type": "object", "description": "Device condition translations", "additionalProperties": { "type": "string" } }, "trigger_type": { "type": "object", "description": "Device trigger translations", "additionalProperties": { "type": "string" } }, "trigger_subtype": { "type": "object", "description": "Device trigger subtype translations (e.g., button names)", "additionalProperties": { "type": "string" } } } }, "exceptions": { "type": "object", "description": "Translations for HomeAssistantError and subclasses", "additionalProperties": { "type": "object", "properties": { "message": { "type": "string", "description": "Exception message (supports placeholders)" } } } }, "issues": { "type": "object", "description": "Translations for repairs issues", "additionalProperties": { "type": "object", "properties": { "title": { "type": "string", "description": "Issue title" }, "description": { "type": "string", "description": "Issue description (exactly one of 'description' or 'fix_flow' must be present)" }, "fix_flow": { "type": "object", "description": "Repair flow translations (same format as config flow, exactly one of 'description' or 'fix_flow' must be present)" } } } } } }