- Parse OWM One Call 3.0 weather alerts and map to Warning structs - Map hourly UVI from OWM response to HourlyForecast.UVIndex - Add severity helper mapping OWM alert tags to severity levels - Extract UVIndex through compute layer to timeline slots - Smart warnings: use provider-supplied alerts, fall back to DWD - Show UV index in dashboard timeline tooltips - Add provider description below forecast dropdown with i18n
380 lines
19 KiB
JSON
380 lines
19 KiB
JSON
{
|
|
"app": {
|
|
"name": "HeatGuard",
|
|
"tagline": "Personalized heat preparedness"
|
|
},
|
|
"nav": {
|
|
"dashboard": "Dashboard",
|
|
"setup": "Setup",
|
|
"guide": "Guide",
|
|
"impress": "Impress",
|
|
"privacy": "Privacy",
|
|
"language": "Language"
|
|
},
|
|
"setup": {
|
|
"title": "Setup",
|
|
"profiles": {
|
|
"title": "Profiles",
|
|
"help": "A profile represents a location you want to monitor.",
|
|
"name": { "label": "Name", "tooltip": "A descriptive name for this location" },
|
|
"latitude": { "label": "Latitude", "tooltip": "Decimal degrees (e.g. 52.52)" },
|
|
"longitude": { "label": "Longitude", "tooltip": "Decimal degrees (e.g. 13.405)" },
|
|
"timezone": { "label": "Timezone", "tooltip": "IANA timezone (e.g. Europe/Berlin)" },
|
|
"geolocate": {
|
|
"button": "Use my location",
|
|
"loading": "Detecting location\u2026",
|
|
"denied": "Location permission denied.",
|
|
"unavailable": "Location unavailable.",
|
|
"timeout": "Location request timed out."
|
|
},
|
|
"add": "Add Profile",
|
|
"save": "Save Profile",
|
|
"edit": "Edit",
|
|
"delete": "Delete",
|
|
"noItems": "No profiles yet. Create one to get started."
|
|
},
|
|
"rooms": {
|
|
"title": "Rooms",
|
|
"help": "Add rooms to monitor. Properties affect heat calculations.",
|
|
"name": { "label": "Name", "tooltip": "Room name (e.g. Office, Bedroom)" },
|
|
"area": { "label": "Area (m\u00b2)", "tooltip": "Floor area. Affects solar gain through windows." },
|
|
"ceilingHeight": { "label": "Ceiling Height (m)", "tooltip": "Room height. Affects air volume for ventilation calculations." },
|
|
"floor": { "label": "Floor", "tooltip": "Floor number (0 = ground). Higher floors tend to be warmer." },
|
|
"orientation": {
|
|
"label": "Orientation",
|
|
"tooltip": "Primary window direction. Affects solar gain timing.",
|
|
"options": { "N": "North", "NE": "Northeast", "E": "East", "SE": "Southeast", "S": "South", "SW": "Southwest", "W": "West", "NW": "Northwest" }
|
|
},
|
|
"shadingType": {
|
|
"label": "Shading",
|
|
"tooltip": "Type of exterior shading (none, blinds, shutters, awning).",
|
|
"options": { "none": "None", "blinds": "Blinds", "shutters": "Shutters", "awning": "Awning" }
|
|
},
|
|
"shadingFactor": { "label": "Shading Factor", "tooltip": "0 = fully shaded, 1 = no shading. External shutters \u2248 0.2, internal blinds \u2248 0.6." },
|
|
"ventilation": { "label": "Ventilation", "tooltip": "Ventilation type (natural, mechanical, sealed)." },
|
|
"ventilationAch": { "label": "Ventilation ACH", "tooltip": "Air Changes per Hour. Sealed \u2248 0.3, natural \u2248 1.5, open windows \u2248 5.0." },
|
|
"windowFraction": { "label": "Window Fraction", "tooltip": "Fraction of wall area that is window (0\u20131). Typical: 0.15." },
|
|
"shgc": { "label": "SHGC", "tooltip": "Solar Heat Gain Coefficient (0\u20131). Low-E glass \u2248 0.3, clear glass \u2248 0.8." },
|
|
"insulation": {
|
|
"label": "Insulation",
|
|
"tooltip": "Wall insulation quality (poor, average, good, excellent).",
|
|
"options": { "poor": "Poor", "average": "Average", "good": "Good", "excellent": "Excellent" }
|
|
},
|
|
"indoorTemp": {
|
|
"label": "Indoor Temp (\u00b0C)",
|
|
"tooltip": "Current or target indoor temperature. Default 25\u00b0C."
|
|
},
|
|
"add": "Add Room",
|
|
"save": "Save Room",
|
|
"noItems": "No rooms yet. Add rooms to your profile."
|
|
},
|
|
"devices": {
|
|
"title": "Devices",
|
|
"help": "Heat-producing devices in each room.",
|
|
"noRooms": "Add a room first before adding devices.",
|
|
"name": { "label": "Name", "tooltip": "Device name (e.g. Desktop PC, TV)" },
|
|
"room": { "label": "Room", "tooltip": "Which room this device is in" },
|
|
"type": { "label": "Type", "tooltip": "Device category (label only, not used in calculations)" },
|
|
"wattsIdle": { "label": "Watts (Idle)", "tooltip": "Power draw when idle/standby" },
|
|
"wattsTypical": { "label": "Watts (Typical)", "tooltip": "Power draw during normal use" },
|
|
"wattsPeak": { "label": "Watts (Peak)", "tooltip": "Power draw at maximum load (e.g. gaming)" },
|
|
"dutyCycle": { "label": "Duty Cycle", "tooltip": "Fraction of time active (0\u20131). Fridge \u2248 0.3, PC \u2248 1.0." },
|
|
"add": "Add Device",
|
|
"save": "Save Device",
|
|
"noItems": "No devices yet."
|
|
},
|
|
"occupants": {
|
|
"title": "Occupants",
|
|
"help": "People in each room. Metabolic heat contributes to room temperature.",
|
|
"noRooms": "Add a room first before adding occupants.",
|
|
"room": { "label": "Room", "tooltip": "Which room" },
|
|
"count": { "label": "Count", "tooltip": "Number of people" },
|
|
"activity": {
|
|
"label": "Activity Level",
|
|
"tooltip": "Sleeping \u2248 70W, Sedentary \u2248 100W, Light \u2248 130W, Moderate \u2248 200W, Heavy \u2248 300W per person.",
|
|
"options": { "sleeping": "Sleeping", "sedentary": "Sedentary", "light": "Light", "moderate": "Moderate", "heavy": "Heavy" }
|
|
},
|
|
"vulnerable": { "label": "Vulnerable", "tooltip": "Check if elderly, young children, or health-compromised. Adds care reminders." },
|
|
"add": "Add Occupants",
|
|
"save": "Save Occupants",
|
|
"noItems": "No occupants yet."
|
|
},
|
|
"ac": {
|
|
"title": "AC Units",
|
|
"help": "Air conditioning units and their room assignments.",
|
|
"noRooms": "Add a room first before assigning AC units.",
|
|
"name": { "label": "Name", "tooltip": "AC unit name" },
|
|
"type": {
|
|
"label": "Type",
|
|
"tooltip": "portable, window, split, central",
|
|
"options": { "portable": "Portable", "window": "Window", "split": "Split", "central": "Central" }
|
|
},
|
|
"capacity": { "label": "Capacity (BTU)", "tooltip": "Cooling capacity in BTU/h. Typical portable: 8,000\u201314,000 BTU." },
|
|
"eer": { "label": "EER", "tooltip": "Energy Efficiency Ratio. Higher = more efficient. Typical: 8\u201312." },
|
|
"dehumidify": { "label": "Dehumidify", "tooltip": "Whether the unit has a dehumidify mode" },
|
|
"canHeat": { "label": "Can Heat", "tooltip": "Whether this unit can operate as a heat pump for heating" },
|
|
"heatingCapacity": { "label": "Heating Capacity (BTU)", "tooltip": "Heating capacity in BTU/h. If blank, cooling capacity is used." },
|
|
"rooms": { "label": "Assigned Rooms", "tooltip": "Which rooms this AC unit serves" },
|
|
"add": "Add AC Unit",
|
|
"save": "Save AC Unit",
|
|
"noItems": "No AC units yet.",
|
|
"search": {
|
|
"label": "Search device database",
|
|
"hint": "Data from bettervent.me (Eurovent certified)",
|
|
"placeholder": "Search by brand or model...",
|
|
"noResults": "No devices found"
|
|
},
|
|
"unit": {
|
|
"btuh": "BTU/h",
|
|
"kw": "kW",
|
|
"switch": "Switch unit"
|
|
},
|
|
"seer": "SEER",
|
|
"scop": "SCOP",
|
|
"cop": "COP",
|
|
"tol": "Min. operating temp",
|
|
"tbiv": "Bivalent temp",
|
|
"refrigerant": "Refrigerant"
|
|
},
|
|
"toggles": {
|
|
"title": "Toggles",
|
|
"help": "Activity toggles affect heat calculations for the current day.",
|
|
"gaming": "Gaming (devices at peak power)",
|
|
"cooking": "Cooking (additional kitchen heat)",
|
|
"laundry": "Laundry / Dryer running",
|
|
"guests": "Extra guests present"
|
|
},
|
|
"forecast": {
|
|
"title": "Forecast",
|
|
"help": "Fetch weather forecast data for your profile location.",
|
|
"provider": "Weather Provider",
|
|
"free": "free, no key needed",
|
|
"apiKey": "API Key",
|
|
"apiKeyPlaceholder": "Enter OpenWeatherMap API key",
|
|
"saveConfig": "Save Settings",
|
|
"fetch": "Fetch Forecast",
|
|
"lastFetched": "Last fetched",
|
|
"never": "Never",
|
|
"fetching": "Fetching forecast\u2026",
|
|
"providerDesc": {
|
|
"openmeteo": "Free, no API key needed. 3-day hourly forecast (temp, humidity, wind, solar, pressure). Warnings via DWD (Germany only).",
|
|
"openweathermap": "Requires One Call 3.0 subscription. 48h hourly + 8-day daily forecast. Includes UV index and worldwide weather alerts."
|
|
}
|
|
},
|
|
"windows": {
|
|
"title": "Windows",
|
|
"help": "Individual windows with their own orientation and properties. Overrides room-level solar gain.",
|
|
"orientation": { "label": "Orientation", "tooltip": "Which direction this window faces" },
|
|
"area": { "label": "Area (m\u00b2)", "tooltip": "Actual glazing area in square meters" },
|
|
"shgc": { "label": "SHGC", "tooltip": "Solar Heat Gain Coefficient for this window" },
|
|
"shadingType": { "label": "Shading", "tooltip": "Shading type for this window" },
|
|
"shadingFactor": { "label": "Shading Factor", "tooltip": "0 = fully shaded, 1 = no shading" },
|
|
"add": "Add Window",
|
|
"save": "Save Window",
|
|
"noItems": "No windows. Room-level solar defaults are used.",
|
|
"saveRoomFirst": "Save the room first to add windows."
|
|
},
|
|
"llm": {
|
|
"title": "AI Summary",
|
|
"help": "Configure an AI provider for personalized heat summaries.",
|
|
"provider": "Provider",
|
|
"model": "Model",
|
|
"apiKey": "API Key",
|
|
"apiKeyPlaceholder": "Enter API key",
|
|
"modelPlaceholder": "Model name (leave blank for default)",
|
|
"save": "Save Settings",
|
|
"providerOptions": { "anthropic": "Anthropic", "openai": "OpenAI", "gemini": "Google Gemini" }
|
|
}
|
|
},
|
|
"dashboard": {
|
|
"title": "Heat Report",
|
|
"riskLevel": "Risk Level",
|
|
"peakTemp": "Peak Temperature",
|
|
"minNightTemp": "Min Night Temp",
|
|
"poorNightCool": "Poor Night Cooling",
|
|
"timeline": "24h Timeline",
|
|
"roomBudgets": "Room Heat Budgets",
|
|
"actions": "Actions",
|
|
"careChecklist": "Care Checklist",
|
|
"warnings": "Weather Warnings",
|
|
"riskWindows": "Risk Windows",
|
|
"llmSummary": "AI Summary",
|
|
"noData": "No data yet. Set up your profile and fetch a forecast.",
|
|
"goToSetup": "Go to Setup",
|
|
"goToGuide": "Read the Guide",
|
|
"loading": "Loading\u2026",
|
|
"computing": "Computing heat analysis\u2026",
|
|
"error": "Failed to load data. Please try again.",
|
|
"retry": "Retry",
|
|
"staleDataWarning": "Using cached forecast data. Latest fetch failed.",
|
|
"errorTimeout": "Weather service timed out. Try again in a moment.",
|
|
"errorNetwork": "Could not reach weather service. Check your connection.",
|
|
"errorUpstream": "Weather service returned an error. Try again later.",
|
|
"errorUnknown": "Something went wrong. Please try again.",
|
|
"autoFetching": "Updating forecast\u2026",
|
|
"internalGains": "Internal Gains",
|
|
"solarGain": "Solar Gain",
|
|
"ventGain": "Ventilation Gain",
|
|
"totalGain": "Total Gain",
|
|
"acCapacity": "AC Capacity",
|
|
"headroom": "Headroom",
|
|
"headroomOk": "AC covers the heat load",
|
|
"headroomInsufficient": "AC insufficient by",
|
|
"fetchForecastFirst": "No forecast data. Fetch a forecast in Setup first.",
|
|
"no": "No",
|
|
"noActions": "No actions",
|
|
"effort": "Effort",
|
|
"impact": "Impact",
|
|
"aiDisclaimer": "AI-generated summary. Not a substitute for professional advice.",
|
|
"riskComfort": "Comfortable",
|
|
"coolComfort": "No cooling needed",
|
|
"coolVentilate": "Open windows",
|
|
"coolAC": "AC cooling",
|
|
"coolOverloaded": "AC overloaded",
|
|
"coolSealed": "Keep sealed",
|
|
"coolHeating": "Heating",
|
|
"coolHeatInsufficient": "Heating insufficient",
|
|
"heatingCapacity": "Heating Capacity",
|
|
"heatDeficit": "Heat Deficit",
|
|
"heatingHeadroom": "Heating Headroom",
|
|
"heatingHeadroomOk": "Heating covers the heat loss",
|
|
"heatingHeadroomInsufficient": "Heating insufficient by",
|
|
"aiActions": "AI-recommended actions",
|
|
"legendTemp": "Temperature",
|
|
"legendCooling": "Cooling",
|
|
"refreshForecast": "Refresh Forecast",
|
|
"quickSettings": "Quick Settings",
|
|
"qsIndoorTemp": "Indoor Temp (\u00b0C)",
|
|
"qsIndoorHumidity": "Indoor Humidity (%)",
|
|
"qsApply": "Apply",
|
|
"legendAI": "AI Actions",
|
|
"category": {
|
|
"shading": "Shading",
|
|
"ventilation": "Ventilation",
|
|
"internal_gains": "Heat Sources",
|
|
"ac_strategy": "AC Strategy",
|
|
"hydration": "Hydration",
|
|
"care": "Care"
|
|
}
|
|
},
|
|
"guide": {
|
|
"title": "Getting Started",
|
|
"intro": "HeatGuard helps you prepare for heat events by analyzing your living space, weather forecasts, and providing personalized hour-by-hour action plans.",
|
|
"step1": {
|
|
"title": "1. Create a Profile",
|
|
"text": "Go to Setup and create a profile for your location. Enter your coordinates (use the 'Use my location' button for auto-detection) and timezone."
|
|
},
|
|
"step2": {
|
|
"title": "2. Add Rooms",
|
|
"text": "Add the rooms you want to monitor. Set the area, orientation (which direction windows face), ceiling height, and window properties. These affect solar gain and ventilation calculations."
|
|
},
|
|
"step3": {
|
|
"title": "3. Add Devices & Occupants",
|
|
"text": "Add heat-producing devices (computers, TVs, appliances) and occupants to each room. Each person and device contributes to the internal heat load."
|
|
},
|
|
"step4": {
|
|
"title": "4. Configure AC Units",
|
|
"text": "If you have air conditioning, add your units and assign them to rooms. This allows HeatGuard to calculate whether your cooling capacity is sufficient."
|
|
},
|
|
"step5": {
|
|
"title": "5. Configure AI (Optional)",
|
|
"text": "For AI-powered summaries and action recommendations, configure an LLM provider. Use Setup > AI Summary for browser-side config, or start the server with --llm-provider and --llm-model flags. Ollama runs locally without an API key."
|
|
},
|
|
"step6": {
|
|
"title": "6. Fetch a Forecast",
|
|
"text": "On the Setup page, click 'Fetch Forecast' to get the latest weather data for your location. Forecasts cover the next 3 days."
|
|
},
|
|
"step7": {
|
|
"title": "7. View the Dashboard",
|
|
"text": "Return to the Dashboard to see your personalized heat analysis: risk level, temperature timeline, room heat budgets, recommended actions, and AI summary."
|
|
},
|
|
"params": {
|
|
"title": "Understanding Room Parameters",
|
|
"shgc": "SHGC (Solar Heat Gain Coefficient): How much solar energy passes through windows. Low-E glass \u2248 0.3, clear single pane \u2248 0.8.",
|
|
"ventilation": "Ventilation ACH (Air Changes per Hour): How often the room's air volume is replaced. Sealed room \u2248 0.3, open windows \u2248 5.0.",
|
|
"shading": "Shading Factor: 0 = fully shaded (no sun enters), 1 = no shading. External shutters \u2248 0.2, internal blinds \u2248 0.6.",
|
|
"orientation": "Orientation: South-facing rooms get the most midday sun. East faces morning sun, West faces afternoon sun."
|
|
},
|
|
"risk": {
|
|
"title": "Understanding Risk Levels",
|
|
"comfortable": "Comfortable: Cool weather, no heat risk. Peak below 22\u00b0C.",
|
|
"low": "Low: Temperatures below 30\u00b0C. Normal conditions.",
|
|
"moderate": "Moderate: Temperatures 30\u201335\u00b0C. Take basic precautions.",
|
|
"high": "High: Temperatures 35\u201340\u00b0C. Significant heat stress risk.",
|
|
"extreme": "Extreme: Temperatures above 40\u00b0C. Dangerous conditions."
|
|
},
|
|
"budget": {
|
|
"title": "Understanding Heat Budgets",
|
|
"text": "Each room's heat budget compares total heat gains (devices + people + solar + ventilation) against AC cooling capacity. Status: Comfortable (>20% headroom), Marginal (0\u201320% headroom), Overloaded (gains exceed capacity)."
|
|
},
|
|
"tips": {
|
|
"title": "Tips for Accuracy",
|
|
"tip1": "Measure your room area and window sizes for better solar gain estimates.",
|
|
"tip2": "Check device power ratings on labels or manufacturer specs.",
|
|
"tip3": "Close external shutters/blinds during peak sun hours for maximum effect.",
|
|
"tip4": "Use the gaming toggle on days when you'll be running devices at full load."
|
|
}
|
|
},
|
|
"impress": {
|
|
"title": "Legal Notice",
|
|
"responsible": "Responsible Person",
|
|
"country": "Germany",
|
|
"contact": "Contact",
|
|
"email": "Email",
|
|
"disclaimer": {
|
|
"title": "Disclaimer",
|
|
"text": "HeatGuard is a personal project provided as-is, without warranty. It does not constitute professional advice. Heat risk assessments are estimates based on user-provided data and weather forecasts — always follow official guidance during heat events."
|
|
}
|
|
},
|
|
"privacy": {
|
|
"title": "Privacy Policy",
|
|
"intro": "HeatGuard is designed to minimize data collection. This policy describes what data is processed and where it is sent.",
|
|
"localStorage": {
|
|
"title": "Local Data Storage",
|
|
"text": "All user data (profiles, rooms, devices, occupants, AC units, forecast cache) is stored exclusively in your browser's IndexedDB. No user data is stored on the server. Clearing your browser data will delete all HeatGuard data."
|
|
},
|
|
"cookie": {
|
|
"title": "Cookie",
|
|
"text": "HeatGuard sets a single cookie (heatguard_lang) to remember your language preference. It expires after one year and contains only the language code (en or de). No other cookies are used."
|
|
},
|
|
"weather": {
|
|
"title": "Weather Forecast API",
|
|
"text": "When you fetch a forecast, your location coordinates (latitude/longitude) are sent to either Open-Meteo (open-meteo.com) or OpenWeatherMap (openweathermap.org), depending on your configuration. These services have their own privacy policies."
|
|
},
|
|
"warnings": {
|
|
"title": "Weather Warnings (DWD)",
|
|
"text": "Weather warnings are fetched from the German Weather Service (DWD) via their public WFS endpoint. Your location coordinates are sent as part of the request."
|
|
},
|
|
"llm": {
|
|
"title": "AI Summary (Optional)",
|
|
"text": "If you configure an AI provider, a summary of your room data and weather forecast is sent to the selected provider (Anthropic, OpenAI, Google Gemini, or Ollama). Your API key is sent directly from your browser. No personal data beyond the heat analysis context is included."
|
|
},
|
|
"bettervent": {
|
|
"title": "Device Database (bettervent.me)",
|
|
"text": "When you search for AC units, your search query is proxied through the HeatGuard server to bettervent.me. No personal data is included in these requests."
|
|
},
|
|
"noTracking": {
|
|
"title": "No Analytics or Tracking",
|
|
"text": "HeatGuard does not use analytics, tracking scripts, fingerprinting, or any third-party scripts. No data is shared with advertisers or data brokers."
|
|
}
|
|
},
|
|
"footer": {
|
|
"source": "Source Code",
|
|
"license": "GPL-3.0 License",
|
|
"impress": "Legal Notice",
|
|
"privacy": "Privacy",
|
|
"betterventCredit": "Heat pump data powered by"
|
|
},
|
|
"common": {
|
|
"save": "Save",
|
|
"cancel": "Cancel",
|
|
"delete": "Delete",
|
|
"edit": "Edit",
|
|
"saved": "Saved",
|
|
"error": "Something went wrong.",
|
|
"confirm": "Are you sure?",
|
|
"loading": "Loading\u2026",
|
|
"watts": "W"
|
|
}
|
|
}
|