Files
MeterVault/src/App/Localization/Strings.resx
T
Florian Schmidt aacdc28d70 Meters: record events from the UI, and book consumption in the months it accrued in
Two threads that ended up in the same files. One is navigation: a meter
swap that happened today had no click path at all, and most per-meter
tasks were reachable only by knowing which admin page owned them. The
other is attribution: readings on 1 August and 16 September showed six
weeks of water under September and nothing under August.

Meter events from the UI

Swap, counter reset, tank level, delivery and note are recorded through
MeterEventService rather than ad-hoc inserts, so the dialog's verdict and
the saved result come from the same Validate call, and every record or
delete recomputes the meter inside one transaction. MeterEventRules
decides which events a mode offers -- a tank has no register to swap, and
Correction is offered nowhere because nothing reads it.

A swap is stored as the event at T plus a manual reading of the new
register's start value at exactly T. That pairing is the whole trick: the
boundary window is (previousReading, reading], so the old register's tail
books at T and every later reading counts from the new start. Writing the
old final value as the reading at T instead -- the obvious thing -- double
counts the tail and then rejects every reading the new register produces.
Deleting a swap removes that start reading only while it is still the
untouched start value, and only Manual readings can be deleted at all.

Navigation

The meter page is now the hub: primary entry by mode, a "Record event"
menu, and Edit through a shared MeterEditor that also owns tank setup.
Other pages link into it with MeterLinks (/meters/{id}?tab=...&action=...),
whose action is consumed once after the interactive render and dropped
from the address -- the reverse order flashes the dialog and closes it,
because a circuit's first location change dismisses every open dialog.
The app bar gains a "Find a meter" dialog with the same quick entry.

A source that has no usable connector now links to creating (or enabling)
one and comes back to the same source dialog with the connector picked
and everything typed still there; the draft survives in a circuit-scoped
DraftStore, and the way back is a meter id rather than a URL, so the page
cannot be made to redirect anywhere else. The connector list shows which
meters use each connector, import batches list the meters and categories
they wrote to, the meter editor owns the meter's own cost categories, and
the dashboard's empty cost panel names the first missing step instead of
listing every admin page.

Months

A reading is an instant, and what it measures accrued over the time since
the previous one. Booking the whole delta at the closing reading misfiles
it whenever the interval crosses a month boundary, so a plain increase is
now divided at local month boundaries in proportion to elapsed time, each
share stamped inside its month and marked estimated: the meter recorded a
total, not a shape. The parts always sum to the original.

Imported monthly tables are the exception that keeps the golden fixtures
reconciling. "Mai 2026" carries the register at the end of May but is
stamped on the 1st, so the importer -- the only place that still knows
whether the date cell named a month or a day -- flags it MonthLabel, and
the engine reads it as the end of its month. Inferring that from the
stamp instead would catch day-dated rows: a sheet with "01.08.2026" in it
is not a monthly table, and reading it as one moves two thirds of July
into August.

ReadingTimeline is the single ordering built on that: effective time,
then stamp. The register normalizers walk it, and so do the decrease
guard and the event dialog, which is what stops them disagreeing about
which reading is "previous" -- a sheet imported after live readings of the
same month used to count that month twice, and a mid-month reading below
the month's end value was rejected as a drop. A swap detected in a
monthly table applies from the start of that local month, i.e. to the
first reading in it, and a recorded start value never counts above the
reading it lands on.

Every reader buckets in the configured timezone rather than a hardcoded
one, and turns a requested date into that zone's local midnight, so the
divided shares are read back under the months they were stamped in. The
zone id is normalised to its IANA form, because .NET accepts a Windows id
that PostgreSQL will not bucket by, and both are checked at startup.

Stored consumption is derived, so a rule change reaches a meter only at
its next reading -- weeks, for a meter read monthly. NormalizationUpgrade
records the revision and zone the stored series was built with and
rebuilds everything once at startup when either differs, each meter in
its own transaction. A meter that fails is logged, kept in
normalization_pending and retried at the next start: one bad series must
never keep the application down.

What an operator sees once

Existing charts change on the first start after the update: months that
carried a neighbour's use give it back. Rows of earlier imports from
monthly tables are marked as such before anything is recomputed, and if
that marking fails nothing is rebuilt or recorded, so the upgrade simply
runs again next time rather than shifting every imported month by one. A
wizard import whose date format was left on auto-detect is treated as a
monthly table when all of its rows sit on the 1st across at least two
months -- exactly how those rows were attributed before -- and each such
batch is named in the log, because a day-dated sheet always read on the
1st looks identical; revert and re-import it with the day format if that
is what it was.

Tests: 120 unit and 230 integration, including the reference fixtures,
which still reconcile month for month.
2026-09-17 21:09:17 +02:00

