From 939564b17547b839b1f2258e6747a06940a466b4 Mon Sep 17 00:00:00 2001 From: Terrence Date: Wed, 19 Feb 2025 23:54:59 +0800 Subject: [PATCH] Add English system sounds --- main/CMakeLists.txt | 25 +++--- main/Kconfig.projbuild | 6 +- main/application.cc | 75 +++++++++--------- main/application.h | 2 +- main/assets/en-US/0.p3 | Bin 0 -> 2045 bytes main/assets/en-US/1.p3 | Bin 0 -> 1389 bytes main/assets/en-US/2.p3 | Bin 0 -> 1478 bytes main/assets/en-US/3.p3 | Bin 0 -> 1843 bytes main/assets/en-US/4.p3 | Bin 0 -> 1837 bytes main/assets/en-US/5.p3 | Bin 0 -> 1519 bytes main/assets/en-US/6.p3 | Bin 0 -> 1674 bytes main/assets/en-US/7.p3 | Bin 0 -> 1542 bytes main/assets/en-US/8.p3 | Bin 0 -> 1588 bytes main/assets/en-US/9.p3 | Bin 0 -> 1668 bytes main/assets/en-US/activation.p3 | Bin 0 -> 9271 bytes main/assets/en-US/err_pin.p3 | Bin 0 -> 3806 bytes main/assets/en-US/err_reg.p3 | Bin 0 -> 8316 bytes main/assets/en-US/language.json | 52 +++++++----- main/assets/en-US/upgrade.p3 | Bin 0 -> 2909 bytes main/assets/en-US/welcome.p3 | Bin 0 -> 2750 bytes main/assets/en-US/wificonfig.p3 | Bin 0 -> 4858 bytes main/assets/{zh => zh-CN}/0.p3 | Bin main/assets/{zh => zh-CN}/1.p3 | Bin main/assets/{zh => zh-CN}/2.p3 | Bin main/assets/{zh => zh-CN}/3.p3 | Bin main/assets/{zh => zh-CN}/4.p3 | Bin main/assets/{zh => zh-CN}/5.p3 | Bin main/assets/{zh => zh-CN}/6.p3 | Bin main/assets/{zh => zh-CN}/7.p3 | Bin main/assets/{zh => zh-CN}/8.p3 | Bin main/assets/{zh => zh-CN}/9.p3 | Bin main/assets/{zh => zh-CN}/activation.p3 | Bin main/assets/{zh => zh-CN}/err_pin.p3 | Bin main/assets/{zh => zh-CN}/err_reg.p3 | Bin main/assets/zh-CN/language.json | 42 ++++++++++ main/assets/{zh => zh-CN}/upgrade.p3 | Bin main/assets/{zh => zh-CN}/welcome.p3 | Bin main/assets/{zh => zh-CN}/wificonfig.p3 | Bin main/assets/zh/binary.h | 39 --------- main/assets/zh/language.json | 34 -------- main/assets/zh/sounds.tar.gz | Bin 41598 -> 0 bytes .../atoms3-echo-base/atoms3_echo_base.cc | 6 +- .../atoms3r-echo-base/atoms3r_echo_base.cc | 7 +- main/boards/common/board.cc | 2 + main/boards/common/ml307_board.cc | 10 +-- main/boards/common/wifi_board.cc | 22 ++--- main/display/display.cc | 19 +++-- main/display/display.h | 7 +- main/display/lcd_display.cc | 10 +-- main/display/lcd_display.h | 2 +- main/display/ssd1306_display.cc | 8 +- scripts/gen_lang.py | 35 +++++--- 52 files changed, 204 insertions(+), 199 deletions(-) create mode 100644 main/assets/en-US/0.p3 create mode 100644 main/assets/en-US/1.p3 create mode 100644 main/assets/en-US/2.p3 create mode 100644 main/assets/en-US/3.p3 create mode 100644 main/assets/en-US/4.p3 create mode 100644 main/assets/en-US/5.p3 create mode 100644 main/assets/en-US/6.p3 create mode 100644 main/assets/en-US/7.p3 create mode 100644 main/assets/en-US/8.p3 create mode 100644 main/assets/en-US/9.p3 create mode 100644 main/assets/en-US/activation.p3 create mode 100644 main/assets/en-US/err_pin.p3 create mode 100644 main/assets/en-US/err_reg.p3 create mode 100644 main/assets/en-US/upgrade.p3 create mode 100644 main/assets/en-US/welcome.p3 create mode 100644 main/assets/en-US/wificonfig.p3 rename main/assets/{zh => zh-CN}/0.p3 (100%) rename main/assets/{zh => zh-CN}/1.p3 (100%) rename main/assets/{zh => zh-CN}/2.p3 (100%) rename main/assets/{zh => zh-CN}/3.p3 (100%) rename main/assets/{zh => zh-CN}/4.p3 (100%) rename main/assets/{zh => zh-CN}/5.p3 (100%) rename main/assets/{zh => zh-CN}/6.p3 (100%) rename main/assets/{zh => zh-CN}/7.p3 (100%) rename main/assets/{zh => zh-CN}/8.p3 (100%) rename main/assets/{zh => zh-CN}/9.p3 (100%) rename main/assets/{zh => zh-CN}/activation.p3 (100%) rename main/assets/{zh => zh-CN}/err_pin.p3 (100%) rename main/assets/{zh => zh-CN}/err_reg.p3 (100%) create mode 100644 main/assets/zh-CN/language.json rename main/assets/{zh => zh-CN}/upgrade.p3 (100%) rename main/assets/{zh => zh-CN}/welcome.p3 (100%) rename main/assets/{zh => zh-CN}/wificonfig.p3 (100%) delete mode 100644 main/assets/zh/binary.h delete mode 100644 main/assets/zh/language.json delete mode 100644 main/assets/zh/sounds.tar.gz diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index bfe17fc5..f776bee4 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -115,6 +115,18 @@ if(CONFIG_USE_AUDIO_PROCESSING) list(APPEND SOURCES "audio_processing/audio_processor.cc" "audio_processing/wake_word_detect.cc") endif() +# 根据Kconfig选择语言目录 +if(CONFIG_LANGUAGE_ZH_CN) + set(LANG_DIR "zh-CN") +elseif(CONFIG_LANGUAGE_EN_US) + set(LANG_DIR "en-US") +endif() + +# 定义生成路径 +set(LANG_JSON "${CMAKE_CURRENT_SOURCE_DIR}/assets/${LANG_DIR}/language.json") +set(LANG_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/assets/lang_config.h") +file(GLOB ASSETS ${CMAKE_CURRENT_SOURCE_DIR}/assets/${LANG_DIR}/*.p3) + # 如果目标芯片是 ESP32,则排除特定文件 if(CONFIG_IDF_TARGET_ESP32) # 排除 "audio_codecs/box_audio_codec.cc" 和 "audio_codecs/cores3_audio_codec.cc" @@ -123,8 +135,6 @@ if(CONFIG_IDF_TARGET_ESP32) "audio_codecs/es8388_audio_codec.cc") endif() -file(GLOB ASSETS ${CMAKE_CURRENT_SOURCE_DIR}/assets/zh/*.p3) - idf_component_register(SRCS ${SOURCES} EMBED_FILES ${ASSETS} INCLUDE_DIRS ${INCLUDE_DIRS} @@ -136,17 +146,6 @@ target_compile_definitions(${COMPONENT_LIB} PRIVATE BOARD_TYPE=\"${BOARD_TYPE}\" ) -# 根据Kconfig选择语言目录 -if(CONFIG_LANGUAGE_ZH) - set(LANG_DIR "zh") -elseif(CONFIG_LANGUAGE_EN) - set(LANG_DIR "en-US") -endif() - -# 定义生成路径 -set(LANG_JSON "${CMAKE_CURRENT_SOURCE_DIR}/assets/${LANG_DIR}/language.json") -set(LANG_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/assets/lang_config.h") - # 添加生成规则 add_custom_command( OUTPUT ${LANG_HEADER} diff --git a/main/Kconfig.projbuild b/main/Kconfig.projbuild index 69549510..ffb923cd 100644 --- a/main/Kconfig.projbuild +++ b/main/Kconfig.projbuild @@ -9,13 +9,13 @@ config OTA_VERSION_URL choice prompt "语言选择" - default LANGUAGE_ZH + default LANGUAGE_ZH_CN help Select device display language - config LANGUAGE_ZH + config LANGUAGE_ZH_CN bool "Chinese" - config LANGUAGE_EN + config LANGUAGE_EN_US bool "English" endchoice diff --git a/main/application.cc b/main/application.cc index 25fc7197..74c0e1b4 100644 --- a/main/application.cc +++ b/main/application.cc @@ -1,7 +1,6 @@ #include "application.h" #include "board.h" #include "display.h" -#include "ssd1306_display.h" #include "system_info.h" #include "ml307_ssl_transport.h" #include "audio_codec.h" @@ -9,7 +8,6 @@ #include "websocket_protocol.h" #include "font_awesome_symbols.h" #include "iot/thing_manager.h" -#include "assets/zh/binary.h" #include "assets/lang_config.h" #include @@ -60,17 +58,17 @@ void Application::CheckNewVersion() { if (!ota_.CheckVersion()) { retry_count++; if (retry_count >= MAX_RETRY) { - ESP_LOGE(TAG, "版本检查失败次数过多,退出检查"); + ESP_LOGE(TAG, "Too many retries, exit version check"); return; } - ESP_LOGW(TAG, "版本检查失败,%d秒后重试 (%d/%d)", 60, retry_count, MAX_RETRY); + ESP_LOGW(TAG, "Check new version failed, retry in %d seconds (%d/%d)", 60, retry_count, MAX_RETRY); vTaskDelay(pdMS_TO_TICKS(60000)); continue; } retry_count = 0; if (ota_.HasNewVersion()) { - Alert("OTA 升级", "正在升级系统", "happy", std::string_view(p3_upgrade_start, p3_upgrade_end - p3_upgrade_start)); + Alert(Lang::Strings::OTA_UPGRADE, Lang::Strings::UPGRADING, "happy", Lang::Sounds::P3_UPGRADE); // Wait for the chat state to be idle do { vTaskDelay(pdMS_TO_TICKS(3000)); @@ -81,7 +79,8 @@ void Application::CheckNewVersion() { SetDeviceState(kDeviceStateUpgrading); display->SetIcon(FONT_AWESOME_DOWNLOAD); - display->SetChatMessage("system", "新版本 " + ota_.GetFirmwareVersion()); + std::string message = std::string(Lang::Strings::NEW_VERSION) + ota_.GetFirmwareVersion(); + display->SetChatMessage("system", message.c_str()); auto& board = Board::GetInstance(); board.SetPowerSaveMode(false); @@ -108,7 +107,7 @@ void Application::CheckNewVersion() { }); // If upgrade success, the device will reboot and never reach here - display->SetStatus("更新失败"); + display->SetStatus(Lang::Strings::UPGRADE_FAILED); ESP_LOGI(TAG, "Firmware upgrade failed..."); vTaskDelay(pdMS_TO_TICKS(3000)); Reboot(); @@ -119,7 +118,8 @@ void Application::CheckNewVersion() { // No new version, mark the current version as valid ota_.MarkCurrentVersionValid(); - display->ShowNotification(Lang::Strings::VERSION + " " + ota_.GetCurrentVersion()); + std::string message = std::string(Lang::Strings::VERSION) + ota_.GetCurrentVersion(); + display->ShowNotification(message.c_str()); if (ota_.HasActivationCode()) { // Activation code is valid @@ -144,24 +144,23 @@ void Application::ShowActivationCode() { struct digit_sound { char digit; - const char* data; - size_t size; + const std::string_view& sound; }; static const std::array digit_sounds{{ - digit_sound{'0', p3_0_start, size_t(p3_0_end - p3_0_start)}, - digit_sound{'1', p3_1_start, size_t(p3_1_end - p3_1_start)}, - digit_sound{'2', p3_2_start, size_t(p3_2_end - p3_2_start)}, - digit_sound{'3', p3_3_start, size_t(p3_3_end - p3_3_start)}, - digit_sound{'4', p3_4_start, size_t(p3_4_end - p3_4_start)}, - digit_sound{'5', p3_5_start, size_t(p3_5_end - p3_5_start)}, - digit_sound{'6', p3_6_start, size_t(p3_6_end - p3_6_start)}, - digit_sound{'7', p3_7_start, size_t(p3_7_end - p3_7_start)}, - digit_sound{'8', p3_8_start, size_t(p3_8_end - p3_8_start)}, - digit_sound{'9', p3_9_start, size_t(p3_9_end - p3_9_start)} + digit_sound{'0', Lang::Sounds::P3_0}, + digit_sound{'1', Lang::Sounds::P3_1}, + digit_sound{'2', Lang::Sounds::P3_2}, + digit_sound{'3', Lang::Sounds::P3_3}, + digit_sound{'4', Lang::Sounds::P3_4}, + digit_sound{'5', Lang::Sounds::P3_5}, + digit_sound{'6', Lang::Sounds::P3_6}, + digit_sound{'7', Lang::Sounds::P3_7}, + digit_sound{'8', Lang::Sounds::P3_8}, + digit_sound{'9', Lang::Sounds::P3_9} }}; // This sentence uses 9KB of SRAM, so we need to wait for it to finish - Alert("激活设备", message, "happy", std::string_view(p3_activation_start, p3_activation_end - p3_activation_start)); + Alert(Lang::Strings::ACTIVATION, message.c_str(), "happy", Lang::Sounds::P3_ACTIVATION); vTaskDelay(pdMS_TO_TICKS(1000)); background_task_->WaitForCompletion(); @@ -169,13 +168,13 @@ void Application::ShowActivationCode() { auto it = std::find_if(digit_sounds.begin(), digit_sounds.end(), [digit](const digit_sound& ds) { return ds.digit == digit; }); if (it != digit_sounds.end()) { - PlayLocalFile(it->data, it->size); + PlayLocalFile(it->sound.data(), it->sound.size()); } } } -void Application::Alert(const std::string& status, const std::string& message, const std::string& emotion, const std::string_view& sound) { - ESP_LOGW(TAG, "Alert %s: %s [%s]", status.c_str(), message.c_str(), emotion.c_str()); +void Application::Alert(const char* status, const char* message, const char* emotion, const std::string_view& sound) { + ESP_LOGW(TAG, "Alert %s: %s [%s]", status, message, emotion); auto display = Board::GetInstance().GetDisplay(); display->SetStatus(status); display->SetEmotion(emotion); @@ -220,7 +219,7 @@ void Application::ToggleChatState() { if (device_state_ == kDeviceStateIdle) { SetDeviceState(kDeviceStateConnecting); if (!protocol_->OpenAudioChannel()) { - Alert("ERROR", Lang::Strings::UNABLE_TO_ESTABLISH_AUDIO_CHANNEL, "sad"); + Alert(Lang::Strings::ERROR, Lang::Strings::UNABLE_TO_ESTABLISH_AUDIO_CHANNEL, "sad"); SetDeviceState(kDeviceStateIdle); return; } @@ -254,7 +253,7 @@ void Application::StartListening() { SetDeviceState(kDeviceStateConnecting); if (!protocol_->OpenAudioChannel()) { SetDeviceState(kDeviceStateIdle); - Alert("ERROR", Lang::Strings::UNABLE_TO_ESTABLISH_AUDIO_CHANNEL, "sad"); + Alert(Lang::Strings::ERROR, Lang::Strings::UNABLE_TO_ESTABLISH_AUDIO_CHANNEL, "sad"); return; } } @@ -328,14 +327,14 @@ void Application::Start() { board.StartNetwork(); // Initialize the protocol - display->SetStatus(Lang::Strings::LOADING_PROTOCOL + "..."); + display->SetStatus(Lang::Strings::LOADING_PROTOCOL); #ifdef CONFIG_CONNECTION_TYPE_WEBSOCKET protocol_ = std::make_unique(); #else protocol_ = std::make_unique(); #endif protocol_->OnNetworkError([this](const std::string& message) { - Alert("ERROR", message, "sad"); + Alert(Lang::Strings::ERROR, message.c_str(), "sad"); }); protocol_->OnIncomingAudio([this](std::vector&& data) { std::lock_guard lock(mutex_); @@ -346,11 +345,11 @@ void Application::Start() { protocol_->OnAudioChannelOpened([this, codec, &board]() { board.SetPowerSaveMode(false); if (protocol_->server_sample_rate() != codec->output_sample_rate()) { - ESP_LOGW(TAG, "服务器的音频采样率 %d 与设备输出的采样率 %d 不一致,重采样后可能会失真", + ESP_LOGW(TAG, "Server sample rate %d does not match device output sample rate %d, resampling may cause distortion", protocol_->server_sample_rate(), codec->output_sample_rate()); } SetDecodeSampleRate(protocol_->server_sample_rate()); - // 物联网设备描述符 + // IoT device descriptors last_iot_states_.clear(); auto& thing_manager = iot::ThingManager::GetInstance(); protocol_->SendIotDescriptors(thing_manager.GetDescriptorsJson()); @@ -392,7 +391,7 @@ void Application::Start() { if (text != NULL) { ESP_LOGI(TAG, "<< %s", text->valuestring); Schedule([this, display, message = std::string(text->valuestring)]() { - display->SetChatMessage("assistant", message); + display->SetChatMessage("assistant", message.c_str()); }); } } @@ -401,14 +400,14 @@ void Application::Start() { if (text != NULL) { ESP_LOGI(TAG, ">> %s", text->valuestring); Schedule([this, display, message = std::string(text->valuestring)]() { - display->SetChatMessage("user", message); + display->SetChatMessage("user", message.c_str()); }); } } else if (strcmp(type->valuestring, "llm") == 0) { auto emotion = cJSON_GetObjectItem(root, "emotion"); if (emotion != NULL) { Schedule([this, display, emotion_str = std::string(emotion->valuestring)]() { - display->SetEmotion(emotion_str); + display->SetEmotion(emotion_str.c_str()); }); } } else if (strcmp(type->valuestring, "iot") == 0) { @@ -428,6 +427,8 @@ void Application::Start() { ota_.SetCheckVersionUrl(CONFIG_OTA_VERSION_URL); ota_.SetHeader("Device-Id", SystemInfo::GetMacAddress().c_str()); ota_.SetHeader("Client-Id", board.GetUuid()); + ota_.SetHeader("X-Language", Lang::CODE); + xTaskCreate([](void* arg) { Application* app = (Application*)arg; app->CheckNewVersion(); @@ -664,18 +665,18 @@ void Application::SetDeviceState(DeviceState state) { switch (state) { case kDeviceStateUnknown: case kDeviceStateIdle: - display->SetStatus(Lang::Strings::STANDING_BY); + display->SetStatus(Lang::Strings::STANDBY); display->SetEmotion("neutral"); #ifdef CONFIG_USE_AUDIO_PROCESSING audio_processor_.Stop(); #endif break; case kDeviceStateConnecting: - display->SetStatus(Lang::Strings::CONNECTING+"..."); + display->SetStatus(Lang::Strings::CONNECTING); display->SetChatMessage("system", ""); break; case kDeviceStateListening: - display->SetStatus(Lang::Strings::LISTENING+"..."); + display->SetStatus(Lang::Strings::LISTENING); display->SetEmotion("neutral"); ResetDecoder(); opus_encoder_->ResetState(); @@ -685,7 +686,7 @@ void Application::SetDeviceState(DeviceState state) { UpdateIotStates(); break; case kDeviceStateSpeaking: - display->SetStatus(Lang::Strings::SPEAKING+"..."); + display->SetStatus(Lang::Strings::SPEAKING); ResetDecoder(); codec->EnableOutput(true); #if CONFIG_USE_AUDIO_PROCESSING diff --git a/main/application.h b/main/application.h index cd8d7df9..03135d22 100644 --- a/main/application.h +++ b/main/application.h @@ -56,7 +56,7 @@ public: bool IsVoiceDetected() const { return voice_detected_; } void Schedule(std::function callback); void SetDeviceState(DeviceState state); - void Alert(const std::string& status, const std::string& message, const std::string& emotion = "", const std::string_view& sound = ""); + void Alert(const char* status, const char* message, const char* emotion = "", const std::string_view& sound = ""); void AbortSpeaking(AbortReason reason); void ToggleChatState(); void StartListening(); diff --git a/main/assets/en-US/0.p3 b/main/assets/en-US/0.p3 new file mode 100644 index 0000000000000000000000000000000000000000..f201dc211b7c8961598e272f2a134a8674c2ec3c GIT binary patch literal 2045 zcmb`F`#;l*AIIm;%;mI^bYjv7Ll>kXa=)x4m->)gGneExjL5AMQ5u;d(N3)8EQFEk zSaQo^sZi#2SS@C*Wf}Ue@AqH${``KtUeD+2@pywkAQS*XqA%u6a_?)}jK43OcWI~? z(gW|8s)jfCE(|Ta(ku?HpZFH|@R=wnlZuFG>ypymspyS~)zm=Br>wL;M||cfN%s#| z+AoIph=V{N008}D%RLW9qWlM~XZkKXKzm3vw0QcQV~zIMgSV}3qIAu*!}kS6 zC3Cz0%v+I;oPDZm9kruIIf_VdWR1yK1y3>vi(i&`n)!jT*WG zMB3KZcRD6G`VeN@zs;BbA1mb;)@LhWp(xo0!)JVC_?j=t}J+v%JdiWN$ zuPxNt%S$xM;6ZKDYLS{RV&_8N>+HSScZjHHK5uaowLYZ$FEcnu=It1Tw)*r?$%Rn?e z8s++0;8vIJe;sSF`BufOPWpG@#^F6PAv0}}w{Ou6@PPlLx;>SYu*vC>XQ5_e$69xs zqSB$nFQtN5nE}!MbB8}V<;jLD!C)2T8`d`UtXMmRz*5z;Jn!7pL%4{jfz}UkFPE<| z-2&__|aNPuU^roj#G z=qKd-5^KM&DnU1DP!VL1=&~1Ke`I=e&N7u=7MmR__1Qv`#V15Bnp^2sy|k+>c0Xxz zsdDeNs!xo2mz!JTUk~P$N^OMMB@+;zJV7S6BBt(TTstjO?Dm=P_Y_}uC6_nz?tlbOTl?tE9($gTs-UtttJYjsMXW9 zToLy~Ye5-LqB=Hbx*XUJ0J)TxVyUKWR2c%sctSVqY)6I$X6$*jHBol^$oX8iE3-mHPQSl7I!u@*Cq-!12LiaGN$%>E($ z(^Fa@7|kP?z#X>g=0@oGiMYyGmKrG$s#BLB*;+1~8xL@ov)M;I<#Vb;!QQf6C8|D_GL_%}CaV3vZIe{;!GYgY0v+XN)AHOUW5^xWc1H55oc zOZTw(mc&MN94!o3`ab!GviT&tCCk$4b#wtFCw9;Caxu;H<4h! z?r(g>ZBl4Tw4KyS>;=y#3e6QQm2b`{bAkxAH!VFb>tsnKfR%5&tQmNhwprXs4@2r- z2^@UbLdvXEoNB__KPto2z;g}CP?u0r=&bRz&xt2sxuFKdhQK% zG5x;(j6O`~#@fgy%=i=K$H2!^EIvUZn>SxBa*q_b@<6_qIJSRv)ol%no6qN1seFHt z)%gk~TbA-0o(asK&amH|bGo0aZ4#70( zc0eBYQ*jfm3Cz6Z>fTfkMQpr{Qhe%DD8GaT%iMAhR9=5zdY_VS+%bcPzrjDJ4*tQ;9i!n6rZ!hya_=b}+}O)5io z%|F3yQfo} zSUo)JPu|`52s$*SQ2|#lBptK&gb9CoAl4cPVXthp_rq$#x4D zctl|A)U2n5qG<$28%5hi=46n6t`)b{>&`8e^ZHd~$oWi`47~ylqphUI4u@npU__+D z@|yOc{e*qSfS4T8YeEhrmLk%6Q)T6r{gJwEWMWZL>XNmC_Xo$;OPq&&iW&_ o2SrB^40ZK!k1X%u#6Cw0x1x5s92b9*5v0vLL*C4-;i{Uq#ua7SFU-|=H$?vT)00Mz50f_xx zH0Q}!Mt}~uOS%bLXaPGVO8F>X17l~QX~?ji28G-Syp{SYv9qw@%k1qfKxkyk;S*d0 zyaz4m95ZrWG8CzY@kkE)E*43(cCQoXZ?2Na{QodLag|nlOvN? zlm)N}`_rwOO-HYBz;kA+{aaZI7#s!*RpWrwtvpkZ8T8|#plHv1m=G(HQ#3BHbkm?Yb>tG?sCz?c}y zd5WZ7m#^s4A)H4bb)b{9auR+x7MD25nV}+clE(9kt088f*yuJ{7sWszew=IDH{U`M zqfYX)!NB(ygN`Tuwoy}FP#|2XK57y8SVa|ukxoXF54Cw6_@aAuk~3c$hWxbeUU1l> z0CPiP^1L-ZxULbr^itJ1JL2sse^t=}--W$J z8F)V`z5|KJr5KDa=N)X9?ht5=odcZmPZ=GPGe!P;=yMmfpSq=F2Ra*Bz1p!90m zSNrYYCN+kZXHHWr&x!?LTo%2&^3!bPBU*=-W)m~$_^e^H-5pZmFqzcW{(keX<`t%i z@x|TXFNOSYh5NU18r@i3kJCO(#avc+_xl(<9?D4}r>|Ua5f`s<(E5u~pVyCP(VC2`Ly zb@@LC3gFAj+|mHsn+I0*-}LLKl;ylQ==!t0zZs@0Nzzy=o~l;CRWOS(K?(a;cz+cD zB>UvlE=QfLM$o|F5Usd6S&Xwu-&?yR0xKpeV8qKNS&#RF1K^*;;M1AMAlp`Hw@~Sd M!aF|-~wg)Bo; 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 Xh2`kU|8&R-LFd4gwzg34|NrnmU@TuB literal 0 HcmV?d00001 diff --git a/main/assets/en-US/4.p3 b/main/assets/en-US/4.p3 new file mode 100644 index 0000000000000000000000000000000000000000..d4045bf587ba78f762665cb832c8589dfacf3be4 GIT binary patch literal 1837 zcmb`{`9Bj59LMolBjvs#=bUpNUnaga%m`74X7iQi$gxJQmYdwOn%r|NDqm-j<1trr zzL%~$M> z(6X9|8y6OF8`EE8GOs8FoaXVa3$NRqp5oVp6iAV=I9%$vqS}w1wu3O&82HS+v}Vbz z8fDvMh`QB^*%?9SAOHY>L7ks|oRd9w^oqHZA2!+f)}YT>!ZOGNMh)A9=Y@WXEpOU{ zJJ7fH61rKgT#uxk!Tq9c<^J{`W#7Qs<;8~;_@?ygOAl<_N|WM?d*Ik*=F{SOM*Mfm z+M~-DRji*4+Xz9?rS?v??;ci%|Jq7x26b9J%yzljfB}qC#PD}(GMji~(!RTyU_57q ziV9`GLv?}|%$1=QeS1BU^>e_>pLI!7=_6(Yj^87GB%#0NaD_aiELTX(tvKU=yC%0D zR~f_$VPx(AkDm{v;Oi{b?1CEKuvIUVK*+5@-_An#yO@`%_?Gm}@Sr%`4fxwEVeSkM znirRPrTMN!w}v9n#o=%^-hnZpXYZ@#NG5IOueFBZzTA=#w>%{Om z$)lAzS2UN~@zb!y*0k%s%6X#LQJ^FjIQW%&ToYC)Orv)pSIcN=RDaM8(LZ8Dk6aWw zvm2GqMcqdCN2me_5ni!^giBJ6EJQ__=e(3Fk8ulQsGn{7qqZb>)Nu}KbE~+RJpiCk@nlWYMw+)$aw$&ZvI0>W}>HKp{8h7S5)}$mt-Fsa0 zydh-$ksYqvV^btx_{P;ye&1H)QPoI_x#rDG?>8QDZa%3^|6vR`N%gVsIb)@md$dV; zJfYX!zJr`&*ggwmf=mwTgo96t0#t8et+#)3`S$ztuAY%Gw}^Do>9EQtch9XF_x@)j zv(!k?cUqCl-OQZmK+zL1R-^7WWwW2gwQllbUpGx9U$%T++P7w7_fd>mciZQWm{Kd7 z8cVWtSPRQ;Fd^b#&SqcQedA2o)}Z&C0bc|wvB;hPQcZB}vimUVnnV2S$LvLUkd7A- zp}R>fmsx=Ja@?K=9uIppj-q$O6pwYP1X8D=v8(H2dtHQThpR7bR%?Y+yvTxV5{F`3 zE@}A{^cQ%N;8#`B)^$=-K`tPE#L?c0&+KC$3gk@4{ImA687T+Vhlbhju7CbulKl7C zOVp0OzXj)@?IL~jOKIz0QW_AOoNCq)AwE)z*?&sOOUw?N5CF-Y>K@es+V+(i??Vhl zB+S^}Z4|@UaxbRGdjhuSC&s!0k}<7>B0+kS7k`KZ76vqnzSHL`SmC0*(4!u1@EYwmjuBk@iGx4r+ike10sRzU^d)~%ZUtBOs_z0V z0PzHvsnjs$V7g;bUsJjIoWiI5;UY$p!n{J^6 zkb7<*-yH{$ohW77c+@89xV6hQ?s#LUKq}Yhpc^#Rb*muWX5j|6b-!+07VX)|VJT*} z-F>GxJP&}RQvw&$^h-Th`!7H>>Z;mAQOhkhEU!xHig^{YYoJoZpLw;wH+-POs5FlFJt^4Qix{7OZ4R zdUNL76iOdZ5*#Jh_)$WQtbLGEcOD+-Ug3hxSxW2@f8Iw!ohV~$7>VL7xf)z<;-Hk6 z)%{fL#$se`=)A0GEbFpqm`+T$hi8$v-f!baFsFR6-DvY2QyzM7U3Ovr=(#)Pi z!O0upnlEB7P9HWIK=#KZksGV^qHvsBO#$TUWGcLoF zRXn5HWRN*2KfBpp$7PWJp2o`{agtE literal 0 HcmV?d00001 diff --git a/main/assets/en-US/5.p3 b/main/assets/en-US/5.p3 new file mode 100644 index 0000000000000000000000000000000000000000..735d360877c7e458e271d22a5dbcd691a4065fb6 GIT binary patch literal 1519 zcmb8p`#;kQ9LMpwUuP&ruE!yB%iV;`<+!BWi?92VIO4eFGMB>}JTNHMhh9(ZwA*5-g}Y`9Cj(t54eOzF|fEbTm$CaQ_WJGqD`Vx$c* z@8~dq4DG*~nVpk&adHg=fj~C^COwB@zZ8OyE3u2oill)W=zHg)g?&1swc)U6_};a6 zXwl93du*i*G$_?M5Tu|9$M&GEXAsI1UYG1Z=${Fbtznn@kxq?tUv5PARkqQXSu|re z1X#wJ+t>TrcZKZdBi`~DT@pBp>)X-^!f}aT29})ScG-8`2Ca!(J^F->Q=ZMff9#3} z{k&e7^=??s?LYdkoDhnoQ8F1*h?(f+YN^8{Y z(c49a;sI>!;adDNQ#li;^GQMijzLFb!v<5VG)0F_&t^SzXqgN(ogEQWXoHmMKhfrW zUOPJfqEK=LJ+K!Z)&8&#_oksC8|#*joh*Q;&5*05Sjy{o+sFKKpHwE}_85Q{uoVX< zU{i((M`1~MqGt1@X4D)_=TD9qIbN1S(a%#;f>C@&GcIe>m+lVca6+eOk>{El?+A6a z@nwqb-9)Visja-!-aBZ!el(TaVP_cRP7%rKSdRphTj!aUqX7mH3v8}eSAOJ(T@f~_ z^(h(}RS9=x4j_3 zLNVlPK$nF1spJBUPo6nI|9%l7%@y48x;Va$`2dDpMGAm!-%GMxy;N;yP!an|U6jKj zFkIrM+;#$k#{ipKb9B-y??{1zmfn6F-by=HVw(P?5goPtn3$U|eZSo&qA$Rsga7Uu z8s5jesSpxZpD1laO4A9Cfh@jmPhxZLtB<8Pn&b2gBYVe))QG1=E#f_{Xv~78w~h@t ziXE474wM1HAJ6VLB@)zmSi`_ex0}73f7y8{IQi0Jg`sk*jF4ntW9LH2c%a=k9kyio zQ(koRnMS!lrkamN|B}TVYS+Hdti7u=E56!|6vDET=OI$-p}n?GsZ41gRmQfN03{UF6uZ5XGR1Y`vjZxr@r~}DA(Fqz2t$q!YpNab) zXYrTkdPmBuSQ{mzGAecPRwB1FKiWUG-Sn(6H#aHVEaGSqHY^xZDSHzN9X+YAw&d>~ zKYmgr=KF+Cf@URgE91n&l=$n!V9#W_ic^tzV;0C*o4aRCD5zfzKCJ-+G7j@G3fDR5=CNi?qV zZYxrMu_9B}9<<~QviQNi&A?ZN8{cgRExUnv>*bzJ#gk6U(sa6S|IG;v_4)bEi6m>I z+utIXa(e$IykblGzkO~GA2AGuSv*)t*1bQYd}28wO>o>&L(qIMUs_uio{Aq$@Jx?x zmAS?TL)NGz5KP4Sn#DT;fi$yL}98Da4Yo zF9k52=lDs?HG>}0CKVI{(YfdYGKM_3WV3OHstPk=ya)kIyPjb>SSdETMTWm}mNfVA Kv6A%vKl}?8lhH5$ literal 0 HcmV?d00001 diff --git a/main/assets/en-US/6.p3 b/main/assets/en-US/6.p3 new file mode 100644 index 0000000000000000000000000000000000000000..a52bf6b87a67fb90a022fe580807890d3abd4606 GIT binary patch literal 1674 zcmb7^`9ISS9LGn_q17A@$I8_*l$`m-9Oe8{i10yk%#ovs=_V~>Nqm`eMKf3BHYsYN z^;O?;i%^ct%{FuOweJ|;_5BaNKfm6O=kxV={qP2XK&}AD!D0OTI+L^+S3Nfz8GGAi zkQe@YpQ$Zu&4q8{tM_6o)UZ?!*)eJ}_9E_zFRY}jTQ&`4sOEEb)%V1Fd>A?N0f|b5 zZ@92@=1&~Ofj}T{K+@CaU#Facwpug zvWAQ>hlZ#U7r)0^FDKk~33)jSQXN{w*Yl80W^(cAIrdhxGT3JpvW-ClR(ICq%_8=r$$>s-XOm> zg4F1vMkMGw({4b&%AVnEY1lH~f+Yks?f|p+%x-HHr*Ff-4OCrB;SPi3Z5iKCC^kSP zU+G{HClgV|MeJk(*)CE^OW7w4u^P7UzDnP%h%^ zEATE)?e&`o(@6GNv1V|Mwstt_Ccz?m1lKvm6sfI?(JAefjF{8lLR;ODZgwKhrsH{C zH|CyPXCwWuEUV%W3yF>U3aPG&f6^x}H`%HGjVRuQTb^-OsEMO#-tKh5*dlI;mYva{ z1)2SXSEUk!C?J={zVavff(ADLc4x1NzHcQ&Wr zoCrD3b`ah0AWW+St=}Qx+C&@rZQh_c=Pgq{Xd7m}0pBVWwQ`DdtJt}Keb9L;sK#C2 z@I9{fpf6Qc4=N6|heN9DX!9W-*DmJv$e0ARMfuT4 z^bbr4ba_5rx4eLlOXIF(4@hIZoiWw|egL4;ilT+Hlv3qm^v^t+K%;jqm^9N4DNF7) zXIMd%!@pV(%jQ(0W1G-sc$W6VF7?fccxb#|($ri66LP$oH!eX>r{LNpFPtjx4rcrx<3 z;&esAh*h$>k3U&Pu1@=Y#i#M(`$SMbx%KN)0qqX8#>)|nycO5T$KE$QYw0W>A zfnu93Vv}bz-~97Zq`Umqu9&XYl=$LVgMNYYCNNteZSv)4!o!ZLPBGZlY9Odha#_ZV3rxFziDIcR7d1bmQqyS}2`W2yKW@Ldt%) zuIJfKTK*b##V_<=RKC&JKRo78!_zQ2j9;XusMf8HFg7&2G&BZ_tM|--8Jab)=wzW z5HbBF2HPN1YJ9w7R2zN*9AczCUs&bF%8<4zDZM;V6@}I_=(RNc6c~HksmkLsMlDLB zY((g_e{F)fP$mLOZ*fc&I6VN#VLVa!GY<|~GGR@uZ1;`RQ0 zI(c>f7>{;{y@rG=yC_D^r^ywK@e$d1MUr@BnL=Lp!=m7ry3$kFQR`CJ^~10b0rsrm ztD4xKN}3_H4jKKB-S6xmH^Ys$I@UHku&Z=U$*ESPias-(otYYVk|-6Pn7)oR2dCXL z@N#?d-K8m(DkFQo&yjFo-gMu$ta@Vs4*>}8Hd{V|QXo(JN6P%>uQk1xqQ7k31D{RG z(TQEcETEF6D&iY8vjn#afY7@Cjkd0co*Q8g*ZK;N4ro?$qY;8c{#SxMnXM|ybI6D| OmZ=8b-quz7|G~fX;wSL{ literal 0 HcmV?d00001 diff --git a/main/assets/en-US/7.p3 b/main/assets/en-US/7.p3 new file mode 100644 index 0000000000000000000000000000000000000000..4dd383ffe4f9a685c8fa6e1aea76ce0d142a20cb GIT binary patch literal 1542 zcmb8u`9ISS90%~3JGl~aWu@GeW61Hfg+lRVu0A1RDAzQFxv$7#79ze#uH46%!Z!EB zq{}z<2>Z%SDEBeryYHXy{q_BRykF1PFK-YCga9Dwchq`@PZj!j&sED6OkmAo+VaAG zdG8Gd#+eis242(^`%FjL8jKXRUtS5?(W)C?E~Ud7>SPcLcv+m|H*UsVxfNG>uvSNl z-*l4K76b$W*#jKnm*gK|^ioqBE8NAw(!yGAXOS;2655&!ItfXRDibfe5HHURa|Um^ z=Il~W)_X&y-fDi&QEy$Sg5HB^hUmLZUA@^>00V$0o8nW82%s7Y~a!s-OvbfgWXvqT#UCo|AxExRq3 zt^4>VUzjb+WVxb!re%EZ-`-9oUi=aAp!(J}edo@;d|w5Wjob%>%ewBkYp<{Js)N&% z+dOVkVp!2TrmlGg13O9udc9L6<+yWkKx9NBEYlY3AuWMB7Ap7E_ItGDF<{f=+da~e z=Oorn61m2$(#Zsk+JGe^rfv+If4QTBB~vX;=+T$10Q)ozHiZUO>WjH3`@f7kUQZOa zz^|kw|I`sSoX~4MwJb^ye%ba}o3WRFVxf-7ms5sQ9KU=4y+Ej&AgnhP3x(Z8A zQ8Golc<}!=A!{RhXUN+aoJ6#ao=x(jE=z@Ydq$y!Wd>s^Y=$TN)Gw8d-*Id-09dQ4 z9?sqZK8%&QtQ9p7^lUJBa`D2ae-g?!ultOija4-CI=^a_Y;|t~75x5__({7R7^@QE zd`7;T!=I7%=_@H+LS^JI+Men$LtPA+O6$hMjvR#C4kF`+bQr-Fgt(;@y!uCDWIcG2 z?cspsvZ7q(#%+F=EBIW%FnUh^M610t>A8U9!+bLRDM}E($G8^CiGuR9)lxHPqazn2 z+!wy6MXY~@_XM6~?Gw$842?uN7V{j8dZKu|cHXSLpVv$#>g}c&B8Qn1vwr@Rq&?~? z*sCYbKxn-@MEBCr>#UG}NYzxomJi2(a3HY{$&lZ`o0D~p5_||r zpmFidWd=hJSPE51Fd`I#ipLfmM`fNX*!Cf+ zm=Of(4WFFXOcW2HMJgO0i>SU6NG`@(jMLIfV>C~MI_f{elR1vcIZ9{x+!?LUvWE>S zmR8t3*q^Kq(C4G%?pguP0se~i9di6QF-2qYoTS}V2we6&63B5dtqOZ$NAVk6GL z31{fsH4~mW!LMB6QPnj(W1enCOtJg!a4XK|Pa+Q)Z-O4ns{SFBW2Qf+(X&iaU&(cS z{%TYehC=OM&g|88t(fG}&`GgM0^p8sJhgL(qAJ|H2~h(#tI=*pxVF7;et*e;(%4nZf0P)&vEho1=4xbe@zpi= iTzZUFtYMGE*<-h0-AsAz19P0OIv#R@$y9^<|HZ$deBQ?Z literal 0 HcmV?d00001 diff --git a/main/assets/en-US/8.p3 b/main/assets/en-US/8.p3 new file mode 100644 index 0000000000000000000000000000000000000000..fe89fb4660e3c11f4e36c9d6ca8b5256142a8af9 GIT binary patch literal 1588 zcmb7<`9ISQ0LLdsS_#=4$&u+G$9lr!zH=X|g>QR}urb4&$;`2pQjR@ah+I!ej#)*N zWbSmhLde}55lxe`OwF_Ygy+}K=k)#&ywTOTw7#|hky~^;8}7AbliB>My(y)#jZeK-Ii|th+?xFI;`esq zaS8|oLIQgqw!zsA$1^dehpSVcP0qVV8X&HFg*^iR!h0rsS9Zaf@Ec{4C|*?islL*H zrRVaPAayg$8p_{Qoae^kpj~!m8#5SOlR_8P!fkUT&G5be8xHt(`9t-La@P%Q%yCSO zT&C2EV9!X@!(ce;p{uh4BB!@8l;od%Dn||P1hURKsVo$DC*69q_;7j~ugN@m^4nkY z;SOfY2_6omcPL9G8Hl&W5*Jnm-S|n56+&Owf2r)t&ha}=K16933V(^U6eyzsZns8p z8K}4}e$&!@>MJYx9t5wpt2XNPG4-X_1o?_E3~8iyQL?+;aB~2Rd9-zDksUoo#3Z_w z|GMbA^>u+47@CDQd_$k?D1=dvOR6Dpps{2fS>D;$v-Jlu-ZDM64-maQI(7y7Jeces*QM}9>IjSCY_tQaPwuoo!vMjzclEC2&mq)&*fZM z#)3C(|1=!5{!2z>*7Z8sO1uZWLKD>9K)W|#fUW@^Xnjq2bU|#7~>UUcY7GG6Gz4zZ-amQ zjxKgnipf%*8=DpXOb=L2c62Mb(i0Q}UU z!d3)YFWFqHYQfHEQ2S8z)NyfhzOw#NSSZf%yn7r zH$NHVrEh8PjaV8p$Vq_@)`)VnP`8VaXUntjCa{#!h(arhfFB0T;;QKtFS(4=BM{ww zh_2Rn5S!YsFOra#7E_{zR;bA-V=OsGpy%3y`xE?Ll~W@XHzIFAg>`POl2c%tVzd}6!MOHMMm;s!ZlG2tjmXjxUW5W}9$Lc_p`_Yo4CcN?!pIZjLA zdqMGr<0bN+SObmN?ZX@7VLTpzls+iA#q_d)v{y_kD;^P*cHm=VlxBEqA+bZO{qLNK zA5KSeD`jM9!9|_2aHm$m1OhM*wesjl)1)Cmw=-Si+_mbwwbzpIwFk6x!W&>_;Onx* zGRrqxe$Jwg`Sc#-7C7lrG%Hm6iDt^Z&)!#sJTCTohbo=9z>4H_+uqnC?-k}rCBWl2 z{8N!3pQ5aZF5n87G{t#)MGFQw1Q!ScfotD0{P$%@gq5=CWHWn6`r~yQtnGv8&SsJa z+5>rXnWvwjnpb&Qr-hTnn2g1@tqSid5z=JU?IBApN%TX7e00R-4#gfM9|us*ix)y5 zGPqw#``Xo?l8u`_B*(VBk||X9bIlXj_YsMrv%MR2Pkc=1idB@imiUoaTVrIcb5Ui* zFK}Q*X~*?P+Z5i`iHP0KXBdiGT4ZK&4~iOLV`yVUMNj_dLO literal 0 HcmV?d00001 diff --git a/main/assets/en-US/9.p3 b/main/assets/en-US/9.p3 new file mode 100644 index 0000000000000000000000000000000000000000..dd9ed7b3a9fda4f64acbb9e7225023b34caf34d7 GIT binary patch literal 1668 zcmb`B`#;kQ1IOpma*gDcp;0-FakR=c8Otrx+;;YDb&_jz8YMz*E4ec>ml8czq#aW< zCOeJhlC#KIhk0Bdmk!N68f}uZ*ZCWspFgk9`~3!iK)wJ79*5*I=Xb$1YZNVqPgkrH zi3I(zZm7syO%eJg+IDEAR)Frw{}) z`2l|S?Nb}CPwi0o{?AQO=rMQ(X946JUVh_$s=N>;Pia`LAyE!?juA*qKLqqIiFble zA*FmWFg=J?>Y?&E&fbSy%&T6x`6f%cZun>#9RKavCBYdB6_pw$b`);26Zj znM&$bpPVr&1}Tq|(3&a7Y<@fItC=Pno$OgThbL?_d_a&-se#+U9Fa_C)hU$2o8SiqD=nVgQac(Y?wUt?H3hk6%JUb{vK5FQ*p9LvNejt zr@G?YS}lLjIK8#$ed(vqdxrENhe)OoT%}_`2K>MQs=)!opU~(*)P9Xeh8)uj-oYpW`3pJ83)Q>e91v zyrq&jU`a&b+%dA)*VpkB`L*PA*~>~QB0Iks*NZL;vJDr;~5zoGgfwdNt5Z_M<2N1Vbysh)E!<|Ie^ zDm{KrQx|KtN=&KJjNL!6C{^DDmd4@1!nLnPd)z--L22Jv*9W!}K6?O(M|ifM>$V&y znM|@!fi#w5-2SUbrXtufm7TBP*G-J+lL+gR>2LzR;TuDhDLN{c$Zg7#yKXom-{Da$ zEU}#Q_8AOF*=Qt9B}_Y~7IvBPHnGt5U#tpp2K%{qGluQTH&s~2pEPO2Enoo?c!dfV zPAs5%)zy5QnT9hn%|o#%tGn*bYiZ?bxYarR{KYAzx~dtYBPw~+#*sEw{L10WGb3?) zsmS=2i;meKbM9+z)F`fX^YD7sJMY`-_q!=~{!U#ZS<3X|_8!qSoPH-eN!=KHJpTNG zT5U1%H@ z4ZL(u?TGW;D@KN`bmIR7D_lMAVaIiJxsQ*_s29k+qUFu|Y1Ky&c#?ro{=IU9O?%oe zf5yZ#e8f^~g3`1!Z@I*-Cv6R68Gh&txM4pX`omX!Wp&0jd{1h0rbMS~EE`f*ECrtg zSJgI~ZyGXdw zpEV#$dw(+S!Wn%f)1ruiL^Wd0(DP0VRGS-jp=}d=WpErXAaj#8ii350c%qJLY4G^} j*l&r5(yJCAvwk_+igIX=#4SGpUI10v-Zq2&ABTSc%#Ii@ literal 0 HcmV?d00001 diff --git a/main/assets/en-US/activation.p3 b/main/assets/en-US/activation.p3 new file mode 100644 index 0000000000000000000000000000000000000000..2a260b5515c73e2f576a705644286b0ea611ab07 GIT binary patch literal 9271 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

