mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-05-03 02:04:54 +00:00
c406b8df96
Move FakeMUI content to appropriate root-level folders by implementation:
**React Components → components/fakemui/**
- 537 components (inputs, surfaces, layout, data-display, feedback,
navigation, utils, atoms, lab, x, email, workflows)
- 416 SVG icons
- Full barrel exports in components/fakemui/index.ts
**QML Components → qml/**
- 104 Material Design 3 components (11 categories)
- 7 hybrid application views
- 8 desktop widgets
- qmldir module registration
**Python Bindings → python/fakemui/**
- 15 PyQt6 modules (120+ components)
- Full Python package structure with pyproject.toml
**SCSS/Styles → fakemui/** (renamed purpose)
- scss/ - Material Design 3 stylesheets
- styles/ - Component SCSS modules
- src/utils/ - Accessibility utilities
- index.ts now re-exports from components/fakemui/
This separation allows:
- React: import { Button } from '@metabuilder/components/fakemui'
- QML: import QmlComponents 1.0
- Python: from fakemui import Button, Card
- Backward compat: import { Button } from '@metabuilder/fakemui'
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
459 lines
17 KiB
QML
459 lines
17 KiB
QML
pragma Singleton
|
|
import QtQuick
|
|
|
|
/**
|
|
* LanguageContext - Internationalization / translations
|
|
* Mirrors React's i18n.js with 19 languages
|
|
*/
|
|
QtObject {
|
|
id: i18n
|
|
|
|
// Alias for component compatibility
|
|
property string currentLanguage: language
|
|
|
|
// Current language - default to English
|
|
property string language: "en"
|
|
|
|
// Available languages
|
|
readonly property var languageKeys: [
|
|
"en", "es", "fr", "de", "ja", "zh", "pt", "nl", "it", "ko",
|
|
"ru", "ar", "hi", "tr", "pl", "vi", "th", "sv", "uk"
|
|
]
|
|
|
|
// Language metadata
|
|
readonly property var languages: ({
|
|
en: { name: "English", flag: "🇺🇸" },
|
|
es: { name: "Español", flag: "🇪🇸" },
|
|
fr: { name: "Français", flag: "🇫🇷" },
|
|
de: { name: "Deutsch", flag: "🇩🇪" },
|
|
ja: { name: "日本語", flag: "🇯🇵" },
|
|
zh: { name: "中文", flag: "🇨🇳" },
|
|
pt: { name: "Português", flag: "🇧🇷" },
|
|
nl: { name: "Nederlands", flag: "🇳🇱" },
|
|
it: { name: "Italiano", flag: "🇮🇹" },
|
|
ko: { name: "한국어", flag: "🇰🇷" },
|
|
ru: { name: "Русский", flag: "🇷🇺" },
|
|
ar: { name: "العربية", flag: "🇸🇦" },
|
|
hi: { name: "हिंदी", flag: "🇮🇳" },
|
|
tr: { name: "Türkçe", flag: "🇹🇷" },
|
|
pl: { name: "Polski", flag: "🇵🇱" },
|
|
vi: { name: "Tiếng Việt", flag: "🇻🇳" },
|
|
th: { name: "ไทย", flag: "🇹🇭" },
|
|
sv: { name: "Svenska", flag: "🇸🇪" },
|
|
uk: { name: "Українська", flag: "🇺🇦" }
|
|
})
|
|
|
|
// Translations
|
|
readonly property var translations: ({
|
|
en: {
|
|
// Navigation
|
|
tasks: "Tasks",
|
|
newTask: "New Task",
|
|
profile: "Profile",
|
|
taskDetail: "Task Detail",
|
|
documentation: "Documentation",
|
|
|
|
// Settings
|
|
nerdMode: "Nerd Mode",
|
|
theme: "Theme",
|
|
language: "Language",
|
|
|
|
// Task List
|
|
filter: "Filter",
|
|
limit: "Limit",
|
|
current: "Current",
|
|
archived: "Archived",
|
|
all: "All",
|
|
noTasks: "No tasks found",
|
|
tasksCount: "tasks",
|
|
view: "View",
|
|
getPatch: "Get Patch",
|
|
archive: "Archive",
|
|
noRepo: "No repo",
|
|
untitledTask: "Untitled Task",
|
|
|
|
// Task Detail
|
|
backToTasks: "Back to Tasks",
|
|
details: "Details",
|
|
turns: "Turns",
|
|
patch: "Patch",
|
|
createPR: "Create PR",
|
|
prCreated: "PR created successfully!",
|
|
failedCreatePR: "Failed to create PR",
|
|
copied: "Copied to clipboard!",
|
|
loadPatch: "Load Patch",
|
|
noPatch: "No patch data available",
|
|
rawTaskData: "Raw Task Data",
|
|
currentTurn: "Current Turn",
|
|
lines: "lines",
|
|
|
|
// New Prompt
|
|
createNewTask: "Create New Task",
|
|
sendPromptDesc: "Send a prompt to Codex to create a new coding task",
|
|
taskPrompt: "Task Prompt",
|
|
promptPlaceholder: "Describe what you want Codex to do...",
|
|
branch: "Branch",
|
|
bestOf: "Best Of",
|
|
creating: "Creating...",
|
|
taskCreated: "Task created successfully!",
|
|
failedCreate: "Failed to create task",
|
|
enterPrompt: "Please enter a prompt",
|
|
tips: "Tips",
|
|
tip1: "Be specific about what you want Codex to implement",
|
|
tip2: "Mention file paths if you know them",
|
|
tip3: "Include any constraints or requirements",
|
|
tip4: "Use \"Best Of\" > 1 to generate multiple solutions and pick the best",
|
|
|
|
// User Info
|
|
loading: "Loading...",
|
|
apiConnection: "API Connection",
|
|
connected: "Connected",
|
|
disconnected: "Disconnected",
|
|
unknown: "Unknown",
|
|
connectedDesc: "Your session is active and connected to Codex API",
|
|
disconnectedDesc: "Could not connect to Codex API. Please check your authentication.",
|
|
apiBase: "API Base",
|
|
refresh: "Refresh",
|
|
accountInfo: "Account Information",
|
|
noName: "No Name",
|
|
userId: "User ID",
|
|
organization: "Organization",
|
|
role: "Role",
|
|
connectionStatus: "Connection Status",
|
|
authRequired: "Authentication required",
|
|
apiInfo: "API Information",
|
|
apiEndpoint: "API Endpoint",
|
|
requestCount: "Request Count",
|
|
|
|
// Documentation
|
|
gettingStarted: "Getting Started",
|
|
usingUI: "Using the UI",
|
|
apiReference: "API Reference",
|
|
cliCommands: "CLI Commands",
|
|
authentication: "Authentication",
|
|
installation: "Installation",
|
|
quickStart: "Quick Start",
|
|
quickStartDesc: "Here's how to get started with Codex Task Runner",
|
|
configDesc: "Configure your environment with the following settings",
|
|
gettingStartedIntro: "Welcome to Codex Task Runner! This guide will help you get started.",
|
|
usingUIIntro: "The UI provides an intuitive way to manage your coding tasks.",
|
|
navigation: "Navigation",
|
|
navigationDesc: "Use the drawer menu to navigate between sections:",
|
|
navTasks: "Tasks - View and manage your coding tasks",
|
|
navNewPrompt: "New Prompt - Create new tasks by sending prompts",
|
|
navAccount: "Account - View your profile and connection status",
|
|
navDocs: "Documentation - Access help and API documentation",
|
|
taskList: "Task List",
|
|
taskListDesc: "Filter and browse tasks with different status filters and limits.",
|
|
taskDetailDesc: "View task details, turns, patches, and create pull requests.",
|
|
keyboardShortcuts: "Keyboard Shortcuts",
|
|
apiReferenceIntro: "Complete API reference for the Codex Task Runner backend.",
|
|
getTasksDesc: "List all tasks with optional filtering",
|
|
getTaskDesc: "Get detailed information about a specific task",
|
|
postPromptDesc: "Create a new coding task from a prompt",
|
|
createPRDesc: "Create a pull request from task changes",
|
|
cliCommandsIntro: "Command-line interface for power users.",
|
|
cliTasksDesc: "List and filter tasks from the command line",
|
|
cliRunDesc: "Run a new task with a prompt",
|
|
cliPollDesc: "Poll a task for status updates",
|
|
cliPRDesc: "Create a pull request for a task",
|
|
authenticationIntro: "Authentication methods and security best practices.",
|
|
apiKey: "API Key",
|
|
apiKeyDesc: "Use an API key for server-to-server authentication",
|
|
sessionCookie: "Session Cookie",
|
|
sessionCookieDesc: "Browser sessions use secure HTTP-only cookies",
|
|
securityTips: "Security Tips",
|
|
securityTip1: "Never share your API key or session cookie",
|
|
securityTip2: "Use environment variables for sensitive data",
|
|
securityTip3: "Rotate API keys periodically",
|
|
securityTip4: "Use HTTPS in production",
|
|
|
|
// Search
|
|
search: "Search",
|
|
searchPlaceholder: "Search tasks, code, patches...",
|
|
noResults: "No results found",
|
|
searchHelp: "Enter a search term to find tasks or code",
|
|
code: "Code",
|
|
|
|
// AJAX Queue
|
|
requests: "Requests"
|
|
},
|
|
|
|
es: {
|
|
tasks: "Tareas",
|
|
newTask: "Nueva Tarea",
|
|
profile: "Perfil",
|
|
taskDetail: "Detalle de Tarea",
|
|
documentation: "Documentación",
|
|
nerdMode: "Modo Nerd",
|
|
theme: "Tema",
|
|
language: "Idioma",
|
|
filter: "Filtro",
|
|
limit: "Límite",
|
|
current: "Actual",
|
|
archived: "Archivado",
|
|
all: "Todos",
|
|
noTasks: "No se encontraron tareas",
|
|
tasksCount: "tareas",
|
|
view: "Ver",
|
|
getPatch: "Obtener Parche",
|
|
archive: "Archivar",
|
|
noRepo: "Sin repo",
|
|
untitledTask: "Tarea sin título",
|
|
backToTasks: "Volver a Tareas",
|
|
details: "Detalles",
|
|
turns: "Turnos",
|
|
patch: "Parche",
|
|
createPR: "Crear PR",
|
|
prCreated: "¡PR creado exitosamente!",
|
|
failedCreatePR: "Error al crear PR",
|
|
copied: "¡Copiado al portapapeles!",
|
|
loadPatch: "Cargar Parche",
|
|
noPatch: "No hay datos de parche disponibles",
|
|
rawTaskData: "Datos Brutos de Tarea",
|
|
currentTurn: "Turno Actual",
|
|
lines: "líneas",
|
|
createNewTask: "Crear Nueva Tarea",
|
|
sendPromptDesc: "Envía un prompt a Codex para crear una nueva tarea de código",
|
|
taskPrompt: "Prompt de Tarea",
|
|
promptPlaceholder: "Describe lo que quieres que Codex haga...",
|
|
branch: "Rama",
|
|
bestOf: "Mejor de",
|
|
creating: "Creando...",
|
|
taskCreated: "¡Tarea creada exitosamente!",
|
|
failedCreate: "Error al crear tarea",
|
|
enterPrompt: "Por favor ingresa un prompt",
|
|
tips: "Consejos",
|
|
tip1: "Sé específico sobre lo que quieres que Codex implemente",
|
|
tip2: "Menciona las rutas de archivos si las conoces",
|
|
tip3: "Incluye restricciones o requisitos",
|
|
tip4: "Usa \"Mejor de\" > 1 para generar múltiples soluciones",
|
|
loading: "Cargando...",
|
|
apiConnection: "Conexión API",
|
|
connected: "Conectado",
|
|
disconnected: "Desconectado",
|
|
unknown: "Desconocido",
|
|
connectedDesc: "Tu sesión está activa y conectada a la API de Codex",
|
|
disconnectedDesc: "No se pudo conectar a la API. Verifica tu autenticación.",
|
|
apiBase: "Base API",
|
|
refresh: "Actualizar",
|
|
accountInfo: "Información de Cuenta",
|
|
connectionStatus: "Estado de Conexión",
|
|
gettingStarted: "Primeros Pasos",
|
|
usingUI: "Usando la UI",
|
|
apiReference: "Referencia API",
|
|
cliCommands: "Comandos CLI",
|
|
authentication: "Autenticación",
|
|
search: "Buscar",
|
|
searchPlaceholder: "Buscar tareas, código, parches...",
|
|
noResults: "Sin resultados",
|
|
code: "Código",
|
|
requests: "Solicitudes"
|
|
},
|
|
|
|
fr: {
|
|
tasks: "Tâches",
|
|
newTask: "Nouvelle Tâche",
|
|
profile: "Profil",
|
|
taskDetail: "Détail de Tâche",
|
|
documentation: "Documentation",
|
|
nerdMode: "Mode Nerd",
|
|
theme: "Thème",
|
|
language: "Langue",
|
|
filter: "Filtre",
|
|
limit: "Limite",
|
|
current: "Actuel",
|
|
archived: "Archivé",
|
|
all: "Tous",
|
|
noTasks: "Aucune tâche trouvée",
|
|
tasksCount: "tâches",
|
|
view: "Voir",
|
|
getPatch: "Obtenir Patch",
|
|
archive: "Archiver",
|
|
backToTasks: "Retour aux Tâches",
|
|
details: "Détails",
|
|
turns: "Tours",
|
|
patch: "Patch",
|
|
createPR: "Créer PR",
|
|
createNewTask: "Créer Nouvelle Tâche",
|
|
loading: "Chargement...",
|
|
connected: "Connecté",
|
|
disconnected: "Déconnecté",
|
|
refresh: "Rafraîchir",
|
|
search: "Rechercher",
|
|
noResults: "Aucun résultat",
|
|
code: "Code",
|
|
requests: "Requêtes"
|
|
},
|
|
|
|
de: {
|
|
tasks: "Aufgaben",
|
|
newTask: "Neue Aufgabe",
|
|
profile: "Profil",
|
|
taskDetail: "Aufgabendetail",
|
|
documentation: "Dokumentation",
|
|
nerdMode: "Nerd-Modus",
|
|
theme: "Thema",
|
|
language: "Sprache",
|
|
filter: "Filter",
|
|
limit: "Limit",
|
|
current: "Aktuell",
|
|
archived: "Archiviert",
|
|
all: "Alle",
|
|
noTasks: "Keine Aufgaben gefunden",
|
|
view: "Ansehen",
|
|
backToTasks: "Zurück zu Aufgaben",
|
|
details: "Details",
|
|
turns: "Runden",
|
|
patch: "Patch",
|
|
createPR: "PR erstellen",
|
|
createNewTask: "Neue Aufgabe erstellen",
|
|
loading: "Laden...",
|
|
connected: "Verbunden",
|
|
disconnected: "Getrennt",
|
|
refresh: "Aktualisieren",
|
|
search: "Suchen",
|
|
noResults: "Keine Ergebnisse",
|
|
code: "Code",
|
|
requests: "Anfragen"
|
|
},
|
|
|
|
ja: {
|
|
tasks: "タスク",
|
|
newTask: "新規タスク",
|
|
profile: "プロフィール",
|
|
taskDetail: "タスク詳細",
|
|
documentation: "ドキュメント",
|
|
nerdMode: "ナードモード",
|
|
theme: "テーマ",
|
|
language: "言語",
|
|
filter: "フィルター",
|
|
limit: "制限",
|
|
current: "現在",
|
|
archived: "アーカイブ済み",
|
|
all: "すべて",
|
|
noTasks: "タスクが見つかりません",
|
|
view: "表示",
|
|
backToTasks: "タスクに戻る",
|
|
details: "詳細",
|
|
turns: "ターン",
|
|
patch: "パッチ",
|
|
createPR: "PRを作成",
|
|
createNewTask: "新規タスクを作成",
|
|
loading: "読み込み中...",
|
|
connected: "接続済み",
|
|
disconnected: "切断",
|
|
refresh: "更新",
|
|
search: "検索",
|
|
noResults: "結果なし",
|
|
code: "コード",
|
|
requests: "リクエスト"
|
|
},
|
|
|
|
zh: {
|
|
tasks: "任务",
|
|
newTask: "新任务",
|
|
profile: "个人资料",
|
|
taskDetail: "任务详情",
|
|
documentation: "文档",
|
|
nerdMode: "极客模式",
|
|
theme: "主题",
|
|
language: "语言",
|
|
filter: "筛选",
|
|
limit: "限制",
|
|
current: "当前",
|
|
archived: "已归档",
|
|
all: "全部",
|
|
noTasks: "未找到任务",
|
|
view: "查看",
|
|
backToTasks: "返回任务",
|
|
details: "详情",
|
|
turns: "轮次",
|
|
patch: "补丁",
|
|
createPR: "创建PR",
|
|
createNewTask: "创建新任务",
|
|
loading: "加载中...",
|
|
connected: "已连接",
|
|
disconnected: "已断开",
|
|
refresh: "刷新",
|
|
search: "搜索",
|
|
noResults: "无结果",
|
|
code: "代码",
|
|
requests: "请求"
|
|
},
|
|
|
|
ko: {
|
|
tasks: "작업",
|
|
newTask: "새 작업",
|
|
profile: "프로필",
|
|
documentation: "문서",
|
|
nerdMode: "너드 모드",
|
|
theme: "테마",
|
|
language: "언어",
|
|
filter: "필터",
|
|
current: "현재",
|
|
archived: "보관됨",
|
|
all: "전체",
|
|
view: "보기",
|
|
loading: "로딩 중...",
|
|
connected: "연결됨",
|
|
refresh: "새로고침",
|
|
search: "검색",
|
|
requests: "요청"
|
|
},
|
|
|
|
ru: {
|
|
tasks: "Задачи",
|
|
newTask: "Новая задача",
|
|
profile: "Профиль",
|
|
documentation: "Документация",
|
|
nerdMode: "Режим гика",
|
|
theme: "Тема",
|
|
language: "Язык",
|
|
filter: "Фильтр",
|
|
current: "Текущие",
|
|
archived: "Архив",
|
|
all: "Все",
|
|
view: "Просмотр",
|
|
loading: "Загрузка...",
|
|
connected: "Подключено",
|
|
refresh: "Обновить",
|
|
search: "Поиск",
|
|
requests: "Запросы"
|
|
}
|
|
// Additional languages follow same pattern...
|
|
})
|
|
|
|
/**
|
|
* Set language
|
|
*/
|
|
function setLanguage(lang) {
|
|
if (languages[lang]) {
|
|
language = lang
|
|
currentLanguage = lang
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get translation for key
|
|
*/
|
|
function t(key) {
|
|
const langTranslations = translations[language]
|
|
if (langTranslations && langTranslations[key]) {
|
|
return langTranslations[key]
|
|
}
|
|
// Fallback to English
|
|
if (translations.en && translations.en[key]) {
|
|
return translations.en[key]
|
|
}
|
|
return key
|
|
}
|
|
|
|
/**
|
|
* Get language info
|
|
*/
|
|
function getLanguageInfo(lang) {
|
|
return languages[lang] || languages.en
|
|
}
|
|
}
|