diff --git a/src/i18n/locales/en/agents.json b/src/i18n/locales/en/agents.json index 503285c..3765d5c 100644 --- a/src/i18n/locales/en/agents.json +++ b/src/i18n/locales/en/agents.json @@ -4,6 +4,9 @@ "bindAccountPasswordRequired": "This agent has no login account yet. Enter an initial password to create one.", "childrenCount": "Direct downline", "code": "Code", + "agentCode": "Agent code", + "agentName": "Agent name", + "loginUsername": "Login name", "codeRequired": "Code and name are required", "createChild": "Add child agent", "createSuccess": "Created agent {{name}}", @@ -29,6 +32,7 @@ "deleteSuccess": "Deleted agent {{name}}", "depth": "Depth", "detailTitle": "Node details", + "detailTabs": "Agent details", "directoryStatus": { "all": "All statuses", "disabled": "Disabled only", @@ -78,6 +82,7 @@ "downlineEmptyShort": "No direct downline yet.", "downlineEmptyTitle": "No direct downline yet", "editAccount": "Account & status", + "editAgent": "Edit agent", "editCurrent": "Edit this agent", "expand": "Expand", "kicker": "Credit share · Agent tree", @@ -107,6 +112,13 @@ "tabDownline": "Downline", "tabOverview": "Overview", "tabPlayers": "Players", + "createDirectPlayer": "Create direct player", + "createDownline": "Create child agent", + "editDownline": "Edit agent", + "deleteDownline": "Delete agent", + "addChildUnavailableHint": "This agent has not enabled \"Allow creating sub-agents\". Adjust the agent profile first.", + "addChildNoPermissionHint": "Your account does not have permission to create sub-agents on this node.", + "lineRootProfileReadOnlyHint": "Level-1 agent share, site credit, and rebate are configured by the platform super admin. You can grant credit to downline agents and players.", "tabProfile": "Share & credit", "tabProfileReadOnly": "Share & credit (read-only)", "viewAll": "View all" @@ -187,6 +199,9 @@ "creditExceedsParentWithMax": "Credit limit cannot exceed {{max}}", "creditInvalid": "Credit limit cannot be negative", "defaultExceedsLimit": "Default player rebate cannot exceed the rebate ceiling", + "defaultExceedsLimitWithMax": "Default player rebate cannot exceed {{max}}%", + "shareExceedsParent": "Share rate cannot exceed parent (max {{max}}%)", + "rebateExceedsParent": "Rebate ceiling cannot exceed parent (max {{max}}%)", "defaultRebateRange": "Default player rebate must be between 0 and 100%", "rebateLimitRange": "Rebate ceiling must be between 0 and 100%", "shareRange": "Share rate must be between 0 and 100" @@ -381,6 +396,7 @@ "updateSuccess": "Updated {{name}}", "usernamePlaceholder": "Enter login username", "usernameRequired": "Login name is required", + "usernameInvalidCharset": "Login name may only contain letters, digits, dots (.), underscores, and hyphens", "users": { "create": "Create account", "createSuccess": "Created account {{name}}", diff --git a/src/i18n/locales/en/common.json b/src/i18n/locales/en/common.json index 4e13209..0415ee2 100644 --- a/src/i18n/locales/en/common.json +++ b/src/i18n/locales/en/common.json @@ -28,6 +28,7 @@ "done": "Done", "exportExcel": "Export Excel", "save": "Save changes", + "saving": "Saving…", "updateSuccess": "Updated successfully", "updateFailed": "Update failed", "updatePassword": "Update password" @@ -110,7 +111,15 @@ "noResource": "No resources", "noData": "No resources", "loading": "Loading…", - "comingSoon": "Feature under development" + "comingSoon": "Feature under development", + "yes": "Yes", + "no": "No", + "none": "None" + }, + "status": { + "enabled": "Enabled", + "disabled": "Disabled", + "label": "Status" }, "integrationSites": { "emptyPlatformHint": "No integration sites yet. Create a site before managing agents, players, or settlement.", diff --git a/src/i18n/locales/en/config.json b/src/i18n/locales/en/config.json index ce1060d..e92ceca 100644 --- a/src/i18n/locales/en/config.json +++ b/src/i18n/locales/en/config.json @@ -54,6 +54,8 @@ "description": "Jump to play rules, odds & rebate, jackpot, and risk cap by domain. The sidebar provides direct links; this page is an overview.", "integrationDesc": "site_code, JWT secrets, partner wallet URL, iframe allowlist", "integrationTitle": "Integration sites", + "currenciesDesc": "Manage supported currencies and precision", + "currenciesTitle": "Currencies", "jackpotDesc": "Pool parameters and ledger records", "jackpotTitle": "Jackpot", "oddsDesc": "Odds matrix and base rebate in one version stream", @@ -62,6 +64,8 @@ "playsTitle": "Play rules", "riskCapDesc": "Per-number payout caps and occupancy", "riskCapTitle": "Risk cap rules", + "settingsDesc": "Payout, rebate, and other system-level parameters", + "settingsTitle": "System settings", "title": "Operations configuration" }, "integrationSites": { diff --git a/src/i18n/locales/ne/agents.json b/src/i18n/locales/ne/agents.json index 4be5b55..cc67169 100644 --- a/src/i18n/locales/ne/agents.json +++ b/src/i18n/locales/ne/agents.json @@ -4,6 +4,9 @@ "bindAccountPasswordRequired": "This agent has no login account yet. Enter an initial password.", "childrenCount": "प्रत्यक्ष अधीनस्थ", "code": "Code", + "agentCode": "एजेन्ट कोड", + "agentName": "एजेन्ट नाम", + "loginUsername": "लगइन नाम", "codeRequired": "Code and name are required", "createChild": "Add child agent", "createSuccess": "Created agent {{name}}", @@ -29,6 +32,7 @@ "deleteSuccess": "Deleted agent {{name}}", "depth": "Depth", "detailTitle": "Node details", + "detailTabs": "एजेन्ट विवरण", "directoryStatus": { "all": "सबै स्थिति", "disabled": "निष्क्रिय मात्र", @@ -66,6 +70,8 @@ "directChildren": "प्रत्यक्ष अधीनस्थ {{count}}", "downlineEmptyTitle": "अहिले प्रत्यक्ष अधीनस्थ छैन", "editAccount": "खाता र स्थिति", + "editAgent": "एजेन्ट सम्पादन", + "editCurrent": "यो एजेन्ट सम्पादन", "kicker": "क्रेडिट शेयर · एजेन्ट ट्री", "noDelegatedTabs": "यो एजेन्टले अधीनस्थ एजेन्ट वा खेलाडी सिर्जना गर्न सक्दैन; शेयर र क्रेडिट मात्र लागू हुन्छ।", "overviewDownlineCard": "प्रत्यक्ष अधीनस्थ एजेन्ट हेर्नुहोस् र व्यवस्थापन गर्नुहोस्", @@ -81,6 +87,13 @@ "tabDownline": "अधीनस्थ", "tabOverview": "अवलोकन", "tabPlayers": "खेलाडी", + "createDirectPlayer": "प्रत्यक्ष खेलाडी सिर्जना", + "createDownline": "चाइल्ड एजेन्ट सिर्जना", + "editDownline": "एजेन्ट सम्पादन", + "deleteDownline": "एजेन्ट मेटाउनुहोस्", + "addChildUnavailableHint": "यो एजेन्टले अधीनस्थ एजेन्ट सिर्जना अनुमति दिएको छैन। पहिले एजेन्ट प्रोफाइल मिलाउनुहोस्।", + "addChildNoPermissionHint": "तपाईंको खातासँग यो नोडमा चाइल्ड एजेन्ट सिर्जनाको अनुमति छैन।", + "lineRootProfileReadOnlyHint": "प्रथम-स्तर एजेन्टको शेयर, साइट क्रेडिट र रिबेट प्लेटफर्म सुपर एडमिनले कन्फिग गर्छ। तपाईंले अधीनस्थ एजेन्ट र खेलाडीलाई क्रेडिट दिन सक्नुहुन्छ।", "tabProfile": "शेयर र क्रेडिट", "tabProfileReadOnly": "शेयर र क्रेडिट (पढ्न मात्र)", "viewAll": "सबै हेर्नुहोस्" @@ -140,6 +153,9 @@ "creditExceedsParentWithMax": "क्रेडिट सीमा {{max}} भन्दा बढी हुन सक्दैन", "creditInvalid": "Credit limit cannot be negative", "defaultExceedsLimit": "Default player rebate cannot exceed the rebate ceiling", + "defaultExceedsLimitWithMax": "Default player rebate cannot exceed {{max}}%", + "shareExceedsParent": "Share rate cannot exceed parent (max {{max}}%)", + "rebateExceedsParent": "Rebate ceiling cannot exceed parent (max {{max}}%)", "defaultRebateRange": "Default player rebate must be between 0 and 1", "rebateLimitRange": "Rebate ceiling must be between 0 and 1", "shareRange": "Share rate must be between 0 and 100" @@ -234,6 +250,7 @@ "updateSuccess": "Updated {{name}}", "usernamePlaceholder": "लगइन नाम प्रविष्ट गर्नुहोस्", "usernameRequired": "Login name is required", + "usernameInvalidCharset": "लगइन नाममा अक्षर, अंक, थोप्लो (.), अन्डरस्कोर र हाइफन मात्र हुन सक्छ", "users": { "create": "Create account", "createSuccess": "Created account {{name}}", diff --git a/src/i18n/locales/ne/common.json b/src/i18n/locales/ne/common.json index d46a24b..9b2b5ac 100644 --- a/src/i18n/locales/ne/common.json +++ b/src/i18n/locales/ne/common.json @@ -16,6 +16,7 @@ "reset": "रिसेट", "reviewNow": "अहिले समीक्षा गर्नुहोस्", "save": "परिवर्तन सुरक्षित गर्नुहोस्", + "saving": "सुरक्षित हुँदैछ…", "search": "खोज", "submitting": "पेश हुँदैछ...", "updateFailed": "अद्यावधिक असफल भयो", @@ -229,7 +230,15 @@ "comingSoon": "सुविधा विकासमा छ", "loading": "लोड हुँदैछ…", "noData": "स्रोत छैन", - "noResource": "स्रोत छैन" + "noResource": "स्रोत छैन", + "yes": "हो", + "no": "होइन", + "none": "छैन" + }, + "status": { + "enabled": "सक्रिय", + "disabled": "निष्क्रिय", + "label": "स्थिति" }, "table": { "actions": "कार्य", diff --git a/src/i18n/locales/ne/config.json b/src/i18n/locales/ne/config.json index d151469..65a2846 100644 --- a/src/i18n/locales/ne/config.json +++ b/src/i18n/locales/ne/config.json @@ -54,6 +54,8 @@ "description": "खेल नियम, बाधा/रिबेट, Jackpot र क्याप क्षेत्रअनुसार खोल्नुहोस्। साइडबारबाट सिधा जान सकिन्छ; यो पृष्ठ सारांश हो।", "integrationDesc": "site_code, JWT गोप्य, पार्टनर वालेट URL र iframe श्वेतसूची", "integrationTitle": "मुख्य साइट एकीकरण", + "currenciesDesc": "समर्थित मुद्रा र परिशुद्धता व्यवस्थापन", + "currenciesTitle": "मुद्रा व्यवस्थापन", "jackpotDesc": "पूल प्यारामिटर र लेजर", "jackpotTitle": "Jackpot", "oddsDesc": "बाधा म्याट्रिक्स र रिबेट, एउटै संस्करण", @@ -62,6 +64,8 @@ "playsTitle": "खेल नियम", "riskCapDesc": "नम्बर क्याप र ओगट उपस्थिति", "riskCapTitle": "जोखिम क्याप", + "settingsDesc": "भुक्तानी, रिबेट र अन्य प्रणाली-स्तर प्यारामिटर", + "settingsTitle": "प्रणाली सेटिङ", "title": "सञ्चालन कन्फिगरेसन अवलोकन" }, "integrationSites": { diff --git a/src/i18n/locales/zh/agents.json b/src/i18n/locales/zh/agents.json index def45d8..9bbf74d 100644 --- a/src/i18n/locales/zh/agents.json +++ b/src/i18n/locales/zh/agents.json @@ -28,6 +28,13 @@ "overviewPlayersSummary": "玩家管理", "tabDownline": "直属下级", "tabPlayers": "直属玩家", + "createDirectPlayer": "创建直属玩家", + "createDownline": "创建下级代理", + "editDownline": "编辑代理", + "deleteDownline": "删除代理", + "addChildUnavailableHint": "当前代理未开启“允许创建下级代理”,如需新增请先调整该代理配置。", + "addChildNoPermissionHint": "当前账号没有为该节点创建下级代理的权限。", + "lineRootProfileReadOnlyHint": "一级代理的占成、站点授信总额与回水由平台超管配置;您可向直属下级代理与玩家下放额度。", "playersUnavailableHint": "当前代理未开启“允许创建玩家”,如需新增请先调整该代理配置。", "playersNoPermissionHint": "当前账号没有该节点的玩家管理权限。", "downlineColumns": { @@ -35,6 +42,7 @@ "downlineCount": "下级数" }, "editAccount": "账号与状态", + "editAgent": "编辑代理", "editCurrent": "编辑本代理", "saveProfile": "保存占成与授信", "profileTabHint": "占成、授信、回水与风控标签在此维护;登录名与密码请用「账号与状态」。", @@ -85,6 +93,7 @@ "listFlatHint": "列表平铺展示所有经营代理;添加下级请使用行内「添加下级代理」。", "addChildNeedParent": "请先在「上级代理」中选择要为谁添加下级", "detailTitle": "代理详情", + "detailTabs": "代理详情", "selectNode": "请选择代理", "loadFailed": "加载代理列表失败", "lineFilter": "一级代理", @@ -105,6 +114,9 @@ "users": "仍有 {{count}} 个账号需先处理" }, "code": "编码", + "agentCode": "代理编码", + "agentName": "代理名称", + "loginUsername": "登录名", "name": "名称", "namePlaceholder": "请输入代理名称", "depth": "层级", @@ -118,6 +130,7 @@ "codeRequired": "请填写代理名称和登录名", "nameRequired": "请填写代理名称", "usernameRequired": "请填写登录名", + "usernameInvalidCharset": "登录名只能使用字母、数字、点(.)、下划线和连字符", "passwordRequired": "请填写密码", "passwordMinLength": "密码至少 8 位", "bindAccountPasswordRequired": "该代理尚未绑定登录账号,请填写初始密码以创建账号", @@ -162,7 +175,10 @@ "creditExceedsParentWithMax": "授信额度不能超过 {{max}}", "rebateLimitRange": "回水上限须在 0–100% 之间", "defaultRebateRange": "默认玩家回水须在 0–100% 之间", - "defaultExceedsLimit": "默认玩家回水不能超过回水上限" + "defaultExceedsLimit": "默认玩家回水不能超过回水上限", + "defaultExceedsLimitWithMax": "默认玩家回水不能超过 {{max}}%", + "shareExceedsParent": "实际占成不能超过上级(最高 {{max}}%)", + "rebateExceedsParent": "回水上限不能超过上级(最高 {{max}}%)" }, "riskTags": "风控标签", "riskTagsPlaceholder": "逗号分隔,如 overdue, high_turnover", diff --git a/src/i18n/locales/zh/common.json b/src/i18n/locales/zh/common.json index 3837682..9a88aa2 100644 --- a/src/i18n/locales/zh/common.json +++ b/src/i18n/locales/zh/common.json @@ -28,6 +28,7 @@ "done": "完成", "exportExcel": "导出 Excel", "save": "保存修改", + "saving": "保存中…", "updateSuccess": "更新成功", "updateFailed": "更新失败", "updatePassword": "更新密码" @@ -110,7 +111,15 @@ "noResource": "暂无资源", "noData": "暂无资源", "loading": "加载中…", - "comingSoon": "功能开发中" + "comingSoon": "功能开发中", + "yes": "是", + "no": "否", + "none": "无" + }, + "status": { + "enabled": "启用", + "disabled": "停用", + "label": "状态" }, "integrationSites": { "emptyPlatformHint": "暂无接入站点。请先创建站点,再进行代理、玩家、结算等业务操作。", diff --git a/src/i18n/locales/zh/config.json b/src/i18n/locales/zh/config.json index 258f2ec..4211a25 100644 --- a/src/i18n/locales/zh/config.json +++ b/src/i18n/locales/zh/config.json @@ -32,7 +32,11 @@ "riskCapTitle": "限额版本", "riskCapDesc": "号码赔付封顶与占用视图", "integrationTitle": "接入站点", - "integrationDesc": "site_code、JWT 密钥、主站钱包 URL 与 iframe 白名单" + "integrationDesc": "site_code、JWT 密钥、主站钱包 URL 与 iframe 白名单", + "settingsTitle": "系统设置", + "settingsDesc": "开奖赔付、回水等系统级参数", + "currenciesTitle": "币种管理", + "currenciesDesc": "维护支持的币种与精度" }, "integrationSites": { "title": "接入站点", diff --git a/src/modules/config/config-hub-screen.tsx b/src/modules/config/config-hub-screen.tsx index 23f0bbe..1407aef 100644 --- a/src/modules/config/config-hub-screen.tsx +++ b/src/modules/config/config-hub-screen.tsx @@ -6,7 +6,7 @@ import { ChevronRight } from "lucide-react"; import { ModuleScaffold } from "@/components/admin/module-scaffold"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; -import { PRD_INTEGRATION_ACCESS_ANY } from "@/lib/admin-prd"; +import { PRD_INTEGRATION_ACCESS_ANY, PRD_SETTINGS_ACCESS_ANY, PRD_CURRENCY_MANAGE } from "@/lib/admin-prd"; import { useAdminProfile } from "@/stores/admin-session"; import { adminHasAnyPermission } from "@/lib/admin-permissions"; @@ -48,6 +48,18 @@ const HUB_CARDS: HubCard[] = [ descKey: "hub.integrationDesc", requiredAny: PRD_INTEGRATION_ACCESS_ANY, }, + { + href: "/admin/settings", + titleKey: "hub.settingsTitle", + descKey: "hub.settingsDesc", + requiredAny: PRD_SETTINGS_ACCESS_ANY, + }, + { + href: "/admin/currencies", + titleKey: "hub.currenciesTitle", + descKey: "hub.currenciesDesc", + requiredAny: [PRD_CURRENCY_MANAGE], + }, ]; export function ConfigHubScreen() {