ci / build-test (push) Failing after 35s
The last open item on the M7 list. Number and currency formatting was already locale-aware, but every string in the UI was an English literal, so a German instance read half in each language -- German data, English chrome. This translates all of it and adds the machinery to keep it translated. Strings live in Localization/Strings.resx (English, neutral) and Strings.de.resx. The neutral file generates a strongly-typed accessor at build time, aliased as S in _Imports.razor, so components reference compiled properties -- @S.Common_Save, not a string key. That choice is the point: across 4,500 lines of markup, a key lookup that silently falls back to its own name is a defect you find in production, while a renamed property is a build error. Generation runs in MSBuild rather than the IDE designer, so dotnet build alone reproduces it anywhere. Resource fallback is the hazard here. Ask for a key the German satellite lacks and ResourceManager quietly serves the English one -- correct at runtime, disastrous at release time, because a half-translated build looks perfectly healthy. StringResourceTests reads each satellite with tryParents: false, which is the only way to see what one actually contains, and fails on a missing or blank translation, a placeholder that changed arity, an orphan, or a key nothing references. Three things needed more than substitution: - Domain enums reached the screen as bare identifiers. They stay bare in the model -- they are persisted as text and appear in the REST API, so their names are part of the data contract -- and DisplayNames is now the single place that decides how each value is spoken. Every arm ends in a fallback returning the identifier, so a value added later cannot throw mid-render; EnumDisplayNameTests is what stops that safety net quietly becoming the shipping behaviour. - Infrastructure was writing display text: FlowService's "Other (X)", MeterPeriodView's "Generation"/"Consumption", the HA connection-test verdicts, the updater's snackbar, the CSV importer's row warnings. Each now returns an outcome value and the UI supplies the words, which is where the reader's language is known. Diagnostics that are not ours -- an HTTP status, systemd's stderr, an exception message -- are passed through untranslated, and every English summary is kept alongside the outcome so log lines never move with the UI language. The UpdateRunner change is additive only; no gate was touched. - Importer warnings carry their arguments rather than a finished sentence, so the numbers inside them pick up the reader's grouping. A register that reads 2.940,19 everywhere else must not read 2940.19 only inside a warning. Switching language is a redirect through /culture/set followed by a full reload, not an interactive state change: a Blazor Server circuit is fixed to the culture of the request that opened it. That makes the endpoint a redirector taking its target from the query string, so anything but a local path is refused rather than followed. Preference order is the cookie, then Accept-Language, then MeterVault__Locale -- an instance can be pinned to one language and a reader can still switch. Locale keeps its documented default of "en". Format now follows CurrentCulture instead of a hardcoded de-DE, so an instance with nothing configured and a browser asking for English will show English number formatting where it previously showed German; set MeterVault__Locale=de to pin the old behaviour. The importer's de-DE parsing is untouched and stays that way -- that dialect is a property of the spreadsheets, not of whoever is looking at the dashboard. Anything that comes from the database -- meter names, energy-type display names, category names -- is user data and is never translated. Claude-Session: https://claude.ai/code/session_0112ezeWqaZ85kTj5bYu9JHx
1636 lines
62 KiB
XML
1636 lines
62 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_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_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_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_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_NoMetersTail" xml:space="preserve">
|
|
<value>and a tank, or load the reference data from</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_TankLevel" xml:space="preserve">
|
|
<value>Tank level</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_NoCostData" xml:space="preserve">
|
|
<value>No cost data yet — import a sheet or add tariffs.</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_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_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 & 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_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_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_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_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_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_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 will be rejected. If the meter was swapped or reset, record that on the Events tab first.</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_EditSource" xml:space="preserve">
|
|
<value>Edit source</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_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_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_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 (swaps, deliveries, corrections).</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_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_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. Record a counter reset or meter swap 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_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_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_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_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_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 is an expression over other meters, so it stores no readings of its own — enter the reading on the meter the expression refers to.</value>
|
|
</data>
|
|
<data name="MeterDetail_VirtualNotice" xml:space="preserve">
|
|
<value>Virtual meter — its value is an expression over other meters, evaluated when read, so it has no stored series of its own.</value>
|
|
</data>
|
|
<data name="MeterDetail_VirtualNoticeTrends" xml:space="preserve">
|
|
<value>See Trends for its figures.</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_WillBeRejectedSuffix" xml:space="preserve">
|
|
<value> — will be rejected</value>
|
|
</data>
|
|
<data name="MeterDetail_Yes" xml:space="preserve">
|
|
<value>yes</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_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_PvRole" xml:space="preserve">
|
|
<value>PV role (optional)</value>
|
|
</data>
|
|
<data name="Meters_RecomputeNotice" xml:space="preserve">
|
|
<value>Mode/baseline changed — consumption will be recomputed on save.</value>
|
|
</data>
|
|
<data name="Meters_RequiredFields" xml:space="preserve">
|
|
<value>Name, energy type and unit are required.</value>
|
|
</data>
|
|
<data name="Meters_RoleNone" xml:space="preserve">
|
|
<value>— none —</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_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_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 & 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 & 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 & 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_NoGenerationTail" xml:space="preserve">
|
|
<value>or load the reference data from</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>Tag a meter</value>
|
|
</data>
|
|
<data name="Solar_TagMetersMid" xml:space="preserve">
|
|
<value>and one</value>
|
|
</data>
|
|
<data name="Solar_TagMetersTail" xml:space="preserve">
|
|
<value>(in meter metadata) to unlock self-consumption, autarky and savings.</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>
|