Add UI for setting repeater identity keys

This adds a simple UI in repeater management settings for remotely
setting a repeater's private key. A key can be pasted from an external
key generator, or a random one can be generated here, optionally with a
specified prefix.

If a prefix is specified, searching is done in 30ms batches in order
to keep the UI responsive and show the progress indicator animation
smoothly. Searches can be interrupted. An estimation of search length is
given as expected number of generated key pairs. (A future improvement
would be to observe keys per second performance and give time estimates
based on that.)

When it generates a new private key on your behalf, it can tell you
what the corresponding public key will be. Unfortunately, if you paste
one in from another source, it can't compute the corresponding public
key. This is because the standard Dart crypto library doesn't provide
that capability, nor does it give access to the elliptic curve functions
it implements so we could do it ourselves. Our only recourse would be to
copy the source for all those things, and I didn't think it was worth
it.

This will not check the validity of a pasted key, but the remote
repeater will. It does limit it to the correct length and hexadecimal
charset.

Prefixes are limited to 4 characters. There's no technical reason for
this, but users are unlikely to want more, and I think it would just be
a bad experience to allow more and spin for a very long time. If someone
really wants a longer one, they can use an external generator like they
do now.

Possible TODO: rewrite background processing using isolates.

Closes #142.
This commit is contained in:
Seth Golub
2026-05-28 10:57:50 -07:00
parent 5670ab0067
commit e1a4900dc0
29 changed files with 1169 additions and 44 deletions
+21 -1
View File
@@ -1409,6 +1409,26 @@
"repeater_advancedSettingsSubtitle": "Tuning knobs for experienced operators",
"repeater_pathHashMode": "Path hash mode",
"repeater_pathHashModeHelper": "Bytes used to encode this repeater's ID in flood path/loop-detect tags. 0=1 byte (256 IDs, up to 64 hops), 1=2 bytes (65K IDs, up to 32 hops), 2=3 bytes (16M IDs, up to 21 hops). v1.13 and older firmware drops multi-byte paths — only raise once your network is on v1.14+.",
"repeater_keySettings": "Change Identity Keys",
"repeater_keySettingsSubtitle": "Change the public/private keypair",
"repeater_prvKey": "Private key",
"repeater_prvKeyHelper": "A new private key for the repeater, a 128-character hex string.",
"repeater_generatePrvKey": "Generate a random keypair",
"repeater_stopGeneratingPrvKey": "Interrupt search for keypair",
"repeater_pubKey": "Public key",
"repeater_pubKeyHelper": "This is the public key that goes with the generated private key. You can't set this directly.",
"repeater_pubKeyPrefix": "Desired prefix",
"repeater_pubKeyPrefixHelper": "Find a public key that starts with these hex digits. Expected tries needed: {tries}.",
"@repeater_pubKeyPrefixHelper": {
"placeholders": {
"tries": {
"type": "int"
}
}
},
"repeater_txDelay": "Flood TX delay",
"repeater_txDelayHelper": "Retransmit spacing for flood traffic, as a multiplier of the packet's airtime (0-2, default 0.5). Higher = fewer collisions but slower delivery.",
"repeater_directTxDelay": "Direct TX delay",
@@ -1589,7 +1609,7 @@
"repeater_cliHelpPowersavingOnOff": "Enables or disables powersaving mode (where supported).",
"repeater_cliHelpErase": "(Serial only) Formats the device file system. Wipes all settings and contacts.",
"repeater_cliHelpSetDutyCycle": "Sets the maximum allowed transmit duty cycle as a percentage (1-100). Internally adjusts the airtime factor.",
"repeater_cliHelpSetPrvKey": "(Serial only) Replaces the device identity private key. Reboot required to apply. Generates a new public key.",
"repeater_cliHelpSetPrvKey": "Replaces the device identity private key. Reboot required to apply. Generates a new public key.",
"repeater_cliHelpSetRadioRxGain": "(SX126x only) Toggles boosted RX gain for improved sensitivity at higher current draw.",
"repeater_cliHelpSetOwnerInfo": "Sets the owner contact info string included in adverts. Use '|' for newlines.",
"repeater_cliHelpSetPathHashMode": "Sets the path-hash mode. 0 = legacy, 1 = standard, 2 = strict. Affects how routing paths are matched.",
+61 -1
View File
@@ -4748,6 +4748,66 @@ abstract class AppLocalizations {
/// **'Bytes used to encode this repeater\'s ID in flood path/loop-detect tags. 0=1 byte (256 IDs, up to 64 hops), 1=2 bytes (65K IDs, up to 32 hops), 2=3 bytes (16M IDs, up to 21 hops). v1.13 and older firmware drops multi-byte paths — only raise once your network is on v1.14+.'**
String get repeater_pathHashModeHelper;
/// No description provided for @repeater_keySettings.
///
/// In en, this message translates to:
/// **'Change Identity Keys'**
String get repeater_keySettings;
/// No description provided for @repeater_keySettingsSubtitle.
///
/// In en, this message translates to:
/// **'Change the public/private keypair'**
String get repeater_keySettingsSubtitle;
/// No description provided for @repeater_prvKey.
///
/// In en, this message translates to:
/// **'Private key'**
String get repeater_prvKey;
/// No description provided for @repeater_prvKeyHelper.
///
/// In en, this message translates to:
/// **'A new private key for the repeater, a 128-character hex string.'**
String get repeater_prvKeyHelper;
/// No description provided for @repeater_generatePrvKey.
///
/// In en, this message translates to:
/// **'Generate a random keypair'**
String get repeater_generatePrvKey;
/// No description provided for @repeater_stopGeneratingPrvKey.
///
/// In en, this message translates to:
/// **'Interrupt search for keypair'**
String get repeater_stopGeneratingPrvKey;
/// No description provided for @repeater_pubKey.
///
/// In en, this message translates to:
/// **'Public key'**
String get repeater_pubKey;
/// No description provided for @repeater_pubKeyHelper.
///
/// In en, this message translates to:
/// **'This is the public key that goes with the generated private key. You can\'t set this directly.'**
String get repeater_pubKeyHelper;
/// No description provided for @repeater_pubKeyPrefix.
///
/// In en, this message translates to:
/// **'Desired prefix'**
String get repeater_pubKeyPrefix;
/// No description provided for @repeater_pubKeyPrefixHelper.
///
/// In en, this message translates to:
/// **'Find a public key that starts with these hex digits. Expected tries needed: {tries}.'**
String repeater_pubKeyPrefixHelper(int tries);
/// No description provided for @repeater_txDelay.
///
/// In en, this message translates to:
@@ -5519,7 +5579,7 @@ abstract class AppLocalizations {
/// No description provided for @repeater_cliHelpSetPrvKey.
///
/// In en, this message translates to:
/// **'(Serial only) Replaces the device identity private key. Reboot required to apply. Generates a new public key.'**
/// **'Replaces the device identity private key. Reboot required to apply. Generates a new public key.'**
String get repeater_cliHelpSetPrvKey;
/// No description provided for @repeater_cliHelpSetRadioRxGain.
+35
View File
@@ -2641,6 +2641,41 @@ class AppLocalizationsBg extends AppLocalizations {
@override
String get repeater_txDelay => 'Забавяне на Flood TX';
String get repeater_keySettings => 'Change Identity Keys';
@override
String get repeater_keySettingsSubtitle =>
'Change the public/private keypair';
@override
String get repeater_prvKey => 'Private key';
@override
String get repeater_prvKeyHelper =>
'A new private key for the repeater, a 128-character hex string.';
@override
String get repeater_generatePrvKey => 'Generate a random keypair';
@override
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
@override
String get repeater_pubKey => 'Public key';
@override
String get repeater_pubKeyHelper =>
'This is the public key that goes with the generated private key. You can\'t set this directly.';
@override
String get repeater_pubKeyPrefix => 'Desired prefix';
@override
String repeater_pubKeyPrefixHelper(int tries) {
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
}
@override
@override
String get repeater_txDelayHelper =>
+35
View File
@@ -2635,6 +2635,41 @@ class AppLocalizationsDe extends AppLocalizations {
String get repeater_pathHashModeHelper =>
'Bytes, die zur Kodierung der ID dieses Repeaters in Flood-Pfad-/Schleifen-Erkennung-Tags verwendet werden. 0 = 1 Byte (256 IDs, bis zu 64 Hops), 1 = 2 Bytes (65.000 IDs, bis zu 32 Hops), 2 = 3 Bytes (16 Millionen IDs, bis zu 21 Hops). Firmware-Versionen 1.13 und älter verwenden mehrstellige Pfade ab Version 1.14+ wird nur ein Pfad erstellt, sobald das Netzwerk aktiv ist.';
@override
String get repeater_keySettings => 'Change Identity Keys';
@override
String get repeater_keySettingsSubtitle =>
'Change the public/private keypair';
@override
String get repeater_prvKey => 'Private key';
@override
String get repeater_prvKeyHelper =>
'A new private key for the repeater, a 128-character hex string.';
@override
String get repeater_generatePrvKey => 'Generate a random keypair';
@override
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
@override
String get repeater_pubKey => 'Public key';
@override
String get repeater_pubKeyHelper =>
'This is the public key that goes with the generated private key. You can\'t set this directly.';
@override
String get repeater_pubKeyPrefix => 'Desired prefix';
@override
String repeater_pubKeyPrefixHelper(int tries) {
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
}
@override
String get repeater_txDelay => 'Flood-TX-Verzögerung';
+36 -1
View File
@@ -2589,6 +2589,41 @@ class AppLocalizationsEn extends AppLocalizations {
String get repeater_pathHashModeHelper =>
'Bytes used to encode this repeater\'s ID in flood path/loop-detect tags. 0=1 byte (256 IDs, up to 64 hops), 1=2 bytes (65K IDs, up to 32 hops), 2=3 bytes (16M IDs, up to 21 hops). v1.13 and older firmware drops multi-byte paths — only raise once your network is on v1.14+.';
@override
String get repeater_keySettings => 'Change Identity Keys';
@override
String get repeater_keySettingsSubtitle =>
'Change the public/private keypair';
@override
String get repeater_prvKey => 'Private key';
@override
String get repeater_prvKeyHelper =>
'A new private key for the repeater, a 128-character hex string.';
@override
String get repeater_generatePrvKey => 'Generate a random keypair';
@override
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
@override
String get repeater_pubKey => 'Public key';
@override
String get repeater_pubKeyHelper =>
'This is the public key that goes with the generated private key. You can\'t set this directly.';
@override
String get repeater_pubKeyPrefix => 'Desired prefix';
@override
String repeater_pubKeyPrefixHelper(int tries) {
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
}
@override
String get repeater_txDelay => 'Flood TX delay';
@@ -3059,7 +3094,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get repeater_cliHelpSetPrvKey =>
'(Serial only) Replaces the device identity private key. Reboot required to apply. Generates a new public key.';
'Replaces the device identity private key. Reboot required to apply. Generates a new public key.';
@override
String get repeater_cliHelpSetRadioRxGain =>
+35
View File
@@ -2634,6 +2634,41 @@ class AppLocalizationsEs extends AppLocalizations {
String get repeater_pathHashModeHelper =>
'Bytes utilizados para codificar el ID de este repetidor en las etiquetas de ruta/detección de bucles. 0=1 byte (256 IDs, hasta 64 saltos), 1=2 bytes (65.000 IDs, hasta 32 saltos), 2=3 bytes (16 millones de IDs, hasta 21 saltos). Las versiones 1.13 y anteriores de firmware eliminan rutas de múltiples bytes; solo se detectan una vez que la red está activa en la versión 1.14 o posterior.';
@override
String get repeater_keySettings => 'Change Identity Keys';
@override
String get repeater_keySettingsSubtitle =>
'Change the public/private keypair';
@override
String get repeater_prvKey => 'Private key';
@override
String get repeater_prvKeyHelper =>
'A new private key for the repeater, a 128-character hex string.';
@override
String get repeater_generatePrvKey => 'Generate a random keypair';
@override
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
@override
String get repeater_pubKey => 'Public key';
@override
String get repeater_pubKeyHelper =>
'This is the public key that goes with the generated private key. You can\'t set this directly.';
@override
String get repeater_pubKeyPrefix => 'Desired prefix';
@override
String repeater_pubKeyPrefixHelper(int tries) {
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
}
@override
String get repeater_txDelay => 'Retraso TX por inundación';
+35
View File
@@ -2645,6 +2645,41 @@ class AppLocalizationsFr extends AppLocalizations {
String get repeater_pathHashModeHelper =>
'Octets utilisés pour encoder l\'ID de ce routeur dans les balises de détection de flux/boucles. 0 = 1 octet (256 ID, jusqu\'à 64 sauts), 1 = 2 octets (65 000 ID, jusqu\'à 32 sauts), 2 = 3 octets (16 millions d\'ID, jusqu\'à 21 sauts). Les versions 1.13 et antérieures utilisent des chemins multi-octets ; à partir de la version 1.14, cela n\'est plus nécessaire.';
@override
String get repeater_keySettings => 'Change Identity Keys';
@override
String get repeater_keySettingsSubtitle =>
'Change the public/private keypair';
@override
String get repeater_prvKey => 'Private key';
@override
String get repeater_prvKeyHelper =>
'A new private key for the repeater, a 128-character hex string.';
@override
String get repeater_generatePrvKey => 'Generate a random keypair';
@override
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
@override
String get repeater_pubKey => 'Public key';
@override
String get repeater_pubKeyHelper =>
'This is the public key that goes with the generated private key. You can\'t set this directly.';
@override
String get repeater_pubKeyPrefix => 'Desired prefix';
@override
String repeater_pubKeyPrefixHelper(int tries) {
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
}
@override
String get repeater_txDelay => 'Délai de transmission en flood';
+35
View File
@@ -2628,6 +2628,41 @@ class AppLocalizationsHu extends AppLocalizations {
String get repeater_pathHashModeHelper =>
'Az átjátszó azonosítójának elárasztási útvonal/hurokészlelési címkékbe való kódolására használt bájtok. 0 = 1 bájt (256 azonosító, legfeljebb 64 ugrás), 1 = 2 bájt (65 000 azonosító, legfeljebb 32 ugrás), 2 = 3 bájt (16 millió azonosító, legfeljebb 21 ugrás). A v1.13 és régebbi firmware eldobja a többbájtos elérési utat csak akkor emelje meg, ha a hálózat a v1.14+ verziót használja.';
@override
String get repeater_keySettings => 'Change Identity Keys';
@override
String get repeater_keySettingsSubtitle =>
'Change the public/private keypair';
@override
String get repeater_prvKey => 'Private key';
@override
String get repeater_prvKeyHelper =>
'A new private key for the repeater, a 128-character hex string.';
@override
String get repeater_generatePrvKey => 'Generate a random keypair';
@override
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
@override
String get repeater_pubKey => 'Public key';
@override
String get repeater_pubKeyHelper =>
'This is the public key that goes with the generated private key. You can\'t set this directly.';
@override
String get repeater_pubKeyPrefix => 'Desired prefix';
@override
String repeater_pubKeyPrefixHelper(int tries) {
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
}
@override
String get repeater_txDelay => 'Áradási TX késleltetés';
+35
View File
@@ -2636,6 +2636,41 @@ class AppLocalizationsIt extends AppLocalizations {
String get repeater_pathHashModeHelper =>
'Byte utilizzati per codificare l\'ID di questo ripetitore nei tag per il rilevamento del percorso/loop. 0=1 byte (256 ID, fino a 64 salti), 1=2 byte (65.000 ID, fino a 32 salti), 2=3 byte (16 milioni di ID, fino a 21 salti). Le versioni 1.13 e precedenti utilizzano percorsi multi-byte: è necessario attivare la rete prima di utilizzare questa funzionalità (a partire dalla versione 1.14).';
@override
String get repeater_keySettings => 'Change Identity Keys';
@override
String get repeater_keySettingsSubtitle =>
'Change the public/private keypair';
@override
String get repeater_prvKey => 'Private key';
@override
String get repeater_prvKeyHelper =>
'A new private key for the repeater, a 128-character hex string.';
@override
String get repeater_generatePrvKey => 'Generate a random keypair';
@override
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
@override
String get repeater_pubKey => 'Public key';
@override
String get repeater_pubKeyHelper =>
'This is the public key that goes with the generated private key. You can\'t set this directly.';
@override
String get repeater_pubKeyPrefix => 'Desired prefix';
@override
String repeater_pubKeyPrefixHelper(int tries) {
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
}
@override
String get repeater_txDelay => 'Ritardo a Flood, TX';
+35
View File
@@ -2519,6 +2519,41 @@ class AppLocalizationsJa extends AppLocalizations {
String get repeater_pathHashModeHelper =>
'このリピータのIDをフローパス/ループ検出タグにエンコードするために使用されるバイト数。 0=1バイト (256個のID、最大64ホップ)、1=2バイト (65,000個のID、最大32ホップ)、2=3バイト (160万個のID、最大21ホップ)。 v1.13およびそれ以前のファームウェアでは、マルチバイトパスがサポートされていません。 v1.14以降のバージョンでは、一度ネットワークが起動されると、パスが一度だけ検出されます。';
@override
String get repeater_keySettings => 'Change Identity Keys';
@override
String get repeater_keySettingsSubtitle =>
'Change the public/private keypair';
@override
String get repeater_prvKey => 'Private key';
@override
String get repeater_prvKeyHelper =>
'A new private key for the repeater, a 128-character hex string.';
@override
String get repeater_generatePrvKey => 'Generate a random keypair';
@override
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
@override
String get repeater_pubKey => 'Public key';
@override
String get repeater_pubKeyHelper =>
'This is the public key that goes with the generated private key. You can\'t set this directly.';
@override
String get repeater_pubKeyPrefix => 'Desired prefix';
@override
String repeater_pubKeyPrefixHelper(int tries) {
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
}
@override
String get repeater_txDelay => 'フロイド・TXでの遅延';
+35
View File
@@ -2524,6 +2524,41 @@ class AppLocalizationsKo extends AppLocalizations {
String get repeater_pathHashModeHelper =>
'이 리피터의 ID를 플러드 경로/루프 감지 태그에 인코딩하는 데 사용되는 바이트 수: 0=1 바이트 (256개의 ID, 최대 64개의 홉), 1=2 바이트 (65,000개의 ID, 최대 32개의 홉), 2=3 바이트 (16백만 개의 ID, 최대 21개의 홉). v1.13 및 이전 버전의 펌웨어는 다중 바이트 경로를 지원하지 않으며, 네트워크가 v1.14 이상으로 업그레이드되면 한 번만 감지합니다.';
@override
String get repeater_keySettings => 'Change Identity Keys';
@override
String get repeater_keySettingsSubtitle =>
'Change the public/private keypair';
@override
String get repeater_prvKey => 'Private key';
@override
String get repeater_prvKeyHelper =>
'A new private key for the repeater, a 128-character hex string.';
@override
String get repeater_generatePrvKey => 'Generate a random keypair';
@override
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
@override
String get repeater_pubKey => 'Public key';
@override
String get repeater_pubKeyHelper =>
'This is the public key that goes with the generated private key. You can\'t set this directly.';
@override
String get repeater_pubKeyPrefix => 'Desired prefix';
@override
String repeater_pubKeyPrefixHelper(int tries) {
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
}
@override
String get repeater_txDelay => '플러드 TX 지연';
+35
View File
@@ -2617,6 +2617,41 @@ class AppLocalizationsNl extends AppLocalizations {
String get repeater_pathHashModeHelper =>
'Bytes die gebruikt worden om de ID van deze repeater te coderen in flood-pad/lusdetectietags. 0=1 byte (256 ID\'s, tot 64 hops), 1=2 bytes (65.000 ID\'s, tot 32 hops), 2=3 bytes (16 miljoen ID\'s, tot 21 hops). Versies 1.13 en ouder gebruiken multi-byte paden alleen na het activeren van het netwerk.';
@override
String get repeater_keySettings => 'Change Identity Keys';
@override
String get repeater_keySettingsSubtitle =>
'Change the public/private keypair';
@override
String get repeater_prvKey => 'Private key';
@override
String get repeater_prvKeyHelper =>
'A new private key for the repeater, a 128-character hex string.';
@override
String get repeater_generatePrvKey => 'Generate a random keypair';
@override
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
@override
String get repeater_pubKey => 'Public key';
@override
String get repeater_pubKeyHelper =>
'This is the public key that goes with the generated private key. You can\'t set this directly.';
@override
String get repeater_pubKeyPrefix => 'Desired prefix';
@override
String repeater_pubKeyPrefixHelper(int tries) {
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
}
@override
String get repeater_txDelay => 'Vertraging bij Flood TX';
+35
View File
@@ -2650,6 +2650,41 @@ class AppLocalizationsPl extends AppLocalizations {
String get repeater_pathHashModeHelper =>
'Bity wykorzystywane do kodowania identyfikatora tego urządzenia w tagach ścieżek/detekcji pętli. 0=1 bity (256 identyfikatorów, do 64 skoków), 1=2 bity (65 000 identyfikatorów, do 32 skoków), 2=3 bity (1 600 000 identyfikatorów, do 21 skoków). Wersje 1.13 i wcześniejsze nie obsługują ścieżek wielobitowych wykrywają tylko jedną, gdy sieć jest w wersji 1.14 lub nowszej.';
@override
String get repeater_keySettings => 'Change Identity Keys';
@override
String get repeater_keySettingsSubtitle =>
'Change the public/private keypair';
@override
String get repeater_prvKey => 'Private key';
@override
String get repeater_prvKeyHelper =>
'A new private key for the repeater, a 128-character hex string.';
@override
String get repeater_generatePrvKey => 'Generate a random keypair';
@override
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
@override
String get repeater_pubKey => 'Public key';
@override
String get repeater_pubKeyHelper =>
'This is the public key that goes with the generated private key. You can\'t set this directly.';
@override
String get repeater_pubKeyPrefix => 'Desired prefix';
@override
String repeater_pubKeyPrefixHelper(int tries) {
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
}
@override
String get repeater_txDelay => 'Opóźnienie w Flood, TX';
+35
View File
@@ -2635,6 +2635,41 @@ class AppLocalizationsPt extends AppLocalizations {
String get repeater_pathHashModeHelper =>
'Bytes utilizados para codificar o ID deste repetidor nas tags de caminho/detecção de loop. 0=1 byte (256 IDs, até 64 saltos), 1=2 bytes (65.000 IDs, até 32 saltos), 2=3 bytes (16 milhões de IDs, até 21 saltos). As versões 1.13 e anteriores do firmware não suportam caminhos multi-byte — apenas funcionam uma vez após a ativação da rede (a partir da versão 1.14+).';
@override
String get repeater_keySettings => 'Change Identity Keys';
@override
String get repeater_keySettingsSubtitle =>
'Change the public/private keypair';
@override
String get repeater_prvKey => 'Private key';
@override
String get repeater_prvKeyHelper =>
'A new private key for the repeater, a 128-character hex string.';
@override
String get repeater_generatePrvKey => 'Generate a random keypair';
@override
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
@override
String get repeater_pubKey => 'Public key';
@override
String get repeater_pubKeyHelper =>
'This is the public key that goes with the generated private key. You can\'t set this directly.';
@override
String get repeater_pubKeyPrefix => 'Desired prefix';
@override
String repeater_pubKeyPrefixHelper(int tries) {
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
}
@override
String get repeater_txDelay => 'Atraso na entrega em Flood, TX';
+35
View File
@@ -2640,6 +2640,41 @@ class AppLocalizationsRu extends AppLocalizations {
String get repeater_pathHashModeHelper =>
'Байты, используемые для кодирования идентификатора этого ретранслятора в тегах для обнаружения потоков/циклов. 0 = 1 байт (256 идентификаторов, до 64 переходов), 1 = 2 байта (65 000 идентификаторов, до 32 переходов), 2 = 3 байта (1 600 000 идентификаторов, до 21 перехода). Версии прошивки v1.13 и более ранние версии не поддерживают многобайтовые пути — они поднимаются только после того, как ваша сеть будет обновлена до версии v1.14 и выше.';
@override
String get repeater_keySettings => 'Change Identity Keys';
@override
String get repeater_keySettingsSubtitle =>
'Change the public/private keypair';
@override
String get repeater_prvKey => 'Private key';
@override
String get repeater_prvKeyHelper =>
'A new private key for the repeater, a 128-character hex string.';
@override
String get repeater_generatePrvKey => 'Generate a random keypair';
@override
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
@override
String get repeater_pubKey => 'Public key';
@override
String get repeater_pubKeyHelper =>
'This is the public key that goes with the generated private key. You can\'t set this directly.';
@override
String get repeater_pubKeyPrefix => 'Desired prefix';
@override
String repeater_pubKeyPrefixHelper(int tries) {
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
}
@override
String get repeater_txDelay => 'Задержка в работе системы Flood TX';
+35
View File
@@ -2621,6 +2621,41 @@ class AppLocalizationsSk extends AppLocalizations {
String get repeater_pathHashModeHelper =>
'Byty použité na zakódovanie ID tohto opakovača v tagoch pre trasu/detekciu slučky. 0 = 1 bytu (256 ID, až 64 skokov), 1 = 2 byty (65 000 ID, až 32 skokov), 2 = 3 byty (16 miliónov ID, až 21 skokov). Verzie 1.13 a staršie nepodporujú viacbytové trasy fungujú len, keď je sieť aktivovaná.';
@override
String get repeater_keySettings => 'Change Identity Keys';
@override
String get repeater_keySettingsSubtitle =>
'Change the public/private keypair';
@override
String get repeater_prvKey => 'Private key';
@override
String get repeater_prvKeyHelper =>
'A new private key for the repeater, a 128-character hex string.';
@override
String get repeater_generatePrvKey => 'Generate a random keypair';
@override
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
@override
String get repeater_pubKey => 'Public key';
@override
String get repeater_pubKeyHelper =>
'This is the public key that goes with the generated private key. You can\'t set this directly.';
@override
String get repeater_pubKeyPrefix => 'Desired prefix';
@override
String repeater_pubKeyPrefixHelper(int tries) {
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
}
@override
String get repeater_txDelay => 'Zpoždanie v Flood, TX';
+35
View File
@@ -2617,6 +2617,41 @@ class AppLocalizationsSl extends AppLocalizations {
String get repeater_pathHashModeHelper =>
'Biti, ki so bila uporabljena za kodiranje ID-ja tega releja v oznakah za zaznavanje pot/kroga, imajo naslednje velikosti: 0=1 bit (256 ID-jev, do 64 skokov), 1=2 biti (65.000 ID-jev, do 32 skokov), 2=3 biti (16 milijonov ID-jev, do 21 skokov). V različicah 1.13 in starejših se ustvarjajo večbitne poti vendar se to zgodi šele, ko je omrežje vklopljeno v različicah 1.14 in kasnejših.';
@override
String get repeater_keySettings => 'Change Identity Keys';
@override
String get repeater_keySettingsSubtitle =>
'Change the public/private keypair';
@override
String get repeater_prvKey => 'Private key';
@override
String get repeater_prvKeyHelper =>
'A new private key for the repeater, a 128-character hex string.';
@override
String get repeater_generatePrvKey => 'Generate a random keypair';
@override
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
@override
String get repeater_pubKey => 'Public key';
@override
String get repeater_pubKeyHelper =>
'This is the public key that goes with the generated private key. You can\'t set this directly.';
@override
String get repeater_pubKeyPrefix => 'Desired prefix';
@override
String repeater_pubKeyPrefixHelper(int tries) {
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
}
@override
String get repeater_txDelay => 'Zatemnitevanje zaradi poplav v Texasu';
+35
View File
@@ -2605,6 +2605,41 @@ class AppLocalizationsSv extends AppLocalizations {
String get repeater_pathHashModeHelper =>
'Byte används för att koda denna repeaters ID i taggar för att upptäcka loopar/flödesvägar. 0=1 byte (256 ID:n, upp till 64 hopp), 1=2 byte (65 000 ID:n, upp till 32 hopp), 2=3 byte (16 miljoner ID:n, upp till 21 hopp). Versioner 1.13 och äldre har stöd för multi-byte-vägar endast en gång när nätverket är aktiverat (från och med version 1.14).';
@override
String get repeater_keySettings => 'Change Identity Keys';
@override
String get repeater_keySettingsSubtitle =>
'Change the public/private keypair';
@override
String get repeater_prvKey => 'Private key';
@override
String get repeater_prvKeyHelper =>
'A new private key for the repeater, a 128-character hex string.';
@override
String get repeater_generatePrvKey => 'Generate a random keypair';
@override
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
@override
String get repeater_pubKey => 'Public key';
@override
String get repeater_pubKeyHelper =>
'This is the public key that goes with the generated private key. You can\'t set this directly.';
@override
String get repeater_pubKeyPrefix => 'Desired prefix';
@override
String repeater_pubKeyPrefixHelper(int tries) {
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
}
@override
String get repeater_txDelay => 'Försening i Flood TX';
+35
View File
@@ -2637,6 +2637,41 @@ class AppLocalizationsUk extends AppLocalizations {
String get repeater_pathHashModeHelper =>
'Байти, що використовуються для кодування ідентифікатора цього ретранслятора в тегах для виявлення потоків/петлі. 0=1 байт (256 ідентифікаторів, до 64 перехідів), 1=2 байти (65 000 ідентифікаторів, до 32 перехідів), 2=3 байти (16 мільйонів ідентифікаторів, до 21 переходу). Версії 1.13 та старіші не підтримують багатобайтні шляхи — вони активуються лише після того, як мережа буде оновлена до версії 1.14+.';
@override
String get repeater_keySettings => 'Change Identity Keys';
@override
String get repeater_keySettingsSubtitle =>
'Change the public/private keypair';
@override
String get repeater_prvKey => 'Private key';
@override
String get repeater_prvKeyHelper =>
'A new private key for the repeater, a 128-character hex string.';
@override
String get repeater_generatePrvKey => 'Generate a random keypair';
@override
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
@override
String get repeater_pubKey => 'Public key';
@override
String get repeater_pubKeyHelper =>
'This is the public key that goes with the generated private key. You can\'t set this directly.';
@override
String get repeater_pubKeyPrefix => 'Desired prefix';
@override
String repeater_pubKeyPrefixHelper(int tries) {
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
}
@override
String get repeater_txDelay => 'Затримка у Flood, штат Техас';
+35
View File
@@ -2494,6 +2494,41 @@ class AppLocalizationsZh extends AppLocalizations {
String get repeater_pathHashModeHelper =>
'用于编码此复用器的 ID 的字节数,在“洪流路径/环检测”标签中使用。 0=1 字节(256 个 ID,最多 64 个跳跃),1=2 字节(65K 个 ID,最多 32 个跳跃),2=3 字节(16M 个 ID,最多 21 个跳跃)。 v1.13 及更早版本的固件会使用多字节路径——只有在您的网络升级到 v1.14 或更高版本后才会生效。';
@override
String get repeater_keySettings => 'Change Identity Keys';
@override
String get repeater_keySettingsSubtitle =>
'Change the public/private keypair';
@override
String get repeater_prvKey => 'Private key';
@override
String get repeater_prvKeyHelper =>
'A new private key for the repeater, a 128-character hex string.';
@override
String get repeater_generatePrvKey => 'Generate a random keypair';
@override
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
@override
String get repeater_pubKey => 'Public key';
@override
String get repeater_pubKeyHelper =>
'This is the public key that goes with the generated private key. You can\'t set this directly.';
@override
String get repeater_pubKeyPrefix => 'Desired prefix';
@override
String repeater_pubKeyPrefixHelper(int tries) {
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
}
@override
String get repeater_txDelay => '洪水(德克萨斯州)延误';