ESP32: перевести UI регистрации на английский

This commit is contained in:
AidarKC 2026-06-12 23:35:05 +04:00
parent 0c9afea67a
commit 3262ec9b4a
2 changed files with 52 additions and 52 deletions

View File

@ -982,11 +982,11 @@ static bool loadWalletBalanceLamports(uint64_t &lamportsOut, String &messageOut)
messageOut = ""; messageOut = "";
lamportsOut = 0; lamportsOut = 0;
if (WiFi.status() != WL_CONNECTED) { if (WiFi.status() != WL_CONNECTED) {
messageOut = "Баланс: Wi-Fi не подключен"; messageOut = "Balance: Wi-Fi not connected";
return false; return false;
} }
if (gDevicePubB58.isEmpty()) { if (gDevicePubB58.isEmpty()) {
messageOut = "Баланс: секрет не задан"; messageOut = "Balance: secret not set";
return false; return false;
} }
@ -994,12 +994,12 @@ static bool loadWalletBalanceLamports(uint64_t &lamportsOut, String &messageOut)
String payload; String payload;
String req = "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getBalance\",\"params\":[\"" + gDevicePubB58 + "\",{\"commitment\":\"confirmed\"}]}"; String req = "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getBalance\",\"params\":[\"" + gDevicePubB58 + "\",{\"commitment\":\"confirmed\"}]}";
if (!httpPostJson(gSolanaRpcUrl, req, code, payload)) { if (!httpPostJson(gSolanaRpcUrl, req, code, payload)) {
messageOut = "Баланс: RPC не ответил"; messageOut = "Balance: RPC unavailable";
return false; return false;
} }
if (!jsonInt64Field(payload, "value", lamportsOut)) { if (!jsonInt64Field(payload, "value", lamportsOut)) {
messageOut = "Баланс: не удалось прочитать"; messageOut = "Balance: failed to load";
return false; return false;
} }
@ -1258,15 +1258,15 @@ static std::vector<uint8_t> buildEd25519InstructionData(const uint8_t signature[
static bool getLatestBlockhashBytes(uint8_t out[32], String &blockhashB58, String &messageOut) { static bool getLatestBlockhashBytes(uint8_t out[32], String &blockhashB58, String &messageOut) {
String payload; String payload;
if (!rpcCallSolana("getLatestBlockhash", "[{\"commitment\":\"confirmed\"}]", payload)) { if (!rpcCallSolana("getLatestBlockhash", "[{\"commitment\":\"confirmed\"}]", payload)) {
messageOut = "RPC не вернул blockhash"; messageOut = "RPC did not return blockhash";
return false; return false;
} }
if (!jsonStringField(payload, "blockhash", blockhashB58) || blockhashB58.isEmpty()) { if (!jsonStringField(payload, "blockhash", blockhashB58) || blockhashB58.isEmpty()) {
messageOut = "В ответе нет blockhash"; messageOut = "Blockhash missing in response";
return false; return false;
} }
if (!base58ToFixed32(blockhashB58, out)) { if (!base58ToFixed32(blockhashB58, out)) {
messageOut = "Некорректный blockhash"; messageOut = "Invalid blockhash";
return false; return false;
} }
return true; return true;
@ -1278,23 +1278,23 @@ static bool pdaAlreadyExists(const String &login, String &pdaAddress, String &me
std::vector<uint8_t>((const uint8_t *)kUsersSeedPrefix, (const uint8_t *)kUsersSeedPrefix + strlen(kUsersSeedPrefix)), std::vector<uint8_t>((const uint8_t *)kUsersSeedPrefix, (const uint8_t *)kUsersSeedPrefix + strlen(kUsersSeedPrefix)),
std::vector<uint8_t>((const uint8_t *)login.c_str(), (const uint8_t *)login.c_str() + login.length())}; std::vector<uint8_t>((const uint8_t *)login.c_str(), (const uint8_t *)login.c_str() + login.length())};
if (!findProgramAddress(seeds, kShineUsersProgramId, userPda)) { if (!findProgramAddress(seeds, kShineUsersProgramId, userPda)) {
messageOut = "Не удалось вычислить user PDA"; messageOut = "Failed to derive user PDA";
return false; return false;
} }
pdaAddress = bytesToBase58(userPda, 32); pdaAddress = bytesToBase58(userPda, 32);
String payload; String payload;
if (!rpcCallSolana("getAccountInfo", "[\"" + pdaAddress + "\",{\"encoding\":\"base64\",\"commitment\":\"confirmed\"}]", payload)) { if (!rpcCallSolana("getAccountInfo", "[\"" + pdaAddress + "\",{\"encoding\":\"base64\",\"commitment\":\"confirmed\"}]", payload)) {
messageOut = "Не удалось проверить PDA"; messageOut = "Failed to check PDA";
return false; return false;
} }
if (payload.indexOf("\"value\":null") >= 0) { if (payload.indexOf("\"value\":null") >= 0) {
return false; return false;
} }
if (payload.indexOf("\"value\"") >= 0) { if (payload.indexOf("\"value\"") >= 0) {
messageOut = "Такой логин уже зарегистрирован"; messageOut = "Login is already registered";
return true; return true;
} }
messageOut = "Непонятный ответ getAccountInfo"; messageOut = "Unexpected getAccountInfo response";
return false; return false;
} }
@ -1391,12 +1391,12 @@ static bool awaitTransactionConfirmation(const String &signatureB58, String &mes
return true; return true;
} }
if (payload.indexOf("\"err\":{") >= 0 || payload.indexOf("\"err\":\"") >= 0) { if (payload.indexOf("\"err\":{") >= 0 || payload.indexOf("\"err\":\"") >= 0) {
messageOut = "Транзакция отклонена сетью"; messageOut = "Transaction rejected by network";
return false; return false;
} }
delay(1000); delay(1000);
} }
messageOut = "RPC не подтвердил транзакцию вовремя"; messageOut = "RPC did not confirm transaction in time";
return false; return false;
} }
@ -1404,19 +1404,19 @@ static bool registerHomeserverOnSolana(String &messageOut) {
messageOut = ""; messageOut = "";
String cleanLogin = normalizeLoginValue(gLoginValue); String cleanLogin = normalizeLoginValue(gLoginValue);
if (cleanLogin.isEmpty()) { if (cleanLogin.isEmpty()) {
messageOut = "Логин не задан"; messageOut = "Login is not set";
return false; return false;
} }
if (!gSecretConfigured || gRootPrivB58.isEmpty() || gBlockchainPrivB58.isEmpty() || gDevicePrivB58.isEmpty()) { if (!gSecretConfigured || gRootPrivB58.isEmpty() || gBlockchainPrivB58.isEmpty() || gDevicePrivB58.isEmpty()) {
messageOut = "Секрет не готов"; messageOut = "Secret is not ready";
return false; return false;
} }
if (WiFi.status() != WL_CONNECTED) { if (WiFi.status() != WL_CONNECTED) {
messageOut = "Сначала подключите Wi-Fi"; messageOut = "Connect Wi-Fi first";
return false; return false;
} }
if (gSolanaRpcUrl.isEmpty()) { if (gSolanaRpcUrl.isEmpty()) {
messageOut = "Сначала задайте Solana RPC"; messageOut = "Set Solana RPC first";
return false; return false;
} }
@ -1427,14 +1427,14 @@ static bool registerHomeserverOnSolana(String &messageOut) {
gRegistrationSignature = ""; gRegistrationSignature = "";
saveAccountPrefs(); saveAccountPrefs();
gAccountPdaStatus = ACCOUNT_PDA_OK; gAccountPdaStatus = ACCOUNT_PDA_OK;
gAccountPdaStatusMessage = "Пользователь уже зарегистрирован"; gAccountPdaStatusMessage = "User is already registered";
gShowRegisterAccountButton = false; gShowRegisterAccountButton = false;
gAccountStatusMessage = "Пользователь уже зарегистрирован"; gAccountStatusMessage = "User is already registered";
gShineStatusLine = String("SHiNE: ") + (gShineServerUrl.isEmpty() ? "not set" : gShineServerUrl) + " registered"; gShineStatusLine = String("SHiNE: ") + (gShineServerUrl.isEmpty() ? "not set" : gShineServerUrl) + " registered";
refreshAccountPdaStatus(); refreshAccountPdaStatus();
return true; return true;
} }
if (pdaCheckMessage == "Не удалось вычислить user PDA" || pdaCheckMessage == "Не удалось проверить PDA" || pdaCheckMessage == "Непонятный ответ getAccountInfo") { if (pdaCheckMessage == "Failed to derive user PDA" || pdaCheckMessage == "Failed to check PDA" || pdaCheckMessage == "Unexpected getAccountInfo response") {
messageOut = pdaCheckMessage; messageOut = pdaCheckMessage;
return false; return false;
} }
@ -1452,7 +1452,7 @@ static bool registerHomeserverOnSolana(String &messageOut) {
!findProgramAddress({ !findProgramAddress({
std::vector<uint8_t>((const uint8_t *)kPaymentsInflowSeed, (const uint8_t *)kPaymentsInflowSeed + strlen(kPaymentsInflowSeed)) std::vector<uint8_t>((const uint8_t *)kPaymentsInflowSeed, (const uint8_t *)kPaymentsInflowSeed + strlen(kPaymentsInflowSeed))
}, kShinePaymentsProgramId, inflowVault)) { }, kShinePaymentsProgramId, inflowVault)) {
messageOut = "Не удалось вычислить обязательные PDA"; messageOut = "Failed to derive required PDAs";
return false; return false;
} }
@ -1468,7 +1468,7 @@ static bool registerHomeserverOnSolana(String &messageOut) {
if (!deriveSeedKeypairFromBase58(gRootPrivB58, rootSeed, rootPub, rootSec) || if (!deriveSeedKeypairFromBase58(gRootPrivB58, rootSeed, rootPub, rootSec) ||
!deriveSeedKeypairFromBase58(gBlockchainPrivB58, blockchainSeed, blockchainPub, blockchainSec) || !deriveSeedKeypairFromBase58(gBlockchainPrivB58, blockchainSeed, blockchainPub, blockchainSec) ||
!deriveSeedKeypairFromBase58(gDevicePrivB58, deviceSeed, devicePub, deviceSec)) { !deriveSeedKeypairFromBase58(gDevicePrivB58, deviceSeed, devicePub, deviceSec)) {
messageOut = "Не удалось восстановить ключи"; messageOut = "Failed to restore keys";
return false; return false;
} }
@ -1478,7 +1478,7 @@ static bool registerHomeserverOnSolana(String &messageOut) {
uint8_t lastBlockSignature[64]; uint8_t lastBlockSignature[64];
sha256calc(lastBlockState.data(), lastBlockState.size(), lastBlockHash); sha256calc(lastBlockState.data(), lastBlockState.size(), lastBlockHash);
if (!signMessageEd25519(std::vector<uint8_t>(lastBlockHash, lastBlockHash + 32), blockchainSec, lastBlockSignature)) { if (!signMessageEd25519(std::vector<uint8_t>(lastBlockHash, lastBlockHash + 32), blockchainSec, lastBlockSignature)) {
messageOut = "Не удалось подписать LastBlockState"; messageOut = "Failed to sign LastBlockState";
return false; return false;
} }
@ -1491,7 +1491,7 @@ static bool registerHomeserverOnSolana(String &messageOut) {
uint8_t rootSignature[64]; uint8_t rootSignature[64];
sha256calc(unsignedRecord.data(), unsignedRecord.size(), unsignedHash); sha256calc(unsignedRecord.data(), unsignedRecord.size(), unsignedHash);
if (!signMessageEd25519(std::vector<uint8_t>(unsignedHash, unsignedHash + 32), rootSec, rootSignature)) { if (!signMessageEd25519(std::vector<uint8_t>(unsignedHash, unsignedHash + 32), rootSec, rootSignature)) {
messageOut = "Не удалось подписать PDA-запись"; messageOut = "Failed to sign PDA record";
return false; return false;
} }
@ -1519,7 +1519,7 @@ static bool registerHomeserverOnSolana(String &messageOut) {
createData); createData);
uint8_t txSignature[64]; uint8_t txSignature[64];
if (!signMessageEd25519(message, deviceSec, txSignature)) { if (!signMessageEd25519(message, deviceSec, txSignature)) {
messageOut = "Не удалось подписать Solana-транзакцию"; messageOut = "Failed to sign Solana transaction";
return false; return false;
} }
String txBase64 = encodeTransactionBase64(txSignature, message); String txBase64 = encodeTransactionBase64(txSignature, message);
@ -1527,11 +1527,11 @@ static bool registerHomeserverOnSolana(String &messageOut) {
String payload; String payload;
if (!rpcCallSolana("sendTransaction", "[\"" + txBase64 + "\",{\"encoding\":\"base64\",\"preflightCommitment\":\"confirmed\"}]", payload)) { if (!rpcCallSolana("sendTransaction", "[\"" + txBase64 + "\",{\"encoding\":\"base64\",\"preflightCommitment\":\"confirmed\"}]", payload)) {
messageOut = "RPC не принял транзакцию"; messageOut = "RPC did not accept transaction";
return false; return false;
} }
if (rpcResponseHasError(payload)) { if (rpcResponseHasError(payload)) {
messageOut = "RPC вернул ошибку sendTransaction"; messageOut = "RPC returned sendTransaction error";
return false; return false;
} }
if (!awaitTransactionConfirmation(signatureB58, messageOut)) { if (!awaitTransactionConfirmation(signatureB58, messageOut)) {
@ -1540,14 +1540,14 @@ static bool registerHomeserverOnSolana(String &messageOut) {
gUserPdaAddress = bytesToBase58(userPda, 32); gUserPdaAddress = bytesToBase58(userPda, 32);
gRegistrationSignature = signatureB58; gRegistrationSignature = signatureB58;
gAccountStatusMessage = "Solana-регистрация завершена"; gAccountStatusMessage = "Solana registration complete";
gAccountPdaStatus = ACCOUNT_PDA_OK; gAccountPdaStatus = ACCOUNT_PDA_OK;
gAccountPdaStatusMessage = "Пользователь зарегистрирован"; gAccountPdaStatusMessage = "User registered";
gShowRegisterAccountButton = false; gShowRegisterAccountButton = false;
gShineStatusLine = String("SHiNE: ") + (gShineServerUrl.isEmpty() ? "not set" : gShineServerUrl) + " registered"; gShineStatusLine = String("SHiNE: ") + (gShineServerUrl.isEmpty() ? "not set" : gShineServerUrl) + " registered";
saveAccountPrefs(); saveAccountPrefs();
refreshAccountPdaStatus(); refreshAccountPdaStatus();
messageOut = "Solana-регистрация подтверждена"; messageOut = "Solana registration confirmed";
return true; return true;
} }
@ -1563,15 +1563,15 @@ static void prepareRegisterAccountScreen() {
String cleanLogin = normalizeLoginValue(gLoginValue); String cleanLogin = normalizeLoginValue(gLoginValue);
if (cleanLogin.isEmpty()) { if (cleanLogin.isEmpty()) {
gRegisterConfirmMessage = "Логин не задан"; gRegisterConfirmMessage = "Login is not set";
return; return;
} }
if (!gSecretConfigured) { if (!gSecretConfigured) {
gRegisterConfirmMessage = "Секрет не задан"; gRegisterConfirmMessage = "Secret is not set";
return; return;
} }
if (WiFi.status() != WL_CONNECTED) { if (WiFi.status() != WL_CONNECTED) {
gRegisterConfirmMessage = "Wi-Fi не подключен"; gRegisterConfirmMessage = "Wi-Fi is not connected";
return; return;
} }
@ -1582,16 +1582,16 @@ static void prepareRegisterAccountScreen() {
} else { } else {
gRegisterConfirmBalanceLine = formatSolValue(lamports); gRegisterConfirmBalanceLine = formatSolValue(lamports);
if (lamports < 20000000ULL) { if (lamports < 20000000ULL) {
gRegisterConfirmMessage = "Баланс меньше 0.020 SOL"; gRegisterConfirmMessage = "Balance is below 0.020 SOL";
} else { } else {
gRegisterConfirmMessage = "Баланс подходит: 0.020 SOL или выше"; gRegisterConfirmMessage = "Balance is OK: 0.020 SOL or more";
} }
} }
if (gHomeserverValue.isEmpty()) { if (gHomeserverValue.isEmpty()) {
gRegisterConfirmHomeserverLine = "Homeserver не задан"; gRegisterConfirmHomeserverLine = "Homeserver is not set";
} else if (gHomeserverValue == "homeserver1") { } else if (gHomeserverValue == "homeserver1") {
gRegisterConfirmHomeserverLine = "Homeserver: homeserver1 (стандартное значение)"; gRegisterConfirmHomeserverLine = "Homeserver: homeserver1 (default value)";
} else { } else {
gRegisterConfirmHomeserverLine = String("Homeserver: ") + gHomeserverValue; gRegisterConfirmHomeserverLine = String("Homeserver: ") + gHomeserverValue;
} }
@ -1599,24 +1599,24 @@ static void prepareRegisterAccountScreen() {
ShinePdaUserState pdaState; ShinePdaUserState pdaState;
String pdaError; String pdaError;
if (!readShineUserPda(cleanLogin, pdaState, pdaError)) { if (!readShineUserPda(cleanLogin, pdaState, pdaError)) {
gRegisterConfirmPdaLine = pdaError.isEmpty() ? "PDA: не удалось проверить" : String("PDA: ") + pdaError; gRegisterConfirmPdaLine = pdaError.isEmpty() ? "PDA: failed to check" : String("PDA: ") + pdaError;
if (gRegisterConfirmMessage.isEmpty()) { if (gRegisterConfirmMessage.isEmpty()) {
gRegisterConfirmMessage = pdaError.isEmpty() ? "Не удалось проверить PDA" : pdaError; gRegisterConfirmMessage = pdaError.isEmpty() ? "Failed to check PDA" : pdaError;
} }
return; return;
} }
if (pdaState.found) { if (pdaState.found) {
gRegisterConfirmPdaLine = "PDA уже занят, этот login не свободен"; gRegisterConfirmPdaLine = "PDA is already occupied, login is not free";
if (gRegisterConfirmMessage.isEmpty()) { if (gRegisterConfirmMessage.isEmpty()) {
gRegisterConfirmMessage = "Login уже зарегистрирован"; gRegisterConfirmMessage = "Login is already registered";
} }
return; return;
} }
gRegisterConfirmPdaLine = "PDA свободен для регистрации"; gRegisterConfirmPdaLine = "PDA is free for registration";
if (gRegisterConfirmMessage.isEmpty()) { if (gRegisterConfirmMessage.isEmpty()) {
gRegisterConfirmMessage = "Все проверки пройдены"; gRegisterConfirmMessage = "All checks passed";
} }
gRegisterConfirmCanSubmit = true; gRegisterConfirmCanSubmit = true;
} }
@ -3085,12 +3085,12 @@ static void actionButtonCb(lv_event_t *event) {
String registerMessage; String registerMessage;
if (registerHomeserverOnSolana(registerMessage)) { if (registerHomeserverOnSolana(registerMessage)) {
gRegisterResultSuccess = true; gRegisterResultSuccess = true;
gRegisterResultMessage = "Регистрация в Сиянии завершена"; gRegisterResultMessage = "Registration in SHiNE completed";
gRegisterResultDetails = registerMessage; gRegisterResultDetails = registerMessage;
gAccountStatusMessage = "Регистрация завершена"; gAccountStatusMessage = "Registration completed";
} else { } else {
gRegisterResultSuccess = false; gRegisterResultSuccess = false;
gRegisterResultMessage = "Регистрация не выполнена"; gRegisterResultMessage = "Registration failed";
gRegisterResultDetails = registerMessage; gRegisterResultDetails = registerMessage;
gAccountStatusMessage = registerMessage; gAccountStatusMessage = registerMessage;
} }
@ -3635,7 +3635,7 @@ static void drawSecretGenerateCancelConfirmScreen() {
static void drawRegisterAccountConfirmScreen() { static void drawRegisterAccountConfirmScreen() {
setRootStyle(); setRootStyle();
makeTitle("REGISTER ACCOUNT", 22, &lv_font_montserrat_24); makeTitle("REGISTER ACCOUNT", 22, &lv_font_montserrat_24);
String topLine = gRegisterConfirmMessage.isEmpty() ? String("Проверка регистрации") : gRegisterConfirmMessage; String topLine = gRegisterConfirmMessage.isEmpty() ? String("Registration check") : gRegisterConfirmMessage;
makeBody(topLine.c_str(), 96, 420); makeBody(topLine.c_str(), 96, 420);
if (!gRegisterConfirmPdaLine.isEmpty()) { if (!gRegisterConfirmPdaLine.isEmpty()) {
makeBody(gRegisterConfirmPdaLine.c_str(), 138, 420); makeBody(gRegisterConfirmPdaLine.c_str(), 138, 420);
@ -3647,9 +3647,9 @@ static void drawRegisterAccountConfirmScreen() {
makeBody(gRegisterConfirmHomeserverLine.c_str(), 222, 420); makeBody(gRegisterConfirmHomeserverLine.c_str(), 222, 420);
} }
if (gRegisterConfirmCanSubmit) { if (gRegisterConfirmCanSubmit) {
makeButton("ЗАРЕГИСТРИРОВАТЬ В СИЯНИИ", 22, 296, 436, 74, 0x2A9D8F, ACTION_REGISTER_ACCOUNT_EXECUTE, &lv_font_montserrat_18); makeButton("REGISTER IN SHINE", 22, 296, 436, 74, 0x2A9D8F, ACTION_REGISTER_ACCOUNT_EXECUTE, &lv_font_montserrat_18);
} else { } else {
makeButton("НЕДОСТУПНО", 22, 296, 436, 74, 0x4A5560, ACTION_NONE, &lv_font_montserrat_20); makeButton("UNAVAILABLE", 22, 296, 436, 74, 0x4A5560, ACTION_NONE, &lv_font_montserrat_20);
} }
makeButton("BACK", 140, 384, 200, 54, 0x5A6570, ACTION_BACK_HOME, &lv_font_montserrat_20); makeButton("BACK", 140, 384, 200, 54, 0x5A6570, ACTION_BACK_HOME, &lv_font_montserrat_20);
makeVersionTag(); makeVersionTag();
@ -3658,7 +3658,7 @@ static void drawRegisterAccountConfirmScreen() {
static void drawRegisterAccountResultScreen() { static void drawRegisterAccountResultScreen() {
setRootStyle(); setRootStyle();
makeTitle("REGISTER RESULT", 22, &lv_font_montserrat_24); makeTitle("REGISTER RESULT", 22, &lv_font_montserrat_24);
String resultTopLine = gRegisterResultSuccess ? String("Регистрация завершилась успешно") : String("Регистрация завершилась с ошибкой"); String resultTopLine = gRegisterResultSuccess ? String("Registration completed successfully") : String("Registration failed");
makeBody(resultTopLine.c_str(), 96, 420); makeBody(resultTopLine.c_str(), 96, 420);
makeBody(gRegisterResultMessage.c_str(), 140, 420); makeBody(gRegisterResultMessage.c_str(), 140, 420);
if (!gRegisterResultDetails.isEmpty()) { if (!gRegisterResultDetails.isEmpty()) {

View File

@ -1,2 +1,2 @@
client.version=1.2.165 client.version=1.2.166
server.version=1.2.154 server.version=1.2.155