diff options
Diffstat (limited to 'core/src/UI')
-rw-r--r-- | core/src/UI/Localization.cpp | 3 | ||||
-rw-r--r-- | core/src/UI/Localization.hpp | 126 | ||||
-rw-r--r-- | core/src/UI/UI_DatabaseView.cpp | 46 | ||||
-rw-r--r-- | core/src/UI/UI_Items.cpp | 62 | ||||
-rw-r--r-- | core/src/UI/UI_MainWindow.cpp | 65 | ||||
-rw-r--r-- | core/src/UI/UI_Settings.cpp | 2 | ||||
-rw-r--r-- | core/src/UI/UI_Templates.cpp | 20 | ||||
-rw-r--r-- | core/src/UI/UI_Workflows.cpp | 28 | ||||
-rw-r--r-- | core/src/UI/fwd.hpp | 3 |
9 files changed, 102 insertions, 253 deletions
diff --git a/core/src/UI/Localization.cpp b/core/src/UI/Localization.cpp deleted file mode 100644 index 220df6f..0000000 --- a/core/src/UI/Localization.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include "Localization.hpp" - -std::unique_ptr<LocaleStrings> LocaleStrings::Instance{}; diff --git a/core/src/UI/Localization.hpp b/core/src/UI/Localization.hpp deleted file mode 100644 index 3474053..0000000 --- a/core/src/UI/Localization.hpp +++ /dev/null @@ -1,126 +0,0 @@ -#pragma once - -#include "Utils/I18n.hpp" - -#include <memory> -#include <string_view> - -using namespace std::literals::string_view_literals; - -class LocaleStrings -{ -public: - static std::unique_ptr<LocaleStrings> Instance; - -public: - /* Generic */ - - BasicTranslation Error{ "Generic.Error"sv }; - BasicTranslation Add{ "Generic.Add"sv }; - BasicTranslation Edit{ "Generic.Edit"sv }; - BasicTranslation Delete{ "Generic.Delete"sv }; - BasicTranslation Rename{ "Generic.Rename"sv }; - BasicTranslation Disconnect{ "Generic.Disconnect"sv }; - BasicTranslation Open{ "Generic.Open"sv }; - BasicTranslation Close{ "Generic.Close"sv }; - BasicTranslation Confirm{ "Generic.Confirm"sv }; - BasicTranslation Cancel{ "Generic.Cancel"sv }; - BasicTranslation Name{ "Generic.Name"sv }; - BasicTranslation Type{ "Generic.Type"sv }; - - BasicTranslation AddDialogTitle{ "Generic.Add.DialogTitle"sv }; - BasicTranslation DeleteDialogTitle{ "Generic.Delete.DialogTitle"sv }; - BasicTranslation RenameDialogTitle{ "Generic.Rename.DialogTitle"sv }; - - BasicTranslation EmptyNameError{ "Generic.EmptyNameError"sv }; - BasicTranslation DuplicateNameError{ "Generic.DuplicateNameError"sv }; - - /* Main window */ - - BasicTranslation SettingsTab{ "MainWindow.Tab.Settings"sv }; - BasicTranslation ProjectTab{ "MainWindow.Tab.Project"sv }; - BasicTranslation DatabaseViewTab{ "MainWindow.Tab.DatabaseView"sv }; - BasicTranslation ItemsTab{ "MainWindow.Tab.Items"sv }; - BasicTranslation WorkflowsTab{ "MainWindow.Tab.Workflows"sv }; - BasicTranslation TemplatesTab{ "MainWindow.Tab.Templates"sv }; - - /* Project tab */ - - BasicTranslation NewProject{ "Project.New"sv }; - BasicTranslation NewProjectDialogTitle{ "Project.New.DialogTitle"sv }; - BasicTranslation NewProjectNameHint{ "Project.New.Name"sv }; - BasicTranslation NewProjectPathHint{ "Project.New.Path"sv }; - BasicTranslation NewProjectPathDialogTitle{ "Project.New.Path.DialogTitle"sv }; - BasicTranslation NewProjectEmptyNameError{ "Project.New.EmptyNameError"sv }; - BasicTranslation NewProjectInvalidPathError{ "Project.New.InvalidPathError"sv }; - - BasicTranslation OpenProject{ "Project.Open"sv }; - BasicTranslation OpenProjectDialogTitle{ "Project.Open.DialogTitle"sv }; - - BasicTranslation RecentProjects{ "Project.Recents"sv }; - BasicTranslation ClearRecentProjects{ "Project.Recents.Clear"sv }; - BasicTranslation NoRecentProjectsMessage{ "Project.Recents.NonePresent"sv }; - BasicTranslation OpenRecentProjectTooltip{ "Project.Recents.Open.Tooltip"sv }; - BasicTranslation DeleteRecentProjectTooltip{ "Project.Recents.Delete.Tooltip"sv }; - - BasicTranslation InvalidProjectFormat{ "Project.InvalidProjectFormat"sv }; - - BasicTranslation OpenActiveProjectInFileSystem{ "ActiveProject.OpenInFilesystem"sv }; - BasicTranslation ActiveProjectName{ "ActiveProject.Info.Name"sv }; - BasicTranslation ActiveProjectPath{ "ActiveProject.Info.Path"sv }; - - /* Database view tab */ - - BasicTranslation SalesViewTab{ "Database.SalesView.TabName"sv }; - BasicTranslation EditSaleEntryDialogTitle{ "Database.SalesView.Edit.DialogTitle"sv }; - - BasicTranslation PurchasesViewTab{ "Database.PurchasesView.TabName"sv }; - BasicTranslation EditPurchaseEntryDialogTitle{ "Database.PurchasesView.Edit.DialogTitle"sv }; - - BasicTranslation DatabaseItemsColumn{ "Database.Column.Items"sv }; - BasicTranslation DatabaseCustomerColumn{ "Database.Column.Customer"sv }; - BasicTranslation DatabaseFactoryColumn{ "Database.Column.Factory"sv }; - /// 销售订单的交货期限 - BasicTranslation DatabaseDeadlineColumn{ "Database.Column.Deadline"sv }; - /// 采购订单的下单时间 - BasicTranslation DatabaseOrderTimeColumn{ "Database.Column.OrderTime"sv }; - /// 所有订单的“完成”时间。对于销售来说是实际交货时间,对于采购来说是收货时间。 - BasicTranslation DatabaseCompletionTimeColumn{ "Database.Column.CompletionTime"sv }; - /// (运输)批次的发货时间,适用于采购和销售批次。 - BasicTranslation DatabaseShipmentTimeColumn{ "Database.Column.ShipmentTime"sv }; - /// (运输)批次的收获时间,适用于采购和销售批次。 - BasicTranslation DatabaseArrivalTimeColumn{ "Database.Column.ArrivalTime"sv }; - - BasicTranslation SelectOrderToShowAssociatedDeliveries{ "Database.Message.NoOrderSelected"sv }; - BasicTranslation NotDelivered{ "Database.Message.NotDelivered"sv }; - - /* Items tab */ - - BasicTranslation AddItemDialogTitle{ "Item.Add.DialogTitle"sv }; - BasicTranslation EditItemDialogTitle{ "Item.Edit.DialogTitle"sv }; - BasicTranslation DeleteItemDialogTitle{ "Item.Delete.DialogTitle"sv }; - BasicTranslation DeleteItemDialogMessage{ "Item.Delete.DialogMessage"sv }; - - BasicTranslation ProductCategoryName{ "Item.CategoryName.Product"sv }; - BasicTranslation FactoryCategoryName{ "Item.CategoryName.Factory"sv }; - BasicTranslation CustomerCategoryName{ "Item.CategoryName.Customer"sv }; - - BasicTranslation ItemNameColumn{ "Item.Column.Name"sv }; - BasicTranslation ItemDescriptionColumn{ "Item.Column.Description"sv }; - BasicTranslation ItemEmailColumn{ "Item.Column.Email"sv }; - BasicTranslation ItemStockColumn{ "Item.Column.Stock"sv }; - BasicTranslation ItemPriceColumn{ "Item.Column.Price"sv }; - - /* Assets */ - - BasicTranslation OpenAsset{ "Asset.Open"sv }; - BasicTranslation OpenAssetDialogTitle{ "Asset.Open.DialogTitle"sv }; - BasicTranslation ManageAssets{ "Asset.Manage"sv }; - BasicTranslation ManageAssetsDialogTitle{ "Asset.Manage.DialogTitle"sv }; - - /* Workflow tab */ - - /* Templates tab */ - - BasicTranslation InvalidTemplateTypeError{ "Template.InvalidTypeError"sv }; -}; diff --git a/core/src/UI/UI_DatabaseView.cpp b/core/src/UI/UI_DatabaseView.cpp index bd0efa5..caf81d8 100644 --- a/core/src/UI/UI_DatabaseView.cpp +++ b/core/src/UI/UI_DatabaseView.cpp @@ -3,7 +3,7 @@ #include "Model/Filter.hpp" #include "Model/GlobalStates.hpp" #include "Model/Project.hpp" -#include "UI/Localization.hpp" +#include "Utils/I18n.hpp" #include "Utils/ScopeGuard.hpp" #include "Utils/Time.hpp" @@ -210,7 +210,6 @@ public: void Display() { bool dummy = true; - auto ls = LocaleStrings::Instance.get(); if (ImGui::Button(ICON_FA_ARROW_LEFT, mCurrentPageNumber == 0)) { SetPage(mCurrentPageNumber - 1); @@ -226,7 +225,7 @@ public: } ImGui::SameLine(); - if (ImGui::Button(ls->Edit.Get(), mSelectRow == -1)) { + if (ImGui::Button(ICON_FA_EDIT " " I18N_TEXT("Edit", L10N_EDIT), mSelectRow == -1)) { ImGui::OpenPopup(mEditDialogTitle); } if (ImGui::BeginPopupModal(mEditDialogTitle, &dummy, ImGuiWindowFlags_AlwaysAutoResize)) { @@ -237,12 +236,12 @@ public: } ImGui::SameLine(); - if (ImGui::Button(ls->Add.Get())) { + if (ImGui::Button(ICON_FA_PLUS " " I18N_TEXT("Add", L10N_ADD))) { // TODO } ImGui::SameLine(); - if (ImGui::Button(ls->Delete.Get(), mSelectRow == -1)) { + if (ImGui::Button(ICON_FA_TRASH " " I18N_TEXT("Delete", L10N_DELETE), mSelectRow == -1)) { // TODO } @@ -252,7 +251,7 @@ public: ImGui::NextColumn(); if (mSelectRow == -1) { - ImGui::TextWrapped("%s", ls->SelectOrderToShowAssociatedDeliveries.Get()); + ImGui::TextWrapped("%s", I18N_TEXT("Select an entry to show associated deliveries", L10N_DATABASE_MESSAGE_NO_ORDER_SELECTED)); } else { DisplayDeliveriesTable(); } @@ -284,15 +283,14 @@ private: void DisplayMainTable() { - auto ls = LocaleStrings::Instance.get(); if (ImGui::BeginTable("DataTable", kColumnCount, ImGuiTableFlags_Borders | ImGuiTableFlags_ScrollX)) { - if constexpr (kHasCustomer) ImGui::TableSetupColumn(ls->DatabaseCustomerColumn.Get()); - if constexpr (kHasDeadline) ImGui::TableSetupColumn(ls->DatabaseDeadlineColumn.Get()); - if constexpr (kHasFactory) ImGui::TableSetupColumn(ls->DatabaseFactoryColumn.Get()); - if constexpr (kHasOrderTime) ImGui::TableSetupColumn(ls->DatabaseOrderTimeColumn.Get()); - if constexpr (kHasCompletionTime) ImGui::TableSetupColumn(ls->DatabaseCompletionTimeColumn.Get()); - if constexpr (kHasItems) ImGui::TableSetupColumn(ls->DatabaseItemsColumn.Get()); + if constexpr (kHasCustomer) ImGui::TableSetupColumn(I18N_TEXT("Customer", L10N_DATABASE_COLUMN_CUSTOMER)); + if constexpr (kHasDeadline) ImGui::TableSetupColumn(I18N_TEXT("Deadline", L10N_DATABASE_COLUMN_DEADLINE)); + if constexpr (kHasFactory) ImGui::TableSetupColumn(I18N_TEXT("Factory", L10N_DATABASE_COLUMN_FACTORY)); + if constexpr (kHasOrderTime) ImGui::TableSetupColumn(I18N_TEXT("Order time", L10N_DATABASE_COLUMN_ORDER_TIME)); + if constexpr (kHasCompletionTime) ImGui::TableSetupColumn(I18N_TEXT("Completion time", L10N_DATABASE_COLUMN_COMPLETION_TIME)); + if constexpr (kHasItems) ImGui::TableSetupColumn(I18N_TEXT("Items", L10N_DATABASE_COLUMN_ITEMS)); ImGui::TableHeadersRow(); if (mActiveFilter) { @@ -327,8 +325,6 @@ private: void DisplayEntry(T& entry, int rowIdx, int entryIdx) { - auto ls = LocaleStrings::Instance.get(); - ImGui::PushID(rowIdx); ImGui::TableNextRow(); @@ -359,7 +355,7 @@ private: if constexpr (kHasCompletionTime) { ImGui::TableNextColumn(); if (entry.DeliveryTime.empty()) { - ImGui::TextUnformatted(ls->NotDelivered.Get()); + ImGui::TextUnformatted(I18N_TEXT("Not delivered", L10N_DATABASE_MESSAGE_NOT_DELIVERED)); } else { ImGui::TextUnformatted(entry.DeliveryTime.c_str()); } @@ -383,12 +379,11 @@ private: void DisplayDeliveriesTable() { - auto ls = LocaleStrings::Instance.get(); if (ImGui::BeginTable("DeliveriesTable", 3, ImGuiTableFlags_Borders | ImGuiTableFlags_ScrollX)) { - ImGui::TableSetupColumn(ls->DatabaseShipmentTimeColumn.Get()); - ImGui::TableSetupColumn(ls->DatabaseArrivalTimeColumn.Get()); - ImGui::TableSetupColumn(ls->DatabaseItemsColumn.Get()); + ImGui::TableSetupColumn(I18N_TEXT("Shipment time", L10N_DATABASE_COLUMN_SHIPMENT_TIME)); + ImGui::TableSetupColumn(I18N_TEXT("Arrival time", L10N_DATABASE_COLUMN_ARRIVAL_TIME)); + ImGui::TableSetupColumn(I18N_TEXT("Items", L10N_DATABASE_COLUMN_ITEMS)); ImGui::TableHeadersRow(); auto& entry = (*mCurrentPage)[mSelectRow]; @@ -601,8 +596,7 @@ class SalesTableView : public GenericTableView<SaleEntry> public: SalesTableView() { - auto ls = LocaleStrings::Instance.get(); - mEditDialogTitle = ls->EditSaleEntryDialogTitle.Get(); + mEditDialogTitle = I18N_TEXT("Edit sales entry", L10N_DATABASE_SALES_VIEW_EDIT_DIALOG_TITLE); } #pragma clang diagnostic push @@ -626,8 +620,7 @@ class PurchasesTableView : public GenericTableView<PurchaseEntry> public: PurchasesTableView() { - auto ls = LocaleStrings::Instance.get(); - mEditDialogTitle = ls->EditPurchaseEntryDialogTitle.Get(); + mEditDialogTitle = I18N_TEXT("Edit purchase entry", L10N_DATABASE_PURCHASES_VIEW_EDIT_DIALOG_TITLE); } #pragma clang diagnostic push @@ -649,7 +642,6 @@ public: void UI::DatabaseViewTab() { - auto ls = LocaleStrings::Instance.get(); auto& gs = GlobalStates::GetInstance(); static Project* currentProject = nullptr; @@ -663,11 +655,11 @@ void UI::DatabaseViewTab() } if (ImGui::BeginTabBar("DatabaseViewTabs")) { - if (ImGui::BeginTabItem(ls->SalesViewTab.Get())) { + if (ImGui::BeginTabItem(I18N_TEXT("Sales", L10N_DATABASE_SALES_VIEW_TAB_NAME))) { sales.Display(); ImGui::EndTabItem(); } - if (ImGui::BeginTabItem(ls->PurchasesViewTab.Get())) { + if (ImGui::BeginTabItem(I18N_TEXT("Purchases", L10N_DATABASE_PURCHASES_VIEW_TAB_NAME))) { purchases.Display(); ImGui::EndTabItem(); } diff --git a/core/src/UI/UI_Items.cpp b/core/src/UI/UI_Items.cpp index 6887f23..a557eb4 100644 --- a/core/src/UI/UI_Items.cpp +++ b/core/src/UI/UI_Items.cpp @@ -2,8 +2,9 @@ #include "Model/GlobalStates.hpp" #include "Model/Project.hpp" -#include "UI/Localization.hpp" +#include "Utils/I18n.hpp" +#include <IconsFontAwesome.h> #include <imgui.h> #include <imgui_stdlib.h> @@ -30,7 +31,6 @@ ActionResult ItemEditor(ItemList<T>& list, T* item) t.GetEmail(); }; - auto ls = LocaleStrings::Instance.get(); auto& gs = GlobalStates::GetInstance(); static bool duplicateName = false; @@ -50,23 +50,23 @@ ActionResult ItemEditor(ItemList<T>& list, T* item) description = {}; }; - if (ImGui::InputText(ls->ItemNameColumn.Get(), &name)) { + if (ImGui::InputText(I18N_TEXT("Name", L10N_ITEM_COLUMN_NAME), &name)) { duplicateName = name != item->GetName() && list.Find(name) != nullptr; } - if constexpr (kHasDescription) ImGui::InputText(ls->ItemDescriptionColumn.Get(), &description); - if constexpr (kHasEmail) ImGui::InputText(ls->ItemEmailColumn.Get(), &email); + if constexpr (kHasDescription) ImGui::InputText(I18N_TEXT("Description", L10N_ITEM_COLUMN_DESCRIPTION), &description); + if constexpr (kHasEmail) ImGui::InputText(I18N_TEXT("Email", L10N_ITEM_COLUMN_EMAIL), &email); if (name.empty()) { - ImGui::ErrorMessage("%s", ls->EmptyNameError.Get()); + ImGui::ErrorMessage(I18N_TEXT("Name cannot be empty", L10N_EMPTY_NAME_ERROR)); } if (duplicateName) { - ImGui::ErrorMessage("%s", ls->DuplicateNameError.Get()); + ImGui::ErrorMessage(I18N_TEXT("Duplicate name", L10N_DUPLICATE_NAME_ERROR)); } // Return Value auto rv = ActionResult::Pending; - if (ImGui::Button(ls->Confirm.Get(), name.empty() || duplicateName)) { + if (ImGui::Button(I18N_TEXT("Confirm", L10N_CONFIRM), name.empty() || duplicateName)) { if (item->GetName() != name) { item->SetName(std::move(name)); } @@ -85,7 +85,7 @@ ActionResult ItemEditor(ItemList<T>& list, T* item) } ImGui::SameLine(); - if (ImGui::Button(ls->Cancel.Get())) { + if (ImGui::Button(I18N_TEXT("Cancel", L10N_CANCEL))) { ImGui::CloseCurrentPopup(); ClearStates(); rv = ActionResult::Canceled; @@ -115,16 +115,15 @@ void ItemListEntries(ItemList<T>& list, int& selectedIdx) }; constexpr int kColumns = 1 /* Name column */ + kHasDescription + kHasEmail + kHasStock + kHasPrice; - auto ls = LocaleStrings::Instance.get(); auto& gs = GlobalStates::GetInstance(); if (ImGui::BeginTable("", kColumns, ImGuiTableFlags_Borders)) { - ImGui::TableSetupColumn(ls->ItemNameColumn.Get()); - if constexpr (kHasDescription) ImGui::TableSetupColumn(ls->ItemDescriptionColumn.Get()); - if constexpr (kHasEmail) ImGui::TableSetupColumn(ls->ItemEmailColumn.Get()); - if constexpr (kHasStock) ImGui::TableSetupColumn(ls->ItemStockColumn.Get()); - if constexpr (kHasPrice) ImGui::TableSetupColumn(ls->ItemPriceColumn.Get()); + ImGui::TableSetupColumn(I18N_TEXT("Name", L10N_ITEM_COLUMN_NAME)); + if constexpr (kHasDescription) ImGui::TableSetupColumn(I18N_TEXT("Description", L10N_ITEM_COLUMN_DESCRIPTION)); + if constexpr (kHasEmail) ImGui::TableSetupColumn(I18N_TEXT("Email", L10N_ITEM_COLUMN_EMAIL)); + if constexpr (kHasStock) ImGui::TableSetupColumn(I18N_TEXT("Stock", L10N_ITEM_COLUMN_STOCK)); + if constexpr (kHasPrice) ImGui::TableSetupColumn(I18N_TEXT("Price", L10N_ITEM_COLUMN_PRICE)); ImGui::TableHeadersRow(); size_t idx = 0; @@ -170,19 +169,17 @@ void ItemListEntries(ItemList<T>& list, int& selectedIdx) template <class T> void ItemListEditor(ItemList<T>& list) { - auto ls = LocaleStrings::Instance.get(); - bool opened = true; static int selectedIdx = -1; static T* editingItem = nullptr; - if (ImGui::Button(ls->Add.Get())) { + if (ImGui::Button(ICON_FA_PLUS " " I18N_TEXT("Add", L10N_ADD))) { ImGui::SetNextWindowCentered(); - ImGui::OpenPopup(ls->AddItemDialogTitle.Get()); + ImGui::OpenPopup(I18N_TEXT("Add item", L10N_ITEM_ADD_DIALOG_TITLE)); editingItem = &list.Insert(""); } - if (ImGui::BeginPopupModal(ls->AddItemDialogTitle.Get(), &opened, ImGuiWindowFlags_AlwaysAutoResize)) { + if (ImGui::BeginPopupModal(I18N_TEXT("Add item", L10N_ITEM_ADD_DIALOG_TITLE), &opened, ImGuiWindowFlags_AlwaysAutoResize)) { switch (ItemEditor(list, editingItem)) { case ActionResult::Confirmed: editingItem = nullptr; @@ -198,13 +195,13 @@ void ItemListEditor(ItemList<T>& list) } ImGui::SameLine(); - if (ImGui::Button(ls->Edit.Get(), selectedIdx == -1)) { + if (ImGui::Button(ICON_FA_EDIT " " I18N_TEXT("Edit", L10N_EDIT), selectedIdx == -1)) { ImGui::SetNextWindowCentered(); - ImGui::OpenPopup(ls->EditItemDialogTitle.Get()); + ImGui::OpenPopup(I18N_TEXT("Edit item", L10N_ITEM_EDIT_DIALOG_TITLE)); editingItem = list.Find(selectedIdx); } - if (ImGui::BeginPopupModal(ls->EditItemDialogTitle.Get(), &opened, ImGuiWindowFlags_AlwaysAutoResize)) { + if (ImGui::BeginPopupModal(I18N_TEXT("Edit item", L10N_ITEM_EDIT_DIALOG_TITLE), &opened, ImGuiWindowFlags_AlwaysAutoResize)) { if (ItemEditor(list, editingItem) != ActionResult::Pending) { editingItem = nullptr; } @@ -212,21 +209,21 @@ void ItemListEditor(ItemList<T>& list) } ImGui::SameLine(); - if (ImGui::Button(ls->Delete.Get(), selectedIdx == -1)) { + if (ImGui::Button(ICON_FA_TRASH " " I18N_TEXT("Delete", L10N_DELETE), selectedIdx == -1)) { ImGui::SetNextWindowCentered(); - ImGui::OpenPopup(ls->DeleteItemDialogTitle.Get()); + ImGui::OpenPopup(I18N_TEXT("Delete item", L10N_ITEM_DELETE_DIALOG_TITLE)); list.Remove(selectedIdx); } - if (ImGui::BeginPopupModal(ls->DeleteItemDialogTitle.Get(), &opened, ImGuiWindowFlags_AlwaysAutoResize)) { - ImGui::TextUnformatted(ls->DeleteItemDialogMessage.Get()); + if (ImGui::BeginPopupModal(I18N_TEXT("Delete item", L10N_ITEM_DELETE_DIALOG_TITLE), &opened, ImGuiWindowFlags_AlwaysAutoResize)) { + ImGui::TextUnformatted(I18N_TEXT("Are you sure you want to delete this item?", L10N_ITEM_DELETE_DIALOG_MESSAGE)); - if (ImGui::Button(ls->Confirm.Get())) { + if (ImGui::Button(I18N_TEXT("Confirm", L10N_CONFIRM))) { ImGui::CloseCurrentPopup(); } ImGui::SameLine(); - if (ImGui::Button(ls->Cancel.Get())) { + if (ImGui::Button(I18N_TEXT("Cancel", L10N_CANCEL))) { ImGui::CloseCurrentPopup(); } @@ -239,19 +236,18 @@ void ItemListEditor(ItemList<T>& list) void UI::ItemsTab() { - auto ls = LocaleStrings::Instance.get(); auto& gs = GlobalStates::GetInstance(); if (ImGui::BeginTabBar("ItemViewTabs")) { - if (ImGui::BeginTabItem(ls->ProductCategoryName.Get())) { + if (ImGui::BeginTabItem(I18N_TEXT("Products", L10N_ITEM_CATEGORY_PRODUCT))) { ItemListEditor(gs.GetCurrentProject()->Products); ImGui::EndTabItem(); } - if (ImGui::BeginTabItem(ls->FactoryCategoryName.Get())) { + if (ImGui::BeginTabItem(I18N_TEXT("Factories", L10N_ITEM_CATEGORY_FACTORY))) { ItemListEditor(gs.GetCurrentProject()->Factories); ImGui::EndTabItem(); } - if (ImGui::BeginTabItem(ls->CustomerCategoryName.Get())) { + if (ImGui::BeginTabItem(I18N_TEXT("Customers", L10N_ITEM_CATEGORY_CUSTOMER))) { ItemListEditor(gs.GetCurrentProject()->Customers); ImGui::EndTabItem(); } diff --git a/core/src/UI/UI_MainWindow.cpp b/core/src/UI/UI_MainWindow.cpp index 8131508..ce6e2e0 100644 --- a/core/src/UI/UI_MainWindow.cpp +++ b/core/src/UI/UI_MainWindow.cpp @@ -2,7 +2,7 @@ #include "Model/GlobalStates.hpp" #include "Model/Project.hpp" -#include "UI/Localization.hpp" +#include "Utils/I18n.hpp" #include <IconsFontAwesome.h> #include <imgui.h> @@ -16,25 +16,23 @@ namespace fs = std::filesystem; namespace { void ProjectTab_Normal() { - auto ls = LocaleStrings::Instance.get(); auto& gs = GlobalStates::GetInstance(); - if (ImGui::Button(ls->Close.Get())) { + if (ImGui::Button(ICON_FA_TIMES " " I18N_TEXT("Close", L10N_CLOSE))) { gs.SetCurrentProject(nullptr); return; } ImGui::SameLine(); - if (ImGui::Button(ls->OpenActiveProjectInFileSystem.Get())) { + if (ImGui::Button(ICON_FA_FOLDER " " I18N_TEXT("Open in filesystem", L10N_PROJECT_OPEN_IN_FILESYSTEM))) { // TODO } - ImGui::Text("%s%s", ls->ActiveProjectName.Get(), gs.GetCurrentProject()->GetName().c_str()); - ImGui::Text("%s%s", ls->ActiveProjectPath.Get(), gs.GetCurrentProject()->GetPathString().c_str()); + ImGui::Text("%s %s", I18N_TEXT("Project name", L10N_PROJECT_NAME), gs.GetCurrentProject()->GetName().c_str()); + ImGui::Text("%s %s", I18N_TEXT("Project path", L10N_PROJECT_PATH), gs.GetCurrentProject()->GetPathString().c_str()); } void ProjectTab_NoProject() { - auto ls = LocaleStrings::Instance.get(); auto& gs = GlobalStates::GetInstance(); bool openedDummy = true; @@ -54,37 +52,37 @@ void ProjectTab_NoProject() } }; - if (ImGui::Button(ls->NewProject.Get())) { + if (ImGui::Button(I18N_TEXT("Create project....", L10N_PROJECT_NEW))) { ImGui::SetNextWindowCentered(); - ImGui::OpenPopup(ls->NewProjectDialogTitle.Get()); + ImGui::OpenPopup(I18N_TEXT("Create project wizard", L10N_PROJECT_NEW_DIALOG_TITLE)); } // Make it so that the modal dialog has a close button - if (ImGui::BeginPopupModal(ls->NewProjectDialogTitle.Get(), &openedDummy, ImGuiWindowFlags_AlwaysAutoResize)) { - ImGui::InputTextWithHint("##ProjectName", ls->NewProjectNameHint.Get(), &projectName); + if (ImGui::BeginPopupModal(I18N_TEXT("Create project wizard", L10N_PROJECT_NEW_DIALOG_TITLE), &openedDummy, ImGuiWindowFlags_AlwaysAutoResize)) { + ImGui::InputTextWithHint("##ProjectName", I18N_TEXT("Project name", L10N_PROJECT_NAME), &projectName); - if (ImGui::InputTextWithHint("##ProjectPath", ls->NewProjectPathHint.Get(), &dirName)) { + if (ImGui::InputTextWithHint("##ProjectPath", I18N_TEXT("Project path", L10N_PROJECT_PATH), &dirName)) { // Changed, validate value TrySelectPath(fs::path(dirName)); } ImGui::SameLine(); if (ImGui::Button("...")) { - auto selection = pfd::select_folder(ls->NewProjectPathDialogTitle.Get()).result(); + auto selection = pfd::select_folder(I18N_TEXT("Project path", L10N_PROJECT_NEW_PATH_DIALOG_TITLE)).result(); if (!selection.empty()) { TrySelectPath(fs::path(selection)); } } if (projectName.empty()) { - ImGui::ErrorMessage("%s", ls->NewProjectEmptyNameError.Get()); + ImGui::ErrorMessage("%s", I18N_TEXT("Name cannot be empty", L10N_EMPTY_NAME_ERROR)); } if (!dirNameIsValid) { - ImGui::ErrorMessage("%s", ls->NewProjectInvalidPathError.Get()); + ImGui::ErrorMessage("%s", I18N_TEXT("Invalid path", L10N_INVALID_PATH_ERROR)); } ImGui::Spacing(); - if (ImGui::Button(ls->Confirm.Get(), !dirNameIsValid || projectName.empty())) { + if (ImGui::Button(I18N_TEXT("Confirm", L10N_CONFIRM), !dirNameIsValid || projectName.empty())) { ImGui::CloseCurrentPopup(); gs.SetCurrentProject(std::make_unique<Project>(std::move(dirPath), std::move(projectName))); @@ -97,7 +95,7 @@ void ProjectTab_NoProject() } ImGui::SameLine(); - if (ImGui::Button(ls->Cancel.Get())) { + if (ImGui::Button(I18N_TEXT("Cancel", L10N_CANCEL))) { ImGui::CloseCurrentPopup(); } @@ -105,8 +103,8 @@ void ProjectTab_NoProject() } ImGui::SameLine(); - if (ImGui::Button(ls->OpenProject.Get())) { - auto selection = pfd::open_file(ls->OpenProjectDialogTitle.Get()).result(); + if (ImGui::Button(I18N_TEXT("Open project...", L10N_PROJECT_OPEN))) { + auto selection = pfd::open_file(I18N_TEXT("Open project", L10N_PROJECT_OPEN_DIALOG_TITLE)).result(); if (!selection.empty()) { fs::path path(selection[0]); @@ -124,10 +122,10 @@ void ProjectTab_NoProject() // Recent projects ImGui::Separator(); - ImGui::TextUnformatted(ls->RecentProjects.Get()); + ImGui::TextUnformatted(I18N_TEXT("Recent projects", L10N_PROJECT_RECENTS)); ImGui::SameLine(); - if (ImGui::Button(ls->ClearRecentProjects.Get())) { + if (ImGui::Button(I18N_TEXT("Clear", L10N_PROJECT_RECENTS_CLEAR))) { gs.ClearRecentProjects(); } @@ -136,7 +134,7 @@ void ProjectTab_NoProject() size_t toRemoveIdx = rp.size(); if (rp.empty()) { - ImGui::TextUnformatted(ls->NoRecentProjectsMessage.Get()); + ImGui::TextUnformatted(I18N_TEXT("No recent projects", L10N_PROJECT_RECENTS_NONE_PRESENT)); } else { for (auto it = rp.rbegin(); it != rp.rend(); ++it) { auto& [path, recent] = *it; @@ -155,7 +153,7 @@ void ProjectTab_NoProject() } } if (ImGui::IsItemHovered()) { - ImGui::SetTooltip("%s", ls->OpenRecentProjectTooltip.Get()); + ImGui::SetTooltip(I18N_TEXT("Open this project", L10N_PROJECT_RECENTS_OPEN_TOOLTIP)); } ImGui::SameLine(); @@ -163,7 +161,7 @@ void ProjectTab_NoProject() toRemoveIdx = idx; } if (ImGui::IsItemHovered()) { - ImGui::SetTooltip("%s", ls->DeleteRecentProjectTooltip.Get()); + ImGui::SetTooltip(I18N_TEXT("Delete this project from the Recent Projects list, the project itself will not be affected", L10N_PROJECT_RECENTS_DELETE_TOOLTIP)); } ImGui::PopID(); @@ -176,10 +174,10 @@ void ProjectTab_NoProject() if (openErrorDialog) { ImGui::SetNextWindowCentered(); - ImGui::OpenPopup(ls->Error.Get()); + ImGui::OpenPopup(I18N_TEXT("Error", L10N_ERROR)); } - if (ImGui::BeginPopupModal(ls->Error.Get(), &openedDummy, ImGuiWindowFlags_AlwaysAutoResize)) { - ImGui::ErrorMessage("%s", ls->InvalidProjectFormat.Get()); + if (ImGui::BeginPopupModal(I18N_TEXT("Error", L10N_ERROR), &openedDummy, ImGuiWindowFlags_AlwaysAutoResize)) { + ImGui::ErrorMessage("%s", I18N_TEXT("Invalid project file", L10N_PROJECT_INVALID_PROJECT_FORMAT)); ImGui::EndPopup(); } } @@ -187,7 +185,6 @@ void ProjectTab_NoProject() void UI::MainWindow() { - auto ls = LocaleStrings::Instance.get(); auto& gs = GlobalStates::GetInstance(); auto windowSize = ImGui::GetMainViewport()->Size; @@ -195,12 +192,12 @@ void UI::MainWindow() ImGui::SetNextWindowPos({ 0, 0 }); ImGui::Begin("##MainWindow", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize); if (ImGui::BeginTabBar("MainWindowTabs")) { - if (ImGui::BeginTabItem(ls->SettingsTab.Get())) { + if (ImGui::BeginTabItem(ICON_FA_COGS " " I18N_TEXT("Settings", L10N_MAIN_TAB_SETTINGS))) { UI::SettingsTab(); ImGui::EndTabItem(); } - if (ImGui::BeginTabItem(ls->ProjectTab.Get(), nullptr)) { + if (ImGui::BeginTabItem(ICON_FA_FILE " " I18N_TEXT("Project", L10N_MAIN_WINDOW_TAB_PROJECT), nullptr)) { if (gs.HasCurrentProject()) { ProjectTab_Normal(); } else { @@ -213,22 +210,22 @@ void UI::MainWindow() goto endTab; } - if (ImGui::BeginTabItem(ls->DatabaseViewTab.Get())) { + if (ImGui::BeginTabItem(ICON_FA_DATABASE " " I18N_TEXT("Data", L10N_MAIN_WINDOW_TAB_DATABASE_VIEW))) { UI::DatabaseViewTab(); ImGui::EndTabItem(); } - if (ImGui::BeginTabItem(ls->ItemsTab.Get())) { + if (ImGui::BeginTabItem(ICON_FA_BOX " " I18N_TEXT("Items", L10N_MAIN_WINDOW_TAB_ITEMS))) { UI::ItemsTab(); ImGui::EndTabItem(); } - if (ImGui::BeginTabItem(ls->WorkflowsTab.Get())) { + if (ImGui::BeginTabItem(ICON_FA_SCROLL " " I18N_TEXT("Workflows", L10N_MAIN_WINDOW_TAB_WORKFLOWS))) { UI::WorkflowsTab(); ImGui::EndTabItem(); } - if (ImGui::BeginTabItem(ls->TemplatesTab.Get())) { + if (ImGui::BeginTabItem(ICON_FA_TABLE " " I18N_TEXT("Templates", L10N_MAIN_WINDOW_TAB_TEMPLATES))) { UI::TemplatesTab(); ImGui::EndTabItem(); } diff --git a/core/src/UI/UI_Settings.cpp b/core/src/UI/UI_Settings.cpp index da935c6..107b94c 100644 --- a/core/src/UI/UI_Settings.cpp +++ b/core/src/UI/UI_Settings.cpp @@ -1,7 +1,5 @@ #include "UI/UI.hpp" -#include "UI/Localization.hpp" - #include <imgui.h> void UI::SettingsTab() diff --git a/core/src/UI/UI_Templates.cpp b/core/src/UI/UI_Templates.cpp index b3a1e05..e08510a 100644 --- a/core/src/UI/UI_Templates.cpp +++ b/core/src/UI/UI_Templates.cpp @@ -4,8 +4,9 @@ #include "Model/Project.hpp" #include "Model/Template/TableTemplate.hpp" #include "Model/Template/Template.hpp" -#include "UI/Localization.hpp" +#include "Utils/I18n.hpp" +#include <IconsFontAwesome.h> #include <imgui.h> #include <imgui_extra_math.h> #include <imgui_stdlib.h> @@ -134,7 +135,6 @@ std::unique_ptr<TemplateUI> TemplateUI::CreateByKind(Template::Kind kind) void UI::TemplatesTab() { - auto ls = LocaleStrings::Instance.get(); auto& project = *GlobalStates::GetInstance().GetCurrentProject(); static std::unique_ptr<TemplateUI> openTemplate; @@ -142,17 +142,17 @@ void UI::TemplatesTab() bool openedDummy = true; // Toolbar item: close - if (ImGui::Button(ls->Close.Get(), openTemplate == nullptr)) { + if (ImGui::Button(ICON_FA_TIMES " " I18N_TEXT("Close", L10N_CLOSE), openTemplate == nullptr)) { openTemplate = nullptr; } // Toolbar item: open... ImGui::SameLine(); - if (ImGui::Button(ls->OpenAsset.Get())) { - ImGui::OpenPopup(ls->OpenAssetDialogTitle.Get()); + if (ImGui::Button(I18N_TEXT("Open asset...", L10N_ASSET_OPEN))) { + ImGui::OpenPopup(I18N_TEXT("Open asset", L10N_ASSET_OPEN_DIALOG_TITLE)); } - if (ImGui::BeginPopupModal(ls->OpenAssetDialogTitle.Get(), &openedDummy, ImGuiWindowFlags_AlwaysAutoResize)) { - if (ImGui::Button(ls->Open.Get(), state.SelectedAsset == nullptr)) { + if (ImGui::BeginPopupModal(I18N_TEXT("Open asset", L10N_ASSET_OPEN_DIALOG_TITLE), &openedDummy, ImGuiWindowFlags_AlwaysAutoResize)) { + if (ImGui::Button(I18N_TEXT("Open", L10N_OPEN), state.SelectedAsset == nullptr)) { auto kind = static_cast<Template::Kind>(state.SelectedAsset->Payload); openTemplate = TemplateUI::CreateByKind(kind); } @@ -165,10 +165,10 @@ void UI::TemplatesTab() // Toolbar item: manage... ImGui::SameLine(); - if (ImGui::Button(ls->ManageAssets.Get())) { - ImGui::OpenPopup(ls->ManageAssetsDialogTitle.Get()); + if (ImGui::Button(I18N_TEXT("Manage assets...", L10N_ASSET_MANAGE))) { + ImGui::OpenPopup(I18N_TEXT("Manage assets", L10N_ASSET_MANAGE_DIALOG_TITLE)); } - if (ImGui::BeginPopupModal(ls->ManageAssetsDialogTitle.Get(), &openedDummy, ImGuiWindowFlags_AlwaysAutoResize)) { + if (ImGui::BeginPopupModal(I18N_TEXT("Manage assets", L10N_ASSET_MANAGE_DIALOG_TITLE), &openedDummy, ImGuiWindowFlags_AlwaysAutoResize)) { project.Templates.DisplayControls(state); project.Templates.DisplayDetailsList(state); ImGui::EndPopup(); diff --git a/core/src/UI/UI_Workflows.cpp b/core/src/UI/UI_Workflows.cpp index 3230cf9..4535f08 100644 --- a/core/src/UI/UI_Workflows.cpp +++ b/core/src/UI/UI_Workflows.cpp @@ -7,9 +7,10 @@ #include "Model/Workflow/Nodes/TextNodes.hpp" #include "Model/Workflow/Nodes/UserInputNodes.hpp" #include "Model/Workflow/Workflow.hpp" -#include "UI/Localization.hpp" +#include "Utils/I18n.hpp" #include "Utils/Macros.hpp" +#include <IconsFontAwesome.h> #include <imgui.h> #include <imgui_node_editor.h> #include <imgui_stdlib.h> @@ -162,8 +163,6 @@ public: void Draw() { - auto ls = LocaleStrings::Instance.get(); - ImNodes::SetCurrentEditor(mContext); ImNodes::Begin(""); @@ -278,7 +277,7 @@ public: auto& node = *mWorkflow->GetNodeByNodeId(mContextMenuNodeId); node.DrawDebugInfo(); - if (ImGui::MenuItem(ls->Delete.Get())) { + if (ImGui::MenuItem(ICON_FA_TRASH " " I18N_TEXT("Delete", L10N_DELETE))) { ImNodes::DeleteNode(mContextMenuNodeId); } @@ -293,7 +292,7 @@ public: node->DrawInputPinDebugInfo(pinId); } - if (ImGui::MenuItem(ls->Disconnect.Get())) { + if (ImGui::MenuItem(ICON_FA_UNLINK " " I18N_TEXT("Disconnect", L10N_DISCONNECT))) { if (isOutput) { auto& pin = node->GetOutputPin(pinId); if (pin.IsConnected()) { @@ -318,7 +317,7 @@ public: auto& conn = *mWorkflow->GetConnectionByLinkId(mContextMenuLinkId); conn.DrawDebugInfo(); - if (ImGui::MenuItem(ls->Delete.Get())) { + if (ImGui::MenuItem(ICON_FA_TRASH " " I18N_TEXT("Delete", L10N_DELETE))) { ImNodes::DeleteLink(mContextMenuLinkId); } @@ -362,7 +361,6 @@ public: void UI::WorkflowsTab() { - auto ls = LocaleStrings::Instance.get(); auto& project = *GlobalStates::GetInstance().GetCurrentProject(); static std::unique_ptr<WorkflowUI> openWorkflow; @@ -370,17 +368,17 @@ void UI::WorkflowsTab() bool openedDummy = true; // Toolbar item: close - if (ImGui::Button(ls->Close.Get(), openWorkflow == nullptr)) { + if (ImGui::Button(ICON_FA_TIMES " " I18N_TEXT("Close", L10N_CLOSE), openWorkflow == nullptr)) { openWorkflow = nullptr; } // Toolbar item: open... ImGui::SameLine(); - if (ImGui::Button(ls->OpenAsset.Get())) { - ImGui::OpenPopup(ls->OpenAssetDialogTitle.Get()); + if (ImGui::Button((I18N_TEXT("Open asset...", L10N_ASSET_OPEN)))) { + ImGui::OpenPopup(I18N_TEXT("Open asset", L10N_ASSET_OPEN_DIALOG_TITLE)); } - if (ImGui::BeginPopupModal(ls->OpenAssetDialogTitle.Get(), &openedDummy, ImGuiWindowFlags_AlwaysAutoResize)) { - if (ImGui::Button(ls->Open.Get(), state.SelectedAsset == nullptr)) { + if (ImGui::BeginPopupModal(I18N_TEXT("Open asset", L10N_ASSET_OPEN_DIALOG_TITLE), &openedDummy, ImGuiWindowFlags_AlwaysAutoResize)) { + if (ImGui::Button(I18N_TEXT("Open", L10N_OPEN), state.SelectedAsset == nullptr)) { auto workflow = project.Workflows.Load(*state.SelectedAsset); openWorkflow = std::make_unique<WorkflowUI>(std::move(workflow)); } @@ -393,10 +391,10 @@ void UI::WorkflowsTab() // Toolbar item: manage... ImGui::SameLine(); - if (ImGui::Button(ls->ManageAssets.Get())) { - ImGui::OpenPopup(ls->ManageAssetsDialogTitle.Get()); + if (ImGui::Button(I18N_TEXT("Manage assets...", L10N_ASSET_MANAGE))) { + ImGui::OpenPopup(I18N_TEXT("Manage assets", L10N_ASSET_MANAGE_DIALOG_TITLE)); } - if (ImGui::BeginPopupModal(ls->ManageAssetsDialogTitle.Get(), &openedDummy, ImGuiWindowFlags_AlwaysAutoResize)) { + if (ImGui::BeginPopupModal(I18N_TEXT("Manage assets", L10N_ASSET_MANAGE_DIALOG_TITLE), &openedDummy, ImGuiWindowFlags_AlwaysAutoResize)) { project.Workflows.DisplayControls(state); project.Workflows.DisplayDetailsList(state); ImGui::EndPopup(); diff --git a/core/src/UI/fwd.hpp b/core/src/UI/fwd.hpp index 9b88370..756e567 100644 --- a/core/src/UI/fwd.hpp +++ b/core/src/UI/fwd.hpp @@ -1,8 +1,5 @@ #pragma once -// Localization.hpp -class LocaleStrings; - // UI.hpp namespace ImGui { enum class IconType; |