2014 lines
80 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
MeterVault UI strings. Neutral culture (English) - the fallback for any unsupported UI language.
Keys are grouped by area: Common_* is shared across pages, Nav_* is the navigation,
everything else is prefixed with its page/component. Placeholders are {0}-style and must
match between cultures - StringResourceTests enforces that, plus key parity and non-empty
values, so a missing translation fails the build rather than silently falling back.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Categories_Add" xml:space="preserve">
<value>Add</value>
</data>
<data name="Categories_AddCategory" xml:space="preserve">
<value>Add category</value>
</data>
<data name="Categories_AddEnergyType" xml:space="preserve">
<value>Add energy type</value>
</data>
<data name="Categories_AddMeter" xml:space="preserve">
<value>Add meter</value>
</data>
<data name="Categories_Close" xml:space="preserve">
<value>Close</value>
</data>
<data name="Categories_ColorHex" xml:space="preserve">
<value>Color hex (optional, e.g. #ff9800)</value>
</data>
<data name="Categories_DeleteBody" xml:space="preserve">
<value>Delete '{0}' and its {1} membership(s)? Manual costs in this category are kept but unlinked.</value>
</data>
<data name="Categories_DeleteTitle" xml:space="preserve">
<value>Delete category</value>
</data>
<data name="Categories_EditCategory" xml:space="preserve">
<value>Edit {0}</value>
</data>
<data name="Categories_MemberMeter" xml:space="preserve">
<value>Meter: {0}</value>
</data>
<data name="Categories_MemberSummary" xml:space="preserve">
<value>{0} meter(s), {1} type(s)</value>
</data>
<data name="Categories_MemberType" xml:space="preserve">
<value>Type: {0}</value>
</data>
<data name="Categories_Members" xml:space="preserve">
<value>Members</value>
</data>
<data name="Categories_NewCategory" xml:space="preserve">
<value>New category</value>
</data>
<data name="Categories_NoMembers" xml:space="preserve">
<value>No members yet — add a meter or an energy type.</value>
</data>
<data name="Categories_SaveFirst" xml:space="preserve">
<value>Save the category first to add members.</value>
</data>
<data name="Categories_SavedAddMembers" xml:space="preserve">
<value>Saved. Add members below.</value>
</data>
<data name="Categories_Sort" xml:space="preserve">
<value>Sort</value>
</data>
<data name="Categories_SortOrder" xml:space="preserve">
<value>Sort order</value>
</data>
<data name="CategoryDonut_Cost" xml:space="preserve">
<value>Cost</value>
</data>
<data name="Common_Actions" xml:space="preserve">
<value>Actions</value>
</data>
<data name="Common_Amount" xml:space="preserve">
<value>Amount</value>
</data>
<data name="Common_Cancel" xml:space="preserve">
<value>Cancel</value>
</data>
<data name="Common_CostRange" xml:space="preserve">
<value>Cost (range)</value>
</data>
<data name="Common_Currency" xml:space="preserve">
<value>Currency</value>
</data>
<data name="Common_Date" xml:space="preserve">
<value>Date</value>
</data>
<data name="Common_Delete" xml:space="preserve">
<value>Delete</value>
</data>
<data name="Common_Deleted" xml:space="preserve">
<value>Deleted.</value>
</data>
<data name="Common_Enabled" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Common_EnergyType" xml:space="preserve">
<value>Energy type</value>
</data>
<data name="Common_EventsLabel" xml:space="preserve">
<value>Events:</value>
</data>
<data name="Common_LastSeen" xml:space="preserve">
<value>Last seen</value>
</data>
<data name="Common_ManualCostsLabel" xml:space="preserve">
<value>Manual costs:</value>
</data>
<data name="Common_Meter" xml:space="preserve">
<value>Meter</value>
</data>
<data name="Common_Meters" xml:space="preserve">
<value>Meters</value>
</data>
<data name="Common_Mode" xml:space="preserve">
<value>Mode</value>
</data>
<data name="Common_Name" xml:space="preserve">
<value>Name</value>
</data>
<data name="Common_NameRequired" xml:space="preserve">
<value>Name is required.</value>
</data>
<data name="Common_NoDataInRange" xml:space="preserve">
<value>No data in this range.</value>
</data>
<data name="Common_Now" xml:space="preserve">
<value>Now</value>
</data>
<data name="Common_Preview" xml:space="preserve">
<value>Preview</value>
</data>
<data name="Common_Range" xml:space="preserve">
<value>Range</value>
</data>
<data name="Common_RangeAllTime" xml:space="preserve">
<value>All time</value>
</data>
<data name="Common_RangeLast12Months" xml:space="preserve">
<value>Last 12 months</value>
</data>
<data name="Common_RangeLast24Months" xml:space="preserve">
<value>Last 24 months</value>
</data>
<data name="Common_RangeLast5Years" xml:space="preserve">
<value>Last 5 years</value>
</data>
<data name="Common_ReadingsLabel" xml:space="preserve">
<value>Readings:</value>
</data>
<data name="Common_Save" xml:space="preserve">
<value>Save</value>
</data>
<data name="Common_Saved" xml:space="preserve">
<value>Saved.</value>
</data>
<data name="Common_Scope" xml:space="preserve">
<value>Scope</value>
</data>
<data name="Common_SkippedRowsLabel" xml:space="preserve">
<value>Skipped rows:</value>
</data>
<data name="Common_Status" xml:space="preserve">
<value>Status</value>
</data>
<data name="Common_Target" xml:space="preserve">
<value>Target</value>
</data>
<data name="Common_ThisYear" xml:space="preserve">
<value>This year</value>
</data>
<data name="Common_Type" xml:space="preserve">
<value>Type</value>
</data>
<data name="Common_Unit" xml:space="preserve">
<value>Unit</value>
</data>
<data name="Common_Value" xml:space="preserve">
<value>Value</value>
</data>
<data name="Connectors_AddConnector" xml:space="preserve">
<value>Add connector</value>
</data>
<data name="Connectors_BackToMeter" xml:space="preserve">
<value>Back to '{0}'</value>
</data>
<data name="Connectors_BaseUrl" xml:space="preserve">
<value>Base URL (e.g. http://homeassistant.local:8123)</value>
</data>
<data name="Connectors_DeleteBody" xml:space="preserve">
<value>Delete '{0}'?</value>
</data>
<data name="Connectors_DeleteInUseNote" xml:space="preserve">
<value>{0} source(s) use it and will stop ingesting until reassigned to another connector.</value>
</data>
<data name="Connectors_DeleteTitle" xml:space="preserve">
<value>Delete connector</value>
</data>
<data name="Connectors_DisabledInUse" xml:space="preserve">
<value>Disabled — these sources are not ingesting</value>
</data>
<data name="Connectors_EditTitle" xml:space="preserve">
<value>Edit {0}</value>
</data>
<data name="Connectors_Empty" xml:space="preserve">
<value>No connectors yet. Add an MQTT broker or a Home Assistant connection.</value>
</data>
<data name="Connectors_EncryptedHint" xml:space="preserve">
<value>Encrypted before it is stored; database dumps and JSON exports carry nothing usable.</value>
</data>
<data name="Connectors_EnterCredentialsHere" xml:space="preserve">
<value>Enter credentials here</value>
</data>
<data name="Connectors_EnterTokenHere" xml:space="preserve">
<value>Enter the token here</value>
</data>
<data name="Connectors_ExtraTopics" xml:space="preserve">
<value>Extra topics (comma-separated, optional)</value>
</data>
<data name="Connectors_ForMeter" xml:space="preserve">
<value>Setting up a connector for a source of '{0}'. Saving it takes you back.</value>
</data>
<data name="Connectors_Host" xml:space="preserve">
<value>Host</value>
</data>
<data name="Connectors_LastStatus" xml:space="preserve">
<value>Last status</value>
</data>
<data name="Connectors_NewConnector" xml:space="preserve">
<value>New connector</value>
</data>
<data name="Connectors_No" xml:space="preserve">
<value>no</value>
</data>
<data name="Connectors_PasswordEnv" xml:space="preserve">
<value>Password env-var name (optional)</value>
</data>
<data name="Connectors_PasswordOptional" xml:space="preserve">
<value>Password (optional)</value>
</data>
<data name="Connectors_PasswordStored" xml:space="preserve">
<value>Password (stored — type to replace)</value>
</data>
<data name="Connectors_Port" xml:space="preserve">
<value>Port</value>
</data>
<data name="Connectors_SecretsNoticeEnvVar" xml:space="preserve">
<value>name of an environment variable</value>
</data>
<data name="Connectors_SecretsNoticePrefix" xml:space="preserve">
<value>Secrets are never stored here. Credentials/tokens are referenced by the</value>
</data>
<data name="Connectors_SecretsNoticeSuffix" xml:space="preserve">
<value>(or Docker secret) resolved at runtime.</value>
</data>
<data name="Connectors_TestBaseUrlChanged" xml:space="preserve">
<value>Base URL differs from the saved one. Re-enter the token to test against a different host — a stored token is only sent to the host it was saved for.</value>
</data>
<data name="Connectors_TestBaseUrlRequired" xml:space="preserve">
<value>Base URL is required.</value>
</data>
<data name="Connectors_TestConnected" xml:space="preserve">
<value>Connected — Home Assistant API reachable and token accepted.</value>
</data>
<data name="Connectors_TestConnectedValue" xml:space="preserve">
<value>Connected — {0} = {1}.</value>
</data>
<data name="Connectors_TestConnection" xml:space="preserve">
<value>Test connection</value>
</data>
<data name="Connectors_TestEntityId" xml:space="preserve">
<value>Test entity id (optional, e.g. sensor.house_power)</value>
</data>
<data name="Connectors_TestEnvVarMissing" xml:space="preserve">
<value>Environment variable '{0}' is not set on the server. Set it and restart the app, or switch on "Enter the token here" to store the token directly.</value>
</data>
<data name="Connectors_TestFailed" xml:space="preserve">
<value>Connection failed: {0}</value>
</data>
<data name="Connectors_TestHttpError" xml:space="preserve">
<value>Home Assistant answered {0}.</value>
</data>
<data name="Connectors_TestNoNumericState" xml:space="preserve">
<value>Connected, but "{0}" has no numeric state (unavailable, unknown or not a number).</value>
</data>
<data name="Connectors_TestNoToken" xml:space="preserve">
<value>Enter a token first.</value>
</data>
<data name="Connectors_TestNoTokenEnv" xml:space="preserve">
<value>Name the environment variable holding the token, or switch on "Enter the token here".</value>
</data>
<data name="Connectors_TestTokenMissing" xml:space="preserve">
<value>No token available to test.</value>
</data>
<data name="Connectors_Tls" xml:space="preserve">
<value>TLS</value>
</data>
<data name="Connectors_Token" xml:space="preserve">
<value>Long-lived access token</value>
</data>
<data name="Connectors_TokenEnv" xml:space="preserve">
<value>Token env-var name (e.g. HA_TOKEN)</value>
</data>
<data name="Connectors_TokenEnvHintEmphasis" xml:space="preserve">
<value>name</value>
</data>
<data name="Connectors_TokenEnvHintPrefix" xml:space="preserve">
<value>The variable's</value>
</data>
<data name="Connectors_TokenEnvHintSuffix" xml:space="preserve">
<value>, not the token. Set it on the server and restart the app.</value>
</data>
<data name="Connectors_TokenRequired" xml:space="preserve">
<value>Enter the token, or switch off "Enter the token here" and name an env var.</value>
</data>
<data name="Connectors_TokenStored" xml:space="preserve">
<value>Long-lived access token (stored — type to replace)</value>
</data>
<data name="Connectors_Unused" xml:space="preserve">
<value>Not used</value>
</data>
<data name="Connectors_UsedBy" xml:space="preserve">
<value>Used by</value>
</data>
<data name="Connectors_UsedByMore" xml:space="preserve">
<value>+{0} more</value>
</data>
<data name="Connectors_UsernameEnv" xml:space="preserve">
<value>Username env-var name (optional)</value>
</data>
<data name="Connectors_UsernameOptional" xml:space="preserve">
<value>Username (optional)</value>
</data>
<data name="Connectors_WebSocketHint" xml:space="preserve">
<value>On: subscribe to state changes and ingest in real time. Off: REST poll on each source's interval.</value>
</data>
<data name="Connectors_WebSocketPush" xml:space="preserve">
<value>Real-time WebSocket push</value>
</data>
<data name="Connectors_Yes" xml:space="preserve">
<value>yes</value>
</data>
<data name="Consumables_AsOf" xml:space="preserve">
<value>as of {0}</value>
</data>
<data name="Consumables_BurnerRuntime" xml:space="preserve">
<value>Burner runtime</value>
</data>
<data name="Consumables_ConsumptionByMonth" xml:space="preserve">
<value>Consumption by month</value>
</data>
<data name="Consumables_DeliveriesCount" xml:space="preserve">
<value>Deliveries ({0})</value>
</data>
<data name="Consumables_EffectiveRate" xml:space="preserve">
<value>Effective rate</value>
</data>
<data name="Consumables_FillOfCapacity" xml:space="preserve">
<value>{0}% of {1} {2}</value>
</data>
<data name="Consumables_ForecastEmpty" xml:space="preserve">
<value>Forecast to empty</value>
</data>
<data name="Consumables_NoDeliveries" xml:space="preserve">
<value>No deliveries recorded.</value>
</data>
<data name="Consumables_NoMetersLead" xml:space="preserve">
<value>No consumable meters found. Add a meter with mode</value>
</data>
<data name="Consumables_NoMetersOrImport" xml:space="preserve">
<value>, or load the reference data from</value>
</data>
<data name="Consumables_NoMetersTail" xml:space="preserve">
<value>and set up its tank in</value>
</data>
<data name="Consumables_PageTitle" xml:space="preserve">
<value>Consumables</value>
</data>
<data name="Consumables_PerDay" xml:space="preserve">
<value>({0} {1}/day)</value>
</data>
<data name="Consumables_RecordDelivery" xml:space="preserve">
<value>Record delivery</value>
</data>
<data name="Consumables_TankLevel" xml:space="preserve">
<value>Tank level</value>
</data>
<data name="Consumables_TankNotConfigured" xml:space="preserve">
<value>{0} has no tank set up yet — its level, fill and forecast need the tank's capacity and dipstick calibration.</value>
</data>
<data name="Consumables_UnitUsed" xml:space="preserve">
<value>{0} used</value>
</data>
<data name="Consumables_UsedRange" xml:space="preserve">
<value>Used (range)</value>
</data>
<data name="Dashboard_ColCategory" xml:space="preserve">
<value>Category</value>
</data>
<data name="Dashboard_ColCurrent" xml:space="preserve">
<value>Now</value>
</data>
<data name="Dashboard_ColPrevious" xml:space="preserve">
<value>Prev</value>
</data>
<data name="Dashboard_LatestMonthWithData" xml:space="preserve">
<value>Latest month with data</value>
</data>
<data name="Dashboard_SetupNoCategories" xml:space="preserve">
<value>Costs are reported per cost category, and there is none yet:</value>
</data>
<data name="Dashboard_SetupNoCostsThisYear" xml:space="preserve">
<value>No costs this year yet. They appear once a meter in a cost category records consumption with a tariff in effect.</value>
</data>
<data name="Dashboard_SetupNoMembers" xml:space="preserve">
<value>No meter counts toward a cost category yet. Pick categories when editing a meter, or assign them per category:</value>
</data>
<data name="Dashboard_SetupNoMeters" xml:space="preserve">
<value>No meters yet. Costs start with a meter — add one, or import existing data:</value>
</data>
<data name="Dashboard_SetupNoTariffs" xml:space="preserve">
<value>No tariffs yet — consumption needs a price before it has a cost:</value>
</data>
<data name="Dashboard_ThisMonth" xml:space="preserve">
<value>This month</value>
</data>
<data name="Dashboard_WhatChanged" xml:space="preserve">
<value>What cost more / less (year vs last year)</value>
</data>
<data name="Dashboard_WhatCostsMost" xml:space="preserve">
<value>What costs most (this year)</value>
</data>
<data name="EnergyTypes_Add" xml:space="preserve">
<value>Add energy type</value>
</data>
<data name="EnergyTypes_BaseUnit" xml:space="preserve">
<value>Base unit</value>
</data>
<data name="EnergyTypes_BaseUnitLabel" xml:space="preserve">
<value>Base unit (kWh, m3, L, h)</value>
</data>
<data name="EnergyTypes_ColorLabel" xml:space="preserve">
<value>Color hex (optional, e.g. #4caf50)</value>
</data>
<data name="EnergyTypes_DefaultMode" xml:space="preserve">
<value>Default mode</value>
</data>
<data name="EnergyTypes_DeleteBlocked" xml:space="preserve">
<value>Cannot delete '{0}': {1} meter(s) still use it.</value>
</data>
<data name="EnergyTypes_DeleteBody" xml:space="preserve">
<value>Delete '{0}'? This cannot be undone.</value>
</data>
<data name="EnergyTypes_DeleteTitle" xml:space="preserve">
<value>Delete energy type</value>
</data>
<data name="EnergyTypes_DisplayName" xml:space="preserve">
<value>Display name</value>
</data>
<data name="EnergyTypes_EditTitle" xml:space="preserve">
<value>Edit {0}</value>
</data>
<data name="EnergyTypes_IconLabel" xml:space="preserve">
<value>Icon (optional)</value>
</data>
<data name="EnergyTypes_Key" xml:space="preserve">
<value>Key</value>
</data>
<data name="EnergyTypes_KeyInUse" xml:space="preserve">
<value>Key '{0}' is already in use.</value>
</data>
<data name="EnergyTypes_KeyLabel" xml:space="preserve">
<value>Key (stable machine key, e.g. electricity)</value>
</data>
<data name="EnergyTypes_NewTitle" xml:space="preserve">
<value>New energy type</value>
</data>
<data name="EnergyTypes_RequiredFields" xml:space="preserve">
<value>Key, display name and base unit are required.</value>
</data>
<data name="EnergyView_ColConsumption" xml:space="preserve">
<value>Consumption</value>
</data>
<data name="EnergyView_ColUpstreamOf" xml:space="preserve">
<value>Upstream of</value>
</data>
<data name="EnergyView_EnergyFallback" xml:space="preserve">
<value>Energy</value>
</data>
<data name="EnergyView_Flow" xml:space="preserve">
<value>Flow</value>
</data>
<data name="EnergyView_FlowCaption" xml:space="preserve">
<value>Where the top-level flow goes. Arrow thickness ∝ amount; "Other" is the unmetered remainder.</value>
</data>
<data name="EnergyView_FlowTitle" xml:space="preserve">
<value>{0} flow</value>
</data>
<data name="EnergyView_NoChainIntro" xml:space="preserve">
<value>No meter chain configured yet. In</value>
</data>
<data name="EnergyView_NoChainMiddle" xml:space="preserve">
<value>→ edit a sub-meter and set its</value>
</data>
<data name="EnergyView_NoChainRest" xml:space="preserve">
<value>to show where the main meter's flow divides (e.g. main → car, pool, other).</value>
</data>
<data name="EnergyView_NoChainUpstream" xml:space="preserve">
<value>upstream meter(s)</value>
</data>
<data name="EnergyView_NoDataInRange" xml:space="preserve">
<value>No consumption recorded for these meters in the selected range yet.</value>
</data>
<data name="EnergyView_NoMetersIntro" xml:space="preserve">
<value>No meters for this energy type yet. Add meters in</value>
</data>
<data name="EnergyView_NoMetersOr" xml:space="preserve">
<value>, or load the reference data from</value>
</data>
<data name="EnergyView_TopLevelThroughput" xml:space="preserve">
<value>Top-level throughput</value>
</data>
<data name="Enum_ConsumptionKind_Consumption" xml:space="preserve">
<value>Consumption</value>
</data>
<data name="Enum_ConsumptionKind_Generation" xml:space="preserve">
<value>Generation</value>
</data>
<data name="Enum_EndpointType_HomeAssistant" xml:space="preserve">
<value>Home Assistant</value>
</data>
<data name="Enum_EndpointType_MqttBroker" xml:space="preserve">
<value>MQTT broker</value>
</data>
<data name="Enum_MappingRole_Delivery" xml:space="preserve">
<value>Delivery</value>
</data>
<data name="Enum_MappingRole_Ignore" xml:space="preserve">
<value>Ignore</value>
</data>
<data name="Enum_MappingRole_ManualCost" xml:space="preserve">
<value>Manual cost</value>
</data>
<data name="Enum_MappingRole_Reading" xml:space="preserve">
<value>Reading</value>
</data>
<data name="Enum_MappingRole_TankLevel" xml:space="preserve">
<value>Tank level</value>
</data>
<data name="Enum_MeterEventType_Correction" xml:space="preserve">
<value>Correction</value>
</data>
<data name="Enum_MeterEventType_CounterReset" xml:space="preserve">
<value>Counter reset</value>
</data>
<data name="Enum_MeterEventType_Delivery" xml:space="preserve">
<value>Delivery</value>
</data>
<data name="Enum_MeterEventType_MeterSwap" xml:space="preserve">
<value>Meter swap</value>
</data>
<data name="Enum_MeterEventType_Note" xml:space="preserve">
<value>Note</value>
</data>
<data name="Enum_MeterEventType_TankLevel" xml:space="preserve">
<value>Tank level</value>
</data>
<data name="Enum_MeterMode_ConsumableBalance" xml:space="preserve">
<value>Consumable balance</value>
</data>
<data name="Enum_MeterMode_CumulativeCounter" xml:space="preserve">
<value>Cumulative counter</value>
</data>
<data name="Enum_MeterMode_DirectDelta" xml:space="preserve">
<value>Direct delta</value>
</data>
<data name="Enum_MeterMode_GenerationCounter" xml:space="preserve">
<value>Generation counter</value>
</data>
<data name="Enum_MeterMode_InstantRate" xml:space="preserve">
<value>Instant rate</value>
</data>
<data name="Enum_MeterMode_RuntimeCounter" xml:space="preserve">
<value>Runtime counter</value>
</data>
<data name="Enum_MeterMode_Virtual" xml:space="preserve">
<value>Virtual</value>
</data>
<data name="Enum_ReadingFlags_Anomaly" xml:space="preserve">
<value>Anomaly</value>
</data>
<data name="Enum_ReadingFlags_CounterReset" xml:space="preserve">
<value>Counter reset</value>
</data>
<data name="Enum_ReadingFlags_MeterSwap" xml:space="preserve">
<value>Meter swap</value>
</data>
<data name="Enum_ReadingFlags_MonthLabel" xml:space="preserve">
<value>Month-end value</value>
</data>
<data name="Enum_ReadingQuality_Estimated" xml:space="preserve">
<value>Estimated</value>
</data>
<data name="Enum_ReadingQuality_Imported" xml:space="preserve">
<value>Imported</value>
</data>
<data name="Enum_ReadingQuality_Interpolated" xml:space="preserve">
<value>Interpolated</value>
</data>
<data name="Enum_ReadingQuality_Manual" xml:space="preserve">
<value>Manual</value>
</data>
<data name="Enum_ReadingQuality_Measured" xml:space="preserve">
<value>Measured</value>
</data>
<data name="Enum_SourceType_HomeAssistant" xml:space="preserve">
<value>Home Assistant</value>
</data>
<data name="Enum_SourceType_Import" xml:space="preserve">
<value>Import</value>
</data>
<data name="Enum_SourceType_Manual" xml:space="preserve">
<value>Manual</value>
</data>
<data name="Enum_SourceType_Mqtt" xml:space="preserve">
<value>MQTT</value>
</data>
<data name="Enum_SourceType_Tasmota" xml:space="preserve">
<value>Tasmota</value>
</data>
<data name="Enum_SourceType_Virtual" xml:space="preserve">
<value>Virtual</value>
</data>
<data name="Enum_SourceValueKind_Delta" xml:space="preserve">
<value>Delta</value>
</data>
<data name="Enum_SourceValueKind_Level" xml:space="preserve">
<value>Level</value>
</data>
<data name="Enum_SourceValueKind_Rate" xml:space="preserve">
<value>Rate</value>
</data>
<data name="Enum_SourceValueKind_Register" xml:space="preserve">
<value>Register</value>
</data>
<data name="Enum_SourceValueKind_Runtime" xml:space="preserve">
<value>Runtime</value>
</data>
<data name="Enum_TankRateMode_Empirical" xml:space="preserve">
<value>Empirical</value>
</data>
<data name="Enum_TankRateMode_Fixed" xml:space="preserve">
<value>Fixed</value>
</data>
<data name="Enum_TariffComponent_BasePrice" xml:space="preserve">
<value>Base price</value>
</data>
<data name="Enum_TariffComponent_Bonus" xml:space="preserve">
<value>Bonus</value>
</data>
<data name="Enum_TariffComponent_Discount" xml:space="preserve">
<value>Discount</value>
</data>
<data name="Enum_TariffComponent_FeedIn" xml:space="preserve">
<value>Feed-in</value>
</data>
<data name="Enum_TariffComponent_Tax" xml:space="preserve">
<value>Tax</value>
</data>
<data name="Enum_TariffComponent_UnitPrice" xml:space="preserve">
<value>Unit price</value>
</data>
<data name="Enum_TariffScope_EnergyType" xml:space="preserve">
<value>Energy type</value>
</data>
<data name="Enum_TariffScope_Global" xml:space="preserve">
<value>Global</value>
</data>
<data name="Enum_TariffScope_Meter" xml:space="preserve">
<value>Meter</value>
</data>
<data name="Enum_UpdateAvailability_Allowed" xml:space="preserve">
<value>Allowed</value>
</data>
<data name="Enum_UpdateAvailability_NotEnabled" xml:space="preserve">
<value>not enabled (MeterVault__AllowInAppUpdate)</value>
</data>
<data name="Enum_UpdateAvailability_NotSupportedHere" xml:space="preserve">
<value>not supported on this install</value>
</data>
<data name="Error_DevelopmentEnableHint" xml:space="preserve">
<value>For local debugging, enable the {0} environment by setting the {1} environment variable to {0} and restarting the app.</value>
</data>
<data name="Error_DevelopmentMode" xml:space="preserve">
<value>Development Mode</value>
</data>
<data name="Error_DevelopmentSwap" xml:space="preserve">
<value>Swapping to {0} environment will display more detailed information about the error that occurred.</value>
</data>
<data name="Error_DevelopmentWarning" xml:space="preserve">
<value>The Development environment shouldn't be enabled for deployed applications.</value>
</data>
<data name="Error_DevelopmentWarningDetail" xml:space="preserve">
<value>It can result in displaying sensitive information from exceptions to end users.</value>
</data>
<data name="Error_Heading" xml:space="preserve">
<value>Error.</value>
</data>
<data name="Error_Message" xml:space="preserve">
<value>An error occurred while processing your request.</value>
</data>
<data name="Error_PageTitle" xml:space="preserve">
<value>Error</value>
</data>
<data name="Error_RequestId" xml:space="preserve">
<value>Request ID:</value>
</data>
<data name="Flow_OtherNode" xml:space="preserve">
<value>Other ({0})</value>
</data>
<data name="ImportWarning_RegisterDropped" xml:space="preserve">
<value>Row {0}: register for meter {1} fell {2}→{3}; a swap event was created (please check).</value>
</data>
<data name="ImportWarning_RegisterDroppedWithAmount" xml:space="preserve">
<value>Row {0}: register for meter {1} fell {2}→{3}; consumption across the swap set to {4}.</value>
</data>
<data name="ImportWarning_RowSkipped" xml:space="preserve">
<value>Row {0}: skipped ({1}).</value>
</data>
<data name="ImportWarning_UnitMismatch" xml:space="preserve">
<value>Row {0}: expected unit "{1}" but found "{2}".</value>
</data>
<data name="ImportWarning_UnparseableDate" xml:space="preserve">
<value>Row {0}: unparseable date, skipped.</value>
</data>
<data name="ImportWizard_BackToImport" xml:space="preserve">
<value>Back to Import</value>
</data>
<data name="ImportWizard_ChooseCsv" xml:space="preserve">
<value>Choose CSV</value>
</data>
<data name="ImportWizard_ColumnN" xml:space="preserve">
<value>Col {0}</value>
</data>
<data name="ImportWizard_ColumnWithHeader" xml:space="preserve">
<value>Col {0}: {1}</value>
</data>
<data name="ImportWizard_CommitButton" xml:space="preserve">
<value>Commit import</value>
</data>
<data name="ImportWizard_CommitFailed" xml:space="preserve">
<value>Commit failed: {0}</value>
</data>
<data name="ImportWizard_CommitSuccess" xml:space="preserve">
<value>Imported batch #{0}: {1} rows staged. Consumption recomputed.</value>
</data>
<data name="ImportWizard_DateAutoDetect" xml:space="preserve">
<value>Auto-detect</value>
</data>
<data name="ImportWizard_DateColumn" xml:space="preserve">
<value>Date column</value>
</data>
<data name="ImportWizard_DateDay" xml:space="preserve">
<value>Day (31.12.2024)</value>
</data>
<data name="ImportWizard_DateFormat" xml:space="preserve">
<value>Date format</value>
</data>
<data name="ImportWizard_DateMonthName" xml:space="preserve">
<value>Month name (Januar 2024)</value>
</data>
<data name="ImportWizard_DetectSwaps" xml:space="preserve">
<value>Detect swaps</value>
</data>
<data name="ImportWizard_DryRunButton" xml:space="preserve">
<value>Dry-run preview</value>
</data>
<data name="ImportWizard_FileSummary" xml:space="preserve">
<value>{0} rows, {1} columns</value>
</data>
<data name="ImportWizard_FirstDataRow" xml:space="preserve">
<value>First data row</value>
</data>
<data name="ImportWizard_HeaderColumn" xml:space="preserve">
<value>Column</value>
</data>
<data name="ImportWizard_HeaderRole" xml:space="preserve">
<value>Role</value>
</data>
<data name="ImportWizard_HeaderRow" xml:space="preserve">
<value>Header row</value>
</data>
<data name="ImportWizard_HeaderSample" xml:space="preserve">
<value>Sample</value>
</data>
<data name="ImportWizard_IntroLead" xml:space="preserve">
<value>Upload any CSV, map its columns to your meters and categories, preview what would be staged, then commit it as a revertible import. Values may use the German dialect (decimal comma, unit suffixes,</value>
</data>
<data name="ImportWizard_IntroOr" xml:space="preserve">
<value>or</value>
</data>
<data name="ImportWizard_IntroTail" xml:space="preserve">
<value>dates) — the same parser the reference sheets use.</value>
</data>
<data name="ImportWizard_MappingChanged" xml:space="preserve">
<value>The mapping changed after the preview. Run the dry run again, then commit.</value>
</data>
<data name="ImportWizard_MeterFallback" xml:space="preserve">
<value>meter {0}</value>
</data>
<data name="ImportWizard_NothingStaged" xml:space="preserve">
<value>Nothing staged. Check the first-data-row, date column and column mappings above.</value>
</data>
<data name="ImportWizard_PreviewCaption" xml:space="preserve">
<value>Faded rows are before the first data row. The 📅 column supplies the date.</value>
</data>
<data name="ImportWizard_SelectCategory" xml:space="preserve">
<value>Select category</value>
</data>
<data name="ImportWizard_SelectMeter" xml:space="preserve">
<value>Select meter</value>
</data>
<data name="ImportWizard_SkipZeroRows" xml:space="preserve">
<value>Skip zero rows</value>
</data>
<data name="ImportWizard_Step1Title" xml:space="preserve">
<value>1. Parsing options</value>
</data>
<data name="ImportWizard_Step2Title" xml:space="preserve">
<value>2. Column preview</value>
</data>
<data name="ImportWizard_Step3Title" xml:space="preserve">
<value>3. Map columns</value>
</data>
<data name="ImportWizard_Step4Title" xml:space="preserve">
<value>4. Preview &amp; commit</value>
</data>
<data name="ImportWizard_Title" xml:space="preserve">
<value>Import wizard</value>
</data>
<data name="ImportWizard_UnitPlaceholder" xml:space="preserve">
<value>e.g. kWh</value>
</data>
<data name="ImportWizard_ValidateDuplicateMeter" xml:space="preserve">
<value>{0} all read into '{1}'. Each Reading column needs its own meter.</value>
</data>
<data name="ImportWizard_ValidateNeedsCategory" xml:space="preserve">
<value>Col {0} (ManualCost) needs a target category.</value>
</data>
<data name="ImportWizard_ValidateNeedsMeter" xml:space="preserve">
<value>Col {0} ({1}) needs a target meter.</value>
</data>
<data name="ImportWizard_ValidateNoMappedColumn" xml:space="preserve">
<value>Map at least one column to a role other than Ignore.</value>
</data>
<data name="Import_BatchReverted" xml:space="preserve">
<value>Import #{0} reverted.</value>
</data>
<data name="Import_ColumnImported" xml:space="preserve">
<value>Imported</value>
</data>
<data name="Import_ColumnRows" xml:space="preserve">
<value>Rows</value>
</data>
<data name="Import_ColumnSource" xml:space="preserve">
<value>Source</value>
</data>
<data name="Import_ColumnWritesTo" xml:space="preserve">
<value>Wrote to</value>
</data>
<data name="Import_DryRunReferenceSheet" xml:space="preserve">
<value>Dry-run a reference sheet</value>
</data>
<data name="Import_Failed" xml:space="preserve">
<value>Import failed: {0}</value>
</data>
<data name="Import_LoadReferenceData" xml:space="preserve">
<value>Load reference data</value>
</data>
<data name="Import_MappingWizard" xml:space="preserve">
<value>Mapping wizard</value>
</data>
<data name="Import_NoImportsYet" xml:space="preserve">
<value>No imports yet.</value>
</data>
<data name="Import_ProfileCosts" xml:space="preserve">
<value>Costs (Kosten)</value>
</data>
<data name="Import_ProfileElectricity" xml:space="preserve">
<value>Electricity (Strom)</value>
</data>
<data name="Import_ProfileHeatingOil" xml:space="preserve">
<value>Heating oil (Heizöl)</value>
</data>
<data name="Import_ProfileWater" xml:space="preserve">
<value>Water (Wasser)</value>
</data>
<data name="Import_RecentImports" xml:space="preserve">
<value>Recent imports</value>
</data>
<data name="Import_ReferenceDataLoaded" xml:space="preserve">
<value>Reference data loaded.</value>
</data>
<data name="Import_ReferenceDataset" xml:space="preserve">
<value>Reference dataset</value>
</data>
<data name="Import_ReferenceDatasetHelp" xml:space="preserve">
<value>Load the bundled Energiebilanz sheets (electricity, water, heating oil, costs) as a starter dataset with meters, tariffs and categories.</value>
</data>
<data name="Import_ReferenceLoaded" xml:space="preserve">
<value>Loaded</value>
</data>
<data name="Import_ReferenceProfile" xml:space="preserve">
<value>Reference profile</value>
</data>
<data name="Import_Revert" xml:space="preserve">
<value>Revert</value>
</data>
<data name="Import_RevertConfirmBody" xml:space="preserve">
<value>Delete all {0} rows from import #{1} ({2}) and recompute the affected meters?</value>
</data>
<data name="Import_RevertConfirmTitle" xml:space="preserve">
<value>Revert import?</value>
</data>
<data name="Import_RevertFailed" xml:space="preserve">
<value>Revert failed: {0}</value>
</data>
<data name="Import_StatusActive" xml:space="preserve">
<value>active</value>
</data>
<data name="Import_StatusReverted" xml:space="preserve">
<value>reverted</value>
</data>
<data name="Import_UnnamedSource" xml:space="preserve">
<value>unnamed</value>
</data>
<data name="Import_WarningsCount" xml:space="preserve">
<value>{0} warnings</value>
</data>
<data name="Import_YourOwnCsv" xml:space="preserve">
<value>Your own CSV</value>
</data>
<data name="Import_YourOwnCsvHelp" xml:space="preserve">
<value>Map an arbitrary sheet's columns to your meters/categories, preview and commit it as a revertible import. Or dry-run against one of the built-in reference profiles below.</value>
</data>
<data name="Layout_DarkMode" xml:space="preserve">
<value>Dark mode</value>
</data>
<data name="Layout_FindMeter" xml:space="preserve">
<value>Find a meter</value>
</data>
<data name="Layout_Language" xml:space="preserve">
<value>Language</value>
</data>
<data name="Layout_LightMode" xml:space="preserve">
<value>Light mode</value>
</data>
<data name="Layout_Reload" xml:space="preserve">
<value>Reload</value>
</data>
<data name="Layout_ToggleNavigation" xml:space="preserve">
<value>Toggle navigation</value>
</data>
<data name="Layout_UnhandledError" xml:space="preserve">
<value>An unhandled error has occurred.</value>
</data>
<data name="MeterDetail_AboutTheSame" xml:space="preserve">
<value>about the same</value>
</data>
<data name="MeterDetail_AddFirstReading" xml:space="preserve">
<value>Add first reading</value>
</data>
<data name="MeterDetail_AddReading" xml:space="preserve">
<value>Add reading</value>
</data>
<data name="MeterDetail_AddReadingTitle" xml:space="preserve">
<value>Add reading — {0}</value>
</data>
<data name="MeterDetail_AddSource" xml:space="preserve">
<value>Add source</value>
</data>
<data name="MeterDetail_AnotherConnector" xml:space="preserve">
<value>Set up another connector</value>
</data>
<data name="MeterDetail_AttributeLabel" xml:space="preserve">
<value>Attribute (optional; blank = state)</value>
</data>
<data name="MeterDetail_BackToMeters" xml:space="preserve">
<value>Back to meters</value>
</data>
<data name="MeterDetail_BackdatedNotice" xml:space="preserve">
<value>Backdated before the latest reading — consumption from there on is recomputed.</value>
</data>
<data name="MeterDetail_BaselineValue" xml:space="preserve">
<value>(baseline {0})</value>
</data>
<data name="MeterDetail_ChangeSinceLast" xml:space="preserve">
<value>{0} {1} since last reading</value>
</data>
<data name="MeterDetail_Component" xml:space="preserve">
<value>Component</value>
</data>
<data name="MeterDetail_ConnectSource" xml:space="preserve">
<value>Connect a live source</value>
</data>
<data name="MeterDetail_Connector" xml:space="preserve">
<value>Connector</value>
</data>
<data name="MeterDetail_ConnectorDisabled" xml:space="preserve">
<value>'{0}' is disabled, so this source would never ingest. Enable it first.</value>
</data>
<data name="MeterDetail_ConnectorOnlyDisabled" xml:space="preserve">
<value>'{0}' is disabled, so it cannot serve this source —</value>
</data>
<data name="MeterDetail_ConnectorTypeMismatch" xml:space="preserve">
<value>'{0}' is a {1} connector; a {2} source needs {3}.</value>
</data>
<data name="MeterDetail_CostThisYear" xml:space="preserve">
<value>Cost this year</value>
</data>
<data name="MeterDetail_CreateConnectorHint" xml:space="preserve">
<value>(set it up once; every source then just picks it).</value>
</data>
<data name="MeterDetail_CreateConnectorLink" xml:space="preserve">
<value>create one</value>
</data>
<data name="MeterDetail_DecreaseWarning" xml:space="preserve">
<value>Below the last reading ({0} {1}) on a register that only counts up, so it would be rejected. If the meter was swapped or its counter reset, record that first — the value you typed is kept.</value>
</data>
<data name="MeterDetail_DeleteBoundaryConfirm" xml:space="preserve">
<value>Delete the {0} of {1}? The new register's start reading recorded with it is removed too, and consumption is recomputed.</value>
</data>
<data name="MeterDetail_DeleteEvent" xml:space="preserve">
<value>Delete event</value>
</data>
<data name="MeterDetail_DeleteEventConfirm" xml:space="preserve">
<value>Delete the {0} of {1}? Consumption is recomputed.</value>
</data>
<data name="MeterDetail_DeleteReading" xml:space="preserve">
<value>Delete this hand-entered reading</value>
</data>
<data name="MeterDetail_DeleteReadingConfirm" xml:space="preserve">
<value>Delete the reading {0} {1} of {2}? Consumption is recomputed without it.</value>
</data>
<data name="MeterDetail_DeleteReadingTitle" xml:space="preserve">
<value>Delete reading</value>
</data>
<data name="MeterDetail_DeleteSourceConfirm" xml:space="preserve">
<value>Delete this {0} source?</value>
</data>
<data name="MeterDetail_DeleteSourceTitle" xml:space="preserve">
<value>Delete source</value>
</data>
<data name="MeterDetail_EditMeter" xml:space="preserve">
<value>Edit meter</value>
</data>
<data name="MeterDetail_EditSource" xml:space="preserve">
<value>Edit source</value>
</data>
<data name="MeterDetail_EnableConnectorLink" xml:space="preserve">
<value>enable it</value>
</data>
<data name="MeterDetail_EnergyTypeFlow" xml:space="preserve">
<value>Open the {0} flow</value>
</data>
<data name="MeterDetail_EnterValue" xml:space="preserve">
<value>Enter a value</value>
</data>
<data name="MeterDetail_EntityIdLabel" xml:space="preserve">
<value>Entity id (e.g. sensor.house_power)</value>
</data>
<data name="MeterDetail_EventDeleted" xml:space="preserve">
<value>Event deleted — consumption recomputed.</value>
</data>
<data name="MeterDetail_EventsHintNote" xml:space="preserve">
<value>Notes annotate this meter's history; they change no figures.</value>
</data>
<data name="MeterDetail_EventsHintRegister" xml:space="preserve">
<value>Record a meter swap or a counter reset here — the history stays continuous on this meter.</value>
</data>
<data name="MeterDetail_EventsHintTank" xml:space="preserve">
<value>Tank levels and deliveries drive this tank's consumption.</value>
</data>
<data name="MeterDetail_Flags" xml:space="preserve">
<value>Flags</value>
</data>
<data name="MeterDetail_From" xml:space="preserve">
<value>From</value>
</data>
<data name="MeterDetail_FutureTime" xml:space="preserve">
<value>That time is in the future.</value>
</data>
<data name="MeterDetail_GetStarted" xml:space="preserve">
<value>Nothing recorded for this meter yet — start with a first value.</value>
</data>
<data name="MeterDetail_GoToEvents" xml:space="preserve">
<value>Go to events</value>
</data>
<data name="MeterDetail_Imported" xml:space="preserve">
<value>Imported</value>
</data>
<data name="MeterDetail_ImportedEventHint" xml:space="preserve">
<value>Came from an import — revert that import to remove it.</value>
</data>
<data name="MeterDetail_Kind" xml:space="preserve">
<value>Kind</value>
</data>
<data name="MeterDetail_LabelThisMonth" xml:space="preserve">
<value>{0} this month</value>
</data>
<data name="MeterDetail_LastMonthValue" xml:space="preserve">
<value>last month {0} {1}</value>
</data>
<data name="MeterDetail_LastReadingCaption" xml:space="preserve">
<value>Last reading {0} {1} on {2}.</value>
</data>
<data name="MeterDetail_LastValue" xml:space="preserve">
<value>Last value</value>
</data>
<data name="MeterDetail_LastYearCost" xml:space="preserve">
<value>· {0} last year</value>
</data>
<data name="MeterDetail_LifetimeTotal" xml:space="preserve">
<value>Lifetime total</value>
</data>
<data name="MeterDetail_LocalTimeIn" xml:space="preserve">
<value>Local time in {0}.</value>
</data>
<data name="MeterDetail_ManageTariffs" xml:space="preserve">
<value>Manage tariffs</value>
</data>
<data name="MeterDetail_MeterGone" xml:space="preserve">
<value>This meter no longer exists.</value>
</data>
<data name="MeterDetail_NewSource" xml:space="preserve">
<value>New source</value>
</data>
<data name="MeterDetail_No" xml:space="preserve">
<value>no</value>
</data>
<data name="MeterDetail_NoBasisYet" xml:space="preserve">
<value>no basis yet</value>
</data>
<data name="MeterDetail_NoChangeSinceLast" xml:space="preserve">
<value>no change since last reading</value>
</data>
<data name="MeterDetail_NoConnectorYet" xml:space="preserve">
<value>No {0} connector yet —</value>
</data>
<data name="MeterDetail_NoConsumption" xml:space="preserve">
<value>No normalized consumption yet.</value>
</data>
<data name="MeterDetail_NoEvents" xml:space="preserve">
<value>No events recorded yet.</value>
</data>
<data name="MeterDetail_NoRawReadings" xml:space="preserve">
<value>No raw readings.</value>
</data>
<data name="MeterDetail_NoReadingsPrefill" xml:space="preserve">
<value>No readings yet — prefilled with this meter's baseline ({0} {1}).</value>
</data>
<data name="MeterDetail_NoSources" xml:space="preserve">
<value>No ingest sources bound to this meter. Add one to pull from MQTT/Tasmota or Home Assistant.</value>
</data>
<data name="MeterDetail_NoTankConfigured" xml:space="preserve">
<value>No tank set up for this meter yet — its level, fill and forecast need the tank's capacity and dipstick calibration.</value>
</data>
<data name="MeterDetail_NoTariffs" xml:space="preserve">
<value>No applicable tariffs.</value>
</data>
<data name="MeterDetail_NotFound" xml:space="preserve">
<value>Meter #{0} not found.</value>
</data>
<data name="MeterDetail_Notes" xml:space="preserve">
<value>Notes</value>
</data>
<data name="MeterDetail_Offset" xml:space="preserve">
<value>Offset</value>
</data>
<data name="MeterDetail_PickConnector" xml:space="preserve">
<value>Pick a {0} connector for this {1} source.</value>
</data>
<data name="MeterDetail_PollHint" xml:space="preserve">
<value>Hourly is plenty for a meter — monthly totals and cost come out identical, with far less raw data.</value>
</data>
<data name="MeterDetail_PollIntervalLabel" xml:space="preserve">
<value>Poll interval (minutes)</value>
</data>
<data name="MeterDetail_PrevNew" xml:space="preserve">
<value>Prev→New</value>
</data>
<data name="MeterDetail_Priority" xml:space="preserve">
<value>Priority</value>
</data>
<data name="MeterDetail_ProblemDisabled" xml:space="preserve">
<value>'{0}' is disabled</value>
</data>
<data name="MeterDetail_ProblemNoConnector" xml:space="preserve">
<value>no connector — never ingests</value>
</data>
<data name="MeterDetail_ProblemTypeMismatch" xml:space="preserve">
<value>'{0}' is {1}, needs {2}</value>
</data>
<data name="MeterDetail_ProjectedByMonthEnd" xml:space="preserve">
<value>≈ {0} {1} by month end</value>
</data>
<data name="MeterDetail_ProjectedFullYear" xml:space="preserve">
<value>≈ {0} {1} full year</value>
</data>
<data name="MeterDetail_Quality" xml:space="preserve">
<value>Quality</value>
</data>
<data name="MeterDetail_ReadingDeleted" xml:space="preserve">
<value>Reading deleted — consumption recomputed.</value>
</data>
<data name="MeterDetail_ReadingLabel" xml:space="preserve">
<value>Reading ({0})</value>
</data>
<data name="MeterDetail_ReadingRejected" xml:space="preserve">
<value>Rejected — below the previous reading on a register that only counts up. If the meter was swapped or reset, record that first.</value>
</data>
<data name="MeterDetail_ReadingReplaced" xml:space="preserve">
<value>Replaced the reading at that time with {0} {1}.</value>
</data>
<data name="MeterDetail_ReadingSaved" xml:space="preserve">
<value>Reading saved: {0} {1}.</value>
</data>
<data name="MeterDetail_Readings" xml:space="preserve">
<value>Readings</value>
</data>
<data name="MeterDetail_RecentConsumptionCaption" xml:space="preserve">
<value>Most recent {0} normalized deltas.</value>
</data>
<data name="MeterDetail_RecentReadingsCaption" xml:space="preserve">
<value>Most recent {0} (raw, immutable audit truth). Times in {1}.</value>
</data>
<data name="MeterDetail_RecordEvent" xml:space="preserve">
<value>Record event</value>
</data>
<data name="MeterDetail_RecordReset" xml:space="preserve">
<value>Record counter reset</value>
</data>
<data name="MeterDetail_RecordSwap" xml:space="preserve">
<value>Record meter swap</value>
</data>
<data name="MeterDetail_RecordTankLevel" xml:space="preserve">
<value>Record tank level</value>
</data>
<data name="MeterDetail_RegisterDetails" xml:space="preserve">
<value>Meter register details</value>
</data>
<data name="MeterDetail_RegisterSpan" xml:space="preserve">
<value>Register span</value>
</data>
<data name="MeterDetail_ReplaceNotice" xml:space="preserve">
<value>This meter already has a reading at that time — saving replaces its value.</value>
</data>
<data name="MeterDetail_ReplaceSwapStartNotice" xml:space="preserve">
<value>Replaces the new meter's start value recorded with the swap — consumption across the swap stays correct.</value>
</data>
<data name="MeterDetail_Retired" xml:space="preserve">
<value>retired</value>
</data>
<data name="MeterDetail_SaveReading" xml:space="preserve">
<value>Save reading</value>
</data>
<data name="MeterDetail_Saving" xml:space="preserve">
<value>Saving…</value>
</data>
<data name="MeterDetail_Scale" xml:space="preserve">
<value>Scale</value>
</data>
<data name="MeterDetail_ScopeThisMeter" xml:space="preserve">
<value>This meter</value>
</data>
<data name="MeterDetail_SerialValue" xml:space="preserve">
<value>S/N {0}</value>
</data>
<data name="MeterDetail_SetUpTank" xml:space="preserve">
<value>Set up tank</value>
</data>
<data name="MeterDetail_SkippedTime" xml:space="preserve">
<value>That clock time never happened in {0} — the clocks moved forward. Pick another time.</value>
</data>
<data name="MeterDetail_SourceDeleted" xml:space="preserve">
<value>Source deleted.</value>
</data>
<data name="MeterDetail_SourceSaved" xml:space="preserve">
<value>Source saved.</value>
</data>
<data name="MeterDetail_SourceType" xml:space="preserve">
<value>Source type</value>
</data>
<data name="MeterDetail_SwappedOrResetHint" xml:space="preserve">
<value>Below last reading — swapped or reset?</value>
</data>
<data name="MeterDetail_TabConsumption" xml:space="preserve">
<value>Consumption ({0})</value>
</data>
<data name="MeterDetail_TabEvents" xml:space="preserve">
<value>Events ({0})</value>
</data>
<data name="MeterDetail_TabReadings" xml:space="preserve">
<value>Readings ({0})</value>
</data>
<data name="MeterDetail_TabSources" xml:space="preserve">
<value>Sources ({0})</value>
</data>
<data name="MeterDetail_TabTariffs" xml:space="preserve">
<value>Tariffs ({0})</value>
</data>
<data name="MeterDetail_TankUsesEvents" xml:space="preserve">
<value>A tank's consumption comes from tank levels and deliveries, which are recorded as events — a reading entered here would change nothing.</value>
</data>
<data name="MeterDetail_TariffOpenEnd" xml:space="preserve">
<value>open</value>
</data>
<data name="MeterDetail_Time" xml:space="preserve">
<value>Time</value>
</data>
<data name="MeterDetail_TimeOfDay" xml:space="preserve">
<value>Time</value>
</data>
<data name="MeterDetail_TimePathLabel" xml:space="preserve">
<value>Time path (optional, e.g. Time)</value>
</data>
<data name="MeterDetail_To" xml:space="preserve">
<value>To</value>
</data>
<data name="MeterDetail_TopicLabel" xml:space="preserve">
<value>MQTT topic (e.g. tele/plug1/SENSOR)</value>
</data>
<data name="MeterDetail_ValueKind" xml:space="preserve">
<value>Value kind</value>
</data>
<data name="MeterDetail_ValuePathLabel" xml:space="preserve">
<value>Value path (e.g. ENERGY.Total; blank = bare scalar)</value>
</data>
<data name="MeterDetail_VirtualNoReadings" xml:space="preserve">
<value>A virtual meter has no readings of its own — enter readings on the meters it adds up.</value>
</data>
<data name="MeterDetail_VirtualNotice" xml:space="preserve">
<value>Virtual meter — it has no readings of its own; its value is the sum of the upstream meters linked to it.</value>
</data>
<data name="MeterDetail_VirtualNoticeFlow" xml:space="preserve">
<value>See it in the flow view.</value>
</data>
<data name="MeterDetail_VsLastMonth" xml:space="preserve">
<value>vs last month</value>
</data>
<data name="MeterDetail_VsLastYear" xml:space="preserve">
<value>{0} vs {1} last year</value>
</data>
<data name="MeterDetail_Yes" xml:space="preserve">
<value>yes</value>
</data>
<data name="MeterEvent_ActionFailed" xml:space="preserve">
<value>That did not go through, and nothing was changed. Try again; the details are in the log.</value>
</data>
<data name="MeterEvent_AfterResetLabel" xml:space="preserve">
<value>Register after the reset ({0})</value>
</data>
<data name="MeterEvent_BeforeResetHelp" xml:space="preserve">
<value>Its last value before it started over. Leave empty if unknown — the stretch since the last reading is then not counted.</value>
</data>
<data name="MeterEvent_BeforeResetLabel" xml:space="preserve">
<value>Register before the reset ({0})</value>
</data>
<data name="MeterEvent_CountsFrom" xml:space="preserve">
<value>Later readings count on from {0} {1}.</value>
</data>
<data name="MeterEvent_DeliveredLabel" xml:space="preserve">
<value>Delivered ({0})</value>
</data>
<data name="MeterEvent_DeliveredSince" xml:space="preserve">
<value>Delivered since then: {0} {1}</value>
</data>
<data name="MeterEvent_FirstLevel" xml:space="preserve">
<value>First level for this tank — consumption is counted from the next one.</value>
</data>
<data name="MeterEvent_IntroDelivery" xml:space="preserve">
<value>A refill of the tank. It raises the level; the next tank level turns the difference into consumption.</value>
</data>
<data name="MeterEvent_IntroNote" xml:space="preserve">
<value>A remark on this meter's history, e.g. a repair or a moved sensor. It changes no figures.</value>
</data>
<data name="MeterEvent_IntroReset" xml:space="preserve">
<value>The register started over — a reset or a rollover — but it is still the same meter. Later readings count on from the value after the reset.</value>
</data>
<data name="MeterEvent_IntroSwap" xml:space="preserve">
<value>The physical meter was replaced. Enter the old meter's final reading and the new meter's start reading — the history continues on this meter without a gap or a spike.</value>
</data>
<data name="MeterEvent_IntroTankLevel" xml:space="preserve">
<value>A dipstick or gauge reading of what is in the tank. Consumption is the difference to the previous level, plus the deliveries in between.</value>
</data>
<data name="MeterEvent_LastLevel" xml:space="preserve">
<value>Last level: {0} ({1} {2}) on {3}</value>
</data>
<data name="MeterEvent_LastReadingBefore" xml:space="preserve">
<value>Last reading before: {0} {1} on {2}</value>
</data>
<data name="MeterEvent_LevelLabel" xml:space="preserve">
<value>Tank level</value>
</data>
<data name="MeterEvent_LevelRose" xml:space="preserve">
<value>The level rose {0} {1} more than the recorded deliveries — is a delivery missing? It is booked as no consumption.</value>
</data>
<data name="MeterEvent_LevelVolume" xml:space="preserve">
<value>= {0} {1} in the tank</value>
</data>
<data name="MeterEvent_LiveSourcesWarning" xml:space="preserve">
<value>{0} live source(s) feed this meter. If they still read the old register, update or disable them on the Sources tab — otherwise their next value counts against the new one.</value>
</data>
<data name="MeterEvent_NewStartHelp" xml:space="preserve">
<value>Usually 0, or the value on the installation record.</value>
</data>
<data name="MeterEvent_NewStartLabel" xml:space="preserve">
<value>New meter — start reading ({0})</value>
</data>
<data name="MeterEvent_NoCalibrationHint" xml:space="preserve">
<value>Centimetres need the tank's dipstick calibration — set it up under Edit meter.</value>
</data>
<data name="MeterEvent_NoReadingBefore" xml:space="preserve">
<value>No earlier reading — the old register counts from the meter's initial baseline, {0} {1}.</value>
</data>
<data name="MeterEvent_NotANumber" xml:space="preserve">
<value>Not a number</value>
</data>
<data name="MeterEvent_NoteLabel" xml:space="preserve">
<value>Note</value>
</data>
<data name="MeterEvent_NotesOptional" xml:space="preserve">
<value>Note (optional)</value>
</data>
<data name="MeterEvent_OldFinalHelp" xml:space="preserve">
<value>From the swap record or a photo of the old meter. Prefilled with the last reading — the difference is booked as consumption at the swap.</value>
</data>
<data name="MeterEvent_OldFinalLabel" xml:space="preserve">
<value>Old meter — final reading ({0})</value>
</data>
<data name="MeterEvent_ProblemAlreadyRecorded" xml:space="preserve">
<value>A swap or reset is already recorded between the same two readings — delete it first, or pick a time after the next reading.</value>
</data>
<data name="MeterEvent_ProblemAmountOutOfRange" xml:space="preserve">
<value>That value is not possible here — a delivery must be above zero, and a level cannot be negative.</value>
</data>
<data name="MeterEvent_ProblemAmountRequired" xml:space="preserve">
<value>Enter an amount.</value>
</data>
<data name="MeterEvent_ProblemBelowPrevious" xml:space="preserve">
<value>The old register's final reading is below where it last stood (its last reading, or the meter's initial baseline) — check both numbers.</value>
</data>
<data name="MeterEvent_ProblemImported" xml:space="preserve">
<value>This came from an import — revert that import to remove it.</value>
</data>
<data name="MeterEvent_ProblemLaterBoundary" xml:space="preserve">
<value>A later meter swap or counter reset was recorded against this — delete that one first.</value>
</data>
<data name="MeterEvent_ProblemLevelAtSameTime" xml:space="preserve">
<value>A tank level is already recorded at exactly this time — delete that one first, or pick another minute.</value>
</data>
<data name="MeterEvent_ProblemNeedsCalibration" xml:space="preserve">
<value>A level in centimetres needs the tank's calibration — set it up under Edit meter, or enter the volume.</value>
</data>
<data name="MeterEvent_ProblemNotForMode" xml:space="preserve">
<value>This event does not apply to a meter in this measurement mode.</value>
</data>
<data name="MeterEvent_ProblemNotFound" xml:space="preserve">
<value>It no longer exists — the page was out of date.</value>
</data>
<data name="MeterEvent_ProblemNotManual" xml:space="preserve">
<value>Only hand-entered readings can be deleted here — measured readings are the audit record, and imported ones go with their import.</value>
</data>
<data name="MeterEvent_ProblemNoteRequired" xml:space="preserve">
<value>Enter the note.</value>
</data>
<data name="MeterEvent_ProblemReadingAtSameTime" xml:space="preserve">
<value>There is already a reading at exactly this time — pick a minute before or after it, depending on which meter it belongs to.</value>
</data>
<data name="MeterEvent_ProblemStartRejected" xml:space="preserve">
<value>The new register's start reading could not be stored because a reading arrived meanwhile. Nothing was saved — try again.</value>
</data>
<data name="MeterEvent_ReadingsAfterWarning" xml:space="preserve">
<value>{0} reading(s) are already recorded after this time — the next is {1} {2} on {3}. They will count as the new register; if they still belong to the old meter, pick a later time.</value>
</data>
<data name="MeterEvent_SavedDelivery" xml:space="preserve">
<value>Delivery recorded — consumption recomputed.</value>
</data>
<data name="MeterEvent_SavedNote" xml:space="preserve">
<value>Note saved.</value>
</data>
<data name="MeterEvent_SavedReset" xml:space="preserve">
<value>Counter reset recorded — consumption recomputed.</value>
</data>
<data name="MeterEvent_SavedSwap" xml:space="preserve">
<value>Meter swap recorded — consumption recomputed.</value>
</data>
<data name="MeterEvent_SavedTankLevel" xml:space="preserve">
<value>Tank level recorded — consumption recomputed.</value>
</data>
<data name="MeterEvent_TailBooked" xml:space="preserve">
<value>{0} {1} since that reading, booked at this time.</value>
</data>
<data name="MeterEvent_Title" xml:space="preserve">
<value>{0} — {1}</value>
</data>
<data name="MeterEvent_UsedSince" xml:space="preserve">
<value>Used since the last level: {0} {1}</value>
</data>
<data name="MeterSearch_More" xml:space="preserve">
<value>Showing {0} of {1} — keep typing to narrow down.</value>
</data>
<data name="MeterSearch_NoMeters" xml:space="preserve">
<value>No meters yet.</value>
</data>
<data name="MeterSearch_Placeholder" xml:space="preserve">
<value>Name, serial number or location</value>
</data>
<data name="Meters_Active" xml:space="preserve">
<value>Active</value>
</data>
<data name="Meters_AddMeter" xml:space="preserve">
<value>Add meter</value>
</data>
<data name="Meters_ChangedMeanwhile" xml:space="preserve">
<value>Something changed while this dialog was open (a meter or category was deleted). Nothing was saved — check and save again.</value>
</data>
<data name="Meters_CostCategories" xml:space="preserve">
<value>Cost categories</value>
</data>
<data name="Meters_CostCategoriesHelp" xml:space="preserve">
<value>The dashboard reports cost per category; a meter in none has no cost there.</value>
</data>
<data name="Meters_CostCategoriesInherited" xml:space="preserve">
<value>Already counted through its energy type in: {0}</value>
</data>
<data name="Meters_DeleteConfirm" xml:space="preserve">
<value>Delete '{0}'? This cannot be undone.</value>
</data>
<data name="Meters_DeleteConfirmWithData" xml:space="preserve">
<value>Delete '{0}'? This will also delete {1} reading(s) and {2} consumption row(s). This cannot be undone.</value>
</data>
<data name="Meters_DeleteTitle" xml:space="preserve">
<value>Delete meter</value>
</data>
<data name="Meters_EditMeter" xml:space="preserve">
<value>Edit {0}</value>
</data>
<data name="Meters_EmptyAfter" xml:space="preserve">
<value>to load the reference data.</value>
</data>
<data name="Meters_EmptyBefore" xml:space="preserve">
<value>No meters yet. Add one, or go to</value>
</data>
<data name="Meters_InitialBaseline" xml:space="preserve">
<value>Initial register baseline</value>
</data>
<data name="Meters_InstantRateHelpAfter" xml:space="preserve">
<value>rate in this meter's unit (e.g. kW for kWh, L/h for L): a source reporting W or L/min should carry a scale factor to convert it first.</value>
</data>
<data name="Meters_InstantRateHelpBefore" xml:space="preserve">
<value>Power/flow sensor — readings are an instantaneous rate, integrated over time into consumption. Store the value as a</value>
</data>
<data name="Meters_InstantRateHelpPerHour" xml:space="preserve">
<value>per-hour</value>
</data>
<data name="Meters_Location" xml:space="preserve">
<value>Location (optional)</value>
</data>
<data name="Meters_Manufacturer" xml:space="preserve">
<value>Manufacturer (optional)</value>
</data>
<data name="Meters_MeasurementMode" xml:space="preserve">
<value>Measurement mode</value>
</data>
<data name="Meters_Model" xml:space="preserve">
<value>Model (optional)</value>
</data>
<data name="Meters_NewMeter" xml:space="preserve">
<value>New meter</value>
</data>
<data name="Meters_No" xml:space="preserve">
<value>no</value>
</data>
<data name="Meters_NoCostCategories" xml:space="preserve">
<value>No cost categories yet, so this meter's cost will not show on the dashboard. Create one in</value>
</data>
<data name="Meters_NoSearchMatch" xml:space="preserve">
<value>No meter matches “{0}”.</value>
</data>
<data name="Meters_PvRole" xml:space="preserve">
<value>PV role (optional)</value>
</data>
<data name="Meters_PvRoleHelp" xml:space="preserve">
<value>Tag the house meter total_load and the grid meter grid_import to unlock self-consumption, autarky and savings on the Solar page.</value>
</data>
<data name="Meters_RecomputeNotice" xml:space="preserve">
<value>Settings that affect consumption changed — it will be recomputed on save.</value>
</data>
<data name="Meters_RecordSwapInstead" xml:space="preserve">
<value>Record meter swap instead</value>
</data>
<data name="Meters_RequiredFields" xml:space="preserve">
<value>Name, energy type and unit are required.</value>
</data>
<data name="Meters_RetireSwapHint" xml:space="preserve">
<value>Was the physical meter replaced? Record a meter swap instead: history, sources, flow links and cost categories stay on this meter, without a gap. Retire a meter only when it is gone for good.</value>
</data>
<data name="Meters_RoleNone" xml:space="preserve">
<value>— none —</value>
</data>
<data name="Meters_SearchPlaceholder" xml:space="preserve">
<value>Search by name, serial number, location or type</value>
</data>
<data name="Meters_SerialNumber" xml:space="preserve">
<value>Serial number (optional)</value>
</data>
<data name="Meters_Sources" xml:space="preserve">
<value>Sources</value>
</data>
<data name="Meters_TankCapacity" xml:space="preserve">
<value>Capacity</value>
</data>
<data name="Meters_TankCapacityRequired" xml:space="preserve">
<value>Enter the tank's capacity to set up its tank.</value>
</data>
<data name="Meters_TankFixedRate" xml:space="preserve">
<value>Fixed rate ({0}/h)</value>
</data>
<data name="Meters_TankHelp" xml:space="preserve">
<value>Capacity sets the fill level; the calibration turns dipstick centimetres into volume. Levels and deliveries are then recorded on the meter's Events tab.</value>
</data>
<data name="Meters_TankOffset" xml:space="preserve">
<value>Offset ({0})</value>
</data>
<data name="Meters_TankRateMode" xml:space="preserve">
<value>Burner rate</value>
</data>
<data name="Meters_TankSection" xml:space="preserve">
<value>Tank</value>
</data>
<data name="Meters_TankVolumePerCm" xml:space="preserve">
<value>{0} per cm</value>
</data>
<data name="Meters_TankVolumePerCmHelp" xml:space="preserve">
<value>e.g. 7000 L ÷ 150 cm = 46.67. Leave empty if levels are entered as volume.</value>
</data>
<data name="Meters_UpstreamHelp" xml:space="preserve">
<value>This meter measures a subsection of the selected meter(s)' flow.</value>
</data>
<data name="Meters_UpstreamLabel" xml:space="preserve">
<value>Sub-meter of (upstream meters)</value>
</data>
<data name="Meters_VirtualHelp" xml:space="preserve">
<value>Virtual "sum" meter — it has no readings of its own. In the flow view it equals the sum of the upstream meters you select below (e.g. Sum Solar = Solar 1 + Solar 2).</value>
</data>
<data name="Meters_Yes" xml:space="preserve">
<value>yes</value>
</data>
<data name="Nav_Admin" xml:space="preserve">
<value>Admin</value>
</data>
<data name="Nav_Connectors" xml:space="preserve">
<value>Connectors</value>
</data>
<data name="Nav_Consumables" xml:space="preserve">
<value>Oil / consumables</value>
</data>
<data name="Nav_CostCategories" xml:space="preserve">
<value>Cost categories</value>
</data>
<data name="Nav_EnergyTypes" xml:space="preserve">
<value>Energy types</value>
</data>
<data name="Nav_Import" xml:space="preserve">
<value>Import</value>
</data>
<data name="Nav_Meters" xml:space="preserve">
<value>Meters</value>
</data>
<data name="Nav_Overview" xml:space="preserve">
<value>Overview</value>
</data>
<data name="Nav_SectionData" xml:space="preserve">
<value>Meters &amp; data</value>
</data>
<data name="Nav_SectionEnergy" xml:space="preserve">
<value>Energy</value>
</data>
<data name="Nav_Settings" xml:space="preserve">
<value>Settings</value>
</data>
<data name="Nav_Solar" xml:space="preserve">
<value>Solar / PV</value>
</data>
<data name="Nav_Tariffs" xml:space="preserve">
<value>Tariffs</value>
</data>
<data name="Nav_Trends" xml:space="preserve">
<value>Trends</value>
</data>
<data name="NotFound_Message" xml:space="preserve">
<value>Sorry, the content you are looking for does not exist.</value>
</data>
<data name="NotFound_Title" xml:space="preserve">
<value>Not Found</value>
</data>
<data name="Reconnect_Paused" xml:space="preserve">
<value>The session has been paused by the server.</value>
</data>
<data name="Reconnect_RejoinFailed" xml:space="preserve">
<value>Failed to rejoin.</value>
</data>
<data name="Reconnect_Rejoining" xml:space="preserve">
<value>Rejoining the server...</value>
</data>
<data name="Reconnect_Resume" xml:space="preserve">
<value>Resume</value>
</data>
<data name="Reconnect_ResumeFailed" xml:space="preserve">
<value>Failed to resume the session.</value>
</data>
<data name="Reconnect_Retry" xml:space="preserve">
<value>Retry</value>
</data>
<data name="Reconnect_RetryCountdownPrefix" xml:space="preserve">
<value>Rejoin failed... trying again in</value>
</data>
<data name="Reconnect_RetryCountdownSuffix" xml:space="preserve">
<value>seconds.</value>
</data>
<data name="Reconnect_RetryOrReload" xml:space="preserve">
<value>Please retry or reload the page.</value>
</data>
<data name="Sankey_AriaLabel" xml:space="preserve">
<value>Flow diagram</value>
</data>
<data name="Sankey_NoFlow" xml:space="preserve">
<value>No flow to show for this period.</value>
</data>
<data name="Settings_AccessAndIngestion" xml:space="preserve">
<value>Access &amp; ingestion</value>
</data>
<data name="Settings_ApiClosed" xml:space="preserve">
<value>closed (401)</value>
</data>
<data name="Settings_ApiDocsLabel" xml:space="preserve">
<value>API docs at</value>
</data>
<data name="Settings_ApiKeysConfigured" xml:space="preserve">
<value>{0} key(s) configured</value>
</data>
<data name="Settings_ApiKeysHintAfter" xml:space="preserve">
<value>Keys themselves are never shown here.</value>
</data>
<data name="Settings_ApiKeysHintBefore" xml:space="preserve">
<value>Set API keys with</value>
</data>
<data name="Settings_ApiOpen" xml:space="preserve">
<value>open (anonymous)</value>
</data>
<data name="Settings_EffectiveEmphasis" xml:space="preserve">
<value>effective</value>
</data>
<data name="Settings_EffectiveLead" xml:space="preserve">
<value>These are the</value>
</data>
<data name="Settings_EffectiveRest" xml:space="preserve">
<value>settings the running instance is using. They are configured via environment variables</value>
</data>
<data name="Settings_EffectiveTail" xml:space="preserve">
<value>or Docker/compose, not stored in the database — so config stays reproducible and secrets never land in the DB. Change them in your compose/env and restart.</value>
</data>
<data name="Settings_EnvKeysLabel" xml:space="preserve">
<value>Env keys:</value>
</data>
<data name="Settings_LiveIngestionWorkers" xml:space="preserve">
<value>Live ingestion workers</value>
</data>
<data name="Settings_Locale" xml:space="preserve">
<value>Locale</value>
</data>
<data name="Settings_LocaleAndTime" xml:space="preserve">
<value>Locale &amp; time</value>
</data>
<data name="Settings_Off" xml:space="preserve">
<value>off</value>
</data>
<data name="Settings_On" xml:space="preserve">
<value>on</value>
</data>
<data name="Settings_RawRetention" xml:space="preserve">
<value>Raw-reading retention</value>
</data>
<data name="Settings_RetentionDays" xml:space="preserve">
<value>{0} days</value>
</data>
<data name="Settings_ReverseProxyTrust" xml:space="preserve">
<value>Reverse-proxy trust</value>
</data>
<data name="Settings_SeedReferenceData" xml:space="preserve">
<value>Seed reference data on start</value>
</data>
<data name="Settings_Timezone" xml:space="preserve">
<value>Timezone</value>
</data>
<data name="Solar_Autarky" xml:space="preserve">
<value>Autarky</value>
</data>
<data name="Solar_Generation" xml:space="preserve">
<value>Generation</value>
</data>
<data name="Solar_GenerationAndSelfConsumption" xml:space="preserve">
<value>Generation &amp; self-consumption</value>
</data>
<data name="Solar_GenerationByMeter" xml:space="preserve">
<value>Generation by meter</value>
</data>
<data name="Solar_GridDraw" xml:space="preserve">
<value>Grid draw {0} kWh</value>
</data>
<data name="Solar_NoGenerationLead" xml:space="preserve">
<value>No generation meters found. Add a meter with mode</value>
</data>
<data name="Solar_NoGenerationOrImport" xml:space="preserve">
<value>, or load the reference data from</value>
</data>
<data name="Solar_NoGenerationTail" xml:space="preserve">
<value>in</value>
</data>
<data name="Solar_Savings" xml:space="preserve">
<value>Savings (Ersparnis)</value>
</data>
<data name="Solar_SelfConsumption" xml:space="preserve">
<value>Self-consumption</value>
</data>
<data name="Solar_ShareOfGeneration" xml:space="preserve">
<value>{0}% of generation</value>
</data>
<data name="Solar_TagMetersLead" xml:space="preserve">
<value>Set the PV role of your house meter to</value>
</data>
<data name="Solar_TagMetersMid" xml:space="preserve">
<value>and of your grid meter to</value>
</data>
<data name="Solar_TagMetersTail" xml:space="preserve">
<value> to unlock self-consumption, autarky and savings — in the meter editor under</value>
</data>
<data name="Tariffs_AddTariff" xml:space="preserve">
<value>Add tariff</value>
</data>
<data name="Tariffs_Component" xml:space="preserve">
<value>Component</value>
</data>
<data name="Tariffs_DeleteBody" xml:space="preserve">
<value>Delete this {0} tariff ({1} {2})?</value>
</data>
<data name="Tariffs_DeleteTitle" xml:space="preserve">
<value>Delete tariff</value>
</data>
<data name="Tariffs_EditTariff" xml:space="preserve">
<value>Edit tariff</value>
</data>
<data name="Tariffs_EmptyState" xml:space="preserve">
<value>No tariffs yet. Add one, or load the reference data from</value>
</data>
<data name="Tariffs_NewTariff" xml:space="preserve">
<value>New tariff</value>
</data>
<data name="Tariffs_NotesLabel" xml:space="preserve">
<value>Notes (optional)</value>
</data>
<data name="Tariffs_OpenEnded" xml:space="preserve">
<value>open</value>
</data>
<data name="Tariffs_ScopeGlobal" xml:space="preserve">
<value>Global</value>
</data>
<data name="Tariffs_ScopeMeter" xml:space="preserve">
<value>Meter: {0}</value>
</data>
<data name="Tariffs_ScopeTargetRequired" xml:space="preserve">
<value>Select the energy type or meter this tariff applies to.</value>
</data>
<data name="Tariffs_ScopeType" xml:space="preserve">
<value>Type: {0}</value>
</data>
<data name="Tariffs_UnitAndValidFromRequired" xml:space="preserve">
<value>Unit and valid-from are required.</value>
</data>
<data name="Tariffs_UnitLabel" xml:space="preserve">
<value>Unit (e.g. EUR/kWh, EUR/m3, EUR/month)</value>
</data>
<data name="Tariffs_ValidFrom" xml:space="preserve">
<value>Valid from</value>
</data>
<data name="Tariffs_ValidTo" xml:space="preserve">
<value>Valid to</value>
</data>
<data name="Tariffs_ValidToLabel" xml:space="preserve">
<value>Valid to (empty = open-ended)</value>
</data>
<data name="TrendChart_MonthlyCost" xml:space="preserve">
<value>Monthly cost</value>
</data>
<data name="Trends_Apply" xml:space="preserve">
<value>Apply</value>
</data>
<data name="Trends_RangeLast48Months" xml:space="preserve">
<value>Last 48 months</value>
</data>
<data name="Trends_Title" xml:space="preserve">
<value>Cost trend</value>
</data>
<data name="Trends_TotalOverRange" xml:space="preserve">
<value>Total over range: {0}</value>
</data>
<data name="UpdateBanner_DialogBody" xml:space="preserve">
<value>This pulls the latest source, rebuilds it, and restarts the service. It takes a few minutes, during which MeterVault is unavailable. Readings are not affected — ingestion resumes on restart.</value>
</data>
<data name="UpdateBanner_DialogTitle" xml:space="preserve">
<value>Update MeterVault</value>
</data>
<data name="UpdateBanner_HintPullImage" xml:space="preserve">
<value>pull the new image and recreate the container</value>
</data>
<data name="UpdateBanner_HintRunUpdate" xml:space="preserve">
<value>run: update</value>
</data>
<data name="UpdateBanner_ReleaseAvailable" xml:space="preserve">
<value>MeterVault {0} is available — this instance runs {1}.</value>
</data>
<data name="UpdateBanner_Starting" xml:space="preserve">
<value>Starting…</value>
</data>
<data name="UpdateBanner_UpdateNow" xml:space="preserve">
<value>Update now</value>
</data>
<data name="Update_LaunchFailed" xml:space="preserve">
<value>Could not start the update.</value>
</data>
<data name="Update_LaunchFailedWithDetail" xml:space="preserve">
<value>Could not start the update: {0}</value>
</data>
<data name="Update_LaunchLauncherMissing" xml:space="preserve">
<value>Could not start systemd-run.</value>
</data>
<data name="Update_LaunchNotAllowed" xml:space="preserve">
<value>Update cannot be started: {0}.</value>
</data>
<data name="Update_LaunchStarted" xml:space="preserve">
<value>Update started. The service restarts when the rebuild finishes — this usually takes a few minutes.</value>
</data>
</root>