TUniPas
UniPas is a cross‑platform Delphi framework for building elegant Single Page Apps from one codebase. It delivers native‑smooth performance, modular architecture, and rapid deployment to desktop, mobile and web.
- Active · last change 3-8-2026
- ★ 6 on GitHub
README
UniPas Framework
⚠️ IMPORTANT — Work in progress — NOT FOR PRODUCTION
This project is actively under development and is not ready for production use. Do NOT use this library in production systems.
Overview
UniPas is a lightweight, opinionated framework for building FireMonkey (FMX) applications with a focus on three practical concerns:
- Fast, frame-based routing and navigation for single-form app layouts.
- Runtime language translation and catalog management for multilingual UIs.
- Simple, JSON-backed application settings with dotted-key access for nested structures.
Designed for Delphi 12 (Athens) and later, UniPas favors clarity and developer ergonomics:
- Singleton-style entry (
TUniPas) with lazy-created modules (Routing,Lang,Settings). - Minimal integration: drop frames named
TPage_<Name>into your project and useTUniPas.Routing.RenderPage. - Safe frame lifecycle handling during rapid navigation and deterministic cleanup at shutdown.
Features
- Routing — Page/frame navigation with straightforward APIs and backward-compatible shared variables
- Language Support — Translation catalog, automatic application to forms/frames, and translation generation tools
- App Settings — JSON configuration with nested keys, type-safe getters/setters, and optional auto-save
Quick Start
uses
UniPas;
procedure TMainForm.FormCreate(Sender: TObject);
begin
// UniPas is a singleton-style framework.
// No Create/Free needed — modules are created on first access.
TUniPas.AppName := 'My Application';
TUniPas.AppVersion := '0.1.0';
// Configure routing
TUniPas.Routing.SetDefaultContainerControl(MainContainer);
TUniPas.Routing.RenderPage('Home');
// Configure language
TUniPas.Lang.SetLanguage('en');
// Use app settings
TUniPas.Settings.LoadFromFile;
TUniPas.Settings.SetValue('UI.Theme', 'dark');
end;Modules
Routing Module
Manages page navigation using Delphi frames.
// Set the container control (usually a TLayout)
TUniPas.Routing.SetDefaultContainerControl(MainContainer);
// Navigate to pages
TUniPas.Routing.RenderPage('Home');
TUniPas.Routing.RenderPage('About', 'some extra info');
// Check current page
if TUniPas.Routing.CurrentPageName = 'Home' then
// ...
// Handle page changes
TUniPas.Routing.OnPageChanged := procedure(Sender: TObject)
begin
UpdateStatusBar;
end;
// Optional: handle routing errors
TUniPas.Routing.OnRoutingError := procedure(const Msg: string)
begin
// log or show the error
end;
// Optional: control frame cleanup
TUniPas.Routing.FreeFramesOnNavigate := False; // keep frames alive and simply hide/show them
// when False the demo exposes Switch1 to flip this at runtimePage Setup:
- Implement pages as frames named
TPage_<PageName>(e.g.,TPage_Home,TPage_About) - Register pages in
UniPas.Routing.Pages.pas - Pages are auto-managed by the framework
Language Support Module
Provides runtime translation of UI components.
// Set the current language
TUniPas.Lang.SetLanguage('en'); // English
TUniPas.Lang.SetLanguage('af'); // Afrikaans
// Handle language changes
TUniPas.Lang.OnLanguageChanged := procedure(Sender: TObject)
begin
RefreshUI;
end;
// Generate translation template
TUniPas.Lang.GenerateEnglishTranslationFile;
// Optional: persist language selection in settings
TUniPas.Settings.SetValue('App.Language', 'en');Translation Setup:
- Create language units (e.g.,
UniPas.LanguageSupport.EN.pas) - Use
ACatalog.SetValue('en', 'Page_Home.Label1.Text', 'Hello')pattern - Translations auto-apply when pages are rendered
App Settings Module
JSON-based configuration with auto-save support.
// Load existing settings
TUniPas.Settings.LoadFromFile;
// Set values (supports dotted paths for nesting)
TUniPas.Settings.SetValue('AppName', 'My App'); // String
TUniPas.Settings.SetValue('WindowWidth', 1024); // Integer
TUniPas.Settings.SetValue('Volume', 0.75); // Double
TUniPas.Settings.SetValue('UI.DarkMode', True); // Boolean (nested)
TUniPas.Settings.SetValue('User.Preferences.Font', 'Arial'); // Deep nesting
// Get values with defaults
var Theme := TUniPas.Settings.GetString('UI.Theme', 'light');
var Width := TUniPas.Settings.GetInt('WindowWidth', 800);
var Volume := TUniPas.Settings.GetFloat('Volume', 1.0);
var DarkMode := TUniPas.Settings.GetBool('UI.DarkMode', False);
// Or use generic getter
var Name := TUniPas.Settings.GetValue<string>('AppName', 'Default');
// Auto-save is enabled by default
TUniPas.Settings.AutoSave := True; // Saves on every change
TUniPas.Settings.AutoSave := False; // Manual save only
TUniPas.Settings.SaveToFile;
// Check and remove keys
if TUniPas.Settings.HasKey('OldSetting') then
TUniPas.Settings.RemoveKey('OldSetting');
// Get all keys
var AllKeys := TUniPas.Settings.Keys;
// Handle changes
TUniPas.Settings.OnChange := procedure(Sender: TObject)
begin
ApplySettings;
end;JSON Output Example:
{
"AppName": "My App",
"WindowWidth": 1024,
"Volume": 0.75,
"UI": {
"DarkMode": true,
"Theme": "dark"
},
"User": {
"Preferences": {
"Font": "Arial"
}
}
}File Structure
UniPas/
????????? Source Code/
??? ????????? UniPas.pas # Main framework (TUniPas)
??? ????????? UniPas.AppSettings.pas # Settings module
??? ????????? UniPas.LanguageSupport.pas # Translation engine
??? ????????? UniPas.Routing.pas # Internal routing types
??? ????????? UniPas.Routing.Pages.pas # Page registry
??? ????????? UniPas.Routing.Variables.pas # Shared state
??? ????????? Default_Pages/ # Built-in pages
??? ??? ????????? UniPas.uPage_404PageNotFound.pas
??? ????????? Language_Translations/ # Translation files
??? ????????? UniPas.LanguageSupport.EN.pas
??? ????????? UniPas.LanguageSupport.AF.pas
????????? Demo/ # Example applicationLicense
See LICENSE file.

