Compare commits

...

4 Commits

Author SHA1 Message Date
dependabot[bot] e2f75acad2 chore(deps): bump github.com/klauspost/compress from 1.19.1 to 1.19.2 (#6212)
Bumps [github.com/klauspost/compress](https://github.com/klauspost/compress) from 1.19.1 to 1.19.2.
- [Release notes](https://github.com/klauspost/compress/releases)
- [Commits](https://github.com/klauspost/compress/compare/v1.19.1...v1.19.2)

---
updated-dependencies:
- dependency-name: github.com/klauspost/compress
  dependency-version: 1.19.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-12 16:57:37 +02:00
Chen, Ting-An 69a8237581 fix(i18n): localize Chinese Xray labels (#6202)
* fix(i18n): localize Traditional Chinese Xray labels

Several navigation, outbound, balancer, VPN, and DNS labels still displayed their English source text in the zh-TW interface. Translate the non-protocol labels while retaining established Xray terminology.

* fix(i18n): localize Simplified Chinese Xray labels

Mirror the reviewed Xray UI coverage in zh-CN so the same labels no longer fall back to English there.

Signed-off-by: 陳廷安 <73953029+nrps9909@users.noreply.github.com>

---------

Signed-off-by: 陳廷安 <73953029+nrps9909@users.noreply.github.com>
Co-authored-by: Sanaei <ho3ein.sanaei@gmail.com>
2026-08-12 16:56:11 +02:00
Sanaei f3f57e66f5 fix(frontend): wait out Collapse fade before a11y scan in ConfigBlock story
Collapse animates opacity in over motionDurationMid; the Collapsed story's
play function only waited for visibility, so the addon-a11y color-contrast
check could sample a mid-fade, lower-contrast frame and fail flakily in CI.
Wait for the panel's opacity to settle to 1 first.
2026-08-12 16:43:57 +02:00
Sanaei 8a8da88548 fix(frontend): isolate swagger deps from main vendor chunk
Keep swagger-ui-react and its transitive dependencies in the lazy swagger chunk so the initial panel bundle stays smaller. This avoids eager loading the OpenAPI UI on first paint while keeping the API docs route unchanged.
2026-08-12 16:11:47 +02:00
6 changed files with 79 additions and 21 deletions
@@ -36,11 +36,17 @@ const sampleLink = 'vless://11112222-3333-4444-5555-666677778888@panel.example.c
export const Collapsed: Story = {
args: { label: 'vless', text: sampleLink, fileName: 'client-config.txt' },
play: async ({ canvas, userEvent }) => {
play: async ({ canvas, canvasElement, userEvent }) => {
await expect(canvas.queryByText(/vless:\/\/11112222/)).not.toBeInTheDocument();
await userEvent.click(canvas.getByText('vless'));
const configText = await canvas.findByText(/vless:\/\/11112222/);
await waitFor(() => expect(configText).toBeVisible());
// Collapse fades content in over motionDurationMid; wait it out so the a11y
// scan doesn't sample a mid-transition, lower-contrast opacity.
await waitFor(() => {
const panel = canvasElement.querySelector('.ant-collapse-panel');
expect(panel && getComputedStyle(panel).opacity).toBe('1');
});
await expect(canvas.getByRole('button', { name: 'Copy' })).toBeVisible();
await expect(canvas.getByRole('button', { name: 'Download' })).toBeVisible();
await expect(canvas.getByRole('button', { name: 'QR Code' })).toBeVisible();
+52
View File
@@ -151,6 +151,57 @@ function makeBackendProxy(target) {
};
}
// Deps only reachable through swagger-ui-react (verified via `npm ls`). The
// catch-all `vendor` chunk would otherwise eager-load them on first paint,
// although the api-docs page is the only lazy route importing them.
const SWAGGER_ONLY_DEPS = [
'@babel/runtime-corejs3',
'@scarf/scarf',
'@swagger-api/apidom-',
'@swaggerexpert/',
'base64-js',
'buffer',
'classnames',
'css.escape',
'deep-extend',
'dompurify',
'fast-json-patch',
'highlight.js',
'highlightjs-vue',
'ieee754',
'immutable',
'js-file-download',
'js-yaml',
'lodash',
'lowlight',
'neotraverse',
'node-abort-controller',
'openapi-path-templating',
'openapi-server-url-templating',
'prismjs',
'prop-types',
'ramda',
'ramda-adjunct',
'randexp',
'react-copy-to-clipboard',
'react-debounce-input',
'react-immutable-proptypes',
'react-immutable-pure-component',
'react-inspector',
'react-redux',
'react-syntax-highlighter',
'redux',
'redux-immutable',
'remarkable',
'reselect',
'serialize-error',
'sha.js',
'url-parse',
'xml',
'xml-but-prettier',
'zenscroll',
];
export default defineConfig({
plugins: [react(), injectBasePathPlugin(), rocketLoaderOptOutPlugin()],
resolve: {
@@ -222,6 +273,7 @@ export default defineConfig({
id.includes('/node_modules/swagger-ui-react/')
|| id.includes('/node_modules/swagger-ui/')
|| id.includes('/node_modules/swagger-client/')
|| SWAGGER_ONLY_DEPS.some((dep) => id.includes(`/node_modules/${dep}/`))
) return 'vendor-swagger';
if (id.includes('/node_modules/uplot/')) return 'vendor-uplot';
if (id.includes('dayjs')) return 'vendor-dayjs';
+1 -1
View File
@@ -64,7 +64,7 @@ require (
github.com/jinzhu/now v1.1.5 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/juju/ratelimit v1.0.2 // indirect
github.com/klauspost/compress v1.19.1
github.com/klauspost/compress v1.19.2
github.com/klauspost/cpuid/v2 v2.4.0 // indirect
github.com/leodido/go-urn v1.5.0 // indirect
github.com/lufia/plan9stats v0.0.0-20260802145828-341c2f0c90b5 // indirect
+2 -2
View File
@@ -115,8 +115,8 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/juju/ratelimit v1.0.2 h1:sRxmtRiajbvrcLQT7S+JbqU0ntsb9W2yhSdNN8tWfaI=
github.com/juju/ratelimit v1.0.2/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk=
github.com/klauspost/compress v1.19.1 h1:VsB4HPswih7mmZ8WleSFQ75c/Ui1M4trX5oAsJnhSlk=
github.com/klauspost/compress v1.19.1/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ=
github.com/klauspost/compress v1.19.2 h1:hMRETovs/pu/dVWN7zIT1PGG8t509MwT6bO7XSi26R8=
github.com/klauspost/compress v1.19.2/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ=
github.com/klauspost/cpuid/v2 v2.4.0 h1:S6Hrbc7+ywsr0r+RLapfGBHfyefhCTwEh3A0tV913Dw=
github.com/klauspost/cpuid/v2 v2.4.0/go.mod h1:19jmZ9mjzoF//ddRSUsv0zfBTJWh3QJh9FNxZTMrGxU=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+8 -8
View File
@@ -1503,8 +1503,8 @@
},
"outbound": {
"tag": "标签",
"egress": "Egress",
"egressHint": "Run an HTTP test to show egress IP and country.",
"egress": "出口",
"egressHint": "执行 HTTP 测试以显示出口 IP 和所在国家/地区。",
"outboundStatus": "出站状态",
"sendThrough": "发送通过",
"targetStrategy": "目标解析策略",
@@ -1607,14 +1607,14 @@
"tagDuplicate": "该标签已被其他均衡器使用",
"tagPlaceholder": "唯一均衡器标签",
"selector": "选择器",
"fallback": "Fallback",
"fallback": "备用负载均衡器",
"cycleTooltip": "循环: {path} → (回到 {start})",
"expected": "期望",
"expectedPlaceholder": "最佳节点数",
"maxRtt": "最大 RTT",
"tolerance": "容差",
"baselines": "Baselines",
"costs": "Costs",
"baselines": "基准值",
"costs": "成本设置",
"costMatch": "标签匹配模式",
"costValue": "权重",
"costRegexp": "正则表达式匹配",
@@ -1635,7 +1635,7 @@
"userLevel": "用户级别"
},
"nord": {
"accessToken": "Access token",
"accessToken": "访问令牌",
"privateKey": "私钥",
"noServers": "未找到选定国家/地区的服务器",
"noPublicKey": "选定的服务器未公布 NordLynx 公钥。",
@@ -1651,7 +1651,7 @@
"licenseError": "设置 WARP 许可证失败。",
"fetchFirst": "请先获取 WARP 配置。",
"createAccount": "创建 WARP 账户",
"accessToken": "Access token",
"accessToken": "访问令牌",
"deviceId": "设备 ID",
"licenseKey": "许可证密钥",
"privateKey": "私钥",
@@ -1702,7 +1702,7 @@
"timeoutMs": "超时 (毫秒)",
"skipFallback": "跳过回退",
"finalQuery": "最终查询",
"hosts": "Hosts",
"hosts": "主机映射",
"hostsAdd": "添加 Host",
"hostsEmpty": "未定义任何 Host",
"hostsDomain": "域名 (例如 domain:example.com)",
+9 -9
View File
@@ -107,7 +107,7 @@
"outbounds": "出站",
"apiDocs": "API 文件",
"donate": "捐贈",
"hosts": "Hosts",
"hosts": "主機",
"docs": "文件",
"openMenu": "開啟選單",
"pinSidebar": "固定側邊欄",
@@ -1503,8 +1503,8 @@
},
"outbound": {
"tag": "標籤",
"egress": "Egress",
"egressHint": "Run an HTTP test to show egress IP and country.",
"egress": "出口",
"egressHint": "執行 HTTP 測試以顯示出口 IP 與所在國家/地區。",
"outboundStatus": "出站狀態",
"sendThrough": "傳送通過",
"targetStrategy": "目標解析策略",
@@ -1607,14 +1607,14 @@
"tagDuplicate": "該標籤已被其他均衡器使用",
"tagPlaceholder": "唯一均衡器標籤",
"selector": "選擇器",
"fallback": "Fallback",
"fallback": "備用負載平衡器",
"cycleTooltip": "循環: {path} → (回到 {start})",
"expected": "期望",
"expectedPlaceholder": "最佳節點數",
"maxRtt": "最大 RTT",
"tolerance": "容差",
"baselines": "Baselines",
"costs": "Costs",
"baselines": "基準值",
"costs": "成本設定",
"costMatch": "標籤比對模式",
"costValue": "權重",
"costRegexp": "正規表示式比對",
@@ -1635,7 +1635,7 @@
"userLevel": "用戶級別"
},
"nord": {
"accessToken": "Access token",
"accessToken": "存取權杖",
"privateKey": "私鑰",
"noServers": "未找到選定國家/地區的伺服器",
"noPublicKey": "選定的伺服器未公布 NordLynx 公鑰。",
@@ -1651,7 +1651,7 @@
"licenseError": "設定 WARP 授權失敗。",
"fetchFirst": "請先取得 WARP 設定。",
"createAccount": "建立 WARP 帳號",
"accessToken": "Access token",
"accessToken": "存取權杖",
"deviceId": "裝置 ID",
"licenseKey": "授權金鑰",
"privateKey": "私鑰",
@@ -1702,7 +1702,7 @@
"timeoutMs": "逾時 (毫秒)",
"skipFallback": "跳過回退",
"finalQuery": "最終查詢",
"hosts": "Hosts",
"hosts": "主機對應",
"hostsAdd": "新增 Host",
"hostsEmpty": "未定義任何 Host",
"hostsDomain": "網域 (例如 domain:example.com)",