mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-15 01:17:00 +00:00
Internals: added basic localization system (#5895)
This commit is contained in:
parent
c3d9f8ee7e
commit
ffe0abbfc2
40
imgui.cpp
40
imgui.cpp
@ -80,7 +80,8 @@ CODE
|
|||||||
// [SECTION] DRAG AND DROP
|
// [SECTION] DRAG AND DROP
|
||||||
// [SECTION] LOGGING/CAPTURING
|
// [SECTION] LOGGING/CAPTURING
|
||||||
// [SECTION] SETTINGS
|
// [SECTION] SETTINGS
|
||||||
// [SECTION] VIEWPORTS
|
// [SECTION] LOCALIZATION
|
||||||
|
// [SECTION] VIEWPORTS, PLATFORM WINDOWS
|
||||||
// [SECTION] PLATFORM DEPENDENT HELPERS
|
// [SECTION] PLATFORM DEPENDENT HELPERS
|
||||||
// [SECTION] METRICS/DEBUGGER WINDOW
|
// [SECTION] METRICS/DEBUGGER WINDOW
|
||||||
// [SECTION] DEBUG LOG WINDOW
|
// [SECTION] DEBUG LOG WINDOW
|
||||||
@ -4772,12 +4773,24 @@ void ImGui::NewFrame()
|
|||||||
CallContextHooks(&g, ImGuiContextHookType_NewFramePost);
|
CallContextHooks(&g, ImGuiContextHookType_NewFramePost);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IMPORTANT: ###xxx suffixes must be same in ALL languages
|
||||||
|
static const ImGuiLocEntry GLocalizationEntriesEnUS[] =
|
||||||
|
{
|
||||||
|
{ ImGuiLocKey_TableSizeOne, "Size column to fit###SizeOne" },
|
||||||
|
{ ImGuiLocKey_TableSizeAllFit, "Size all columns to fit###SizeAll" },
|
||||||
|
{ ImGuiLocKey_TableSizeAllDefault, "Size all columns to default###SizeAll" },
|
||||||
|
{ ImGuiLocKey_TableResetOrder, "Reset order###ResetOrder" },
|
||||||
|
{ ImGuiLocKey_WindowingMainMenuBar, "(Main menu bar)" },
|
||||||
|
{ ImGuiLocKey_WindowingPopup, "(Popup)" },
|
||||||
|
{ ImGuiLocKey_WindowingUntitled, "(Untitled)" },
|
||||||
|
};
|
||||||
|
|
||||||
void ImGui::Initialize()
|
void ImGui::Initialize()
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
IM_ASSERT(!g.Initialized && !g.SettingsLoaded);
|
IM_ASSERT(!g.Initialized && !g.SettingsLoaded);
|
||||||
|
|
||||||
// Add .ini handle for ImGuiWindow type
|
// Add .ini handle for ImGuiWindow and ImGuiTable types
|
||||||
{
|
{
|
||||||
ImGuiSettingsHandler ini_handler;
|
ImGuiSettingsHandler ini_handler;
|
||||||
ini_handler.TypeName = "Window";
|
ini_handler.TypeName = "Window";
|
||||||
@ -4789,10 +4802,11 @@ void ImGui::Initialize()
|
|||||||
ini_handler.WriteAllFn = WindowSettingsHandler_WriteAll;
|
ini_handler.WriteAllFn = WindowSettingsHandler_WriteAll;
|
||||||
AddSettingsHandler(&ini_handler);
|
AddSettingsHandler(&ini_handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add .ini handle for ImGuiTable type
|
|
||||||
TableSettingsAddSettingsHandler();
|
TableSettingsAddSettingsHandler();
|
||||||
|
|
||||||
|
// Setup default localization table
|
||||||
|
LocalizeRegisterEntries(GLocalizationEntriesEnUS, IM_ARRAYSIZE(GLocalizationEntriesEnUS));
|
||||||
|
|
||||||
// Create default viewport
|
// Create default viewport
|
||||||
ImGuiViewportP* viewport = IM_NEW(ImGuiViewportP)();
|
ImGuiViewportP* viewport = IM_NEW(ImGuiViewportP)();
|
||||||
g.Viewports.push_back(viewport);
|
g.Viewports.push_back(viewport);
|
||||||
@ -11660,10 +11674,10 @@ static void ImGui::NavUpdateWindowing()
|
|||||||
static const char* GetFallbackWindowNameForWindowingList(ImGuiWindow* window)
|
static const char* GetFallbackWindowNameForWindowingList(ImGuiWindow* window)
|
||||||
{
|
{
|
||||||
if (window->Flags & ImGuiWindowFlags_Popup)
|
if (window->Flags & ImGuiWindowFlags_Popup)
|
||||||
return "(Popup)";
|
return ImGui::LocalizeGetMsg(ImGuiLocKey_WindowingPopup);
|
||||||
if ((window->Flags & ImGuiWindowFlags_MenuBar) && strcmp(window->Name, "##MainMenuBar") == 0)
|
if ((window->Flags & ImGuiWindowFlags_MenuBar) && strcmp(window->Name, "##MainMenuBar") == 0)
|
||||||
return "(Main menu bar)";
|
return ImGui::LocalizeGetMsg(ImGuiLocKey_WindowingMainMenuBar);
|
||||||
return "(Untitled)";
|
return ImGui::LocalizeGetMsg(ImGuiLocKey_WindowingUntitled);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Overlay displayed when using CTRL+TAB. Called by EndFrame().
|
// Overlay displayed when using CTRL+TAB. Called by EndFrame().
|
||||||
@ -12593,6 +12607,18 @@ static void WindowSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandl
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// [SECTION] LOCALIZATION
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void ImGui::LocalizeRegisterEntries(const ImGuiLocEntry* entries, int count)
|
||||||
|
{
|
||||||
|
ImGuiContext& g = *GImGui;
|
||||||
|
for (int n = 0; n < count; n++)
|
||||||
|
g.LocalizationTable[entries[n].Key] = entries[n].Text;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// [SECTION] VIEWPORTS, PLATFORM WINDOWS
|
// [SECTION] VIEWPORTS, PLATFORM WINDOWS
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
@ -26,6 +26,7 @@ Index of this file:
|
|||||||
// [SECTION] Docking support
|
// [SECTION] Docking support
|
||||||
// [SECTION] Viewport support
|
// [SECTION] Viewport support
|
||||||
// [SECTION] Settings support
|
// [SECTION] Settings support
|
||||||
|
// [SECTION] Localization support
|
||||||
// [SECTION] Metrics, Debug tools
|
// [SECTION] Metrics, Debug tools
|
||||||
// [SECTION] Generic context hooks
|
// [SECTION] Generic context hooks
|
||||||
// [SECTION] ImGuiContext (main imgui context)
|
// [SECTION] ImGuiContext (main imgui context)
|
||||||
@ -121,6 +122,7 @@ struct ImGuiDataTypeInfo; // Type information associated to a ImGuiDat
|
|||||||
struct ImGuiGroupData; // Stacked storage data for BeginGroup()/EndGroup()
|
struct ImGuiGroupData; // Stacked storage data for BeginGroup()/EndGroup()
|
||||||
struct ImGuiInputTextState; // Internal state of the currently focused/edited text input box
|
struct ImGuiInputTextState; // Internal state of the currently focused/edited text input box
|
||||||
struct ImGuiLastItemData; // Status storage for last submitted items
|
struct ImGuiLastItemData; // Status storage for last submitted items
|
||||||
|
struct ImGuiLocEntry; // A localization entry.
|
||||||
struct ImGuiMenuColumns; // Simple column measurement, currently used for MenuItem() only
|
struct ImGuiMenuColumns; // Simple column measurement, currently used for MenuItem() only
|
||||||
struct ImGuiNavItemData; // Result of a gamepad/keyboard directional navigation move query result
|
struct ImGuiNavItemData; // Result of a gamepad/keyboard directional navigation move query result
|
||||||
struct ImGuiMetricsConfig; // Storage for ShowMetricsWindow() and DebugNodeXXX() functions
|
struct ImGuiMetricsConfig; // Storage for ShowMetricsWindow() and DebugNodeXXX() functions
|
||||||
@ -144,8 +146,12 @@ struct ImGuiWindow; // Storage for one window
|
|||||||
struct ImGuiWindowTempData; // Temporary storage for one window (that's the data which in theory we could ditch at the end of the frame, in practice we currently keep it for each window)
|
struct ImGuiWindowTempData; // Temporary storage for one window (that's the data which in theory we could ditch at the end of the frame, in practice we currently keep it for each window)
|
||||||
struct ImGuiWindowSettings; // Storage for a window .ini settings (we keep one of those even if the actual window wasn't instanced during this session)
|
struct ImGuiWindowSettings; // Storage for a window .ini settings (we keep one of those even if the actual window wasn't instanced during this session)
|
||||||
|
|
||||||
|
// Enumerations
|
||||||
// Use your programming IDE "Go to definition" facility on the names of the center columns to find the actual flags/enum lists.
|
// Use your programming IDE "Go to definition" facility on the names of the center columns to find the actual flags/enum lists.
|
||||||
|
enum ImGuiLocKey : int; // -> enum ImGuiLocKey // Enum: a localization entry for translation.
|
||||||
typedef int ImGuiLayoutType; // -> enum ImGuiLayoutType_ // Enum: Horizontal or vertical
|
typedef int ImGuiLayoutType; // -> enum ImGuiLayoutType_ // Enum: Horizontal or vertical
|
||||||
|
|
||||||
|
// Flags
|
||||||
typedef int ImGuiActivateFlags; // -> enum ImGuiActivateFlags_ // Flags: for navigation/focus function (will be for ActivateItem() later)
|
typedef int ImGuiActivateFlags; // -> enum ImGuiActivateFlags_ // Flags: for navigation/focus function (will be for ActivateItem() later)
|
||||||
typedef int ImGuiDebugLogFlags; // -> enum ImGuiDebugLogFlags_ // Flags: for ShowDebugLogWindow(), g.DebugLogFlags
|
typedef int ImGuiDebugLogFlags; // -> enum ImGuiDebugLogFlags_ // Flags: for ShowDebugLogWindow(), g.DebugLogFlags
|
||||||
typedef int ImGuiInputFlags; // -> enum ImGuiInputFlags_ // Flags: for IsKeyPressed(), IsMouseClicked(), SetKeyOwner(), SetItemKeyOwner() etc.
|
typedef int ImGuiInputFlags; // -> enum ImGuiInputFlags_ // Flags: for IsKeyPressed(), IsMouseClicked(), SetKeyOwner(), SetItemKeyOwner() etc.
|
||||||
@ -1608,6 +1614,30 @@ struct ImGuiSettingsHandler
|
|||||||
ImGuiSettingsHandler() { memset(this, 0, sizeof(*this)); }
|
ImGuiSettingsHandler() { memset(this, 0, sizeof(*this)); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// [SECTION] Localization support
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// This is experimental and not officially supported, it'll probably fall short of features, if/when it does we may backtrack.
|
||||||
|
enum ImGuiLocKey : int
|
||||||
|
{
|
||||||
|
ImGuiLocKey_TableSizeOne,
|
||||||
|
ImGuiLocKey_TableSizeAllFit,
|
||||||
|
ImGuiLocKey_TableSizeAllDefault,
|
||||||
|
ImGuiLocKey_TableResetOrder,
|
||||||
|
ImGuiLocKey_WindowingMainMenuBar,
|
||||||
|
ImGuiLocKey_WindowingPopup,
|
||||||
|
ImGuiLocKey_WindowingUntitled,
|
||||||
|
ImGuiLocKey_COUNT
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ImGuiLocEntry
|
||||||
|
{
|
||||||
|
ImGuiLocKey Key;
|
||||||
|
const char* Text;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// [SECTION] Metrics, Debug Tools
|
// [SECTION] Metrics, Debug Tools
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@ -1938,6 +1968,9 @@ struct ImGuiContext
|
|||||||
ImVector<ImGuiContextHook> Hooks; // Hooks for extensions (e.g. test engine)
|
ImVector<ImGuiContextHook> Hooks; // Hooks for extensions (e.g. test engine)
|
||||||
ImGuiID HookIdNext; // Next available HookId
|
ImGuiID HookIdNext; // Next available HookId
|
||||||
|
|
||||||
|
// Localization
|
||||||
|
const char* LocalizationTable[ImGuiLocKey_COUNT];
|
||||||
|
|
||||||
// Capture/Logging
|
// Capture/Logging
|
||||||
bool LogEnabled; // Currently capturing
|
bool LogEnabled; // Currently capturing
|
||||||
ImGuiLogType LogType; // Capture target
|
ImGuiLogType LogType; // Capture target
|
||||||
@ -2109,6 +2142,8 @@ struct ImGuiContext
|
|||||||
SettingsDirtyTimer = 0.0f;
|
SettingsDirtyTimer = 0.0f;
|
||||||
HookIdNext = 0;
|
HookIdNext = 0;
|
||||||
|
|
||||||
|
memset(LocalizationTable, 0, sizeof(LocalizationTable));
|
||||||
|
|
||||||
LogEnabled = false;
|
LogEnabled = false;
|
||||||
LogType = ImGuiLogType_None;
|
LogType = ImGuiLogType_None;
|
||||||
LogNextPrefix = LogNextSuffix = NULL;
|
LogNextPrefix = LogNextSuffix = NULL;
|
||||||
@ -2725,6 +2760,10 @@ namespace ImGui
|
|||||||
IMGUI_API void RemoveSettingsHandler(const char* type_name);
|
IMGUI_API void RemoveSettingsHandler(const char* type_name);
|
||||||
IMGUI_API ImGuiSettingsHandler* FindSettingsHandler(const char* type_name);
|
IMGUI_API ImGuiSettingsHandler* FindSettingsHandler(const char* type_name);
|
||||||
|
|
||||||
|
// Localization
|
||||||
|
IMGUI_API void LocalizeRegisterEntries(const ImGuiLocEntry* entries, int count);
|
||||||
|
inline const char* LocalizeGetMsg(ImGuiLocKey key) { ImGuiContext& g = *GImGui; const char* msg = g.LocalizationTable[key]; return msg ? msg : "*Missing Text*"; }
|
||||||
|
|
||||||
// Scrolling
|
// Scrolling
|
||||||
IMGUI_API void SetScrollX(ImGuiWindow* window, float scroll_x);
|
IMGUI_API void SetScrollX(ImGuiWindow* window, float scroll_x);
|
||||||
IMGUI_API void SetScrollY(ImGuiWindow* window, float scroll_y);
|
IMGUI_API void SetScrollY(ImGuiWindow* window, float scroll_y);
|
||||||
|
@ -3070,15 +3070,15 @@ void ImGui::TableDrawContextMenu(ImGuiTable* table)
|
|||||||
if (column != NULL)
|
if (column != NULL)
|
||||||
{
|
{
|
||||||
const bool can_resize = !(column->Flags & ImGuiTableColumnFlags_NoResize) && column->IsEnabled;
|
const bool can_resize = !(column->Flags & ImGuiTableColumnFlags_NoResize) && column->IsEnabled;
|
||||||
if (MenuItem("Size column to fit###SizeOne", NULL, false, can_resize))
|
if (MenuItem(LocalizeGetMsg(ImGuiLocKey_TableSizeOne), NULL, false, can_resize)) // "###SizeOne"
|
||||||
TableSetColumnWidthAutoSingle(table, column_n);
|
TableSetColumnWidthAutoSingle(table, column_n);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* size_all_desc;
|
const char* size_all_desc;
|
||||||
if (table->ColumnsEnabledFixedCount == table->ColumnsEnabledCount && (table->Flags & ImGuiTableFlags_SizingMask_) != ImGuiTableFlags_SizingFixedSame)
|
if (table->ColumnsEnabledFixedCount == table->ColumnsEnabledCount && (table->Flags & ImGuiTableFlags_SizingMask_) != ImGuiTableFlags_SizingFixedSame)
|
||||||
size_all_desc = "Size all columns to fit###SizeAll"; // All fixed
|
size_all_desc = LocalizeGetMsg(ImGuiLocKey_TableSizeAllFit); // "###SizeAll" All fixed
|
||||||
else
|
else
|
||||||
size_all_desc = "Size all columns to default###SizeAll"; // All stretch or mixed
|
size_all_desc = LocalizeGetMsg(ImGuiLocKey_TableSizeAllDefault); // "###SizeAll" All stretch or mixed
|
||||||
if (MenuItem(size_all_desc, NULL))
|
if (MenuItem(size_all_desc, NULL))
|
||||||
TableSetColumnWidthAutoAll(table);
|
TableSetColumnWidthAutoAll(table);
|
||||||
want_separator = true;
|
want_separator = true;
|
||||||
@ -3087,7 +3087,7 @@ void ImGui::TableDrawContextMenu(ImGuiTable* table)
|
|||||||
// Ordering
|
// Ordering
|
||||||
if (table->Flags & ImGuiTableFlags_Reorderable)
|
if (table->Flags & ImGuiTableFlags_Reorderable)
|
||||||
{
|
{
|
||||||
if (MenuItem("Reset order", NULL, false, !table->IsDefaultDisplayOrder))
|
if (MenuItem(LocalizeGetMsg(ImGuiLocKey_TableResetOrder), NULL, false, !table->IsDefaultDisplayOrder))
|
||||||
table->IsResetDisplayOrderRequest = true;
|
table->IsResetDisplayOrderRequest = true;
|
||||||
want_separator = true;
|
want_separator = true;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user