fix(lang): 修复路径含连字符时无法匹配bundle的问题
新增尝试原始段名的匹配逻辑,同时支持camelCase、snake_case和原始段名三种命名方式,覆盖更多bundle命名场景
This commit is contained in:
@@ -856,26 +856,31 @@ function normalizeRemoteTreeForPage(tree, langPath) {
|
|||||||
const segments = String(langPath).split('/').filter(Boolean);
|
const segments = String(langPath).split('/').filter(Boolean);
|
||||||
if (!segments.length) return tree;
|
if (!segments.length) return tree;
|
||||||
|
|
||||||
// 沿 langPath 段向下找页面 leaf:同一段同时尝试 camelCase 与 snake_case(bundle 服务器侧
|
// 沿 langPath 段向下找页面 leaf:同一段同时尝试 camelCase、snake_case 与原始段名
|
||||||
// 对同一段实际可能用任一种命名,例如 point/order_list 在 bundle 里是 `tree.point.order_list.X`,
|
// (bundle 服务器侧对同一段实际可能用任一种命名,例如 point/order_list 在 bundle 里是
|
||||||
// 而 login/login 这种 camel 路径又是 `tree.login.login.X`)。
|
// `tree.point.order_list.X`,而 login/login 这种 camel 路径又是 `tree.login.login.X`;
|
||||||
|
// 路径含连字符(如 ai-chat/index)时,原始段名 `ai-chat` 是唯一能命中 bundle 的形式)。
|
||||||
let leaf = tree;
|
let leaf = tree;
|
||||||
let hasLeaf = true;
|
let hasLeaf = true;
|
||||||
for (const segment of segments) {
|
for (const segment of segments) {
|
||||||
const camel = toCamelCaseName(segment);
|
const camel = toCamelCaseName(segment);
|
||||||
const snake = toSnakeCaseName(segment);
|
const snake = toSnakeCaseName(segment);
|
||||||
// 优先 camelCase;没有就回退 snake_case;都没有就放弃
|
const raw = segment;
|
||||||
|
// 优先 camelCase;回退 snake_case;再回退原始段名;都没有就放弃
|
||||||
const key = (leaf && typeof leaf === 'object' && !Array.isArray(leaf) && leaf[camel] !== undefined)
|
const key = (leaf && typeof leaf === 'object' && !Array.isArray(leaf) && leaf[camel] !== undefined)
|
||||||
? camel
|
? camel
|
||||||
: (leaf && typeof leaf === 'object' && !Array.isArray(leaf) && leaf[snake] !== undefined
|
: (leaf && typeof leaf === 'object' && !Array.isArray(leaf) && leaf[snake] !== undefined
|
||||||
? snake
|
? snake
|
||||||
: null);
|
: (leaf && typeof leaf === 'object' && !Array.isArray(leaf) && raw !== camel && raw !== snake && leaf[raw] !== undefined
|
||||||
|
? raw
|
||||||
|
: null));
|
||||||
if (key === null) { hasLeaf = false; break; }
|
if (key === null) { hasLeaf = false; break; }
|
||||||
leaf = leaf[key];
|
leaf = leaf[key];
|
||||||
}
|
}
|
||||||
|
|
||||||
const lastSegment = toCamelCaseName(segments[segments.length - 1]);
|
const rawLast = segments[segments.length - 1];
|
||||||
const lastSegmentSnake = toSnakeCaseName(segments[segments.length - 1]);
|
const lastSegment = toCamelCaseName(rawLast);
|
||||||
|
const lastSegmentSnake = toSnakeCaseName(rawLast);
|
||||||
const currentPageLeaf =
|
const currentPageLeaf =
|
||||||
hasLeaf && leaf && typeof leaf === 'object' && !Array.isArray(leaf)
|
hasLeaf && leaf && typeof leaf === 'object' && !Array.isArray(leaf)
|
||||||
? leaf
|
? leaf
|
||||||
@@ -883,7 +888,9 @@ function normalizeRemoteTreeForPage(tree, langPath) {
|
|||||||
? tree[lastSegment]
|
? tree[lastSegment]
|
||||||
: (tree[lastSegmentSnake] && typeof tree[lastSegmentSnake] === 'object' && !Array.isArray(tree[lastSegmentSnake])
|
: (tree[lastSegmentSnake] && typeof tree[lastSegmentSnake] === 'object' && !Array.isArray(tree[lastSegmentSnake])
|
||||||
? tree[lastSegmentSnake]
|
? tree[lastSegmentSnake]
|
||||||
: null));
|
: (rawLast !== lastSegment && rawLast !== lastSegmentSnake && tree[rawLast] && typeof tree[rawLast] === 'object' && !Array.isArray(tree[rawLast])
|
||||||
|
? tree[rawLast]
|
||||||
|
: null)));
|
||||||
|
|
||||||
if (!currentPageLeaf) return tree;
|
if (!currentPageLeaf) return tree;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user