aboutsummaryrefslogtreecommitdiff
path: root/resources
diff options
context:
space:
mode:
authorcirakg <cirakg@cirakg.xyz>2026-10-20 18:36:54 +0200
committercirakg <cirakg@cirakg.xyz>2026-10-20 18:36:54 +0200
commit151bfda5d4c567ff909a61dc9c90bf8eece1db37 (patch)
treef8487b91cf6a9ce59dba02e95e67250fc84d8e80 /resources
parent25910f3a7a7fb28c4a58367b6e56dd2468b60933 (diff)
feat(settings): add the Add OTP, Add code and Manage entry forms with a PIN queue for locked entries
The full phone settings form (README 10.2) and its processing (10.3) as one resumable job: Import, Add OTP, Add code, Manage, then the About fields. Forms are applied only when their switch is on, cleared afterwards (secret first; only the secret after a problem), deduplicated by keyed hash, and report into their Result field and the results screen. - Add OTP validates per README 10.4; Add code runs the real encoder (CodeCheck, a job for 2D codes) and caches 2D codes on the way in. - Manage entry: edit, move, require/drop PIN, replace, counter, delete. Changes to locked entries are sealed under "q" and applied only after the PIN is entered under "Phone changes" in the menu. - About: catalog (800 characters max), version, storage use. - "Encrypt names" now applies to new and existing entries. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'resources')
-rw-r--r--resources/settings/properties.xml57
-rw-r--r--resources/settings/settings.xml206
-rw-r--r--resources/strings/strings.xml118
3 files changed, 372 insertions, 9 deletions
diff --git a/resources/settings/properties.xml b/resources/settings/properties.xml
index e6b75a4..bcd31b6 100644
--- a/resources/settings/properties.xml
+++ b/resources/settings/properties.xml
@@ -1,17 +1,57 @@
<!--
Author: cirakg & claude ai
- Summary: App properties (README 10.2): the Import form (M5) and the Options group with their defaults.
+ Summary: App properties (README 10.2): every settings form field with its default, the options and the read-only About fields.
-->
<!--
Every property the watch reads must be defined here: reading an undefined
one stops the app with a system error that can't be caught.
- * Import (M5): read by source/settings/SettingsProcessor.mc. impText1-8
- are joined in order; the watch clears them and turns impApply off after
- processing, and writes the result to impStatus.
- * Options: read by source/app/Options.mc; list values are indexes. Their
- phone form follows in M7 with the other groups.
+ * Forms (Add OTP, Add code, Manage entry, Import): read by
+ source/settings/SettingsJob.mc when their switch (otpAdd, codeAdd,
+ mgApply, impApply) is on. Afterwards the watch turns the switch off,
+ clears the form (secret fields first) and writes *Status. The defaults
+ here are the values a cleared form returns to (OtpForm/CodeForm/
+ ManageForm.defaults() must match them).
+ * Options: read by source/app/Options.mc; list values are indexes.
+ * About (catalog, version, storageUse): written by the watch only
+ (source/settings/AboutScan.mc).
-->
<properties>
+ <!-- Add OTP -->
+ <property id="otpType" type="number">0</property>
+ <property id="otpIssuer" type="string"></property>
+ <property id="otpAccount" type="string"></property>
+ <property id="otpSecret" type="string"></property>
+ <property id="otpAlgorithm" type="number">0</property>
+ <property id="otpDigits" type="number">6</property>
+ <property id="otpPeriod" type="number">30</property>
+ <property id="otpCounter" type="long">0</property>
+ <property id="otpGroup" type="string"></property>
+ <property id="otpLocked" type="boolean">false</property>
+ <property id="otpAdd" type="boolean">false</property>
+ <property id="otpStatus" type="string"></property>
+ <!-- Add code -->
+ <property id="codeName" type="string"></property>
+ <property id="codeSymbology" type="number">0</property>
+ <property id="codePayload" type="string"></property>
+ <property id="codeEcLevel" type="number">1</property>
+ <property id="codeCheckDigit" type="number">0</property>
+ <property id="codeShowText" type="boolean">true</property>
+ <property id="codeGroup" type="string"></property>
+ <property id="codeLocked" type="boolean">false</property>
+ <property id="codeAdd" type="boolean">false</property>
+ <property id="codeStatus" type="string"></property>
+ <!-- Manage entry -->
+ <property id="mgId" type="string"></property>
+ <property id="mgAction" type="number">0</property>
+ <property id="mgName" type="string"></property>
+ <property id="mgAccount" type="string"></property>
+ <property id="mgGroup" type="string"></property>
+ <property id="mgPosition" type="number">1</property>
+ <property id="mgSecret" type="string"></property>
+ <property id="mgCounter" type="long">0</property>
+ <property id="mgApply" type="boolean">false</property>
+ <property id="mgStatus" type="string"></property>
+ <!-- Import -->
<property id="impText1" type="string"></property>
<property id="impText2" type="string"></property>
<property id="impText3" type="string"></property>
@@ -24,6 +64,7 @@
<property id="impLocked" type="boolean">false</property>
<property id="impApply" type="boolean">false</property>
<property id="impStatus" type="string"></property>
+ <!-- Options -->
<property id="optAutoLock" type="number">3</property>
<property id="optWipe" type="boolean">false</property>
<property id="optTimeOffset" type="number">0</property>
@@ -33,4 +74,8 @@
<property id="optEncryptNames" type="boolean">false</property>
<property id="optGlanceCode" type="boolean">false</property>
<property id="optBrightness" type="boolean">true</property>
+ <!-- About (written by the watch) -->
+ <property id="catalog" type="string"></property>
+ <property id="version" type="string"></property>
+ <property id="storageUse" type="string"></property>
</properties>
diff --git a/resources/settings/settings.xml b/resources/settings/settings.xml
index a8c3b66..d6ae008 100644
--- a/resources/settings/settings.xml
+++ b/resources/settings/settings.xml
@@ -1,8 +1,158 @@
<!--
Author: cirakg & claude ai
- Summary: The app settings form in Garmin Connect: the Import group (M5); the other groups follow in M7.
+ Summary: The app settings form in Garmin Connect (README 10.2): Add OTP, Add code, Manage entry, Import, Options and About.
+-->
+<!--
+ The forms are requests to the watch: fill one in, turn its switch on and
+ save; the watch applies it, clears it and writes the result into its
+ Result field (README 10.1, 10.3). List values are indexes the watch maps
+ (source/settings/*Form.mc, source/app/Options.mc).
-->
<settings>
+ <group id="addOtp" title="@Strings.GroupAddOtp" description="@Strings.GroupAddOtpHelp">
+ <setting propertyKey="@Properties.otpType" title="@Strings.OtpType">
+ <settingConfig type="list">
+ <listEntry value="0">@Strings.TypeTotp</listEntry>
+ <listEntry value="1">@Strings.TypeHotp</listEntry>
+ <listEntry value="2">@Strings.TypeSteam</listEntry>
+ </settingConfig>
+ </setting>
+ <setting propertyKey="@Properties.otpIssuer" title="@Strings.OtpIssuer">
+ <settingConfig type="alphaNumeric" maxLength="40" />
+ </setting>
+ <setting propertyKey="@Properties.otpAccount" title="@Strings.OtpAccount">
+ <settingConfig type="alphaNumeric" maxLength="64" />
+ </setting>
+ <setting propertyKey="@Properties.otpSecret" title="@Strings.OtpSecret" prompt="@Strings.OtpSecretPrompt">
+ <settingConfig type="password" />
+ </setting>
+ <setting propertyKey="@Properties.otpAlgorithm" title="@Strings.OtpAlgorithm">
+ <settingConfig type="list">
+ <listEntry value="0">@Strings.AlgSha1</listEntry>
+ <listEntry value="1">@Strings.AlgSha256</listEntry>
+ <listEntry value="2">@Strings.AlgSha512</listEntry>
+ </settingConfig>
+ </setting>
+ <setting propertyKey="@Properties.otpDigits" title="@Strings.OtpDigits">
+ <settingConfig type="list">
+ <listEntry value="6">@Strings.Digits6</listEntry>
+ <listEntry value="7">@Strings.Digits7</listEntry>
+ <listEntry value="8">@Strings.Digits8</listEntry>
+ </settingConfig>
+ </setting>
+ <setting propertyKey="@Properties.otpPeriod" title="@Strings.OtpPeriod">
+ <settingConfig type="numeric" min="1" max="300" errorMessage="@Strings.OtpPeriodError" />
+ </setting>
+ <setting propertyKey="@Properties.otpCounter" title="@Strings.OtpCounter">
+ <settingConfig type="numeric" min="0" errorMessage="@Strings.CounterError" />
+ </setting>
+ <setting propertyKey="@Properties.otpGroup" title="@Strings.Group">
+ <settingConfig type="alphaNumeric" maxLength="32" />
+ </setting>
+ <setting propertyKey="@Properties.otpLocked" title="@Strings.RequirePin">
+ <settingConfig type="boolean" />
+ </setting>
+ <setting propertyKey="@Properties.otpAdd" title="@Strings.AddThisEntry">
+ <settingConfig type="boolean" />
+ </setting>
+ <setting propertyKey="@Properties.otpStatus" title="@Strings.Status">
+ <settingConfig type="alphaNumeric" readonly="true" />
+ </setting>
+ </group>
+ <group id="addCode" title="@Strings.GroupAddCode" description="@Strings.GroupAddCodeHelp">
+ <setting propertyKey="@Properties.codeName" title="@Strings.CodeName">
+ <settingConfig type="alphaNumeric" maxLength="40" />
+ </setting>
+ <setting propertyKey="@Properties.codeSymbology" title="@Strings.CodeSymbology">
+ <settingConfig type="list">
+ <listEntry value="0">@Strings.SymQr</listEntry>
+ <listEntry value="1">@Strings.SymCode128</listEntry>
+ <listEntry value="2">@Strings.SymCode39</listEntry>
+ <listEntry value="3">@Strings.SymEan13</listEntry>
+ <listEntry value="4">@Strings.SymEan8</listEntry>
+ <listEntry value="5">@Strings.SymUpcA</listEntry>
+ <listEntry value="6">@Strings.SymUpcE</listEntry>
+ <listEntry value="7">@Strings.SymItf</listEntry>
+ <listEntry value="8">@Strings.SymCodabar</listEntry>
+ <listEntry value="9">@Strings.SymDataMatrix</listEntry>
+ <listEntry value="10">@Strings.SymPdf417</listEntry>
+ <listEntry value="11">@Strings.SymAztec</listEntry>
+ </settingConfig>
+ </setting>
+ <setting propertyKey="@Properties.codePayload" title="@Strings.CodePayload" prompt="@Strings.CodePayloadPrompt">
+ <settingConfig type="alphaNumeric" />
+ </setting>
+ <setting propertyKey="@Properties.codeEcLevel" title="@Strings.CodeEcLevel">
+ <settingConfig type="list">
+ <listEntry value="0">@Strings.EcLow</listEntry>
+ <listEntry value="1">@Strings.EcMedium</listEntry>
+ <listEntry value="2">@Strings.EcQuartile</listEntry>
+ <listEntry value="3">@Strings.EcHigh</listEntry>
+ </settingConfig>
+ </setting>
+ <setting propertyKey="@Properties.codeCheckDigit" title="@Strings.CodeCheckDigit">
+ <settingConfig type="list">
+ <listEntry value="0">@Strings.CheckAddVerify</listEntry>
+ <listEntry value="1">@Strings.CheckFix</listEntry>
+ <listEntry value="2">@Strings.CheckOff</listEntry>
+ </settingConfig>
+ </setting>
+ <setting propertyKey="@Properties.codeShowText" title="@Strings.CodeShowText">
+ <settingConfig type="boolean" />
+ </setting>
+ <setting propertyKey="@Properties.codeGroup" title="@Strings.Group">
+ <settingConfig type="alphaNumeric" maxLength="32" />
+ </setting>
+ <setting propertyKey="@Properties.codeLocked" title="@Strings.RequirePin">
+ <settingConfig type="boolean" />
+ </setting>
+ <setting propertyKey="@Properties.codeAdd" title="@Strings.AddThisEntry">
+ <settingConfig type="boolean" />
+ </setting>
+ <setting propertyKey="@Properties.codeStatus" title="@Strings.Status">
+ <settingConfig type="alphaNumeric" readonly="true" />
+ </setting>
+ </group>
+ <group id="manage" title="@Strings.GroupManage" description="@Strings.GroupManageHelp">
+ <setting propertyKey="@Properties.mgId" title="@Strings.MgId" prompt="@Strings.MgIdPrompt">
+ <settingConfig type="alphaNumeric" maxLength="4" />
+ </setting>
+ <setting propertyKey="@Properties.mgAction" title="@Strings.MgAction">
+ <settingConfig type="list">
+ <listEntry value="0">@Strings.ActEdit</listEntry>
+ <listEntry value="1">@Strings.ActMove</listEntry>
+ <listEntry value="2">@Strings.ActLock</listEntry>
+ <listEntry value="3">@Strings.ActUnlock</listEntry>
+ <listEntry value="4">@Strings.ActReplace</listEntry>
+ <listEntry value="5">@Strings.ActCounter</listEntry>
+ <listEntry value="6">@Strings.ActDelete</listEntry>
+ </settingConfig>
+ </setting>
+ <setting propertyKey="@Properties.mgName" title="@Strings.MgName">
+ <settingConfig type="alphaNumeric" maxLength="64" />
+ </setting>
+ <setting propertyKey="@Properties.mgAccount" title="@Strings.MgAccount">
+ <settingConfig type="alphaNumeric" maxLength="64" />
+ </setting>
+ <setting propertyKey="@Properties.mgGroup" title="@Strings.MgGroup">
+ <settingConfig type="alphaNumeric" maxLength="32" />
+ </setting>
+ <setting propertyKey="@Properties.mgPosition" title="@Strings.MgPosition">
+ <settingConfig type="numeric" min="1" max="150" errorMessage="@Strings.PositionError" />
+ </setting>
+ <setting propertyKey="@Properties.mgSecret" title="@Strings.MgSecret">
+ <settingConfig type="password" />
+ </setting>
+ <setting propertyKey="@Properties.mgCounter" title="@Strings.MgCounter">
+ <settingConfig type="numeric" min="0" errorMessage="@Strings.CounterError" />
+ </setting>
+ <setting propertyKey="@Properties.mgApply" title="@Strings.MgApply">
+ <settingConfig type="boolean" />
+ </setting>
+ <setting propertyKey="@Properties.mgStatus" title="@Strings.Status">
+ <settingConfig type="alphaNumeric" readonly="true" />
+ </setting>
+ </group>
<group id="import" title="@Strings.GroupImport" description="@Strings.GroupImportHelp">
<setting propertyKey="@Properties.impText1" title="@Strings.ImpText1" prompt="@Strings.ImpTextPrompt">
<settingConfig type="alphaNumeric" />
@@ -45,4 +195,58 @@
<settingConfig type="alphaNumeric" readonly="true" />
</setting>
</group>
+ <group id="options" title="@Strings.GroupOptions" description="@Strings.GroupOptionsHelp">
+ <setting propertyKey="@Properties.optAutoLock" title="@Strings.OptAutoLock">
+ <settingConfig type="list">
+ <listEntry value="0">@Strings.LockNow</listEntry>
+ <listEntry value="1">@Strings.Lock15s</listEntry>
+ <listEntry value="2">@Strings.Lock30s</listEntry>
+ <listEntry value="3">@Strings.Lock1m</listEntry>
+ <listEntry value="4">@Strings.Lock2m</listEntry>
+ <listEntry value="5">@Strings.Lock5m</listEntry>
+ </settingConfig>
+ </setting>
+ <setting propertyKey="@Properties.optWipe" title="@Strings.OptWipe">
+ <settingConfig type="boolean" />
+ </setting>
+ <setting propertyKey="@Properties.optTimeOffset" title="@Strings.OptTimeOffset">
+ <settingConfig type="numeric" min="-120" max="120" errorMessage="@Strings.OffsetError" />
+ </setting>
+ <setting propertyKey="@Properties.optCodeSize" title="@Strings.OptCodeSize">
+ <settingConfig type="list">
+ <listEntry value="0">@Strings.SizeNormal</listEntry>
+ <listEntry value="1">@Strings.SizeLarge</listEntry>
+ <listEntry value="2">@Strings.SizeHuge</listEntry>
+ </settingConfig>
+ </setting>
+ <setting propertyKey="@Properties.optTheme" title="@Strings.OptTheme">
+ <settingConfig type="list">
+ <listEntry value="0">@Strings.ThemeDark</listEntry>
+ <listEntry value="1">@Strings.ThemeLight</listEntry>
+ </settingConfig>
+ </setting>
+ <setting propertyKey="@Properties.optGroups" title="@Strings.OptGroups">
+ <settingConfig type="boolean" />
+ </setting>
+ <setting propertyKey="@Properties.optEncryptNames" title="@Strings.OptEncryptNames">
+ <settingConfig type="boolean" />
+ </setting>
+ <setting propertyKey="@Properties.optGlanceCode" title="@Strings.OptGlanceCode">
+ <settingConfig type="boolean" />
+ </setting>
+ <setting propertyKey="@Properties.optBrightness" title="@Strings.OptBrightness">
+ <settingConfig type="boolean" />
+ </setting>
+ </group>
+ <group id="about" title="@Strings.GroupAbout" description="@Strings.GroupAboutHelp">
+ <setting propertyKey="@Properties.catalog" title="@Strings.Catalog">
+ <settingConfig type="alphaNumeric" readonly="true" />
+ </setting>
+ <setting propertyKey="@Properties.version" title="@Strings.Version">
+ <settingConfig type="alphaNumeric" readonly="true" />
+ </setting>
+ <setting propertyKey="@Properties.storageUse" title="@Strings.StorageUse">
+ <settingConfig type="alphaNumeric" readonly="true" />
+ </setting>
+ </group>
</settings>
diff --git a/resources/strings/strings.xml b/resources/strings/strings.xml
index d571554..32f6cc6 100644
--- a/resources/strings/strings.xml
+++ b/resources/strings/strings.xml
@@ -1,10 +1,93 @@
<!--
Author: cirakg & claude ai
- Summary: User-visible strings of the app (English).
+ Summary: User-visible strings of the app (English): the app name and the phone settings form.
-->
<!-- User-visible strings. English only for now (README section 14). -->
<strings>
<string id="AppName">OTP Wallet</string>
+
+ <!-- Settings: shared -->
+ <string id="Status">Result</string>
+ <string id="Group">Group (optional)</string>
+ <string id="RequirePin">Require PIN to display</string>
+ <string id="AddThisEntry">Add this entry</string>
+ <string id="CounterError">A whole number, 0 or more</string>
+
+ <!-- Settings: Add OTP (README 10.2) -->
+ <string id="GroupAddOtp">Add OTP</string>
+ <string id="GroupAddOtpHelp">Fill in one account, turn on Add this entry and save. The watch adds it, clears this form and writes the result below. The secret is the Base32 text the service shows next to its QR code.</string>
+ <string id="OtpType">Type</string>
+ <string id="TypeTotp">TOTP (time-based)</string>
+ <string id="TypeHotp">HOTP (counter-based)</string>
+ <string id="TypeSteam">Steam Guard</string>
+ <string id="OtpIssuer">Issuer (service)</string>
+ <string id="OtpAccount">Account</string>
+ <string id="OtpSecret">Secret (Base32)</string>
+ <string id="OtpSecretPrompt">Letters A-Z and digits 2-7; spaces are ignored</string>
+ <string id="OtpAlgorithm">Algorithm</string>
+ <string id="AlgSha1">SHA1 (most services)</string>
+ <string id="AlgSha256">SHA256</string>
+ <string id="AlgSha512">SHA512</string>
+ <string id="OtpDigits">Digits</string>
+ <string id="Digits6">6</string>
+ <string id="Digits7">7</string>
+ <string id="Digits8">8</string>
+ <string id="OtpPeriod">Period in seconds (TOTP)</string>
+ <string id="OtpPeriodError">1 to 300 seconds</string>
+ <string id="OtpCounter">Starting counter (HOTP)</string>
+
+ <!-- Settings: Add code -->
+ <string id="GroupAddCode">Add code</string>
+ <string id="GroupAddCodeHelp">A loyalty card, ticket or other barcode. Fill in the name and contents, turn on Add this entry and save. The watch checks that the contents are valid for the type.</string>
+ <string id="CodeName">Card name</string>
+ <string id="CodeSymbology">Barcode type</string>
+ <string id="SymQr">QR code</string>
+ <string id="SymCode128">Code 128</string>
+ <string id="SymCode39">Code 39</string>
+ <string id="SymEan13">EAN-13</string>
+ <string id="SymEan8">EAN-8</string>
+ <string id="SymUpcA">UPC-A</string>
+ <string id="SymUpcE">UPC-E</string>
+ <string id="SymItf">ITF (Interleaved 2 of 5)</string>
+ <string id="SymCodabar">Codabar</string>
+ <string id="SymDataMatrix">Data Matrix</string>
+ <string id="SymPdf417">PDF417</string>
+ <string id="SymAztec">Aztec</string>
+ <string id="CodePayload">Contents</string>
+ <string id="CodePayloadPrompt">The digits or text of the code</string>
+ <string id="CodeEcLevel">Error correction (2D codes)</string>
+ <string id="EcLow">Low</string>
+ <string id="EcMedium">Medium</string>
+ <string id="EcQuartile">Quartile</string>
+ <string id="EcHigh">High</string>
+ <string id="CodeCheckDigit">Check digit</string>
+ <string id="CheckAddVerify">Add or verify</string>
+ <string id="CheckFix">Fix if wrong</string>
+ <string id="CheckOff">Off</string>
+ <string id="CodeShowText">Show the text under the bars</string>
+
+ <!-- Settings: Manage entry -->
+ <string id="GroupManage">Manage entry</string>
+ <string id="GroupManageHelp">Change one entry by its ID (shown on the watch and under About). Turn on Apply and save. Changes to entries that require the PIN wait until you confirm them with the PIN on the watch.</string>
+ <string id="MgId">Entry ID</string>
+ <string id="MgIdPrompt">For example K7F2</string>
+ <string id="MgAction">Action</string>
+ <string id="ActEdit">Edit details</string>
+ <string id="ActMove">Move to position</string>
+ <string id="ActLock">Require PIN</string>
+ <string id="ActUnlock">Don't require PIN</string>
+ <string id="ActReplace">Replace secret or contents</string>
+ <string id="ActCounter">Set HOTP counter</string>
+ <string id="ActDelete">Delete</string>
+ <string id="MgName">New name (blank: unchanged)</string>
+ <string id="MgAccount">New account (blank: unchanged, - clears)</string>
+ <string id="MgGroup">New group (blank: unchanged, - clears)</string>
+ <string id="MgPosition">New position (1 = top)</string>
+ <string id="PositionError">1 to 150</string>
+ <string id="MgSecret">New secret or contents</string>
+ <string id="MgCounter">New HOTP counter</string>
+ <string id="MgApply">Apply</string>
+
<!-- Settings: Import group (README 10.2, 11) -->
<string id="GroupImport">Import</string>
<string id="GroupImportHelp">Paste otpauth:// links or an unencrypted Aegis JSON export. Long text continues in the next field. Turn on Import now and save; the result appears below and on the watch.</string>
@@ -23,5 +106,36 @@
<string id="ImpModeCancel">Cancel waiting import</string>
<string id="ImpLocked">Require PIN for these entries</string>
<string id="ImpApply">Import now</string>
- <string id="Status">Result</string>
+
+ <!-- Settings: Options -->
+ <string id="GroupOptions">Options</string>
+ <string id="GroupOptionsHelp">Applied as soon as you save.</string>
+ <string id="OptAutoLock">Lock after</string>
+ <string id="LockNow">Immediately</string>
+ <string id="Lock15s">15 seconds</string>
+ <string id="Lock30s">30 seconds</string>
+ <string id="Lock1m">1 minute</string>
+ <string id="Lock2m">2 minutes</string>
+ <string id="Lock5m">5 minutes</string>
+ <string id="OptWipe">Erase locked entries after 10 wrong PINs</string>
+ <string id="OptTimeOffset">Time offset in seconds</string>
+ <string id="OffsetError">-120 to 120 seconds</string>
+ <string id="OptCodeSize">Code size</string>
+ <string id="SizeNormal">Normal</string>
+ <string id="SizeLarge">Large</string>
+ <string id="SizeHuge">Huge</string>
+ <string id="OptTheme">Theme</string>
+ <string id="ThemeDark">Dark</string>
+ <string id="ThemeLight">Light</string>
+ <string id="OptGroups">Show groups</string>
+ <string id="OptEncryptNames">Encrypt names on the watch</string>
+ <string id="OptGlanceCode">Show the favourite code in the glance</string>
+ <string id="OptBrightness">Full brightness while showing a barcode</string>
+
+ <!-- Settings: About (written by the watch) -->
+ <string id="GroupAbout">About</string>
+ <string id="GroupAboutHelp">Written by the watch. Entry IDs for Manage entry are in the list below.</string>
+ <string id="Catalog">Entries</string>
+ <string id="Version">Version</string>
+ <string id="StorageUse">Storage</string>
</strings>