mirror of
				https://github.com/ocornut/imgui.git
				synced 2025-11-04 01:34:32 +00:00 
			
		
		
		
	Internals: added basic localization system (#5895)
This commit is contained in:
		
							
								
								
									
										40
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								imgui.cpp
									
									
									
									
									
								
							@@ -80,7 +80,8 @@ CODE
 | 
			
		||||
// [SECTION] DRAG AND DROP
 | 
			
		||||
// [SECTION] LOGGING/CAPTURING
 | 
			
		||||
// [SECTION] SETTINGS
 | 
			
		||||
// [SECTION] VIEWPORTS
 | 
			
		||||
// [SECTION] LOCALIZATION
 | 
			
		||||
// [SECTION] VIEWPORTS, PLATFORM WINDOWS
 | 
			
		||||
// [SECTION] PLATFORM DEPENDENT HELPERS
 | 
			
		||||
// [SECTION] METRICS/DEBUGGER WINDOW
 | 
			
		||||
// [SECTION] DEBUG LOG WINDOW
 | 
			
		||||
@@ -4772,12 +4773,24 @@ void ImGui::NewFrame()
 | 
			
		||||
    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()
 | 
			
		||||
{
 | 
			
		||||
    ImGuiContext& g = *GImGui;
 | 
			
		||||
    IM_ASSERT(!g.Initialized && !g.SettingsLoaded);
 | 
			
		||||
 | 
			
		||||
    // Add .ini handle for ImGuiWindow type
 | 
			
		||||
    // Add .ini handle for ImGuiWindow and ImGuiTable types
 | 
			
		||||
    {
 | 
			
		||||
        ImGuiSettingsHandler ini_handler;
 | 
			
		||||
        ini_handler.TypeName = "Window";
 | 
			
		||||
@@ -4789,10 +4802,11 @@ void ImGui::Initialize()
 | 
			
		||||
        ini_handler.WriteAllFn = WindowSettingsHandler_WriteAll;
 | 
			
		||||
        AddSettingsHandler(&ini_handler);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Add .ini handle for ImGuiTable type
 | 
			
		||||
    TableSettingsAddSettingsHandler();
 | 
			
		||||
 | 
			
		||||
    // Setup default localization table
 | 
			
		||||
    LocalizeRegisterEntries(GLocalizationEntriesEnUS, IM_ARRAYSIZE(GLocalizationEntriesEnUS));
 | 
			
		||||
 | 
			
		||||
    // Create default viewport
 | 
			
		||||
    ImGuiViewportP* viewport = IM_NEW(ImGuiViewportP)();
 | 
			
		||||
    g.Viewports.push_back(viewport);
 | 
			
		||||
@@ -11660,10 +11674,10 @@ static void ImGui::NavUpdateWindowing()
 | 
			
		||||
static const char* GetFallbackWindowNameForWindowingList(ImGuiWindow* window)
 | 
			
		||||
{
 | 
			
		||||
    if (window->Flags & ImGuiWindowFlags_Popup)
 | 
			
		||||
        return "(Popup)";
 | 
			
		||||
        return ImGui::LocalizeGetMsg(ImGuiLocKey_WindowingPopup);
 | 
			
		||||
    if ((window->Flags & ImGuiWindowFlags_MenuBar) && strcmp(window->Name, "##MainMenuBar") == 0)
 | 
			
		||||
        return "(Main menu bar)";
 | 
			
		||||
    return "(Untitled)";
 | 
			
		||||
        return ImGui::LocalizeGetMsg(ImGuiLocKey_WindowingMainMenuBar);
 | 
			
		||||
    return ImGui::LocalizeGetMsg(ImGuiLocKey_WindowingUntitled);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,7 @@ Index of this file:
 | 
			
		||||
// [SECTION] Docking support
 | 
			
		||||
// [SECTION] Viewport support
 | 
			
		||||
// [SECTION] Settings support
 | 
			
		||||
// [SECTION] Localization support
 | 
			
		||||
// [SECTION] Metrics, Debug tools
 | 
			
		||||
// [SECTION] Generic context hooks
 | 
			
		||||
// [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 ImGuiInputTextState;         // Internal state of the currently focused/edited text input box
 | 
			
		||||
struct ImGuiLastItemData;           // Status storage for last submitted items
 | 
			
		||||
struct ImGuiLocEntry;               // A localization entry.
 | 
			
		||||
struct ImGuiMenuColumns;            // Simple column measurement, currently used for MenuItem() only
 | 
			
		||||
struct ImGuiNavItemData;            // Result of a gamepad/keyboard directional navigation move query result
 | 
			
		||||
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 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.
 | 
			
		||||
enum ImGuiLocKey : int;                 // -> enum ImGuiLocKey              // Enum: a localization entry for translation.
 | 
			
		||||
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 ImGuiDebugLogFlags;         // -> enum ImGuiDebugLogFlags_      // Flags: for ShowDebugLogWindow(), g.DebugLogFlags
 | 
			
		||||
typedef int ImGuiInputFlags;            // -> enum ImGuiInputFlags_         // Flags: for IsKeyPressed(), IsMouseClicked(), SetKeyOwner(), SetItemKeyOwner() etc.
 | 
			
		||||
@@ -1608,6 +1614,30 @@ struct ImGuiSettingsHandler
 | 
			
		||||
    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
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
@@ -1938,6 +1968,9 @@ struct ImGuiContext
 | 
			
		||||
    ImVector<ImGuiContextHook>          Hooks;                  // Hooks for extensions (e.g. test engine)
 | 
			
		||||
    ImGuiID                             HookIdNext;             // Next available HookId
 | 
			
		||||
 | 
			
		||||
    // Localization
 | 
			
		||||
    const char*             LocalizationTable[ImGuiLocKey_COUNT];
 | 
			
		||||
 | 
			
		||||
    // Capture/Logging
 | 
			
		||||
    bool                    LogEnabled;                         // Currently capturing
 | 
			
		||||
    ImGuiLogType            LogType;                            // Capture target
 | 
			
		||||
@@ -2109,6 +2142,8 @@ struct ImGuiContext
 | 
			
		||||
        SettingsDirtyTimer = 0.0f;
 | 
			
		||||
        HookIdNext = 0;
 | 
			
		||||
 | 
			
		||||
        memset(LocalizationTable, 0, sizeof(LocalizationTable));
 | 
			
		||||
 | 
			
		||||
        LogEnabled = false;
 | 
			
		||||
        LogType = ImGuiLogType_None;
 | 
			
		||||
        LogNextPrefix = LogNextSuffix = NULL;
 | 
			
		||||
@@ -2725,6 +2760,10 @@ namespace ImGui
 | 
			
		||||
    IMGUI_API void                  RemoveSettingsHandler(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
 | 
			
		||||
    IMGUI_API void          SetScrollX(ImGuiWindow* window, float scroll_x);
 | 
			
		||||
    IMGUI_API void          SetScrollY(ImGuiWindow* window, float scroll_y);
 | 
			
		||||
 
 | 
			
		||||
@@ -3070,15 +3070,15 @@ void ImGui::TableDrawContextMenu(ImGuiTable* table)
 | 
			
		||||
        if (column != NULL)
 | 
			
		||||
        {
 | 
			
		||||
            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);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const char* size_all_desc;
 | 
			
		||||
        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
 | 
			
		||||
            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))
 | 
			
		||||
            TableSetColumnWidthAutoAll(table);
 | 
			
		||||
        want_separator = true;
 | 
			
		||||
@@ -3087,7 +3087,7 @@ void ImGui::TableDrawContextMenu(ImGuiTable* table)
 | 
			
		||||
    // Ordering
 | 
			
		||||
    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;
 | 
			
		||||
        want_separator = true;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user