From 13ae4d50dfed303b4c66ae25d10bd0bdd3bc571b Mon Sep 17 00:00:00 2001 From: fengruixiang <474182370@qq.com> Date: Mon, 27 Jul 2026 14:56:03 +0800 Subject: [PATCH] =?UTF-8?q?=20=20docs(justsolutionsWebV2):=20=E5=A4=9A?= =?UTF-8?q?=E5=9C=B0=E5=8C=BA=E8=AE=BE=E8=AE=A1=E5=9B=9E=E5=A1=AB=E5=9C=8B?= =?UTF-8?q?=E5=AE=B6=E9=81=B8=E9=A0=85=E4=B8=8E=20global=20=E7=AB=99?= =?UTF-8?q?=EF=BC=8CQ1/Q3=20=E6=A0=87=E6=B3=A8=E4=BF=AE=E8=AE=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - §02 新增「地区切换:页头/页尾的國家選項」小节 + Plans 按 region.subscription 分流 - §03 目录树加 global/,§07 币种表加「其他國家 · 无在线支付」 - §08 config 补 subscription / regions / markets,§09 加第 8 步与生成器执行顺序 - §12 Q1(兜底落 /global/en)、Q3(jp+hk+global)标为 2026-07-27 修订, 原决策用删除线保留追溯;§A 组件表补国家切换器 --- .../multi-region-i18n-design.html | 53 +++++++++++++++---- 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/docs/justsolutionsWebV2/multi-region-i18n-design.html b/docs/justsolutionsWebV2/multi-region-i18n-design.html index 88f2c6d..8bdeda1 100644 --- a/docs/justsolutionsWebV2/multi-region-i18n-design.html +++ b/docs/justsolutionsWebV2/multi-region-i18n-design.html @@ -297,6 +297,7 @@ .pill { font-family: var(--font-mono); font-size: 12px; padding: 2px 8px; border-radius: 6px; font-weight: 600; white-space: nowrap; } .pill.jp { color: var(--jp); background: var(--jp-soft); } .pill.hk { color: var(--hk); background: var(--hk-soft); } + .pill.gl { color: var(--ink-3); background: var(--line-soft); } /* ---------- code / tree ---------- */ .code { @@ -349,6 +350,7 @@ .q.pend .qn { color: var(--warn); background: var(--warn-soft); } .q .ans { display: block; margin-top: 7px; font-size: 13.5px; font-weight: 600; color: var(--accent-strong); } .q .ans.pend { color: var(--warn); } + .q .ans s { color: var(--ink-3); font-weight: 500; } /* 被推翻的旧决策:保留可追溯,但压低视觉权重 */ .q .qb strong { display: block; margin-bottom: 3px; } .q .qb { font-size: 14.5px; color: var(--ink-2); } .q .qb .opts { font-family: var(--font-mono); font-size: 12.5px; color: var(--ink-3); margin-top: 4px; } @@ -375,7 +377,7 @@ 路由 /{region}/{lang} 站点 Express + 静态托管 现有 geoip · translations.js · /api/* - 状态 Q1–5 已定 · Q6/7 待定 + 状态 Q1–5 已定(Q1·Q3 2026-07-27 修订)· Q6/7 待定 @@ -457,7 +459,8 @@
/hk302 → /hk/zh
/hk/zh/plans香港 繁中 · Plans 页
/hk/en/plans香港 英文 · Plans 页
-
/302 → geoip 决定的 /{region}/{lang}(认不出 → 兜底 /hk/en
+
/global/en/plans其他國家 英文 · Plans 页(营销版,无在线订阅)
+
/302 → geoip 决定的 /{region}/{lang}(认不出 → 兜底 /global/en
语言代码采用 BCP 47(已定 · Q2):ja / zh-HK / en。旧 jp/tc 迁移期做别名映射即可不断链。
@@ -467,9 +470,10 @@ - + + @@ -478,6 +482,25 @@
请求处理说明
/302 → geoip 命中的 /{region}/{lang}无法识别 → 回落 /hk/en(Q1)
/302 → geoip 命中的 /{region}/{lang}无法识别 → 回落 /global/en(Q1 · 2026-07-27 修订)
/{region}302 → /{region}/{defaultLang}/jp/jp/ja
/{region}/{lang}/…public/{region}/ 提供静态内容命中具体页面
/{region}/{lang}/plans该地区在线订阅 → 内部改写成 plans-plus没有 → 营销页 plans依据 region.subscription(非 geoip 国家);地址栏不变
/_shared/…提供跨地区共享资源css / js / img 公共部分
/api/…共享 BFF(带地区上下文)见 §06
/config.js动态注入运行时配置no-store,见 §08
+

地区切换:页头 / 页尾的「國家選項」2026-07-27 增补

+

geoip 只是落地猜测,访客必须能自己改。因此在页头(语言按钮左侧)与页尾各放一个国家选项,与语言切换器同构:选择进 URL,由服务端按路径重新渲染,可缓存、可分享、利于 hreflang。

+
+ + + + + + + +
站点URL语言在线订阅
香港/hk/{zh-HK,en}/繁中 · 英文有(plans-plus,市场 HKG)
/jp/{ja,en}/日文 · 英文有(plans-plus,市场 JPN)
其他國家/global/en/仅英文无 —— Plans 给英文营销页
+
+ +

为什么「地区在前、语言显式成段」

@@ -520,6 +543,10 @@ │ ├── zh-HK.js # 繁中文案 │ └── en.js │ +├── global/ # ── 其他國家(纯英文,无在线订阅)── +│ ├── pages/ # 不含 plans-plus / pay-return +│ └── i18n/en.js +│ └── (新增地区照抄一个目录即可,零特判) +
JPYPayPay · JCB/信用卡 · Konbini 便利店
香港 HKHKDFPS 转数快 · AlipayHK · 信用卡(Stripe)
其他國家无在线支付 —— 只走线下渠道(试用申请 / 联络我们)
其它按落地地区补充
@@ -634,12 +662,16 @@ availableLangs: ["zh-HK", "en"], // 语言切换器用 currency: "HKD", // 该地区币种(§07) paymentMethods: ["fps", "alipay_hk", "card"], // 该地区可用支付方式(§07) + subscription: true, // 该地区是否有在线订阅(决定 Plans 入口给哪张页) + regions: [{ code, name, defaultLang, availableLangs, subscription }, …], // 全部站点,国家选项用(§02) + markets: { HKG: {…}, JPN: {…} }, // 市场码 → 站点,跨站续费/加购用 geo: { country, lang, … } // 现有 geoip 结果(裸域落地判断) }
@@ -655,7 +687,9 @@
  • 克隆日本地区public/jp/,落地日文排版与 ja.js/en.js
  • BFF 引入地区上下文X-Region 中间件 + 让 countries/industries/plans 等按地区返回。
  • 收尾:旧扁平 URL(如 /plans)301 到默认地区,保留一段时间兼容外链。
  • +
  • 补建 global 站 + 国家选项(2026-07-27,Q1/Q3 修订):regions.jsglobal 一行 → 重跑 build-regions.js(生成 public/global/pages)+ split-i18n.js(生成 global/i18n/en.js);裸域兜底改 globalmain.js 注入页头/页尾国家选项。
  • +
    改动这一层时的顺序固定为:node scripts/build-regions.jsnode scripts/split-i18n.js(后者要读前者产出的地区页来收 data-i18n 键)。两者都幂等。
    @@ -690,11 +724,11 @@
    §12

    决策记录(Q1–Q7)

    -

    Q1–Q5 已拍板并回填到上文相关章节;Q6–Q7 待后续确认。

    +

    Q1–Q5 已拍板并回填到上文相关章节;Q6–Q7 待后续确认。Q1 与 Q3 已于 2026-07-27 因「页头/页尾国家选项」需求修订——原决策保留在下方以便追溯。

    -
    Q1
    裸域 / 的兜底地区geoip 认不出来(本地/内网/未覆盖国家)时落到哪?✓ 落 HK;语言按 geoip 语种,认不出 → en,即最终落 /hk/en
    +
    Q1
    裸域 / 的兜底地区geoip 认不出来(本地/内网/未覆盖国家)时落到哪?2026-07-27 修订:落 /global/en(其他國家站)—— 与页头国家选项显示的站点一致,Plans 自然是英文营销版。
    原:落 HK,语言按 geoip,认不出 → /hk/en
    Q2
    语言码规范是否规范化为 BCP47?采用 BCP47ja / zh-HK / en;旧 jp/tc 迁移期做别名兼容
    -
    Q3
    首批上线地区仅 jp + hk;不单建 global 基线地区
    +
    Q3
    首批上线地区2026-07-27 修订:jp + hk + global —— 有了国家选项就必须有「其他國家」这个可选项,故补建 global 基线站(纯英文、无在线订阅,页面同样以 HK 为基线克隆)。
    原:仅 jp + hk,不单建 global 基线地区
    Q4
    地区差异化起点以现有 HK 页面为基线复制,再逐地区改排版
    Q5
    是否用独立域名不用独立域名,纯路径前缀;region 中间件无需预留「域名→地区」解析口
    Q6
    BFF 地区差异范围哪些接口/数据真的按地区不同(币种/Plans/合规文案/上游租户/支付方式)?据此确定 X-Region 影响哪些 service。⏳ 待定 —— 实现时按接口逐一确认
    @@ -709,15 +743,16 @@ - + - + + - +
    组件位置(建议)职责
    地区注册表server/regions.jsregion → { defaultLang, availableLangs, currency, paymentMethods, … }
    地区注册表server/regions.jsregion → { defaultLang, availableLangs, currency, market, paymentMethods, subscription };键序即国家选项的展示顺序
    region 解析中间件server/index.js解析 /{region}/{lang}、裸地区/裸域重定向、按地区托管静态
    geoip 落地server/geoip.js(复用)裸域 / 决定落地 region/lang(认不出 → hk/en)
    geoip 落地server/geoip.js(复用)裸域 / 决定落地 region/lang(认不出 → global/en)
    国家选项(切换器)public/_shared/js/main.js页头 + 页尾运行时注入,读 __APP_CONFIG__.regions,换站做语言/页面回落
    BFF 地区上下文中间件server/index.js读 X-Region → req.region
    支付门面路由server/routes/payments.js统一 /api/payments/*,按 region + method 选适配器
    支付适配器server/services/payments/*.js一网关一适配器:createPayment · verifyWebhook · getStatus
    i18n 引擎public/_shared/js/i18n.js加载共享 + 地区字典,渲染 data-i18n
    BFF 客户端public/_shared/js/api.js/api/* 请求自动带 X-Region / X-Lang
    配置注入/config.js(server/index.js)注入 region / lang / availableLangs / currency / paymentMethods
    配置注入/config.js(server/index.js)注入 region / lang / availableLangs / currency / paymentMethods / subscription / regions / markets