mni?TBhsOxO1oP{(qx1s-CQO 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 Hj|ct_^iP|9Q z>mG@|-d6+VTx{c&(!X|U6)KBqOw!@H5xAtGXm!bIvAPmkGRM`aL_#MXUgT3VHsqK-^Z0ZZrKq7qJUkQ;GU87fXUXK z-D&c5+dt?Sv_(lXL(so1VH5kUqr01eb=Q4Jk{&7wbKEqNrTK@-M9k6RMp?@Sv&ae+ z+*cf<_{(k@`+mH*`(`zJO%sDqwe(-RBtQQei%#|~a z5N6e?Az`d9U=#(()cGZRV=_g}cY{}N28rkgV5!>W^Oefd*|&hH4?(%Z{*o?BN?2!R z0~WQW*igPaSja~Z4osjGlvBo>^f@N~nKH5Oq3@-Bdb*)eTTcn|wVh6fnJP;1{t@yJ z99;v~;%cfP^zL0Iv>s)`S~;trGFS@7S)?R$+|_<03zxms6*JUe~%7ADEEt>=x4*iD-2|OI7<~ zQbEkJ$*#=F{bmvN@r$=FcFaY+YA5>wl^BOIPJGV!wyIcuI-uX~{L@;!M{n}eS^QX7 zFTp`{v^ANZT|w>HOpdxm9Cx?hpl zop&8HC-K%xe#0FceH#$W=K9Vva;)%d!RklvT`0?Dx=wV(;d}W9b z+8I<&pHs4#G_8N2yECeDzfgms5wV&Td23H{Az!VcB3rc^Q(LJ^ZUW^)!Y*bU1miLy z3RC@!D}BBfGi8G7{Iv&F!%ocu|5&Iif7(P_acJ1i4o8u{7%kD_R<#f(b)YftGJLfm zRTUKQ=W|QY!1kim!?3f;Kqu>$+wJ9y>k>|e?JgaNW_DHWj6PZ^wF;{6l7kM`*!nK%%lFX(^`9C9JGIUi*}h+Z@Fk@@+|t;5u@)ow$)f8 zzH;Y?-{~dr-hzAL4LN~_se{E&3xQxCcC8@NaR5Gktk3J|v@vuqKZEJ2s6{`HUxZKO zVlCc;BA)i7RD+FnyOUZ_Xz-GI1fw5zmuKz{?pm*0ikWJt@AIf&cU#O2hjew7g_!I4 zqbW0HVabM$5z!Oh*2z*B_L1fmr^CsXV*agFbUp3g(aB!A%ui@{enEJAEZ96upC$np zwd1$Jv}#@Yp4j3Hpl>9@vZ>v&PE-NSn&cD&ta0Hyp-muv+Gnv{bRbHER7NY$DrJBVn z%i_YbYyms1lbO)l%E8!i;R)`UiEIo-8CnoL886|XV|gT!;he55$Q~p;4;tS7(4(%4 z5)7JK#@$PaS&=G}ATXxqZI(Y8N*E`~p1@APWqWa}C+?|%Y` zUp_nHXEb~0#Qq0(yX$K5Icd*fJGbocbFEz%x^yF7E>5dFnX4A+Rp8 z{}SAhzVYFtKURSHy{a;n{{v6(*=g-%pZ&t6@XX5 zqJ>5VUiYX>Q95MeT_O05EP;)}Tl8z|uRgHsxehQF1WrHJX0I|vBTcva361gpxf9#H zOR}lP=OsH;X(tt9?bqd_v!_&TRjQ#~6>=wO?HeY85|aAQkD|$0DP=2v zAF5#lXTo;^7YLCK_~7c>3)lj}I{<{>Up$0Tx+lPUKQTJ{c;yxF=_Q(@oZ zIL=5#9$a4H@9brqHsR11W<>ELT3)~2Lxa2AdY?#}15{}*&ir7b7O4AGlqDE?RnpG7 z>$EcX*k&Q&2Rk8$X+0ZdT>_tI@f*X zP`Hif=$B@t)hBA^#9b&rHbK!x_MG$W{qI5#t^@w=Y;;B@hZ|Y!(^r|zKM2zlC84C7 zLW&*;%fAoRdlIBRYgDaG&!Il{F1w{G?nN^9dN~7m)fjQ# zUxMh9al^j#{ZLAp+b7$r;5F-#H++vKg;e3rLURXT;)x7!%du$laYgo}OrLmFz(Cry z%*TRn4?|_hb{l`Iug6T#3w*p KbtV4)eE2Vc*@NK# literal 0 HcmV?d00001 diff --git a/main/assets/en-US/welcome.p3 b/main/assets/en-US/welcome.p3 new file mode 100644 index 0000000000000000000000000000000000000000..d2c35f46de40f7580dbe066d785d22c464a4dad9 GIT binary patch literal 2750 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 SKKS7OH~t4bL;JS?@BjcZan`c{ diff --git a/main/boards/atoms3-echo-base/atoms3_echo_base.cc b/main/boards/atoms3-echo-base/atoms3_echo_base.cc index 04e00389..a426fa6f 100644 --- a/main/boards/atoms3-echo-base/atoms3_echo_base.cc +++ b/main/boards/atoms3-echo-base/atoms3_echo_base.cc @@ -1,12 +1,12 @@ #include "wifi_board.h" #include "audio_codecs/es8311_audio_codec.h" #include "display/lcd_display.h" -#include "display/no_display.h" #include "application.h" #include "button.h" #include "config.h" #include "i2c_device.h" #include "iot/thing_manager.h" +#include "assets/lang_config.h" #include #include @@ -110,9 +110,9 @@ private: InitializeSpi(); InitializeGc9107Display(); InitializeButtons(); - display_->SetStatus("错误"); + display_->SetStatus(Lang::Strings::ERROR); display_->SetEmotion("sad"); - display_->SetChatMessage("system", "Echo Base\n未连接"); + display_->SetChatMessage("system", "Echo Base\nnot connected"); while (1) { ESP_LOGE(TAG, "Atomic Echo Base is disconnected"); diff --git a/main/boards/atoms3r-echo-base/atoms3r_echo_base.cc b/main/boards/atoms3r-echo-base/atoms3r_echo_base.cc index ccf2bbc3..226dd396 100644 --- a/main/boards/atoms3r-echo-base/atoms3r_echo_base.cc +++ b/main/boards/atoms3r-echo-base/atoms3r_echo_base.cc @@ -1,12 +1,12 @@ #include "wifi_board.h" #include "audio_codecs/es8311_audio_codec.h" #include "display/lcd_display.h" -#include "display/no_display.h" #include "application.h" #include "button.h" #include "config.h" #include "i2c_device.h" #include "iot/thing_manager.h" +#include "assets/lang_config.h" #include #include @@ -158,9 +158,10 @@ private: InitializeSpi(); InitializeGc9107Display(); InitializeButtons(); - display_->SetStatus("错误"); + + display_->SetStatus(Lang::Strings::ERROR); display_->SetEmotion("sad"); - display_->SetChatMessage("system", "Echo Base\n未连接"); + display_->SetChatMessage("system", "Echo Base\nnot connected"); while (1) { ESP_LOGE(TAG, "Atomic Echo Base is disconnected"); diff --git a/main/boards/common/board.cc b/main/boards/common/board.cc index a3e67a69..67b9e47f 100644 --- a/main/boards/common/board.cc +++ b/main/boards/common/board.cc @@ -2,6 +2,7 @@ #include "system_info.h" #include "settings.h" #include "display/no_display.h" +#include "assets/lang_config.h" #include #include @@ -99,6 +100,7 @@ std::string Board::GetJson() { */ std::string json = "{"; json += "\"version\":2,"; + json += "\"language\":\"" + std::string(Lang::CODE) + "\","; json += "\"flash_size\":" + std::to_string(SystemInfo::GetFlashSize()) + ","; json += "\"minimum_free_heap_size\":" + std::to_string(SystemInfo::GetMinimumFreeHeapSize()) + ","; json += "\"mac_address\":\"" + SystemInfo::GetMacAddress() + "\","; diff --git a/main/boards/common/ml307_board.cc b/main/boards/common/ml307_board.cc index 7ae13ea0..587506a7 100644 --- a/main/boards/common/ml307_board.cc +++ b/main/boards/common/ml307_board.cc @@ -3,7 +3,7 @@ #include "application.h" #include "display.h" #include "font_awesome_symbols.h" -#include "assets/zh/binary.h" +#include "assets/lang_config.h" #include #include @@ -25,7 +25,7 @@ std::string Ml307Board::GetBoardType() { void Ml307Board::StartNetwork() { auto display = Board::GetInstance().GetDisplay(); - display->SetStatus("检测模组..."); + display->SetStatus(Lang::Strings::DETECTING_MODULE); modem_.SetDebug(false); modem_.SetBaudRate(921600); @@ -45,13 +45,13 @@ void Ml307Board::StartNetwork() { void Ml307Board::WaitForNetworkReady() { auto& application = Application::GetInstance(); auto display = Board::GetInstance().GetDisplay(); - display->SetStatus("等待网络..."); + display->SetStatus(Lang::Strings::REGISTERING_NETWORK); int result = modem_.WaitForNetworkReady(); if (result == -1) { - application.Alert("PIN_ERROR", "请插入SIM卡", "sad", std::string_view(p3_err_pin_start, p3_err_pin_end - p3_err_pin_start)); + application.Alert(Lang::Strings::ERROR, Lang::Strings::PIN_ERROR, "sad", Lang::Sounds::P3_ERR_PIN); return; } else if (result == -2) { - application.Alert("REG_ERROR", "无法接入网络,请检查流量卡状态", "sad", std::string_view(p3_err_reg_start, p3_err_reg_end - p3_err_reg_start)); + application.Alert(Lang::Strings::ERROR, Lang::Strings::REG_ERROR, "sad", Lang::Sounds::P3_ERR_REG); return; } diff --git a/main/boards/common/wifi_board.cc b/main/boards/common/wifi_board.cc index f0755411..6359b790 100644 --- a/main/boards/common/wifi_board.cc +++ b/main/boards/common/wifi_board.cc @@ -5,7 +5,7 @@ #include "system_info.h" #include "font_awesome_symbols.h" #include "settings.h" -#include "assets/zh/binary.h" +#include "assets/lang_config.h" #include #include @@ -20,7 +20,6 @@ #include #include #include -#include "assets/lang_config.h" static const char *TAG = "WifiBoard"; @@ -46,14 +45,14 @@ void WifiBoard::EnterWifiConfigMode() { wifi_ap.Start(); // 显示 WiFi 配置 AP 的 SSID 和 Web 服务器 URL - std::string hint = Lang::Strings::CONNECT_MOBILE_PHONE_TO_HOTSPOT + " "; + std::string hint = Lang::Strings::CONNECT_TO_HOTSPOT; hint += wifi_ap.GetSsid(); - hint += "\n"+ Lang::Strings::ACCESS_VIA_BROWSER + " "; + hint += Lang::Strings::ACCESS_VIA_BROWSER; hint += wifi_ap.GetWebServerUrl(); hint += "\n\n"; // 播报配置 WiFi 的提示 - application.Alert(Lang::Strings::WIFI_CONFIGURATION_MODE, hint, "", std::string(p3_wificonfig_start, p3_wificonfig_end - p3_wificonfig_start)); + application.Alert(Lang::Strings::WIFI_CONFIG_MODE, hint.c_str(), "", Lang::Sounds::P3_WIFICONFIG); // Wait forever until reset after configuration while (true) { @@ -87,11 +86,16 @@ void WifiBoard::StartNetwork() { }); wifi_station.OnConnect([this](const std::string& ssid) { auto display = Board::GetInstance().GetDisplay(); - display->ShowNotification(std::string(Lang::Strings::CONNECT + " ") + ssid + "...", 30000); + std::string notification = Lang::Strings::CONNECT_TO; + notification += ssid; + notification += "..."; + display->ShowNotification(notification.c_str(), 30000); }); wifi_station.OnConnected([this](const std::string& ssid) { auto display = Board::GetInstance().GetDisplay(); - display->ShowNotification(std::string(Lang::Strings::CONNECTION_SUCCESSFUL) + ssid); + std::string notification = Lang::Strings::CONNECTED_TO; + notification += ssid; + display->ShowNotification(notification.c_str(), 30000); }); wifi_station.Start(); @@ -167,12 +171,12 @@ void WifiBoard::SetPowerSaveMode(bool enabled) { } void WifiBoard::ResetWifiConfiguration() { - // Reset the wifi station + // Set a flag and reboot the device to enter the network configuration mode { Settings settings("wifi", true); settings.SetInt("force_ap", 1); } - GetDisplay()->ShowNotification("Enter the network configuration mode..."); + GetDisplay()->ShowNotification(Lang::Strings::ENTERING_WIFI_CONFIG_MODE); vTaskDelay(pdMS_TO_TICKS(1000)); // Reboot the device esp_restart(); diff --git a/main/display/display.cc b/main/display/display.cc index e4172b42..17fd9d0f 100644 --- a/main/display/display.cc +++ b/main/display/display.cc @@ -67,22 +67,26 @@ Display::~Display() { } } -void Display::SetStatus(const std::string &status) { +void Display::SetStatus(const char* status) { DisplayLockGuard lock(this); if (status_label_ == nullptr) { return; } - lv_label_set_text(status_label_, status.c_str()); + lv_label_set_text(status_label_, status); lv_obj_clear_flag(status_label_, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(notification_label_, LV_OBJ_FLAG_HIDDEN); } void Display::ShowNotification(const std::string ¬ification, int duration_ms) { + ShowNotification(notification.c_str(), duration_ms); +} + +void Display::ShowNotification(const char* notification, int duration_ms) { DisplayLockGuard lock(this); if (notification_label_ == nullptr) { return; } - lv_label_set_text(notification_label_, notification.c_str()); + lv_label_set_text(notification_label_, notification); lv_obj_clear_flag(notification_label_, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(status_label_, LV_OBJ_FLAG_HIDDEN); @@ -154,7 +158,7 @@ void Display::Update() { } -void Display::SetEmotion(const std::string &emotion) { +void Display::SetEmotion(const char* emotion) { struct Emotion { const char* icon; const char* text; @@ -185,8 +189,9 @@ void Display::SetEmotion(const std::string &emotion) { }; // 查找匹配的表情 + std::string_view emotion_view(emotion); auto it = std::find_if(emotions.begin(), emotions.end(), - [&emotion](const Emotion& e) { return e.text == emotion; }); + [&emotion_view](const Emotion& e) { return e.text == emotion_view; }); DisplayLockGuard lock(this); if (emotion_label_ == nullptr) { @@ -209,12 +214,12 @@ void Display::SetIcon(const char* icon) { lv_label_set_text(emotion_label_, icon); } -void Display::SetChatMessage(const std::string &role, const std::string &content) { +void Display::SetChatMessage(const char* role, const char* content) { DisplayLockGuard lock(this); if (chat_message_label_ == nullptr) { return; } - lv_label_set_text(chat_message_label_, content.c_str()); + lv_label_set_text(chat_message_label_, content); } void Display::SetBacklight(uint8_t brightness) { diff --git a/main/display/display.h b/main/display/display.h index 7bab9460..8b28a551 100644 --- a/main/display/display.h +++ b/main/display/display.h @@ -18,10 +18,11 @@ public: Display(); virtual ~Display(); - virtual void SetStatus(const std::string &status); + virtual void SetStatus(const char* status); + virtual void ShowNotification(const char* notification, int duration_ms = 3000); virtual void ShowNotification(const std::string ¬ification, int duration_ms = 3000); - virtual void SetEmotion(const std::string &emotion); - virtual void SetChatMessage(const std::string &role, const std::string &content); + virtual void SetEmotion(const char* emotion); + virtual void SetChatMessage(const char* role, const char* content); virtual void SetIcon(const char* icon); virtual void SetBacklight(uint8_t brightness); diff --git a/main/display/lcd_display.cc b/main/display/lcd_display.cc index 7211735b..3e8ead36 100644 --- a/main/display/lcd_display.cc +++ b/main/display/lcd_display.cc @@ -257,15 +257,14 @@ void LcdDisplay::SetupUI() { notification_label_ = lv_label_create(status_bar_); lv_obj_set_flex_grow(notification_label_, 1); lv_obj_set_style_text_align(notification_label_, LV_TEXT_ALIGN_CENTER, 0); - lv_label_set_text(notification_label_, (Lang::Strings::NOTICE).c_str()); + lv_label_set_text(notification_label_, ""); lv_obj_add_flag(notification_label_, LV_OBJ_FLAG_HIDDEN); status_label_ = lv_label_create(status_bar_); lv_obj_set_flex_grow(status_label_, 1); lv_label_set_long_mode(status_label_, LV_LABEL_LONG_SCROLL_CIRCULAR); - lv_label_set_text(status_label_,(Lang::Strings::INITIALIZING + "...").c_str()); lv_obj_set_style_text_align(status_label_, LV_TEXT_ALIGN_CENTER, 0); - + lv_label_set_text(status_label_, Lang::Strings::INITIALIZING); mute_label_ = lv_label_create(status_bar_); lv_label_set_text(mute_label_, ""); lv_obj_set_style_text_font(mute_label_, fonts_.icon_font, 0); @@ -275,7 +274,7 @@ void LcdDisplay::SetupUI() { lv_obj_set_style_text_font(battery_label_, fonts_.icon_font, 0); } -void LcdDisplay::SetEmotion(const std::string &emotion) { +void LcdDisplay::SetEmotion(const char* emotion) { struct Emotion { const char* icon; const char* text; @@ -306,8 +305,9 @@ void LcdDisplay::SetEmotion(const std::string &emotion) { }; // 查找匹配的表情 + std::string_view emotion_view(emotion); auto it = std::find_if(emotions.begin(), emotions.end(), - [&emotion](const Emotion& e) { return e.text == emotion; }); + [&emotion_view](const Emotion& e) { return e.text == emotion_view; }); DisplayLockGuard lock(this); if (emotion_label_ == nullptr) { diff --git a/main/display/lcd_display.h b/main/display/lcd_display.h index f4fba4de..04f87245 100644 --- a/main/display/lcd_display.h +++ b/main/display/lcd_display.h @@ -45,7 +45,7 @@ public: DisplayFonts fonts); ~LcdDisplay(); - virtual void SetEmotion(const std::string &emotion) override; + virtual void SetEmotion(const char* emotion) override; virtual void SetIcon(const char* icon) override; virtual void SetBacklight(uint8_t brightness) override; }; diff --git a/main/display/ssd1306_display.cc b/main/display/ssd1306_display.cc index 6ce5dba6..d6214d9d 100644 --- a/main/display/ssd1306_display.cc +++ b/main/display/ssd1306_display.cc @@ -221,12 +221,12 @@ void Ssd1306Display::SetupUI_128x64() { notification_label_ = lv_label_create(status_bar_); lv_obj_set_flex_grow(notification_label_, 1); lv_obj_set_style_text_align(notification_label_, LV_TEXT_ALIGN_CENTER, 0); - lv_label_set_text(notification_label_, (Lang::Strings::NOTICE).c_str()); + lv_label_set_text(notification_label_, ""); lv_obj_add_flag(notification_label_, LV_OBJ_FLAG_HIDDEN); status_label_ = lv_label_create(status_bar_); lv_obj_set_flex_grow(status_label_, 1); - lv_label_set_text(status_label_,(Lang::Strings::INITIALIZING + "...").c_str()); + lv_label_set_text(status_label_, Lang::Strings::INITIALIZING); lv_obj_set_style_text_align(status_label_, LV_TEXT_ALIGN_CENTER, 0); mute_label_ = lv_label_create(status_bar_); @@ -296,10 +296,10 @@ void Ssd1306Display::SetupUI_128x32() { status_label_ = lv_label_create(status_bar_); lv_obj_set_style_pad_left(status_label_, 2, 0); - lv_label_set_text(status_label_,(Lang::Strings::INITIALIZING + "...").c_str()); + lv_label_set_text(status_label_, Lang::Strings::INITIALIZING); notification_label_ = lv_label_create(status_bar_); - lv_label_set_text(notification_label_, (Lang::Strings::NOTICE).c_str()); + lv_label_set_text(notification_label_, ""); lv_obj_set_style_pad_left(notification_label_, 2, 0); lv_obj_add_flag(notification_label_, LV_OBJ_FLAG_HIDDEN); diff --git a/scripts/gen_lang.py b/scripts/gen_lang.py index 9885acc0..dd0ac83b 100644 --- a/scripts/gen_lang.py +++ b/scripts/gen_lang.py @@ -6,18 +6,20 @@ import os HEADER_TEMPLATE = """// Auto-generated language config #pragma once -#include #include namespace Lang {{ // 语言元数据 - constexpr std::string_view CODE_VIEW = "{lang_code}"; - const std::string CODE = std::string(CODE_VIEW); + constexpr const char* CODE = "{lang_code}"; // 字符串资源 namespace Strings {{ -{strings_view} -{strings_string} +{strings} + }} + + // 音效资源 + namespace Sounds {{ +{sounds} }} }} """ @@ -33,18 +35,29 @@ def generate_header(input_path, output_path): lang_code = data['language']['type'] # 生成字符串常量 - strings_view = [] - strings_string = [] + strings = [] + sounds = [] for key, value in data['strings'].items(): value = value.replace('"', '\\"') - strings_view.append(f' constexpr std::string_view {key.upper()}_VIEW = "{value}";') - strings_string.append(f' const std::string {key.upper()} = std::string({key.upper()}_VIEW);') + strings.append(f' constexpr const char* {key.upper()} = "{value}";') + + # 生成音效常量 + for file in os.listdir(os.path.dirname(input_path)): + if file.endswith('.p3'): + base_name = os.path.splitext(file)[0] + sounds.append(f''' + extern const char p3_{base_name}_start[] asm("_binary_{base_name}_p3_start"); + extern const char p3_{base_name}_end[] asm("_binary_{base_name}_p3_end"); + static const std::string_view P3_{base_name.upper()} {{ + static_cast(p3_{base_name}_start), + static_cast(p3_{base_name}_end - p3_{base_name}_start) + }};''') # 填充模板 content = HEADER_TEMPLATE.format( lang_code=lang_code, - strings_view="\n".join(sorted(strings_view)), - strings_string="\n".join(sorted(strings_string)) + strings="\n".join(sorted(strings)), + sounds="\n".join(sorted(sounds)) ) # 写入文件