You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2026/05/26 06:58:15 UTC

(skywalking-horizon-ui) branch main updated: feat(i18n): eight-locale parity + admin polish + live-debug + upstream id-required compat (#16)

This is an automated email from the ASF dual-hosted git repository.

wu-sheng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-horizon-ui.git


The following commit(s) were added to refs/heads/main by this push:
     new 3f58846  feat(i18n): eight-locale parity + admin polish + live-debug + upstream id-required compat (#16)
3f58846 is described below

commit 3f58846f9c6f329871709b3db67a837b8cfb0c9b
Author: 吴晟 Wu Sheng <wu...@foxmail.com>
AuthorDate: Tue May 26 14:58:09 2026 +0800

    feat(i18n): eight-locale parity + admin polish + live-debug + upstream id-required compat (#16)
    
    * feat(i18n): eight-locale parity across UI chrome + layer/overview overlays
    
    Brings every advertised locale (en, zh-CN, ja, ko, es, pt, de, fr) to
    full coverage across both UI chrome and BFF-shipped template overlays.
    
    UI chrome (apps/ui/src/i18n/locales/*.json)
      Each non-English catalog now mirrors en.json exactly at 511 keys. Tech
      terms (SkyWalking, OAP, MQE, eBPF, Zipkin, OTLP, Kubernetes, K8s,
      Istio, GraphQL, OAL/MAL/LAL, LDAP, BanyanDB, Elasticsearch, JVM,
      Apdex, RPS/RPM/SLA, hot/warm/cold, scope enums, layer keys, MQE
      function names, env vars, HTTP status codes, language runtimes, all
      DB / MQ / cache / gateway product names) stay verbatim in every
      locale; surrounding English is translated idiomatically. User-specified
      popular mappings honored (e.g. zh-CN general.alias = 普通应用).
    
    BFF layer templates (apps/bff/src/bundled_templates/layers/*.i18n.<loc>.json)
      All 42 layer source templates carry a per-locale overlay for each of
      the seven non-English locales, covering every translatable leaf
      (alias, title, description, tip, label, group; aliases.* / slots.*
      values; expressionLabels[] / tableHeaders[] entries). Coverage ~2,300
      leaves per locale, previously 0–300 in most cases.
    
    i18n wiring across components (~55 .vue files)
      31 routed components and 24 sub-components now use vue-i18n. Strings
      that reach the DOM are wrapped in t() with natural-key style. Several
      shadowed v-for `t` variables were renamed (tabItem, target, …) to
      avoid clobbering the i18n function. Translations push now refetches
      the sync-status cache so per-locale state stays fresh.
    
    Validator + housekeeping
      - apps/bff/src/i18n/validate.ts: every source template must have a
        sibling overlay file per OVERLAY_LOCALES; missing-file is a
        finding.
      - LiveDebuggerView tab buttons now push to /operate/live-debug/<tab>
        instead of the non-existent /debug/<tab>.
      - K8s instance Node Status: switched from a single-scalar card to a
        table of currently-true Kubernetes conditions (matches the
        cluster-scope sibling), and aligned rowSpan so widget heights
        line up with neighbors.
      - MonacoYaml gutter glyph (▶) on `- name:` lines is now visible; CSS
        class was referenced but unstyled.
      - ClusterStatusView fully i18n-wired; gate descriptions and
        Zipkin/OTLP pane copy translate.
      - Capture history row layout consolidated; LIVE chip moved inline
        next to the timestamp.
    
    Catalog half-translation policy preserved
      A missing key in any non-English catalog still falls back to English
      at the leaf. This commit closes most gaps but does not change the
      fallback semantics; future template additions remain valid even
      before their translations land.
    
    Upstream API note (deferred)
      skywalking#13884 made `id` REQUIRED on POST /ui-management/templates.
      Horizon's create call still sends only `configuration` here; the
      forward-compat change to send `id = horizon.<kind>.<key>` is held
      back for a dedicated follow-up. Verified Horizon code treats r.id as
      opaque (no UUID-format assumptions) and reconcileDuplicates handles
      mixed-id legacy deployments, so the switch will be a small surgical
      PR once OAP is on a release line that includes #13884.
    
    * fix(i18n + live-debug): re-apply admin polish + per-locale chips + live-debug bug fixes
    
    A grab-bag of small but visible fixes layered on top of the i18n branch,
    several of which had landed earlier in the cycle and were lost to
    mid-flight reverts.
    
    Cluster Status — chrome i18n (Pane B columns + Pane C entirely)
      - Pane B `Module / State / Env var / Gates` column headers, the
        `enabled / missing` per-row badge, the `healthLabel` computed,
        `adminBadgeLabel` (loading… / unreachable / all selectors on /
        {n} selectors off), and the admin-host-unreachable hint all go
        through t() now.
      - Pane C `Zipkin / OTLP traces` lede, `Endpoint` card heading,
        `zipkinBadgeLabel` (reachable / unreachable / loading…), and the
        Zipkin-unreachable hint translated.
      - 20 new keys seeded into all 8 locale catalogs (en + 7
        translations).
    
    Admin polish — hide BUNDLED when synced
      - `OverviewTemplatesAdmin.vue` and `LayerDashboardsAdmin.vue` no
        longer surface the `from bundled` source pill or the
        `Reset to / Preview Bundled` dropdown items when the row's sync
        badge is `synced`. With bundled == remote, the distinction is just
        visual noise. LOCAL drafts and DIVERGED rows still show the full
        chrome.
    
    Translations picker — per-locale status chips
      - `TemplateSyncRow` now carries the existing wire-level `locale?`
        field; `useTemplateSources.overlayStatus(name, locale)` looks up the
        per-locale overlay row's status from the same sync-status payload
        (zero extra round-trips). `TemplatePickerEntry.localeBadges` is
        rendered as a strip of small color-coded chips after the source
        badge in both the collapsed button and the dropdown rows
        (synced / diverged / remote-only / bundled-fallback / local /
        empty), and `TranslationsView.metaFor` wires it up.
    
    Live debugger — fixes for history → debug deep-link
      - MAL view dead-ended on `?historyId=…` because `loadHistorical`
        reset `selectedRow / expandedEntities / foldedRecords` before
        those refs were declared (TDZ ReferenceError swallowed by the
        setup boundary, no console trace). LAL had the same shape with
        `selectedCell`. Hoisted the resettable refs above their consumer.
      - Per-DSL view lookups (`history.entries.value.find`) changed to
        `history.all.value.find`. The route had already pinned us to the
        right widget; double-filtering by widget was a silent way for a
        stale `widget` field to drop the entry on the floor.
      - `useDebugHistory.save()` now refuses to downgrade a session
        snapshot: if the existing entry already has records and the new
        input has fewer, only metadata (retentionDeadline, retentionMillis)
        updates. Defeats the post-stop wipe — `stop()` triggers one final
        `session()` refresh against an already-cleaned-up OAP, which
        returns nodes-only-with-empty-records and used to overwrite the
        rich live snapshot with an empty one.
      - Stable node ordering in `DebugMal / DebugLal / DebugOal` —
        `nodeViews` sorts by `nodeId ?? peer` before rendering so cards
        don't reshuffle between polls.
      - `DebugView` shows an explicit "This capture has no records"
        placeholder when an effective session has zero node-views, so an
        honest empty capture is visibly different from a bug.
      - LiveDebuggerView tab buttons push `/operate/live-debug/<tab>` (the
        actual mounted path) instead of the non-existent `/debug/<tab>`.
        Same one-line fix in the surrounding doc-comments.
    
    Other small fixes
      - MonacoYaml `.rr-debug-glyph` CSS restored — the green ▶ in the MAL
        / LAL editor gutter was referencing an unstyled class, so the
        live-debug entrance was invisible.
      - RuleCard duplicate BUNDLED pill removed — the status pill in the
        header row already conveys it; the second pill below was just
        duplication.
      - `i18n:validate` tightened: empty `{}` overlays are now a finding
        rather than a free pass. The missing-overlay finding's secondary
        "(an empty {} is acceptable)" hint goes away.
    
    CLAUDE.md
      Adds a sixth failure mode under "Common AI failure modes":
      audit `router.push({ path })` and `<router-link to>` against the
      router on every route refactor, and hoist refs that param-driven
      immediate watches reset above the watch itself (Vue's compiler does
      not hoist `const` — a TDZ crash silently aborts setup with no
      console error in some browser builds).
    
    * feat(ui-template): send id=<envelope name> on POST /ui-management/templates
    
    Upstream skywalking#13884 ("remove auto generate id for UI templates")
    made `id` required on POST /ui-management/templates — OAP no longer
    auto-generates one. Pass the envelope name (`horizon.<kind>.<key>` for
    source rows, `horizon.<kind>.<key>.i18n.<locale>` for translation
    overlays) as the requested id; the row lands at the predictable id on
    current OAP and `ack.id` echoes it back.
    
    Forward- and backward-compatible:
      - Current OAP (post-#13884): row created at the requested id; Horizon
        treats `ack.id` as the wire handle (no change in downstream code,
        which already operates on `r.id` as opaque).
      - Legacy OAP (pre-#13884): the extra `id` body field is ignored, the
        server still auto-assigns a UUID and echoes it back in `ack.id`.
        Behavior identical to before.
    
    `createAndConfirm` parses the envelope to extract `name`, so all
    existing call-sites (sync.ts, template-sync.ts admin routes) keep their
    signatures.
    
    Mixed-id deployments (UUID-keyed legacy rows + name-keyed new rows under
    the same envelope name) self-heal via `reconcileDuplicates` on next
    boot.
    
    * docs(changelog): 0.6.0 — i18n / Cluster Status / live-debug / id-required
    
    Adds the 0.6.0 release-notes block for everything in this branch:
    eight-locale parity, Cluster Status + admin polish, live-debugger
    fixes, the gutter-glyph / duplicate-BUNDLED / k8s-Node-Status cleanups,
    and the upstream `id`-required ui-management alignment.
---
 CHANGELOG.md                                       | 126 +++
 CLAUDE.md                                          |  16 +
 apps/bff/package.json                              |   2 +
 .../bundled_templates/layers/activemq.i18n.de.json | 261 ++++++
 .../bundled_templates/layers/activemq.i18n.es.json | 174 ++++
 .../bundled_templates/layers/activemq.i18n.fr.json | 174 ++++
 .../bundled_templates/layers/activemq.i18n.ja.json | 174 ++++
 .../bundled_templates/layers/activemq.i18n.ko.json | 174 ++++
 .../bundled_templates/layers/activemq.i18n.pt.json | 174 ++++
 .../layers/activemq.i18n.zh-CN.json                |  87 ++
 .../layers/alipay_mini_program.i18n.de.json        | 142 ++++
 .../layers/alipay_mini_program.i18n.es.json        | 103 +++
 .../layers/alipay_mini_program.i18n.fr.json        | 103 +++
 .../layers/alipay_mini_program.i18n.ja.json        | 103 +++
 .../layers/alipay_mini_program.i18n.ko.json        | 103 +++
 .../layers/alipay_mini_program.i18n.pt.json        | 103 +++
 .../layers/alipay_mini_program.i18n.zh-CN.json     |  56 ++
 .../bundled_templates/layers/apisix.i18n.de.json   | 184 +++++
 .../bundled_templates/layers/apisix.i18n.es.json   | 123 +++
 .../bundled_templates/layers/apisix.i18n.fr.json   | 123 +++
 .../bundled_templates/layers/apisix.i18n.ja.json   | 123 +++
 .../bundled_templates/layers/apisix.i18n.ko.json   | 123 +++
 .../bundled_templates/layers/apisix.i18n.pt.json   | 123 +++
 .../layers/apisix.i18n.zh-CN.json                  |  65 ++
 .../layers/aws_dynamodb.i18n.de.json               | 283 +++++++
 .../layers/aws_dynamodb.i18n.es.json               | 188 +++++
 .../layers/aws_dynamodb.i18n.fr.json               | 188 +++++
 .../layers/aws_dynamodb.i18n.ja.json               | 188 +++++
 .../layers/aws_dynamodb.i18n.ko.json               | 188 +++++
 .../layers/aws_dynamodb.i18n.pt.json               | 188 +++++
 .../layers/aws_dynamodb.i18n.zh-CN.json            |  71 ++
 .../bundled_templates/layers/aws_eks.i18n.de.json  | 209 +++++
 .../bundled_templates/layers/aws_eks.i18n.es.json  | 133 +++
 .../bundled_templates/layers/aws_eks.i18n.fr.json  | 133 +++
 .../bundled_templates/layers/aws_eks.i18n.ja.json  | 133 +++
 .../bundled_templates/layers/aws_eks.i18n.ko.json  | 133 +++
 .../bundled_templates/layers/aws_eks.i18n.pt.json  | 133 +++
 .../layers/aws_eks.i18n.zh-CN.json                 |  66 ++
 .../layers/aws_gateway.i18n.de.json                | 157 ++++
 .../layers/aws_gateway.i18n.es.json                | 109 +++
 .../layers/aws_gateway.i18n.fr.json                | 109 +++
 .../layers/aws_gateway.i18n.ja.json                | 109 +++
 .../layers/aws_gateway.i18n.ko.json                | 109 +++
 .../layers/aws_gateway.i18n.pt.json                | 109 +++
 .../layers/aws_gateway.i18n.zh-CN.json             |  56 ++
 .../bundled_templates/layers/aws_s3.i18n.de.json   | 108 +++
 .../bundled_templates/layers/aws_s3.i18n.es.json   |  78 ++
 .../bundled_templates/layers/aws_s3.i18n.fr.json   |  78 ++
 .../bundled_templates/layers/aws_s3.i18n.ja.json   |  78 ++
 .../bundled_templates/layers/aws_s3.i18n.ko.json   |  78 ++
 .../bundled_templates/layers/aws_s3.i18n.pt.json   |  78 ++
 .../layers/aws_s3.i18n.zh-CN.json                  |  41 +
 .../layers/bookkeeper.i18n.de.json                 | 198 +++++
 .../layers/bookkeeper.i18n.es.json                 | 130 +++
 .../layers/bookkeeper.i18n.fr.json                 | 130 +++
 .../layers/bookkeeper.i18n.ja.json                 | 130 +++
 .../layers/bookkeeper.i18n.ko.json                 | 130 +++
 .../layers/bookkeeper.i18n.pt.json                 | 130 +++
 .../layers/bookkeeper.i18n.zh-CN.json              |  74 ++
 .../bundled_templates/layers/browser.i18n.de.json  | 215 +++++
 .../bundled_templates/layers/browser.i18n.es.json  | 139 ++++
 .../bundled_templates/layers/browser.i18n.fr.json  | 139 ++++
 .../bundled_templates/layers/browser.i18n.ja.json  | 139 ++++
 .../bundled_templates/layers/browser.i18n.ko.json  | 139 ++++
 .../bundled_templates/layers/browser.i18n.pt.json  | 139 ++++
 .../layers/browser.i18n.zh-CN.json                 |  81 ++
 .../layers/cilium_service.i18n.de.json             | 311 +++++++
 .../layers/cilium_service.i18n.es.json             | 215 +++++
 .../layers/cilium_service.i18n.fr.json             | 215 +++++
 .../layers/cilium_service.i18n.ja.json             | 215 +++++
 .../layers/cilium_service.i18n.ko.json             | 215 +++++
 .../layers/cilium_service.i18n.pt.json             | 212 +++++
 .../layers/cilium_service.i18n.zh-CN.json          | 115 +++
 .../layers/clickhouse.i18n.de.json                 | 320 ++++++++
 .../layers/clickhouse.i18n.es.json                 | 204 +++++
 .../layers/clickhouse.i18n.fr.json                 | 204 +++++
 .../layers/clickhouse.i18n.ja.json                 | 204 +++++
 .../layers/clickhouse.i18n.ko.json                 | 204 +++++
 .../layers/clickhouse.i18n.pt.json                 | 204 +++++
 .../layers/clickhouse.i18n.zh-CN.json              | 105 +++
 .../layers/elasticsearch.i18n.de.json              | 324 ++++++++
 .../layers/elasticsearch.i18n.es.json              | 201 +++++
 .../layers/elasticsearch.i18n.fr.json              | 201 +++++
 .../layers/elasticsearch.i18n.ja.json              | 201 +++++
 .../layers/elasticsearch.i18n.ko.json              | 201 +++++
 .../layers/elasticsearch.i18n.pt.json              | 201 +++++
 .../layers/elasticsearch.i18n.zh-CN.json           | 106 +++
 .../layers/envoy_ai_gateway.i18n.de.json           | 239 ++++++
 .../layers/envoy_ai_gateway.i18n.es.json           | 154 ++++
 .../layers/envoy_ai_gateway.i18n.fr.json           | 154 ++++
 .../layers/envoy_ai_gateway.i18n.ja.json           | 154 ++++
 .../layers/envoy_ai_gateway.i18n.ko.json           | 154 ++++
 .../layers/envoy_ai_gateway.i18n.pt.json           | 154 ++++
 .../layers/envoy_ai_gateway.i18n.zh-CN.json        |  81 ++
 .../bundled_templates/layers/envoy_ai_gateway.json |   5 +-
 .../bundled_templates/layers/flink.i18n.de.json    | 374 +++++++++
 .../bundled_templates/layers/flink.i18n.es.json    | 231 ++++++
 .../bundled_templates/layers/flink.i18n.fr.json    | 231 ++++++
 .../bundled_templates/layers/flink.i18n.ja.json    | 231 ++++++
 .../bundled_templates/layers/flink.i18n.ko.json    | 231 ++++++
 .../bundled_templates/layers/flink.i18n.pt.json    | 231 ++++++
 .../bundled_templates/layers/flink.i18n.zh-CN.json | 125 +++
 .../bundled_templates/layers/general.i18n.de.json  | 760 +++++++++++++++++
 .../bundled_templates/layers/general.i18n.es.json  | 482 +++++++++++
 .../bundled_templates/layers/general.i18n.fr.json  | 482 +++++++++++
 .../bundled_templates/layers/general.i18n.ja.json  | 482 +++++++++++
 .../bundled_templates/layers/general.i18n.ko.json  | 482 +++++++++++
 .../bundled_templates/layers/general.i18n.pt.json  | 482 +++++++++++
 .../layers/general.i18n.zh-CN.json                 | 272 +++++++
 .../src/bundled_templates/layers/ios.i18n.de.json  | 216 +++++
 .../src/bundled_templates/layers/ios.i18n.es.json  | 140 ++++
 .../src/bundled_templates/layers/ios.i18n.fr.json  | 140 ++++
 .../src/bundled_templates/layers/ios.i18n.ja.json  | 140 ++++
 .../src/bundled_templates/layers/ios.i18n.ko.json  | 140 ++++
 .../src/bundled_templates/layers/ios.i18n.pt.json  | 140 ++++
 .../bundled_templates/layers/ios.i18n.zh-CN.json   |  80 ++
 .../src/bundled_templates/layers/k8s.i18n.de.json  | 290 +++++++
 .../src/bundled_templates/layers/k8s.i18n.es.json  | 205 +++++
 .../src/bundled_templates/layers/k8s.i18n.fr.json  | 205 +++++
 .../src/bundled_templates/layers/k8s.i18n.ja.json  | 205 +++++
 .../src/bundled_templates/layers/k8s.i18n.ko.json  | 205 +++++
 .../src/bundled_templates/layers/k8s.i18n.pt.json  | 204 +++++
 .../bundled_templates/layers/k8s.i18n.zh-CN.json   | 113 +++
 .../layers/k8s_service.i18n.de.json                | 378 +++++++++
 .../layers/k8s_service.i18n.es.json                | 265 ++++++
 .../layers/k8s_service.i18n.fr.json                | 265 ++++++
 .../layers/k8s_service.i18n.ja.json                | 265 ++++++
 .../layers/k8s_service.i18n.ko.json                | 265 ++++++
 .../layers/k8s_service.i18n.pt.json                | 261 ++++++
 .../layers/k8s_service.i18n.zh-CN.json             | 140 ++++
 .../bundled_templates/layers/kafka.i18n.de.json    | 226 ++++++
 .../bundled_templates/layers/kafka.i18n.es.json    | 146 ++++
 .../bundled_templates/layers/kafka.i18n.fr.json    | 146 ++++
 .../bundled_templates/layers/kafka.i18n.ja.json    | 146 ++++
 .../bundled_templates/layers/kafka.i18n.ko.json    | 146 ++++
 .../bundled_templates/layers/kafka.i18n.pt.json    | 146 ++++
 .../bundled_templates/layers/kafka.i18n.zh-CN.json |  73 ++
 .../src/bundled_templates/layers/kong.i18n.de.json | 219 +++++
 .../src/bundled_templates/layers/kong.i18n.es.json | 141 ++++
 .../src/bundled_templates/layers/kong.i18n.fr.json | 141 ++++
 .../src/bundled_templates/layers/kong.i18n.ja.json | 141 ++++
 .../src/bundled_templates/layers/kong.i18n.ko.json | 141 ++++
 .../src/bundled_templates/layers/kong.i18n.pt.json | 141 ++++
 .../bundled_templates/layers/kong.i18n.zh-CN.json  |  71 ++
 .../src/bundled_templates/layers/mesh.i18n.de.json | 365 +++++++++
 .../src/bundled_templates/layers/mesh.i18n.es.json | 252 ++++++
 .../src/bundled_templates/layers/mesh.i18n.fr.json | 252 ++++++
 .../src/bundled_templates/layers/mesh.i18n.ja.json | 252 ++++++
 .../src/bundled_templates/layers/mesh.i18n.ko.json | 252 ++++++
 .../src/bundled_templates/layers/mesh.i18n.pt.json | 249 ++++++
 .../bundled_templates/layers/mesh.i18n.zh-CN.json  | 145 ++++
 .../bundled_templates/layers/mesh_cp.i18n.de.json  | 156 ++++
 .../bundled_templates/layers/mesh_cp.i18n.es.json  | 109 +++
 .../bundled_templates/layers/mesh_cp.i18n.fr.json  | 109 +++
 .../bundled_templates/layers/mesh_cp.i18n.ja.json  | 109 +++
 .../bundled_templates/layers/mesh_cp.i18n.ko.json  | 109 +++
 .../bundled_templates/layers/mesh_cp.i18n.pt.json  | 106 +++
 .../layers/mesh_cp.i18n.zh-CN.json                 |  56 ++
 .../bundled_templates/layers/mesh_dp.i18n.de.json  | 115 +++
 .../bundled_templates/layers/mesh_dp.i18n.es.json  |  75 ++
 .../bundled_templates/layers/mesh_dp.i18n.fr.json  |  75 ++
 .../bundled_templates/layers/mesh_dp.i18n.ja.json  |  75 ++
 .../bundled_templates/layers/mesh_dp.i18n.ko.json  |  75 ++
 .../bundled_templates/layers/mesh_dp.i18n.pt.json  |  72 ++
 .../layers/mesh_dp.i18n.zh-CN.json                 |  59 ++
 .../bundled_templates/layers/mongodb.i18n.de.json  | 266 ++++++
 .../bundled_templates/layers/mongodb.i18n.es.json  | 178 ++++
 .../bundled_templates/layers/mongodb.i18n.fr.json  | 178 ++++
 .../bundled_templates/layers/mongodb.i18n.ja.json  | 178 ++++
 .../bundled_templates/layers/mongodb.i18n.ko.json  | 178 ++++
 .../bundled_templates/layers/mongodb.i18n.pt.json  | 178 ++++
 .../layers/mongodb.i18n.zh-CN.json                 |  94 +++
 .../bundled_templates/layers/mysql.i18n.de.json    | 212 +++++
 .../bundled_templates/layers/mysql.i18n.es.json    | 145 ++++
 .../bundled_templates/layers/mysql.i18n.fr.json    | 145 ++++
 .../bundled_templates/layers/mysql.i18n.ja.json    | 145 ++++
 .../bundled_templates/layers/mysql.i18n.ko.json    | 145 ++++
 .../bundled_templates/layers/mysql.i18n.pt.json    | 145 ++++
 .../bundled_templates/layers/mysql.i18n.zh-CN.json |  80 ++
 .../bundled_templates/layers/nginx.i18n.de.json    | 188 +++++
 .../bundled_templates/layers/nginx.i18n.es.json    | 122 +++
 .../bundled_templates/layers/nginx.i18n.fr.json    | 122 +++
 .../bundled_templates/layers/nginx.i18n.ja.json    | 122 +++
 .../bundled_templates/layers/nginx.i18n.ko.json    | 122 +++
 .../bundled_templates/layers/nginx.i18n.pt.json    | 122 +++
 .../bundled_templates/layers/nginx.i18n.zh-CN.json |  63 ++
 .../bundled_templates/layers/os_linux.i18n.de.json | 140 ++++
 .../bundled_templates/layers/os_linux.i18n.es.json | 101 +++
 .../bundled_templates/layers/os_linux.i18n.fr.json | 101 +++
 .../bundled_templates/layers/os_linux.i18n.ja.json | 101 +++
 .../bundled_templates/layers/os_linux.i18n.ko.json | 101 +++
 .../bundled_templates/layers/os_linux.i18n.pt.json | 101 +++
 .../layers/os_linux.i18n.zh-CN.json                |  57 ++
 .../layers/os_windows.i18n.de.json                 |  93 +++
 .../layers/os_windows.i18n.es.json                 |  73 ++
 .../layers/os_windows.i18n.fr.json                 |  73 ++
 .../layers/os_windows.i18n.ja.json                 |  73 ++
 .../layers/os_windows.i18n.ko.json                 |  73 ++
 .../layers/os_windows.i18n.pt.json                 |  73 ++
 .../layers/os_windows.i18n.zh-CN.json              |  46 ++
 .../layers/postgresql.i18n.de.json                 | 244 ++++++
 .../layers/postgresql.i18n.es.json                 | 164 ++++
 .../layers/postgresql.i18n.fr.json                 | 164 ++++
 .../layers/postgresql.i18n.ja.json                 | 164 ++++
 .../layers/postgresql.i18n.ko.json                 | 164 ++++
 .../layers/postgresql.i18n.pt.json                 | 164 ++++
 .../layers/postgresql.i18n.zh-CN.json              |  88 ++
 .../bundled_templates/layers/pulsar.i18n.de.json   | 204 +++++
 .../bundled_templates/layers/pulsar.i18n.es.json   | 136 ++++
 .../bundled_templates/layers/pulsar.i18n.fr.json   | 136 ++++
 .../bundled_templates/layers/pulsar.i18n.ja.json   | 136 ++++
 .../bundled_templates/layers/pulsar.i18n.ko.json   | 136 ++++
 .../bundled_templates/layers/pulsar.i18n.pt.json   | 136 ++++
 .../layers/pulsar.i18n.zh-CN.json                  |  73 ++
 .../bundled_templates/layers/rabbitmq.i18n.de.json | 243 ++++++
 .../bundled_templates/layers/rabbitmq.i18n.es.json | 162 ++++
 .../bundled_templates/layers/rabbitmq.i18n.fr.json | 162 ++++
 .../bundled_templates/layers/rabbitmq.i18n.ja.json | 162 ++++
 .../bundled_templates/layers/rabbitmq.i18n.ko.json | 162 ++++
 .../bundled_templates/layers/rabbitmq.i18n.pt.json | 162 ++++
 .../layers/rabbitmq.i18n.zh-CN.json                |  84 ++
 .../bundled_templates/layers/redis.i18n.de.json    | 207 +++++
 .../bundled_templates/layers/redis.i18n.es.json    | 138 ++++
 .../bundled_templates/layers/redis.i18n.fr.json    | 138 ++++
 .../bundled_templates/layers/redis.i18n.ja.json    | 138 ++++
 .../bundled_templates/layers/redis.i18n.ko.json    | 138 ++++
 .../bundled_templates/layers/redis.i18n.pt.json    | 138 ++++
 .../bundled_templates/layers/redis.i18n.zh-CN.json |  75 ++
 .../bundled_templates/layers/rocketmq.i18n.de.json | 233 ++++++
 .../bundled_templates/layers/rocketmq.i18n.es.json | 156 ++++
 .../bundled_templates/layers/rocketmq.i18n.fr.json | 156 ++++
 .../bundled_templates/layers/rocketmq.i18n.ja.json | 156 ++++
 .../bundled_templates/layers/rocketmq.i18n.ko.json | 156 ++++
 .../bundled_templates/layers/rocketmq.i18n.pt.json | 156 ++++
 .../layers/rocketmq.i18n.zh-CN.json                |  87 ++
 .../layers/so11y_go_agent.i18n.de.json             |  64 ++
 .../layers/so11y_go_agent.i18n.es.json             |  41 +
 .../layers/so11y_go_agent.i18n.fr.json             |  41 +
 .../layers/so11y_go_agent.i18n.ja.json             |  41 +
 .../layers/so11y_go_agent.i18n.ko.json             |  41 +
 .../layers/so11y_go_agent.i18n.pt.json             |  41 +
 .../layers/so11y_go_agent.i18n.zh-CN.json          |  25 +
 .../layers/so11y_java_agent.i18n.de.json           |  64 ++
 .../layers/so11y_java_agent.i18n.es.json           |  41 +
 .../layers/so11y_java_agent.i18n.fr.json           |  41 +
 .../layers/so11y_java_agent.i18n.ja.json           |  41 +
 .../layers/so11y_java_agent.i18n.ko.json           |  41 +
 .../layers/so11y_java_agent.i18n.pt.json           |  41 +
 .../layers/so11y_java_agent.i18n.zh-CN.json        |  25 +
 .../layers/so11y_oap.i18n.de.json                  | 254 ++++++
 .../layers/so11y_oap.i18n.es.json                  | 153 ++++
 .../layers/so11y_oap.i18n.fr.json                  | 153 ++++
 .../layers/so11y_oap.i18n.ja.json                  | 153 ++++
 .../layers/so11y_oap.i18n.ko.json                  | 153 ++++
 .../layers/so11y_oap.i18n.pt.json                  | 153 ++++
 .../layers/so11y_oap.i18n.zh-CN.json               |  78 ++
 .../layers/so11y_satellite.i18n.de.json            |  69 ++
 .../layers/so11y_satellite.i18n.es.json            |  50 ++
 .../layers/so11y_satellite.i18n.fr.json            |  50 ++
 .../layers/so11y_satellite.i18n.ja.json            |  50 ++
 .../layers/so11y_satellite.i18n.ko.json            |  50 ++
 .../layers/so11y_satellite.i18n.pt.json            |  50 ++
 .../layers/so11y_satellite.i18n.zh-CN.json         |  31 +
 .../layers/virtual_cache.i18n.de.json              | 139 ++++
 .../layers/virtual_cache.i18n.es.json              |  97 +++
 .../layers/virtual_cache.i18n.fr.json              |  97 +++
 .../layers/virtual_cache.i18n.ja.json              |  97 +++
 .../layers/virtual_cache.i18n.ko.json              |  97 +++
 .../layers/virtual_cache.i18n.pt.json              |  97 +++
 .../layers/virtual_cache.i18n.zh-CN.json           |  56 ++
 .../layers/virtual_database.i18n.de.json           |  87 ++
 .../layers/virtual_database.i18n.es.json           |  72 ++
 .../layers/virtual_database.i18n.fr.json           |  72 ++
 .../layers/virtual_database.i18n.ja.json           |  72 ++
 .../layers/virtual_database.i18n.ko.json           |  72 ++
 .../layers/virtual_database.i18n.pt.json           |  72 ++
 .../layers/virtual_database.i18n.zh-CN.json        |  47 ++
 .../layers/virtual_genai.i18n.de.json              | 181 +++++
 .../layers/virtual_genai.i18n.es.json              | 129 +++
 .../layers/virtual_genai.i18n.fr.json              | 129 +++
 .../layers/virtual_genai.i18n.ja.json              | 129 +++
 .../layers/virtual_genai.i18n.ko.json              | 129 +++
 .../layers/virtual_genai.i18n.pt.json              | 129 +++
 .../layers/virtual_genai.i18n.zh-CN.json           |  75 ++
 .../layers/virtual_mq.i18n.de.json                 | 134 +++
 .../layers/virtual_mq.i18n.es.json                 |  98 +++
 .../layers/virtual_mq.i18n.fr.json                 |  98 +++
 .../layers/virtual_mq.i18n.ja.json                 |  98 +++
 .../layers/virtual_mq.i18n.ko.json                 |  98 +++
 .../layers/virtual_mq.i18n.pt.json                 |  98 +++
 .../layers/virtual_mq.i18n.zh-CN.json              |  55 ++
 .../layers/wechat_mini_program.i18n.de.json        | 179 ++++
 .../layers/wechat_mini_program.i18n.es.json        | 122 +++
 .../layers/wechat_mini_program.i18n.fr.json        | 122 +++
 .../layers/wechat_mini_program.i18n.ja.json        | 122 +++
 .../layers/wechat_mini_program.i18n.ko.json        | 122 +++
 .../layers/wechat_mini_program.i18n.pt.json        | 122 +++
 .../layers/wechat_mini_program.i18n.zh-CN.json     |  65 ++
 .../bundled_templates/overviews/mesh.i18n.de.json  |  58 ++
 .../bundled_templates/overviews/mesh.i18n.es.json  |  78 ++
 .../bundled_templates/overviews/mesh.i18n.fr.json  |  58 ++
 .../bundled_templates/overviews/mesh.i18n.ja.json  |  78 ++
 .../bundled_templates/overviews/mesh.i18n.ko.json  |  78 ++
 .../bundled_templates/overviews/mesh.i18n.pt.json  |  78 ++
 .../overviews/mesh.i18n.zh-CN.json                 |  78 ++
 .../overviews/services.i18n.de.json                |  84 ++
 .../overviews/services.i18n.es.json                | 126 +++
 .../overviews/services.i18n.fr.json                |  84 ++
 .../overviews/services.i18n.ja.json                | 126 +++
 .../overviews/services.i18n.ko.json                | 126 +++
 .../overviews/services.i18n.pt.json                | 126 +++
 .../overviews/services.i18n.zh-CN.json             | 126 +++
 apps/bff/src/http/admin/template-sync.ts           | 295 ++++++-
 apps/bff/src/http/config/bundle.ts                 |  87 +-
 apps/bff/src/http/config/dashboard.ts              |   8 +-
 apps/bff/src/http/config/layer-template.ts         |   3 +
 apps/bff/src/http/config/overview.ts               |  31 +-
 apps/bff/src/http/query/menu.ts                    |  16 +-
 apps/bff/src/i18n/index.ts                         |  41 +
 apps/bff/src/i18n/lexicon/de.json                  | 131 +++
 apps/bff/src/i18n/lexicon/en.json                  | 139 ++++
 apps/bff/src/i18n/lexicon/es.json                  | 139 ++++
 apps/bff/src/i18n/lexicon/fr.json                  | 131 +++
 apps/bff/src/i18n/lexicon/ja.json                  | 139 ++++
 apps/bff/src/i18n/lexicon/ko.json                  | 139 ++++
 apps/bff/src/i18n/lexicon/pt.json                  | 139 ++++
 apps/bff/src/i18n/lexicon/zh-CN.json               | 139 ++++
 apps/bff/src/i18n/merge.ts                         | 132 +++
 apps/bff/src/i18n/request.ts                       | 106 +++
 apps/bff/src/i18n/seed.ts                          | 348 ++++++++
 apps/bff/src/i18n/store.ts                         | 192 +++++
 apps/bff/src/i18n/types.ts                         |  68 ++
 apps/bff/src/i18n/validate.ts                      | 379 +++++++++
 apps/bff/src/logic/layers/loader.ts                |   9 +
 apps/bff/src/logic/overview/loader.ts              |   7 +-
 apps/bff/src/logic/templates/aggregator.ts         |  38 +
 apps/bff/src/logic/templates/names.ts              |  96 ++-
 apps/bff/src/logic/templates/sync.ts               | 363 ++++++++-
 apps/bff/src/rbac/route-policy.ts                  |   4 +
 apps/bff/src/server.ts                             |   3 +-
 apps/ui/src/api/client.ts                          |  11 +
 apps/ui/src/api/scopes/configs.ts                  |  36 +-
 apps/ui/src/api/scopes/template-sync.ts            |  54 +-
 apps/ui/src/components/charts/TopList.vue          |  11 +-
 .../ui/src/components/primitives/FloatingPanel.vue | 170 ++++
 .../src/components/primitives/TypeaheadSelect.vue  | 219 +++++
 apps/ui/src/components/primitives/WidgetTip.vue    | 164 ++++
 apps/ui/src/controls/configBundle.ts               |  10 +-
 apps/ui/src/controls/localTranslationEdits.ts      | 129 +++
 .../admin/_shared/LayerDashboardCanvas.vue         | 303 +++++++
 .../admin/_shared/OverviewDashboardCanvas.vue      | 298 +++++++
 .../features/admin/_shared/SyncStatusBanner.vue    |  60 ++
 .../features/admin/_shared/TemplateDiffModal.vue   |  40 +-
 .../src/features/admin/_shared/TemplatePicker.vue  | 421 ++++++++++
 .../features/admin/_shared/TranslationEditor.vue   | 334 ++++++++
 .../features/admin/_shared/translatableFields.ts   | 175 ++++
 .../features/admin/_shared/useTemplateSources.ts   |  34 +-
 .../src/features/admin/_shared/useTemplateSync.ts  |  38 +-
 .../admin/global-defaults/ThemePreviewCard.vue     |  19 +-
 .../admin/layer-templates/LayerDashboardsAdmin.vue | 145 +++-
 .../overview-templates/OverviewTemplatesAdmin.vue  | 132 ++-
 .../admin/translations/TranslationPreview.vue      | 402 +++++++++
 .../admin/translations/TranslationsView.vue        | 897 +++++++++++++++++++++
 apps/ui/src/features/alarms/AlarmDetailPanel.vue   |  58 +-
 apps/ui/src/features/auth/LoginView.vue            |  72 +-
 .../ui/src/features/operate/_shared/MonacoYaml.vue |  23 +
 apps/ui/src/features/operate/_shared/RuleCard.vue  |  14 +-
 .../features/operate/cluster/ClusterStatusView.vue |  98 +--
 apps/ui/src/features/operate/dsl/DslEditorView.vue |   7 +-
 .../ui/src/features/operate/dsl/OalCatalogView.vue |   2 +-
 .../operate/live-debug/DebugHistoryView.vue        |   8 +-
 .../src/features/operate/live-debug/DebugLal.vue   | 146 ++--
 .../src/features/operate/live-debug/DebugMal.vue   |  55 +-
 .../src/features/operate/live-debug/DebugOal.vue   |  89 +-
 .../src/features/operate/live-debug/DebugView.vue  |  13 +
 .../operate/live-debug/LiveDebuggerView.vue        |  10 +-
 .../features/operate/live-debug/useDebugHistory.ts |  33 +-
 apps/ui/src/i18n/index.ts                          | 151 ++++
 apps/ui/src/i18n/locales/de.json                   | 534 ++++++++++++
 apps/ui/src/i18n/locales/en.json                   | 534 ++++++++++++
 apps/ui/src/i18n/locales/es.json                   | 534 ++++++++++++
 apps/ui/src/i18n/locales/fr.json                   | 534 ++++++++++++
 apps/ui/src/i18n/locales/ja.json                   | 534 ++++++++++++
 apps/ui/src/i18n/locales/ko.json                   | 534 ++++++++++++
 apps/ui/src/i18n/locales/pt.json                   | 534 ++++++++++++
 apps/ui/src/i18n/locales/zh-CN.json                | 534 ++++++++++++
 apps/ui/src/layer/LayerServiceSelector.vue         |  11 +-
 apps/ui/src/layer/LayerShell.vue                   | 152 +---
 .../src/layer/profiling/ProcessTopologyGraph.vue   |   9 +-
 apps/ui/src/layer/profiling/ProfileFlameGraph.vue  |  11 +-
 apps/ui/src/layer/profiling/ProfileStackTable.vue  |  19 +-
 apps/ui/src/layer/traces/LayerTracesView.vue       | 243 +++---
 apps/ui/src/layer/traces/LayerZipkinTracesView.vue | 133 +--
 apps/ui/src/layer/traces/TracePopout.vue           |  76 +-
 apps/ui/src/layer/traces/ZipkinTracePopout.vue     |  35 +-
 apps/ui/src/main.ts                                |   6 +
 .../render/layer-dashboard/LayerDashboardsView.vue |  28 +-
 apps/ui/src/render/widgets/AlarmsWidget.vue        |  77 +-
 apps/ui/src/render/widgets/KpiTileWidget.vue       |  10 +-
 .../src/render/widgets/MetricCompositeWidget.vue   |   8 +-
 apps/ui/src/render/widgets/MetricWidget.vue        |   8 +-
 apps/ui/src/shell/AdminFeatureWarning.vue          |  39 +-
 apps/ui/src/shell/AppShell.vue                     |   7 +-
 apps/ui/src/shell/AppSidebar.vue                   | 101 ++-
 apps/ui/src/shell/AppTopbar.vue                    |  27 +-
 apps/ui/src/shell/ColdStageTrapBanner.vue          |  10 +-
 apps/ui/src/shell/DebugEventPanel.vue              |  14 +-
 apps/ui/src/shell/GlobalConnectivityBanner.vue     |  15 +-
 apps/ui/src/shell/LocaleChip.vue                   | 216 +++++
 apps/ui/src/shell/PreviewModeBanner.vue            |   7 +-
 apps/ui/src/shell/TemplateConflictPrompt.vue       |  20 +-
 apps/ui/src/shell/router/index.ts                  |  15 +-
 apps/ui/src/state/auth.ts                          |   8 +-
 apps/ui/src/state/layerSelection.ts                |  91 +--
 apps/ui/src/utils/autosize.ts                      |  58 ++
 docs/customization/i18n.md                         | 126 +++
 docs/menu.yml                                      |   2 +
 packages/api-client/src/ui-template.ts             |  17 +-
 418 files changed, 58015 insertions(+), 963 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 82ab1d3..bcbc513 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,132 @@ packages) plus the BFF's `HORIZON_VERSION` default.
 
 ## 0.6.0
 
+### Eight-locale internationalization
+
+Horizon now ships with eight first-class UI languages — English (source)
+plus zh-CN, ja, ko, es, pt, de, fr — selectable from the top-bar locale
+chip on every page (including the pre-auth login). The choice persists
+per device.
+
+- **UI chrome.** Every routed page (31) and every shared sub-component
+  (24) renders through `vue-i18n`. The English catalog is the source
+  of truth at 531 keys; every other locale carries 531 native
+  translations. Missing keys fall back to English at the leaf, so
+  partial catalogs are valid and degradation is invisible.
+- **BFF-shipped templates.** All 42 layer dashboards and both overview
+  dashboards carry per-locale overlay catalogs alongside the source
+  template. Coverage is ~2,300 translatable leaves per non-English
+  locale across the layer set. The BFF picks the locale from the
+  request's `X-Horizon-Locale` header (auto-set by the SPA), merges
+  the overlay onto the source, and serves the localised template to
+  the renderer — translation resolves once on the BFF, never on
+  every chart mount.
+- **Operator-runnable Translations page.** A new admin surface
+  (Dashboard setup → Translations) edits the per-locale overlays
+  through the live preview: pick a target language, click any widget
+  in the rendered dashboard, type the translation. Per-locale status
+  chips on the template picker show at a glance which dashboards have
+  drafts, which are synced, which diverge from disk, and which are
+  empty for a given locale. Push writes the sibling overlay row on
+  OAP; pushing zh-CN never touches ja.
+- **Tech-term policy.** Product, project, and protocol names
+  (SkyWalking, Kubernetes, OAP, MQE, eBPF, Zipkin, OpenTelemetry,
+  Istio, GraphQL, etc.), OAP scope enums (Service, ServiceInstance,
+  Endpoint, Process), layer keys, MQE function names, env vars, HTTP
+  status codes, and per-language runtimes (JVM, Go, Python, …) stay
+  verbatim in every locale per CLAUDE.md. Phrases containing tech
+  terms are translated around the term (`HTTP Connections` →
+  `HTTP 连接` / `HTTP 接続`), not transliterated.
+- **OAP-supplied data is never translated.** Service names, alarm
+  rule names, trace span operation names, log messages — anything
+  arriving over the OAP wire — render verbatim regardless of locale.
+- **Validator gate.** `i18n:validate` is stricter: every source
+  template must have a sibling overlay file per advertised locale,
+  and empty `{}` overlays are now a finding (used to pass silently —
+  surfaced as "structurally complete" while every translatable string
+  still rendered in English).
+
+### Cluster Status + admin polish
+
+- **Cluster Status — Pane B + Pane C fully translatable.** Module
+  column headers, gate descriptions (the SWIP-13 affects strings),
+  per-row enabled/missing badges, the admin-host status badge
+  (`loading…` / `unreachable` / `all selectors on` / `{n} selectors
+  off`), the admin-host-unreachable hint, the Zipkin / OTLP pane
+  lede, the Endpoint card heading, the Zipkin badge and the
+  Zipkin-unreachable hint all now render in the active locale.
+- **Hide redundant BUNDLED chrome when synced.** On the Overview
+  templates and Layer dashboards admin pages, when the row's sync
+  badge is `synced` the BUNDLED and REMOTE versions are byte-equal,
+  so the `from {source}` pill and the `Reset to / Preview Bundled`
+  dropdown items add no information and are hidden. LOCAL drafts
+  always show; BUNDLED resurfaces the moment the row diverges.
+- **Translations picker prefers the English bundle.** REMOTE-only
+  rows with non-English titles (legacy duplicates from prior import
+  cycles) no longer appear as separate dashboards in the picker — the
+  picker lists the canonical English bundled dashboards once each,
+  and the preview renders the English source as the baseline.
+
+### Live debugger fixes
+
+A clutch of small but visible bugs were caught while exercising the
+i18n surfaces:
+
+- **History → debug deep-link rendered blank.** MAL and LAL views
+  crashed silently on `?historyId=…` because `loadHistorical` reset
+  refs (`selectedRow`, `expandedEntities`, `foldedRecords`;
+  `selectedCell` for LAL) that the file declared further down. The
+  `watch(historyId, …, { immediate: true })` fires during setup, so
+  the TDZ ReferenceError aborted setup before the page rendered, with
+  no console trace. Resettable refs are now hoisted above their
+  consumer.
+- **Captured records wiped on stop.** After `stop()`, the per-DSL
+  view did one final `session()` refresh against an already-cleaned-
+  up OAP, which returned nodes-only-with-empty-records and
+  overwrote the rich live snapshot in localStorage. `save()` now
+  refuses to shrink an existing entry's `recordCount` for the same
+  `sessionId` — only metadata (`retentionDeadline`, `retentionMillis`)
+  updates.
+- **Stable node ordering.** MAL / LAL / OAL node cards now sort by
+  `nodeId ?? peer` so they don't reshuffle between polls.
+- **Tab buttons jumped nowhere.** `LiveDebuggerView.selectTab` pushed
+  `/debug/<tab>` (a path that doesn't exist); fixed to
+  `/operate/live-debug/<tab>`. Same correction in
+  `DebugHistoryView.loadEntry` deep-links and surrounding
+  doc-comments in `RuleCard.vue` / `DslEditorView.vue`.
+- **Empty-capture placeholder.** When a saved session has zero
+  populated nodes, `DebugView` now shows an explicit "This capture
+  has no records" rather than rendering blank, so an honest empty
+  capture is visibly different from a bug.
+- **Per-locale lookup widened.** Per-DSL views look up the historyId
+  via `history.all` (not the widget-filtered `history.entries`); the
+  route already pinned us to the right widget, and double-filtering
+  by `widget` was a silent way for a stale field to drop the entry.
+
+### Other small fixes
+
+- **MAL / LAL editor gutter glyph.** The green ▶ live-debug entrance
+  on every `- name:` row was referencing an unstyled CSS class —
+  Monaco reserved the gutter and wired clicks, but the icon was
+  invisible. Restored.
+- **Rule catalog cards.** Duplicate BUNDLED pill removed; the header
+  status pill already conveyed it.
+- **K8s instance Node Status.** Switched from a single-scalar card
+  (rendering just `1`) to a table of currently-true Kubernetes
+  conditions, matching the cluster-scope sibling and aligning widget
+  heights.
+
+### Upstream `ui-management` compatibility
+
+Aligned with upstream [skywalking#13884](https://github.com/apache/skywalking/pull/13884)
+("remove auto generate id for UI templates"): Horizon now sends
+`id = <envelope name>` on `POST /ui-management/templates`. Current
+OAP requires it (POSTs without `id` are rejected); legacy OAP
+releases ignored the field and auto-generated UUIDs, so the same
+payload works against both. Horizon already treated `r.id` as
+opaque; mixed-id deployments self-heal via `reconcileDuplicates` on
+the next boot.
+
 ### Smartscape service hierarchy
 
 OAP 10's cross-layer service hierarchy is now reachable from any layer's
diff --git a/CLAUDE.md b/CLAUDE.md
index f6d7248..482ed13 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -55,6 +55,19 @@ Design tokens live in the runtime token CSS (`apps/ui/src/assets/styles/tokens.c
 
 **Docs are written for the end user (operator / dashboard author), not the contributor.** Document what a feature *does*, how to *configure* it (YAML, fields, recipes), and how to *operate / troubleshoot* it. Do **not** document the internal code workflow: no step-by-step algorithms ("1. service-bind 2. user search 3. …"), no source-file paths (`apps/bff/src/...`), no internal function / composable / route names, no "the BFF then fans out / chunks / probes …" implementation narration. If [...]
 
+## Internationalization
+
+English is the source of truth. Every UI string and every translatable template field is authored in English first; the English bundle ships in the main JS chunk so the app renders without any network locale fetch. Other locales (zh-CN, es, pt, ja, ko at the time of writing) are catalog overlays. A missing key in any non-English catalog falls back to English at the leaf, never at the file — half-translated catalogs are valid and expected. Edit English first; re-translate downstream.
+
+**Translation principles:**
+
+- **IT terms and proper nouns stay in their original form.** Product, project, and protocol names (SkyWalking, Kubernetes, Envoy, Istio, OAP, MQE, eBPF, Zipkin, OpenTelemetry, gRPC, GraphQL, Java, Go, …), OAP scope enums (Service, ServiceInstance, Endpoint, Process), layer keys (GENERAL, MESH, K8S_SERVICE, …), metric ids, MQE function names, and HTTP / SQL / log keywords are **not** translated in any locale. Operators read these terms across docs, source, and other SkyWalking surfaces —  [...]
+- **Translate meaning, not words.** Use idiomatic, native phrasing. A literal word-for-word translation that reads like machine output is worse than leaving the string in English — restructure the sentence if the target language needs it. Faithfulness is to the *intent*, not the English syntax.
+- **OAP-supplied data is never translated.** Service names, instance names, endpoint names, alarm rule names, tag values, log messages, trace span operation names, anything coming over the OAP wire — that's mutable user data from outside our control, render verbatim regardless of locale. The only OAP-adjacent strings we translate are the layer `alias` and `aliases.*` fields *inside our own templates* (which name the enum for display); the enum value itself is not translated.
+- **Initial translations are AI-assisted, and that's fine.** When seeding a new locale, modern models handle the technical vocabulary competently — we use them as the starting point and ship. Native speakers refine over time as they spot phrasings that aren't quite right; the in-app locale picker and docs invite corrections via PR. Don't treat AI translations as second-class.
+- **Resolution split is fixed.** UI chrome (Vue templates, validation, error toasts, login page, topbar, sidebar, modals, placeholders) resolves client-side with vue-i18n. BFF-shipped templates (bundled layer dashboards, bundled overview dashboards) and user-maintained dashboards stored on OAP resolve BFF-side from sibling `*.i18n.<lang>.json` catalogs before the response leaves the BFF. The UI never sees template translation keys; the BFF never serves UI chrome strings.
+- **Catalog drift is a build-time error.** Catalog keys that don't exist in the source template are pruned at load with a warning; non-string values at translatable paths are dropped. Source structure is the contract.
+
 ## Things that are non-negotiable
 
 - **TypeScript strict.** No `any` outside `.d.ts` shims.
@@ -98,3 +111,6 @@ Design tokens live in the runtime token CSS (`apps/ui/src/assets/styles/tokens.c
 3. **Blanket reverts.** `git checkout <file>` discards anyone else's uncommitted changes too. Diff first, revert by hunk.
 4. **Faking backend data to "unblock" yourself.** A mocked response that shapes nothing real is worse than no response — it hides the real wire mismatch until much later. Ask for OAP access.
 5. **Inventing layouts.** The rendered UI is the visual spec; match the existing dark-dense vocabulary rather than introducing new conventions. If something is genuinely new, ask before designing.
+6. **Dead-route / parameter jumps.** Every `router.push({ path: '…' })`, `<router-link to="…">`, and `entry.widget`-style URL-built path must resolve to a route that's actually defined in `apps/ui/src/shell/router/index.ts` — grep it before you commit. Stale paths (`/debug/mal`, `/debug/history`) compile and ship, then dead-end at runtime with a blank page and no error. **Audit twice:**
+    - *The path.* If you refactor route paths anywhere in the app, grep the entire source tree for every push / `to=` / `router.push({ path })` that targets the old prefix — including dynamic builds like `` `/operate/live-debug/${widget}` ``.
+    - *The parameter-on-mount flow.* When a route takes a query/path param the view loads on first mount (e.g. `?historyId=`, `?catalog=&name=`), the watch that consumes it almost always uses `{ immediate: true }` — which fires *during* setup. Any ref the handler writes to must be declared *above* that watch in the file, or you get a TDZ ReferenceError that silently aborts setup and leaves the page blank with no console trace. Hoist resettable refs above their consumer; never assume Vue' [...]
diff --git a/apps/bff/package.json b/apps/bff/package.json
index 0cb5e0a..4bbd8fc 100644
--- a/apps/bff/package.json
+++ b/apps/bff/package.json
@@ -11,6 +11,8 @@
     "dev": "NODE_ENV=development tsx watch src/server.ts",
     "build": "esbuild src/server.ts --bundle --platform=node --format=esm --target=node20 --outfile=dist/server.js --packages=external",
     "cli:hash": "tsx src/cli/hash.ts",
+    "i18n:seed": "tsx src/i18n/seed.ts",
+    "i18n:validate": "tsx src/i18n/validate.ts",
     "type-check": "tsc --noEmit",
     "lint": "eslint .",
     "lint:fix": "eslint . --fix",
diff --git a/apps/bff/src/bundled_templates/layers/activemq.i18n.de.json b/apps/bff/src/bundled_templates/layers/activemq.i18n.de.json
new file mode 100644
index 0000000..31a6d97
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/activemq.i18n.de.json
@@ -0,0 +1,261 @@
+{
+  "alias": "ActiveMQ",
+  "group": "MQ",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Enqueue/s"
+      },
+      {
+        "label": "Dequeue/s"
+      },
+      {
+        "label": "Systemlast"
+      },
+      {
+        "label": "Threads"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Durchsatz",
+        "metrics": [
+          {
+            "label": "Enqueue/s",
+            "tip": "Pro Sekunde in die Queue gestellte Nachrichten."
+          },
+          {
+            "label": "Dequeue/s",
+            "tip": "Pro Sekunde aus der Queue entnommene Nachrichten."
+          },
+          {
+            "label": "Abgelaufen/s",
+            "tip": "Vor dem Verbrauch abgelaufene Nachrichten."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Systemlast Mittel",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Thread-Anzahl",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Heap genutzt (MB)",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Heap max (MB)",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Enqueue / Dequeue / Dispatch /s",
+        "expressions": [
+          null,
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "enqueue",
+          "dequeue",
+          "dispatch"
+        ]
+      },
+      {
+        "title": "Abgelaufen /s",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Enqueue-Zeit",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "mittel",
+          "max"
+        ]
+      },
+      {
+        "title": "GC-Anzahl (G1+Parallel)",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "old",
+          "young"
+        ]
+      },
+      {
+        "title": "GC-Zeit (ms)",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "old",
+          "young"
+        ]
+      }
+    ],
+    "instance": [
+      {
+        "title": "Verbindungen",
+        "tip": "Aktuelle TCP/JMS-Verbindungen zu diesem Broker.",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Producer-Anzahl",
+        "tip": "Aktive Erzeuger-Sitzungen auf diesem Broker.",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Consumer-Anzahl",
+        "tip": "Aktive Verbraucher-Sitzungen auf diesem Broker.",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Uptime",
+        "tip": "Broker-Uptime in Stunden seit letztem Neustart.",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Verbindungen (Trend)",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Enqueue / Dequeue Anzahl",
+        "tip": "Enqueue + Dequeue pro Minute über alle Ziele auf diesem Broker.",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "enqueue",
+          "dequeue"
+        ]
+      },
+      {
+        "title": "Producer / Consumer Zuwachs",
+        "tip": "Pro Minute neu geöffnete Producer- + Consumer-Sitzungen.",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "neue producers",
+          "neue consumers"
+        ]
+      },
+      {
+        "title": "Speichernutzung",
+        "tip": "Aggregierte Speichernutzung über alle Ziele (MB).",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Speicher-Limit",
+        "tip": "Konfigurierte Speicher-Obergrenze über alle Ziele (GB).",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Mittlere Nachrichtengröße",
+        "tip": "Durchschnittliche Nachrichtengröße über alle Ziele.",
+        "expressions": [
+          null
+        ]
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Producer-Anzahl",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Consumer-Anzahl",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Queue-Größe",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Speichernutzung (MB)",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Nachrichtenanzahl",
+        "expressions": [
+          null,
+          null,
+          null,
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "enqueue",
+          "dequeue",
+          "dispatch",
+          "abgelaufen",
+          "inflight"
+        ]
+      },
+      {
+        "title": "Enqueue-Zeit (s)",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "mittel",
+          "max"
+        ]
+      }
+    ]
+  },
+  "slots": {
+    "services": "ActiveMQ-Cluster",
+    "instances": "Broker",
+    "endpoints": "Ziele"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/activemq.i18n.es.json b/apps/bff/src/bundled_templates/layers/activemq.i18n.es.json
new file mode 100644
index 0000000..a715d47
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/activemq.i18n.es.json
@@ -0,0 +1,174 @@
+{
+  "overview": {
+    "groups": [
+      {
+        "title": "Rendimiento",
+        "metrics": [
+          {
+            "label": "Enqueue/s",
+            "tip": "Mensajes encolados por segundo."
+          },
+          {
+            "label": "Dequeue/s",
+            "tip": "Mensajes desencolados por segundo."
+          },
+          {
+            "label": "Expirados/s",
+            "tip": "Mensajes que expiraron antes de ser consumidos."
+          }
+        ]
+      }
+    ]
+  },
+  "slots": {
+    "instances": "Brokers",
+    "endpoints": "Destinos",
+    "services": "Clústeres de ActiveMQ"
+  },
+  "alias": "ActiveMQ",
+  "group": "MQ",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Enqueue/s"
+      },
+      {
+        "label": "Dequeue/s"
+      },
+      {
+        "label": "Carga del sistema"
+      },
+      {
+        "label": "Hilos"
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Load average del sistema"
+      },
+      {
+        "title": "Conteo de hilos"
+      },
+      {
+        "title": "Heap usado (MB)"
+      },
+      {
+        "title": "Heap máx (MB)"
+      },
+      {
+        "title": "Enqueue / dequeue / dispatch /s",
+        "expressionLabels": [
+          "enqueue",
+          "dequeue",
+          "dispatch"
+        ]
+      },
+      {
+        "title": "Expirados /s"
+      },
+      {
+        "title": "Tiempo de enqueue",
+        "expressionLabels": [
+          "media",
+          "máx"
+        ]
+      },
+      {
+        "title": "Conteo de GC (G1+Parallel)",
+        "expressionLabels": [
+          "old",
+          "young"
+        ]
+      },
+      {
+        "title": "Tiempo de GC (ms)",
+        "expressionLabels": [
+          "old",
+          "young"
+        ]
+      }
+    ],
+    "instance": [
+      {
+        "title": "Conexiones",
+        "tip": "Conexiones TCP/JMS actuales a este broker."
+      },
+      {
+        "title": "Conteo de productores",
+        "tip": "Sesiones de productor activas en este broker."
+      },
+      {
+        "title": "Conteo de consumidores",
+        "tip": "Sesiones de consumidor activas en este broker."
+      },
+      {
+        "title": "Uptime",
+        "tip": "Uptime del broker en horas desde el último reinicio."
+      },
+      {
+        "title": "Conexiones (tendencia)"
+      },
+      {
+        "title": "Conteo de enqueue / dequeue",
+        "tip": "Enqueue + dequeue por minuto en todos los destinos de este broker.",
+        "expressionLabels": [
+          "enqueue",
+          "dequeue"
+        ]
+      },
+      {
+        "title": "Incremento de productores / consumidores",
+        "tip": "Sesiones de productor + consumidor nuevas abiertas por minuto.",
+        "expressionLabels": [
+          "productores nuevos",
+          "consumidores nuevos"
+        ]
+      },
+      {
+        "title": "Uso de memoria",
+        "tip": "Uso de memoria agregado en todos los destinos (MB)."
+      },
+      {
+        "title": "Límite de memoria",
+        "tip": "Tope de memoria configurado en todos los destinos (GB)."
+      },
+      {
+        "title": "Tamaño medio de mensaje",
+        "tip": "Tamaño medio de mensaje en todos los destinos."
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Conteo de productores"
+      },
+      {
+        "title": "Conteo de consumidores"
+      },
+      {
+        "title": "Tamaño de cola"
+      },
+      {
+        "title": "Uso de memoria (MB)"
+      },
+      {
+        "title": "Conteo de mensajes",
+        "expressionLabels": [
+          "enqueue",
+          "dequeue",
+          "dispatch",
+          "expirados",
+          "en curso"
+        ]
+      },
+      {
+        "title": "Tiempo de enqueue (s)",
+        "expressionLabels": [
+          "media",
+          "máx"
+        ]
+      }
+    ]
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/activemq.i18n.fr.json b/apps/bff/src/bundled_templates/layers/activemq.i18n.fr.json
new file mode 100644
index 0000000..6f2dba1
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/activemq.i18n.fr.json
@@ -0,0 +1,174 @@
+{
+  "alias": "ActiveMQ",
+  "group": "MQ",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Enqueue/s"
+      },
+      {
+        "label": "Dequeue/s"
+      },
+      {
+        "label": "Charge système"
+      },
+      {
+        "label": "Threads"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Débit",
+        "metrics": [
+          {
+            "label": "Enqueue/s",
+            "tip": "Messages empilés par seconde."
+          },
+          {
+            "label": "Dequeue/s",
+            "tip": "Messages dépilés par seconde."
+          },
+          {
+            "label": "Expirés/s",
+            "tip": "Messages expirés avant consommation."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Load average système"
+      },
+      {
+        "title": "Nombre de threads"
+      },
+      {
+        "title": "Heap utilisé (Mo)"
+      },
+      {
+        "title": "Heap max (Mo)"
+      },
+      {
+        "title": "Enqueue / Dequeue / Dispatch /s",
+        "expressionLabels": [
+          "enqueue",
+          "dequeue",
+          "dispatch"
+        ]
+      },
+      {
+        "title": "Expirés /s"
+      },
+      {
+        "title": "Temps d'enqueue",
+        "expressionLabels": [
+          "moy",
+          "max"
+        ]
+      },
+      {
+        "title": "Nombre de GC (G1+Parallèle)",
+        "expressionLabels": [
+          "ancien",
+          "young"
+        ]
+      },
+      {
+        "title": "Temps GC (ms)",
+        "expressionLabels": [
+          "ancien",
+          "young"
+        ]
+      }
+    ],
+    "instance": [
+      {
+        "title": "Connexions",
+        "tip": "Connexions TCP/JMS courantes vers ce broker."
+      },
+      {
+        "title": "Nombre de producers",
+        "tip": "Sessions producteur actives sur ce broker."
+      },
+      {
+        "title": "Nombre de consumers",
+        "tip": "Sessions consommateur actives sur ce broker."
+      },
+      {
+        "title": "Disponibilité",
+        "tip": "Disponibilité du broker en heures depuis le dernier redémarrage."
+      },
+      {
+        "title": "Connexions (tendance)"
+      },
+      {
+        "title": "Nombre d'enqueue / dequeue",
+        "tip": "Enqueue + dequeue par minute sur l'ensemble des destinations de ce broker.",
+        "expressionLabels": [
+          "enqueue",
+          "dequeue"
+        ]
+      },
+      {
+        "title": "Augmentation producer / consumer",
+        "tip": "Nouvelles sessions producer + consumer ouvertes par minute.",
+        "expressionLabels": [
+          "nouveaux producers",
+          "nouveaux consumers"
+        ]
+      },
+      {
+        "title": "Utilisation mémoire",
+        "tip": "Utilisation mémoire agrégée sur l'ensemble des destinations (Mo)."
+      },
+      {
+        "title": "Limite mémoire",
+        "tip": "Plafond mémoire configuré sur l'ensemble des destinations (Go)."
+      },
+      {
+        "title": "Taille de message moyenne",
+        "tip": "Taille moyenne des messages sur l'ensemble des destinations."
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Nombre de producers"
+      },
+      {
+        "title": "Nombre de consumers"
+      },
+      {
+        "title": "Taille de la file"
+      },
+      {
+        "title": "Utilisation mémoire (Mo)"
+      },
+      {
+        "title": "Nombre de messages",
+        "expressionLabels": [
+          "enqueue",
+          "dequeue",
+          "dispatch",
+          "expirés",
+          "en vol"
+        ]
+      },
+      {
+        "title": "Temps d'enqueue (s)",
+        "expressionLabels": [
+          "moy",
+          "max"
+        ]
+      }
+    ]
+  },
+  "slots": {
+    "services": "Clusters ActiveMQ",
+    "instances": "Brokers",
+    "endpoints": "Destinations"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/activemq.i18n.ja.json b/apps/bff/src/bundled_templates/layers/activemq.i18n.ja.json
new file mode 100644
index 0000000..b82677c
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/activemq.i18n.ja.json
@@ -0,0 +1,174 @@
+{
+  "alias": "ActiveMQ",
+  "group": "MQ",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "エンキュー/s"
+      },
+      {
+        "label": "デキュー/s"
+      },
+      {
+        "label": "システム負荷"
+      },
+      {
+        "label": "スレッド"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "スループット",
+        "metrics": [
+          {
+            "label": "エンキュー/s",
+            "tip": "1秒あたりのエンキューメッセージ数。"
+          },
+          {
+            "label": "デキュー/s",
+            "tip": "1秒あたりのデキューメッセージ数。"
+          },
+          {
+            "label": "期限切れ/s",
+            "tip": "コンシューム前に期限切れとなったメッセージ。"
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "システムロードアベレージ"
+      },
+      {
+        "title": "スレッド数"
+      },
+      {
+        "title": "ヒープ使用中 (MB)"
+      },
+      {
+        "title": "ヒープ最大 (MB)"
+      },
+      {
+        "title": "エンキュー / デキュー / ディスパッチ /s",
+        "expressionLabels": [
+          "エンキュー",
+          "デキュー",
+          "ディスパッチ"
+        ]
+      },
+      {
+        "title": "期限切れ /s"
+      },
+      {
+        "title": "エンキュー時間",
+        "expressionLabels": [
+          "平均",
+          "最大"
+        ]
+      },
+      {
+        "title": "GC 回数 (G1+Parallel)",
+        "expressionLabels": [
+          "old",
+          "young"
+        ]
+      },
+      {
+        "title": "GC 時間 (ms)",
+        "expressionLabels": [
+          "old",
+          "young"
+        ]
+      }
+    ],
+    "instance": [
+      {
+        "title": "接続",
+        "tip": "この Broker への現在の TCP/JMS 接続数。"
+      },
+      {
+        "title": "プロデューサー数",
+        "tip": "この Broker のアクティブなプロデューサーセッション。"
+      },
+      {
+        "title": "コンシューマー数",
+        "tip": "この Broker のアクティブなコンシューマーセッション。"
+      },
+      {
+        "title": "稼働時間",
+        "tip": "前回の再起動からの Broker 稼働時間(時間単位)。"
+      },
+      {
+        "title": "接続 (傾向)"
+      },
+      {
+        "title": "エンキュー / デキュー件数",
+        "tip": "この Broker の宛先全体での 1分あたりエンキュー + デキュー。",
+        "expressionLabels": [
+          "エンキュー",
+          "デキュー"
+        ]
+      },
+      {
+        "title": "プロデューサー / コンシューマー増分",
+        "tip": "1分あたりに開かれた新規プロデューサー + コンシューマーセッション。",
+        "expressionLabels": [
+          "新規プロデューサー",
+          "新規コンシューマー"
+        ]
+      },
+      {
+        "title": "メモリ使用率",
+        "tip": "宛先全体のメモリ使用量合計 (MB)。"
+      },
+      {
+        "title": "メモリ上限",
+        "tip": "宛先全体の設定メモリ上限 (GB)。"
+      },
+      {
+        "title": "平均メッセージサイズ",
+        "tip": "宛先全体での平均メッセージサイズ。"
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "プロデューサー数"
+      },
+      {
+        "title": "コンシューマー数"
+      },
+      {
+        "title": "キューサイズ"
+      },
+      {
+        "title": "メモリ使用量 (MB)"
+      },
+      {
+        "title": "メッセージ数",
+        "expressionLabels": [
+          "エンキュー",
+          "デキュー",
+          "ディスパッチ",
+          "期限切れ",
+          "処理中"
+        ]
+      },
+      {
+        "title": "エンキュー時間 (s)",
+        "expressionLabels": [
+          "平均",
+          "最大"
+        ]
+      }
+    ]
+  },
+  "slots": {
+    "services": "ActiveMQ クラスタ",
+    "instances": "Broker",
+    "endpoints": "宛先"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/activemq.i18n.ko.json b/apps/bff/src/bundled_templates/layers/activemq.i18n.ko.json
new file mode 100644
index 0000000..f4fa78f
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/activemq.i18n.ko.json
@@ -0,0 +1,174 @@
+{
+  "alias": "ActiveMQ",
+  "group": "MQ",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Enqueue/s"
+      },
+      {
+        "label": "Dequeue/s"
+      },
+      {
+        "label": "시스템 부하"
+      },
+      {
+        "label": "스레드"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "처리량",
+        "metrics": [
+          {
+            "label": "Enqueue/s",
+            "tip": "초당 Enqueue 된 메시지 수입니다."
+          },
+          {
+            "label": "Dequeue/s",
+            "tip": "초당 Dequeue 된 메시지 수입니다."
+          },
+          {
+            "label": "Expired/s",
+            "tip": "소비되기 전에 만료된 메시지입니다."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "시스템 부하 평균"
+      },
+      {
+        "title": "스레드 수"
+      },
+      {
+        "title": "Heap 사용 (MB)"
+      },
+      {
+        "title": "Heap 최대 (MB)"
+      },
+      {
+        "title": "Enqueue / Dequeue / Dispatch /s",
+        "expressionLabels": [
+          "enqueue",
+          "dequeue",
+          "dispatch"
+        ]
+      },
+      {
+        "title": "만료 /s"
+      },
+      {
+        "title": "Enqueue 시간",
+        "expressionLabels": [
+          "평균",
+          "최대"
+        ]
+      },
+      {
+        "title": "GC 수 (G1+Parallel)",
+        "expressionLabels": [
+          "old",
+          "young"
+        ]
+      },
+      {
+        "title": "GC 시간 (ms)",
+        "expressionLabels": [
+          "old",
+          "young"
+        ]
+      }
+    ],
+    "instance": [
+      {
+        "title": "연결",
+        "tip": "이 브로커에 대한 현재 TCP/JMS 연결 수입니다."
+      },
+      {
+        "title": "생산자 수",
+        "tip": "이 브로커의 활성 생산자 세션 수입니다."
+      },
+      {
+        "title": "소비자 수",
+        "tip": "이 브로커의 활성 소비자 세션 수입니다."
+      },
+      {
+        "title": "가동 시간",
+        "tip": "마지막 재시작 이후 브로커 가동 시간(시간 단위)입니다."
+      },
+      {
+        "title": "연결 (추세)"
+      },
+      {
+        "title": "Enqueue / Dequeue 수",
+        "tip": "이 브로커의 대상별 분당 Enqueue + Dequeue 입니다.",
+        "expressionLabels": [
+          "enqueue",
+          "dequeue"
+        ]
+      },
+      {
+        "title": "생산자 / 소비자 증가",
+        "tip": "분당 새로 열리는 생산자 + 소비자 세션 수입니다.",
+        "expressionLabels": [
+          "새 생산자",
+          "새 소비자"
+        ]
+      },
+      {
+        "title": "메모리 사용량",
+        "tip": "대상별 총 메모리 사용량 (MB)입니다."
+      },
+      {
+        "title": "메모리 제한",
+        "tip": "대상별로 설정된 메모리 상한 (GB)입니다."
+      },
+      {
+        "title": "평균 메시지 크기",
+        "tip": "대상 간 평균 메시지 크기입니다."
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "생산자 수"
+      },
+      {
+        "title": "소비자 수"
+      },
+      {
+        "title": "큐 크기"
+      },
+      {
+        "title": "메모리 사용량 (MB)"
+      },
+      {
+        "title": "메시지 수",
+        "expressionLabels": [
+          "enqueue",
+          "dequeue",
+          "dispatch",
+          "만료",
+          "inflight"
+        ]
+      },
+      {
+        "title": "Enqueue 시간 (s)",
+        "expressionLabels": [
+          "평균",
+          "최대"
+        ]
+      }
+    ]
+  },
+  "slots": {
+    "services": "ActiveMQ 클러스터",
+    "instances": "Broker",
+    "endpoints": "대상"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/activemq.i18n.pt.json b/apps/bff/src/bundled_templates/layers/activemq.i18n.pt.json
new file mode 100644
index 0000000..e64e752
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/activemq.i18n.pt.json
@@ -0,0 +1,174 @@
+{
+  "alias": "ActiveMQ",
+  "group": "MQ",
+  "slots": {
+    "services": "Clusters do ActiveMQ",
+    "instances": "Brokers",
+    "endpoints": "Destinos"
+  },
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Enqueue/s"
+      },
+      {
+        "label": "Dequeue/s"
+      },
+      {
+        "label": "Carga do sistema"
+      },
+      {
+        "label": "Threads"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Vazão",
+        "metrics": [
+          {
+            "label": "Enqueue/s",
+            "tip": "Mensagens enfileiradas por segundo."
+          },
+          {
+            "label": "Dequeue/s",
+            "tip": "Mensagens desenfileiradas por segundo."
+          },
+          {
+            "label": "Expiradas/s",
+            "tip": "Mensagens que expiraram antes de serem consumidas."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Média de carga do sistema"
+      },
+      {
+        "title": "Quantidade de threads"
+      },
+      {
+        "title": "Heap usado (MB)"
+      },
+      {
+        "title": "Heap máximo (MB)"
+      },
+      {
+        "title": "Enqueue / Dequeue / Dispatch /s",
+        "expressionLabels": [
+          "enqueue",
+          "dequeue",
+          "dispatch"
+        ]
+      },
+      {
+        "title": "Expiradas /s"
+      },
+      {
+        "title": "Tempo de enqueue",
+        "expressionLabels": [
+          "média",
+          "máx"
+        ]
+      },
+      {
+        "title": "Contagem de GC (G1+Parallel)",
+        "expressionLabels": [
+          "old",
+          "young"
+        ]
+      },
+      {
+        "title": "Tempo de GC (ms)",
+        "expressionLabels": [
+          "old",
+          "young"
+        ]
+      }
+    ],
+    "instance": [
+      {
+        "title": "Conexões",
+        "tip": "Conexões TCP/JMS atuais com este broker."
+      },
+      {
+        "title": "Quantidade de produtores",
+        "tip": "Sessões de produtor ativas neste broker."
+      },
+      {
+        "title": "Quantidade de consumidores",
+        "tip": "Sessões de consumidor ativas neste broker."
+      },
+      {
+        "title": "Uptime",
+        "tip": "Tempo de atividade do broker em horas desde o último reinício."
+      },
+      {
+        "title": "Conexões (tendência)"
+      },
+      {
+        "title": "Contagem de enqueue / dequeue",
+        "tip": "Enqueue + dequeue por minuto entre os destinos deste broker.",
+        "expressionLabels": [
+          "enqueue",
+          "dequeue"
+        ]
+      },
+      {
+        "title": "Aumento de produtores / consumidores",
+        "tip": "Novas sessões de produtor + consumidor abertas por minuto.",
+        "expressionLabels": [
+          "novos produtores",
+          "novos consumidores"
+        ]
+      },
+      {
+        "title": "Uso de memória",
+        "tip": "Uso de memória agregado entre os destinos (MB)."
+      },
+      {
+        "title": "Limite de memória",
+        "tip": "Teto de memória configurado entre os destinos (GB)."
+      },
+      {
+        "title": "Tamanho médio de mensagem",
+        "tip": "Tamanho médio de mensagem entre os destinos."
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Quantidade de produtores"
+      },
+      {
+        "title": "Quantidade de consumidores"
+      },
+      {
+        "title": "Tamanho da fila"
+      },
+      {
+        "title": "Uso de memória (MB)"
+      },
+      {
+        "title": "Contagem de mensagens",
+        "expressionLabels": [
+          "enqueue",
+          "dequeue",
+          "dispatch",
+          "expiradas",
+          "em trânsito"
+        ]
+      },
+      {
+        "title": "Tempo de enqueue (s)",
+        "expressionLabels": [
+          "média",
+          "máx"
+        ]
+      }
+    ]
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/activemq.i18n.zh-CN.json b/apps/bff/src/bundled_templates/layers/activemq.i18n.zh-CN.json
new file mode 100644
index 0000000..c65c8d5
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/activemq.i18n.zh-CN.json
@@ -0,0 +1,87 @@
+{
+  "group": "MQ",
+  "slots": {
+    "services": "ActiveMQ 集群",
+    "instances": "Broker",
+    "endpoints": "目的地"
+  },
+  "layer-header": {
+    "columns": [
+      { "label": "入队/秒" },
+      { "label": "出队/秒" },
+      { "label": "系统负载" },
+      { "label": "线程数" }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "吞吐量",
+        "metrics": [
+          { "label": "入队/秒", "tip": "每秒入队的消息数。" },
+          { "label": "出队/秒", "tip": "每秒出队的消息数。" },
+          { "label": "过期/秒", "tip": "在被消费前过期的消息数。" }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      { "title": "系统平均负载" },
+      { "title": "线程数" },
+      { "title": "Heap 已用(MB)" },
+      { "title": "Heap 最大值(MB)" },
+      {
+        "title": "入队 / 出队 / 派发 每秒",
+        "expressionLabels": ["enqueue", "dequeue", "dispatch"]
+      },
+      { "title": "过期数 每秒" },
+      {
+        "title": "入队耗时",
+        "expressionLabels": ["avg", "max"]
+      },
+      {
+        "title": "GC 次数(G1+Parallel)",
+        "expressionLabels": ["old", "young"]
+      },
+      {
+        "title": "GC 时间(ms)",
+        "expressionLabels": ["old", "young"]
+      }
+    ],
+    "instance": [
+      { "title": "连接数", "tip": "当前到此 Broker 的 TCP/JMS 连接数。" },
+      { "title": "Producer 数量", "tip": "此 Broker 上活跃的 Producer 会话数。" },
+      { "title": "Consumer 数量", "tip": "此 Broker 上活跃的 Consumer 会话数。" },
+      { "title": "运行时长", "tip": "自上次重启以来 Broker 的运行小时数。" },
+      { "title": "连接数(趋势)" },
+      {
+        "title": "入队 / 出队次数",
+        "tip": "此 Broker 上各目的地每分钟的入队 + 出队次数。",
+        "expressionLabels": ["enqueue", "dequeue"]
+      },
+      {
+        "title": "Producer / Consumer 增长",
+        "tip": "每分钟新建的 Producer + Consumer 会话数。",
+        "expressionLabels": ["新 Producer", "新 Consumer"]
+      },
+      { "title": "内存使用", "tip": "各目的地的总内存使用(MB)。" },
+      { "title": "内存上限", "tip": "各目的地配置的内存上限(GB)。" },
+      { "title": "平均消息大小", "tip": "各目的地的平均消息大小。" }
+    ],
+    "endpoint": [
+      { "title": "Producer 数量" },
+      { "title": "Consumer 数量" },
+      { "title": "队列大小" },
+      { "title": "内存使用(MB)" },
+      {
+        "title": "消息计数",
+        "expressionLabels": ["enqueue", "dequeue", "dispatch", "expired", "inflight"]
+      },
+      {
+        "title": "入队耗时(s)",
+        "expressionLabels": ["avg", "max"]
+      }
+    ]
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.de.json b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.de.json
new file mode 100644
index 0000000..949769e
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.de.json
@@ -0,0 +1,142 @@
+{
+  "alias": "Alipay Mini-Programm",
+  "group": "Mobil",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Anfrage-RPM"
+      },
+      {
+        "label": "Start"
+      },
+      {
+        "label": "First Render"
+      },
+      {
+        "label": "Fehler"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Latenz & Fehler",
+        "metrics": [
+          {
+            "label": "Anfrage-P95",
+            "tip": "95. Perzentil der Anfragedauer über die Mini-Programm-Netzwerk-Bridge."
+          },
+          {
+            "label": "Start",
+            "tip": "Ungefähre Mini-Programm-Startdauer."
+          },
+          {
+            "label": "Fehler",
+            "tip": "Gemeldete Fehleranzahl."
+          }
+        ]
+      },
+      {
+        "title": "Durchsatz",
+        "metrics": [
+          {
+            "label": "Anfrage-RPM",
+            "tip": "Bridge-Anfragen pro Minute."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "App-Startdauer",
+        "tip": "Ungefähre Kaltstartdauer aus dem Alipay-Container.",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "First-Render-Dauer",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Fehleranzahl",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Anfragelast",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Anfragedauer-Perzentil",
+        "expressions": [
+          null
+        ]
+      }
+    ],
+    "instance": [
+      {
+        "title": "Startdauer",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "First-Render-Dauer",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Anfragelast",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Anfragedauer-Perzentil",
+        "expressions": [
+          null
+        ]
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Startdauer auf Seite",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "First-Render-Dauer",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Anfragelast",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Anfragedauer-Perzentil",
+        "expressions": [
+          null
+        ]
+      }
+    ]
+  },
+  "slots": {
+    "services": "Mini-Programme",
+    "instances": "Versionen",
+    "endpoints": "Seiten"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.es.json b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.es.json
new file mode 100644
index 0000000..6e883eb
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.es.json
@@ -0,0 +1,103 @@
+{
+  "layer-header": {
+    "columns": [
+      {
+        "label": "RPM de peticiones"
+      },
+      {
+        "label": "Lanzamiento"
+      },
+      {
+        "label": "Primer render"
+      },
+      {
+        "label": "Errores"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Latencia y errores",
+        "metrics": [
+          {
+            "label": "Petición P95",
+            "tip": "Duración de petición en el percentil 95 desde el puente de red del mini programa."
+          },
+          {
+            "label": "Lanzamiento",
+            "tip": "Duración aproximada del lanzamiento del mini programa."
+          },
+          {
+            "label": "Errores",
+            "tip": "Conteo de errores reportados."
+          }
+        ]
+      },
+      {
+        "title": "Rendimiento",
+        "metrics": [
+          {
+            "label": "RPM de peticiones",
+            "tip": "Peticiones del puente por minuto."
+          }
+        ]
+      }
+    ]
+  },
+  "slots": {
+    "instances": "Versiones",
+    "endpoints": "Páginas",
+    "services": "Mini programas"
+  },
+  "alias": "Mini programa de Alipay",
+  "group": "Móvil",
+  "dashboards": {
+    "service": [
+      {
+        "title": "Duración del lanzamiento de la app",
+        "tip": "Duración aproximada del arranque en frío desde el contenedor de Alipay."
+      },
+      {
+        "title": "Duración del primer render"
+      },
+      {
+        "title": "Conteo de errores"
+      },
+      {
+        "title": "Carga de peticiones"
+      },
+      {
+        "title": "Percentil de duración de peticiones"
+      }
+    ],
+    "instance": [
+      {
+        "title": "Duración del lanzamiento"
+      },
+      {
+        "title": "Duración del primer render"
+      },
+      {
+        "title": "Carga de peticiones"
+      },
+      {
+        "title": "Percentil de duración de peticiones"
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Duración del lanzamiento en la página"
+      },
+      {
+        "title": "Duración del primer render"
+      },
+      {
+        "title": "Carga de peticiones"
+      },
+      {
+        "title": "Percentil de duración de peticiones"
+      }
+    ]
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.fr.json b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.fr.json
new file mode 100644
index 0000000..5cb9095
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.fr.json
@@ -0,0 +1,103 @@
+{
+  "alias": "Mini-programme Alipay",
+  "group": "Mobile",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "RPM des requêtes"
+      },
+      {
+        "label": "Lancement"
+      },
+      {
+        "label": "Premier rendu"
+      },
+      {
+        "label": "Erreurs"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Latence et erreurs",
+        "metrics": [
+          {
+            "label": "P95 des requêtes",
+            "tip": "Durée de requête au 95e centile depuis le bridge réseau du mini-programme."
+          },
+          {
+            "label": "Lancement",
+            "tip": "Durée approximative de lancement du mini-programme."
+          },
+          {
+            "label": "Erreurs",
+            "tip": "Nombre d'erreurs remontées."
+          }
+        ]
+      },
+      {
+        "title": "Débit",
+        "metrics": [
+          {
+            "label": "RPM des requêtes",
+            "tip": "Requêtes via le bridge par minute."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Durée de lancement de l'app",
+        "tip": "Durée approximative de lancement à froid depuis le conteneur Alipay."
+      },
+      {
+        "title": "Durée du premier rendu"
+      },
+      {
+        "title": "Nombre d'erreurs"
+      },
+      {
+        "title": "Charge de requêtes"
+      },
+      {
+        "title": "Centile de durée de requête"
+      }
+    ],
+    "instance": [
+      {
+        "title": "Durée de lancement"
+      },
+      {
+        "title": "Durée du premier rendu"
+      },
+      {
+        "title": "Charge de requêtes"
+      },
+      {
+        "title": "Centile de durée de requête"
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Durée de lancement sur la page"
+      },
+      {
+        "title": "Durée du premier rendu"
+      },
+      {
+        "title": "Charge de requêtes"
+      },
+      {
+        "title": "Centile de durée de requête"
+      }
+    ]
+  },
+  "slots": {
+    "services": "Mini-programmes",
+    "instances": "Versions",
+    "endpoints": "Pages"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.ja.json b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.ja.json
new file mode 100644
index 0000000..739a4b6
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.ja.json
@@ -0,0 +1,103 @@
+{
+  "alias": "Alipay ミニプログラム",
+  "group": "モバイル",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "リクエスト RPM"
+      },
+      {
+        "label": "起動"
+      },
+      {
+        "label": "初回描画"
+      },
+      {
+        "label": "エラー"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "レイテンシとエラー",
+        "metrics": [
+          {
+            "label": "リクエスト P95",
+            "tip": "ミニプログラムネットワークブリッジからのリクエスト所要時間の 95 パーセンタイル。"
+          },
+          {
+            "label": "起動",
+            "tip": "ミニプログラムの概算起動所要時間。"
+          },
+          {
+            "label": "エラー",
+            "tip": "報告されたエラー件数。"
+          }
+        ]
+      },
+      {
+        "title": "スループット",
+        "metrics": [
+          {
+            "label": "リクエスト RPM",
+            "tip": "1分あたりのブリッジリクエスト数。"
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "アプリ起動所要時間",
+        "tip": "Alipay コンテナからの概算コールド起動所要時間。"
+      },
+      {
+        "title": "初回描画所要時間"
+      },
+      {
+        "title": "エラー件数"
+      },
+      {
+        "title": "リクエスト負荷"
+      },
+      {
+        "title": "リクエスト所要時間パーセンタイル"
+      }
+    ],
+    "instance": [
+      {
+        "title": "起動所要時間"
+      },
+      {
+        "title": "初回描画所要時間"
+      },
+      {
+        "title": "リクエスト負荷"
+      },
+      {
+        "title": "リクエスト所要時間パーセンタイル"
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "ページ単位の起動所要時間"
+      },
+      {
+        "title": "初回描画所要時間"
+      },
+      {
+        "title": "リクエスト負荷"
+      },
+      {
+        "title": "リクエスト所要時間パーセンタイル"
+      }
+    ]
+  },
+  "slots": {
+    "services": "ミニプログラム",
+    "instances": "バージョン",
+    "endpoints": "ページ"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.ko.json b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.ko.json
new file mode 100644
index 0000000..1a5e4db
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.ko.json
@@ -0,0 +1,103 @@
+{
+  "alias": "Alipay 미니프로그램",
+  "group": "모바일",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "요청 RPM"
+      },
+      {
+        "label": "실행"
+      },
+      {
+        "label": "최초 렌더"
+      },
+      {
+        "label": "오류"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "지연 시간 및 오류",
+        "metrics": [
+          {
+            "label": "요청 P95",
+            "tip": "미니 프로그램 네트워크 브리지의 95번째 백분위 요청 시간입니다."
+          },
+          {
+            "label": "실행",
+            "tip": "대략적인 미니 프로그램 실행 시간입니다."
+          },
+          {
+            "label": "오류",
+            "tip": "보고된 오류 수입니다."
+          }
+        ]
+      },
+      {
+        "title": "처리량",
+        "metrics": [
+          {
+            "label": "요청 RPM",
+            "tip": "브리지의 분당 요청 수입니다."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "앱 실행 시간",
+        "tip": "알리페이 컨테이너의 대략적인 콜드 런치 시간입니다."
+      },
+      {
+        "title": "최초 렌더 시간"
+      },
+      {
+        "title": "오류 수"
+      },
+      {
+        "title": "요청 부하"
+      },
+      {
+        "title": "요청 시간 백분위"
+      }
+    ],
+    "instance": [
+      {
+        "title": "실행 시간"
+      },
+      {
+        "title": "최초 렌더 시간"
+      },
+      {
+        "title": "요청 부하"
+      },
+      {
+        "title": "요청 시간 백분위"
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "페이지의 실행 시간"
+      },
+      {
+        "title": "최초 렌더 시간"
+      },
+      {
+        "title": "요청 부하"
+      },
+      {
+        "title": "요청 시간 백분위"
+      }
+    ]
+  },
+  "slots": {
+    "services": "미니 프로그램",
+    "instances": "버전",
+    "endpoints": "페이지"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.pt.json b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.pt.json
new file mode 100644
index 0000000..5b16a8c
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.pt.json
@@ -0,0 +1,103 @@
+{
+  "alias": "Mini Programa do Alipay",
+  "group": "Móvel",
+  "slots": {
+    "services": "Mini programas",
+    "instances": "Versões",
+    "endpoints": "Páginas"
+  },
+  "layer-header": {
+    "columns": [
+      {
+        "label": "RPM de requisições"
+      },
+      {
+        "label": "Inicialização"
+      },
+      {
+        "label": "Primeira renderização"
+      },
+      {
+        "label": "Erros"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Latência e erros",
+        "metrics": [
+          {
+            "label": "Requisição P95",
+            "tip": "Duração da requisição no percentil 95 a partir da ponte de rede do mini programa."
+          },
+          {
+            "label": "Inicialização",
+            "tip": "Duração aproximada de inicialização do mini programa."
+          },
+          {
+            "label": "Erros",
+            "tip": "Contagem de erros reportados."
+          }
+        ]
+      },
+      {
+        "title": "Vazão",
+        "metrics": [
+          {
+            "label": "RPM de requisições",
+            "tip": "Requisições da ponte por minuto."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Duração da inicialização do app",
+        "tip": "Duração aproximada do cold-start a partir do contêiner do Alipay."
+      },
+      {
+        "title": "Duração da primeira renderização"
+      },
+      {
+        "title": "Contagem de erros"
+      },
+      {
+        "title": "Carga de requisições"
+      },
+      {
+        "title": "Percentil de duração das requisições"
+      }
+    ],
+    "instance": [
+      {
+        "title": "Duração da inicialização"
+      },
+      {
+        "title": "Duração da primeira renderização"
+      },
+      {
+        "title": "Carga de requisições"
+      },
+      {
+        "title": "Percentil de duração das requisições"
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Duração da inicialização na página"
+      },
+      {
+        "title": "Duração da primeira renderização"
+      },
+      {
+        "title": "Carga de requisições"
+      },
+      {
+        "title": "Percentil de duração das requisições"
+      }
+    ]
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.zh-CN.json b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.zh-CN.json
new file mode 100644
index 0000000..ff8edfb
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.zh-CN.json
@@ -0,0 +1,56 @@
+{
+  "alias": "支付宝小程序",
+  "group": "移动",
+  "slots": {
+    "services": "小程序",
+    "instances": "版本",
+    "endpoints": "页面"
+  },
+  "layer-header": {
+    "columns": [
+      { "label": "请求 RPM" },
+      { "label": "启动" },
+      { "label": "首屏渲染" },
+      { "label": "错误" }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "延迟与错误",
+        "metrics": [
+          { "label": "请求 P95", "tip": "来自小程序网络桥的 95 分位请求耗时。" },
+          { "label": "启动", "tip": "小程序大致启动耗时。" },
+          { "label": "错误", "tip": "上报的错误次数。" }
+        ]
+      },
+      {
+        "title": "吞吐量",
+        "metrics": [
+          { "label": "请求 RPM", "tip": "桥每分钟的请求数。" }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      { "title": "应用启动耗时", "tip": "来自支付宝容器的大致冷启动耗时。" },
+      { "title": "首屏渲染耗时" },
+      { "title": "错误数" },
+      { "title": "请求负载" },
+      { "title": "请求耗时分位" }
+    ],
+    "instance": [
+      { "title": "启动耗时" },
+      { "title": "首屏渲染耗时" },
+      { "title": "请求负载" },
+      { "title": "请求耗时分位" }
+    ],
+    "endpoint": [
+      { "title": "页面启动耗时" },
+      { "title": "首屏渲染耗时" },
+      { "title": "请求负载" },
+      { "title": "请求耗时分位" }
+    ]
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/apisix.i18n.de.json b/apps/bff/src/bundled_templates/layers/apisix.i18n.de.json
new file mode 100644
index 0000000..7632905
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/apisix.i18n.de.json
@@ -0,0 +1,184 @@
+{
+  "alias": "APISIX",
+  "group": "Gateways",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "RPS"
+      },
+      {
+        "label": "200/s"
+      },
+      {
+        "label": "404/s"
+      },
+      {
+        "label": "503/s"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Durchsatz",
+        "metrics": [
+          {
+            "label": "RPS",
+            "tip": "Anfragen pro Sekunde, die von APISIX-Routen getroffen wurden."
+          },
+          {
+            "label": "5xx",
+            "tip": "Upstream- / Gateway-Fehlerklasse."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "HTTP-Request-Trend",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "HTTP-Status-Trend",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "HTTP-Latenz",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "HTTP-Bandbreite",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "HTTP-Verbindungen",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Status-Trend ohne Treffer",
+        "tip": "Anfragen ohne passende APISIX-Route.",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Latenz ohne Treffer",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Bandbreite ohne Treffer",
+        "expressions": [
+          null
+        ]
+      }
+    ],
+    "instance": [
+      {
+        "title": "HTTP-Request-Trend",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "HTTP-Status-Trend",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "HTTP-Latenz",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "HTTP-Bandbreite",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "HTTP-Verbindungen",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Shared Dict",
+        "tip": "Kapazität vs. freier Speicher.",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "kapazität",
+          "frei"
+        ]
+      },
+      {
+        "title": "etcd",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "indizes",
+          "erreichbar"
+        ]
+      },
+      {
+        "title": "Traffic ohne Treffer",
+        "tip": "Status + Latenz + Bandbreite für Anfragen ohne passende Route.",
+        "expressions": [
+          null,
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "status",
+          "latenz (ms)",
+          "bandbreite (KB)"
+        ]
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "HTTP-Status-Trend",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "HTTP-Latenz",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "HTTP-Bandbreite",
+        "expressions": [
+          null
+        ]
+      }
+    ]
+  },
+  "slots": {
+    "services": "APISIX-Dienste",
+    "instances": "Knoten",
+    "endpoints": "Routes"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/apisix.i18n.es.json b/apps/bff/src/bundled_templates/layers/apisix.i18n.es.json
new file mode 100644
index 0000000..8f21fd8
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/apisix.i18n.es.json
@@ -0,0 +1,123 @@
+{
+  "overview": {
+    "groups": [
+      {
+        "title": "Rendimiento",
+        "metrics": [
+          {
+            "label": "RPS",
+            "tip": "Peticiones por segundo coincidentes con rutas de APISIX."
+          },
+          {
+            "label": "5xx",
+            "tip": "Clase de error upstream / gateway."
+          }
+        ]
+      }
+    ]
+  },
+  "slots": {
+    "instances": "Nodos",
+    "services": "Servicios de APISIX",
+    "endpoints": "Rutas"
+  },
+  "group": "Gateways",
+  "alias": "APISIX",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "RPS"
+      },
+      {
+        "label": "200/s"
+      },
+      {
+        "label": "404/s"
+      },
+      {
+        "label": "503/s"
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Tendencia de peticiones HTTP"
+      },
+      {
+        "title": "Tendencia de estado HTTP"
+      },
+      {
+        "title": "Latencia HTTP"
+      },
+      {
+        "title": "Ancho de banda HTTP"
+      },
+      {
+        "title": "Conexiones HTTP"
+      },
+      {
+        "title": "Tendencia de estado sin coincidencia",
+        "tip": "Peticiones sin ruta APISIX coincidente."
+      },
+      {
+        "title": "Latencia sin coincidencia"
+      },
+      {
+        "title": "Ancho de banda sin coincidencia"
+      }
+    ],
+    "instance": [
+      {
+        "title": "Tendencia de peticiones HTTP"
+      },
+      {
+        "title": "Tendencia de estado HTTP"
+      },
+      {
+        "title": "Latencia HTTP"
+      },
+      {
+        "title": "Ancho de banda HTTP"
+      },
+      {
+        "title": "Conexiones HTTP"
+      },
+      {
+        "title": "Diccionario compartido",
+        "tip": "Capacidad vs espacio libre.",
+        "expressionLabels": [
+          "capacidad",
+          "libre"
+        ]
+      },
+      {
+        "title": "etcd",
+        "expressionLabels": [
+          "índices",
+          "accesible"
+        ]
+      },
+      {
+        "title": "Tráfico sin coincidencia",
+        "tip": "Estado + latencia + ancho de banda para peticiones sin ruta coincidente.",
+        "expressionLabels": [
+          "estado",
+          "latencia (ms)",
+          "ancho de banda (KB)"
+        ]
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Tendencia de estado HTTP"
+      },
+      {
+        "title": "Latencia HTTP"
+      },
+      {
+        "title": "Ancho de banda HTTP"
+      }
+    ]
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/apisix.i18n.fr.json b/apps/bff/src/bundled_templates/layers/apisix.i18n.fr.json
new file mode 100644
index 0000000..48abde5
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/apisix.i18n.fr.json
@@ -0,0 +1,123 @@
+{
+  "alias": "APISIX",
+  "group": "Passerelles",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "RPS"
+      },
+      {
+        "label": "200/s"
+      },
+      {
+        "label": "404/s"
+      },
+      {
+        "label": "503/s"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Débit",
+        "metrics": [
+          {
+            "label": "RPS",
+            "tip": "Requêtes par seconde matchées par les routes APISIX."
+          },
+          {
+            "label": "5xx",
+            "tip": "Classe d'erreur upstream / passerelle."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Tendance des requêtes HTTP"
+      },
+      {
+        "title": "Tendance des statuts HTTP"
+      },
+      {
+        "title": "Latence HTTP"
+      },
+      {
+        "title": "Bande passante HTTP"
+      },
+      {
+        "title": "Connexions HTTP"
+      },
+      {
+        "title": "Tendance des statuts non matchés",
+        "tip": "Requêtes sans route APISIX correspondante."
+      },
+      {
+        "title": "Latence non matchée"
+      },
+      {
+        "title": "Bande passante non matchée"
+      }
+    ],
+    "instance": [
+      {
+        "title": "Tendance des requêtes HTTP"
+      },
+      {
+        "title": "Tendance des statuts HTTP"
+      },
+      {
+        "title": "Latence HTTP"
+      },
+      {
+        "title": "Bande passante HTTP"
+      },
+      {
+        "title": "Connexions HTTP"
+      },
+      {
+        "title": "Dict partagé",
+        "tip": "Capacité vs espace libre.",
+        "expressionLabels": [
+          "capacité",
+          "libre"
+        ]
+      },
+      {
+        "title": "etcd",
+        "expressionLabels": [
+          "index",
+          "joignable"
+        ]
+      },
+      {
+        "title": "Trafic non matché",
+        "tip": "Statut + latence + bande passante pour les requêtes sans route correspondante.",
+        "expressionLabels": [
+          "statut",
+          "latence (ms)",
+          "bande passante (Ko)"
+        ]
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Tendance des statuts HTTP"
+      },
+      {
+        "title": "Latence HTTP"
+      },
+      {
+        "title": "Bande passante HTTP"
+      }
+    ]
+  },
+  "slots": {
+    "services": "Services APISIX",
+    "instances": "Nœuds",
+    "endpoints": "Routes"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/apisix.i18n.ja.json b/apps/bff/src/bundled_templates/layers/apisix.i18n.ja.json
new file mode 100644
index 0000000..cffd66c
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/apisix.i18n.ja.json
@@ -0,0 +1,123 @@
+{
+  "alias": "APISIX",
+  "group": "ゲートウェイ",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "RPS"
+      },
+      {
+        "label": "200/s"
+      },
+      {
+        "label": "404/s"
+      },
+      {
+        "label": "503/s"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "スループット",
+        "metrics": [
+          {
+            "label": "RPS",
+            "tip": "APISIX ルートにマッチした 1秒あたりのリクエスト数。"
+          },
+          {
+            "label": "5xx",
+            "tip": "アップストリーム / ゲートウェイエラークラス。"
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "HTTP リクエスト傾向"
+      },
+      {
+        "title": "HTTP ステータス傾向"
+      },
+      {
+        "title": "HTTP レイテンシ"
+      },
+      {
+        "title": "HTTP 帯域"
+      },
+      {
+        "title": "HTTP 接続"
+      },
+      {
+        "title": "未マッチステータス傾向",
+        "tip": "APISIX ルートにマッチしないリクエスト。"
+      },
+      {
+        "title": "未マッチレイテンシ"
+      },
+      {
+        "title": "未マッチ帯域"
+      }
+    ],
+    "instance": [
+      {
+        "title": "HTTP リクエスト傾向"
+      },
+      {
+        "title": "HTTP ステータス傾向"
+      },
+      {
+        "title": "HTTP レイテンシ"
+      },
+      {
+        "title": "HTTP 帯域"
+      },
+      {
+        "title": "HTTP 接続"
+      },
+      {
+        "title": "Shared Dict",
+        "tip": "キャパシティ vs 空き容量。",
+        "expressionLabels": [
+          "容量",
+          "空き"
+        ]
+      },
+      {
+        "title": "etcd",
+        "expressionLabels": [
+          "インデックス",
+          "到達可能"
+        ]
+      },
+      {
+        "title": "未マッチトラフィック",
+        "tip": "ルートにマッチしないリクエストのステータス + レイテンシ + 帯域。",
+        "expressionLabels": [
+          "ステータス",
+          "レイテンシ (ms)",
+          "帯域 (KB)"
+        ]
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "HTTP ステータス傾向"
+      },
+      {
+        "title": "HTTP レイテンシ"
+      },
+      {
+        "title": "HTTP 帯域"
+      }
+    ]
+  },
+  "slots": {
+    "services": "APISIX サービス",
+    "instances": "ノード",
+    "endpoints": "ルート"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/apisix.i18n.ko.json b/apps/bff/src/bundled_templates/layers/apisix.i18n.ko.json
new file mode 100644
index 0000000..5b7fff1
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/apisix.i18n.ko.json
@@ -0,0 +1,123 @@
+{
+  "alias": "APISIX",
+  "group": "게이트웨이",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "RPS"
+      },
+      {
+        "label": "200/s"
+      },
+      {
+        "label": "404/s"
+      },
+      {
+        "label": "503/s"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "처리량",
+        "metrics": [
+          {
+            "label": "RPS",
+            "tip": "APISIX 라우트가 매칭한 초당 요청 수입니다."
+          },
+          {
+            "label": "5xx",
+            "tip": "업스트림 / 게이트웨이 오류 클래스입니다."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "HTTP 요청 추세"
+      },
+      {
+        "title": "HTTP 상태 추세"
+      },
+      {
+        "title": "HTTP 지연 시간"
+      },
+      {
+        "title": "HTTP 대역폭"
+      },
+      {
+        "title": "HTTP 연결"
+      },
+      {
+        "title": "매칭되지 않은 상태 추세",
+        "tip": "매칭되는 APISIX 라우트가 없는 요청입니다."
+      },
+      {
+        "title": "매칭되지 않은 지연 시간"
+      },
+      {
+        "title": "매칭되지 않은 대역폭"
+      }
+    ],
+    "instance": [
+      {
+        "title": "HTTP 요청 추세"
+      },
+      {
+        "title": "HTTP 상태 추세"
+      },
+      {
+        "title": "HTTP 지연 시간"
+      },
+      {
+        "title": "HTTP 대역폭"
+      },
+      {
+        "title": "HTTP 연결"
+      },
+      {
+        "title": "공유 사전",
+        "tip": "용량과 여유 공간 비교.",
+        "expressionLabels": [
+          "용량",
+          "여유"
+        ]
+      },
+      {
+        "title": "etcd",
+        "expressionLabels": [
+          "인덱스",
+          "도달 가능"
+        ]
+      },
+      {
+        "title": "매칭되지 않은 트래픽",
+        "tip": "매칭되는 라우트가 없는 요청의 상태 + 지연 시간 + 대역폭.",
+        "expressionLabels": [
+          "status",
+          "지연 시간 (ms)",
+          "대역폭 (KB)"
+        ]
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "HTTP 상태 추세"
+      },
+      {
+        "title": "HTTP 지연 시간"
+      },
+      {
+        "title": "HTTP 대역폭"
+      }
+    ]
+  },
+  "slots": {
+    "services": "APISIX 서비스",
+    "instances": "노드",
+    "endpoints": "라우트"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/apisix.i18n.pt.json b/apps/bff/src/bundled_templates/layers/apisix.i18n.pt.json
new file mode 100644
index 0000000..7746f51
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/apisix.i18n.pt.json
@@ -0,0 +1,123 @@
+{
+  "alias": "APISIX",
+  "group": "Gateways",
+  "slots": {
+    "services": "Serviços do APISIX",
+    "instances": "Nós",
+    "endpoints": "Rotas"
+  },
+  "layer-header": {
+    "columns": [
+      {
+        "label": "RPS"
+      },
+      {
+        "label": "200/s"
+      },
+      {
+        "label": "404/s"
+      },
+      {
+        "label": "503/s"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Vazão",
+        "metrics": [
+          {
+            "label": "RPS",
+            "tip": "Requisições por segundo casadas com rotas do APISIX."
+          },
+          {
+            "label": "5xx",
+            "tip": "Classe de erro de upstream / gateway."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Tendência de requisições HTTP"
+      },
+      {
+        "title": "Tendência de status HTTP"
+      },
+      {
+        "title": "Latência HTTP"
+      },
+      {
+        "title": "Largura de banda HTTP"
+      },
+      {
+        "title": "Conexões HTTP"
+      },
+      {
+        "title": "Tendência de status sem correspondência",
+        "tip": "Requisições sem rota APISIX correspondente."
+      },
+      {
+        "title": "Latência sem correspondência"
+      },
+      {
+        "title": "Largura de banda sem correspondência"
+      }
+    ],
+    "instance": [
+      {
+        "title": "Tendência de requisições HTTP"
+      },
+      {
+        "title": "Tendência de status HTTP"
+      },
+      {
+        "title": "Latência HTTP"
+      },
+      {
+        "title": "Largura de banda HTTP"
+      },
+      {
+        "title": "Conexões HTTP"
+      },
+      {
+        "title": "Dicionário compartilhado",
+        "tip": "Capacidade vs espaço livre.",
+        "expressionLabels": [
+          "capacidade",
+          "livre"
+        ]
+      },
+      {
+        "title": "etcd",
+        "expressionLabels": [
+          "índices",
+          "acessível"
+        ]
+      },
+      {
+        "title": "Tráfego sem correspondência",
+        "tip": "Status + latência + largura de banda para requisições sem rota correspondente.",
+        "expressionLabels": [
+          "status",
+          "latência (ms)",
+          "largura de banda (KB)"
+        ]
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Tendência de status HTTP"
+      },
+      {
+        "title": "Latência HTTP"
+      },
+      {
+        "title": "Largura de banda HTTP"
+      }
+    ]
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/apisix.i18n.zh-CN.json b/apps/bff/src/bundled_templates/layers/apisix.i18n.zh-CN.json
new file mode 100644
index 0000000..5da101e
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/apisix.i18n.zh-CN.json
@@ -0,0 +1,65 @@
+{
+  "group": "网关",
+  "slots": {
+    "services": "APISIX 服务",
+    "instances": "节点",
+    "endpoints": "路由"
+  },
+  "layer-header": {
+    "columns": [
+      { "label": "RPS" },
+      { "label": "200/秒" },
+      { "label": "404/秒" },
+      { "label": "503/秒" }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "吞吐量",
+        "metrics": [
+          { "label": "RPS", "tip": "APISIX 路由匹配的每秒请求数。" },
+          { "label": "5xx", "tip": "上游 / 网关错误类。" }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      { "title": "HTTP 请求趋势" },
+      { "title": "HTTP 状态趋势" },
+      { "title": "HTTP 延迟" },
+      { "title": "HTTP 带宽" },
+      { "title": "HTTP 连接" },
+      { "title": "未匹配状态趋势", "tip": "未匹配到 APISIX 路由的请求。" },
+      { "title": "未匹配延迟" },
+      { "title": "未匹配带宽" }
+    ],
+    "instance": [
+      { "title": "HTTP 请求趋势" },
+      { "title": "HTTP 状态趋势" },
+      { "title": "HTTP 延迟" },
+      { "title": "HTTP 带宽" },
+      { "title": "HTTP 连接" },
+      {
+        "title": "Shared Dict",
+        "tip": "容量 vs 空闲空间。",
+        "expressionLabels": ["capacity", "free"]
+      },
+      {
+        "title": "etcd",
+        "expressionLabels": ["indexes", "reachable"]
+      },
+      {
+        "title": "未匹配流量",
+        "tip": "未匹配路由请求的状态 + 延迟 + 带宽。",
+        "expressionLabels": ["status", "latency (ms)", "bandwidth (KB)"]
+      }
+    ],
+    "endpoint": [
+      { "title": "HTTP 状态趋势" },
+      { "title": "HTTP 延迟" },
+      { "title": "HTTP 带宽" }
+    ]
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.de.json b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.de.json
new file mode 100644
index 0000000..c338db1
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.de.json
@@ -0,0 +1,283 @@
+{
+  "alias": "AWS DynamoDB",
+  "group": "AWS",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Lese-Drosselung"
+      },
+      {
+        "label": "Schreib-Drosselung"
+      },
+      {
+        "label": "Lese-Systemfehler"
+      },
+      {
+        "label": "Schreib-Systemfehler"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Drosselung",
+        "metrics": [
+          {
+            "label": "Lese-Drosselung",
+            "tip": "Drosselung der Leseanfragen — Kapazitätserschöpfung."
+          },
+          {
+            "label": "Schreib-Drosselung",
+            "tip": "Schreibanfragen gedrosselt."
+          },
+          {
+            "label": "Benutzerfehler",
+            "tip": "Benutzerfehler vom Typ Bad Request."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Gedrosselte Anfragen",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "lesen",
+          "schreiben"
+        ]
+      },
+      {
+        "title": "Drosselungs-Ereignisse",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "lesen",
+          "schreiben"
+        ]
+      },
+      {
+        "title": "Systemfehler",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "lesen",
+          "schreiben"
+        ]
+      },
+      {
+        "title": "Benutzerfehler",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Conditional Check fehlgeschlagen",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Transaktionskonflikt",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Lesekapazität (Einheit/s)",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "provisioned",
+          "verbraucht"
+        ]
+      },
+      {
+        "title": "Schreibkapazität (Einheit/s)",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "provisioned",
+          "verbraucht"
+        ]
+      },
+      {
+        "title": "Erfolgreiche Anfrage-Latenz (ms)",
+        "expressions": [
+          null,
+          null,
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "get",
+          "put",
+          "query",
+          "scan"
+        ]
+      },
+      {
+        "title": "TTL gelöschte Items",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Scan zurückgegebene Items",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Query zurückgegebene Items",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Konto Max. Lesen / Schreiben",
+        "expressions": [
+          null,
+          null,
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "table-level reads",
+          "table-level writes",
+          "reads",
+          "schreibvorgänge"
+        ]
+      },
+      {
+        "title": "Konto-Kapazitätsauslastung",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "lesen",
+          "schreiben"
+        ]
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Gedrosselte Anfragen",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "lesen",
+          "schreiben"
+        ]
+      },
+      {
+        "title": "Drosselungs-Ereignisse",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "lesen",
+          "schreiben"
+        ]
+      },
+      {
+        "title": "Systemfehler",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "lesen",
+          "schreiben"
+        ]
+      },
+      {
+        "title": "Conditional Check fehlgeschlagen",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Transaktionskonflikt",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "TTL gelöschte Items",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Lesekapazität",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "provisioned",
+          "verbraucht"
+        ]
+      },
+      {
+        "title": "Schreibkapazität",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "provisioned",
+          "verbraucht"
+        ]
+      },
+      {
+        "title": "Erfolgreiche Anfrage-Latenz (ms)",
+        "expressions": [
+          null,
+          null,
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "get",
+          "put",
+          "query",
+          "scan"
+        ]
+      },
+      {
+        "title": "Scan zurückgegebene Items",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Query zurückgegebene Items",
+        "expressions": [
+          null
+        ]
+      }
+    ]
+  },
+  "slots": {
+    "services": "DynamoDB-Konten",
+    "endpoints": "Tabellen"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.es.json b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.es.json
new file mode 100644
index 0000000..568c99d
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.es.json
@@ -0,0 +1,188 @@
+{
+  "alias": "AWS DynamoDB",
+  "overview": {
+    "groups": [
+      {
+        "title": "Limitación",
+        "metrics": [
+          {
+            "label": "Lecturas limitadas",
+            "tip": "Peticiones de lectura throttled — capacidad agotada."
+          },
+          {
+            "label": "Escrituras limitadas",
+            "tip": "Peticiones de escritura throttled."
+          },
+          {
+            "label": "Errores de usuario",
+            "tip": "Errores de usuario tipo bad-request."
+          }
+        ]
+      }
+    ]
+  },
+  "group": "AWS",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Lectura throttled"
+      },
+      {
+        "label": "Escritura throttled"
+      },
+      {
+        "label": "Errores de sistema de lectura"
+      },
+      {
+        "label": "Errores de sistema de escritura"
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Peticiones throttled",
+        "expressionLabels": [
+          "lectura",
+          "escritura"
+        ]
+      },
+      {
+        "title": "Eventos de throttling",
+        "expressionLabels": [
+          "lectura",
+          "escritura"
+        ]
+      },
+      {
+        "title": "Errores del sistema",
+        "expressionLabels": [
+          "lectura",
+          "escritura"
+        ]
+      },
+      {
+        "title": "Errores del usuario"
+      },
+      {
+        "title": "Verificación condicional fallida"
+      },
+      {
+        "title": "Conflicto de transacción"
+      },
+      {
+        "title": "Capacidad de lectura (unidad/s)",
+        "expressionLabels": [
+          "aprovisionado",
+          "consumidos"
+        ]
+      },
+      {
+        "title": "Capacidad de escritura (unidad/s)",
+        "expressionLabels": [
+          "aprovisionado",
+          "consumidos"
+        ]
+      },
+      {
+        "title": "Latencia de peticiones exitosas (ms)",
+        "expressionLabels": [
+          "get",
+          "put",
+          "consulta",
+          "scan"
+        ]
+      },
+      {
+        "title": "Items eliminados por TTL"
+      },
+      {
+        "title": "Items devueltos por scan"
+      },
+      {
+        "title": "Items devueltos por la consulta"
+      },
+      {
+        "title": "Lecturas / escrituras máximas de la cuenta",
+        "expressionLabels": [
+          "lecturas a nivel tabla",
+          "escrituras a nivel tabla",
+          "lecturas",
+          "escrituras"
+        ]
+      },
+      {
+        "title": "Utilización de capacidad de la cuenta",
+        "expressionLabels": [
+          "lectura",
+          "escritura"
+        ]
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Peticiones throttled",
+        "expressionLabels": [
+          "lectura",
+          "escritura"
+        ]
+      },
+      {
+        "title": "Eventos de throttling",
+        "expressionLabels": [
+          "lectura",
+          "escritura"
+        ]
+      },
+      {
+        "title": "Errores del sistema",
+        "expressionLabels": [
+          "lectura",
+          "escritura"
+        ]
+      },
+      {
+        "title": "Verificación condicional fallida"
+      },
+      {
+        "title": "Conflicto de transacción"
+      },
+      {
+        "title": "Items eliminados por TTL"
+      },
+      {
+        "title": "Capacidad de lectura",
+        "expressionLabels": [
+          "aprovisionado",
+          "consumidos"
+        ]
+      },
+      {
+        "title": "Capacidad de escritura",
+        "expressionLabels": [
+          "aprovisionado",
+          "consumidos"
+        ]
+      },
+      {
+        "title": "Latencia de peticiones exitosas (ms)",
+        "expressionLabels": [
+          "get",
+          "put",
+          "consulta",
+          "scan"
+        ]
+      },
+      {
+        "title": "Items devueltos por scan"
+      },
+      {
+        "title": "Items devueltos por la consulta"
+      }
+    ]
+  },
+  "slots": {
+    "services": "Cuentas de DynamoDB",
+    "endpoints": "Tablas"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.fr.json b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.fr.json
new file mode 100644
index 0000000..394b699
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.fr.json
@@ -0,0 +1,188 @@
+{
+  "alias": "AWS DynamoDB",
+  "overview": {
+    "groups": [
+      {
+        "title": "Limitation",
+        "metrics": [
+          {
+            "label": "Lectures limitées",
+            "tip": "Requêtes en lecture throttlées — épuisement de la capacité."
+          },
+          {
+            "label": "Écritures limitées",
+            "tip": "Requêtes d'écriture throttlées."
+          },
+          {
+            "label": "Erreurs utilisateur",
+            "tip": "Erreurs utilisateur de type bad-request."
+          }
+        ]
+      }
+    ]
+  },
+  "group": "AWS",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Lectures throttlées"
+      },
+      {
+        "label": "Écritures throttlées"
+      },
+      {
+        "label": "Erreurs système en lecture"
+      },
+      {
+        "label": "Erreurs système en écriture"
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Requêtes throttlées",
+        "expressionLabels": [
+          "lecture",
+          "écriture"
+        ]
+      },
+      {
+        "title": "Événements de throttle",
+        "expressionLabels": [
+          "lecture",
+          "écriture"
+        ]
+      },
+      {
+        "title": "Erreurs système",
+        "expressionLabels": [
+          "lecture",
+          "écriture"
+        ]
+      },
+      {
+        "title": "Erreurs utilisateur"
+      },
+      {
+        "title": "Conditional check échoué"
+      },
+      {
+        "title": "Conflit de transactions"
+      },
+      {
+        "title": "Capacité de lecture (unité/s)",
+        "expressionLabels": [
+          "provisionné",
+          "consommé"
+        ]
+      },
+      {
+        "title": "Capacité d'écriture (unité/s)",
+        "expressionLabels": [
+          "provisionné",
+          "consommé"
+        ]
+      },
+      {
+        "title": "Latence des requêtes réussies (ms)",
+        "expressionLabels": [
+          "get",
+          "put",
+          "query",
+          "scan"
+        ]
+      },
+      {
+        "title": "Éléments supprimés TTL"
+      },
+      {
+        "title": "Éléments retournés par scan"
+      },
+      {
+        "title": "Éléments retournés par query"
+      },
+      {
+        "title": "Lectures / écritures max du compte",
+        "expressionLabels": [
+          "lectures au niveau table",
+          "écritures au niveau table",
+          "lectures",
+          "écritures"
+        ]
+      },
+      {
+        "title": "Utilisation de la capacité du compte",
+        "expressionLabels": [
+          "lecture",
+          "écriture"
+        ]
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Requêtes throttlées",
+        "expressionLabels": [
+          "lecture",
+          "écriture"
+        ]
+      },
+      {
+        "title": "Événements de throttle",
+        "expressionLabels": [
+          "lecture",
+          "écriture"
+        ]
+      },
+      {
+        "title": "Erreurs système",
+        "expressionLabels": [
+          "lecture",
+          "écriture"
+        ]
+      },
+      {
+        "title": "Conditional check échoué"
+      },
+      {
+        "title": "Conflit de transactions"
+      },
+      {
+        "title": "Éléments supprimés TTL"
+      },
+      {
+        "title": "Capacité de lecture",
+        "expressionLabels": [
+          "provisionné",
+          "consommé"
+        ]
+      },
+      {
+        "title": "Capacité d'écriture",
+        "expressionLabels": [
+          "provisionné",
+          "consommé"
+        ]
+      },
+      {
+        "title": "Latence des requêtes réussies (ms)",
+        "expressionLabels": [
+          "get",
+          "put",
+          "query",
+          "scan"
+        ]
+      },
+      {
+        "title": "Éléments retournés par scan"
+      },
+      {
+        "title": "Éléments retournés par query"
+      }
+    ]
+  },
+  "slots": {
+    "services": "Comptes DynamoDB",
+    "endpoints": "Tables"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.ja.json b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.ja.json
new file mode 100644
index 0000000..f899152
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.ja.json
@@ -0,0 +1,188 @@
+{
+  "alias": "AWS DynamoDB",
+  "group": "AWS",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "読み取りスロットリング"
+      },
+      {
+        "label": "書き込みスロットリング"
+      },
+      {
+        "label": "読み取りシステムエラー"
+      },
+      {
+        "label": "書き込みシステムエラー"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "スロットリング",
+        "metrics": [
+          {
+            "label": "読み取りスロットリング",
+            "tip": "読み取りリクエストのスロットリング — キャパシティ枯渇。"
+          },
+          {
+            "label": "書き込みスロットリング",
+            "tip": "書き込みリクエストのスロットリング。"
+          },
+          {
+            "label": "ユーザーエラー",
+            "tip": "Bad-request 系のユーザーエラー。"
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "スロットリクエスト",
+        "expressionLabels": [
+          "読み取り",
+          "書き込み"
+        ]
+      },
+      {
+        "title": "スロットルイベント",
+        "expressionLabels": [
+          "読み取り",
+          "書き込み"
+        ]
+      },
+      {
+        "title": "システムエラー",
+        "expressionLabels": [
+          "読み取り",
+          "書き込み"
+        ]
+      },
+      {
+        "title": "ユーザーエラー"
+      },
+      {
+        "title": "条件付きチェック失敗"
+      },
+      {
+        "title": "トランザクション競合"
+      },
+      {
+        "title": "読み取りキャパシティ (unit/s)",
+        "expressionLabels": [
+          "プロビジョン",
+          "消費"
+        ]
+      },
+      {
+        "title": "書き込みキャパシティ (unit/s)",
+        "expressionLabels": [
+          "プロビジョン",
+          "消費"
+        ]
+      },
+      {
+        "title": "成功リクエストレイテンシ (ms)",
+        "expressionLabels": [
+          "get",
+          "put",
+          "クエリ",
+          "スキャン"
+        ]
+      },
+      {
+        "title": "TTL 削除アイテム"
+      },
+      {
+        "title": "Scan 返却アイテム"
+      },
+      {
+        "title": "Query 返却アイテム"
+      },
+      {
+        "title": "アカウント最大読み取り / 書き込み",
+        "expressionLabels": [
+          "テーブル単位読み取り",
+          "テーブル単位書き込み",
+          "読み取り",
+          "書き込み"
+        ]
+      },
+      {
+        "title": "アカウントキャパシティ使用率",
+        "expressionLabels": [
+          "読み取り",
+          "書き込み"
+        ]
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "スロットリクエスト",
+        "expressionLabels": [
+          "読み取り",
+          "書き込み"
+        ]
+      },
+      {
+        "title": "スロットルイベント",
+        "expressionLabels": [
+          "読み取り",
+          "書き込み"
+        ]
+      },
+      {
+        "title": "システムエラー",
+        "expressionLabels": [
+          "読み取り",
+          "書き込み"
+        ]
+      },
+      {
+        "title": "条件付きチェック失敗"
+      },
+      {
+        "title": "トランザクション競合"
+      },
+      {
+        "title": "TTL 削除アイテム"
+      },
+      {
+        "title": "読み取りキャパシティ",
+        "expressionLabels": [
+          "プロビジョン",
+          "消費"
+        ]
+      },
+      {
+        "title": "書き込みキャパシティ",
+        "expressionLabels": [
+          "プロビジョン",
+          "消費"
+        ]
+      },
+      {
+        "title": "成功リクエストレイテンシ (ms)",
+        "expressionLabels": [
+          "get",
+          "put",
+          "クエリ",
+          "スキャン"
+        ]
+      },
+      {
+        "title": "Scan 返却アイテム"
+      },
+      {
+        "title": "Query 返却アイテム"
+      }
+    ]
+  },
+  "slots": {
+    "services": "DynamoDB アカウント",
+    "endpoints": "テーブル"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.ko.json b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.ko.json
new file mode 100644
index 0000000..7c8649f
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.ko.json
@@ -0,0 +1,188 @@
+{
+  "alias": "AWS DynamoDB",
+  "group": "AWS",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "읽기 스로틀"
+      },
+      {
+        "label": "쓰기 스로틀"
+      },
+      {
+        "label": "읽기 시스템 오류"
+      },
+      {
+        "label": "쓰기 시스템 오류"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "제한(스로틀링)",
+        "metrics": [
+          {
+            "label": "읽기 제한",
+            "tip": "용량 소진으로 스로틀된 읽기 요청입니다."
+          },
+          {
+            "label": "쓰기 제한",
+            "tip": "스로틀된 쓰기 요청입니다."
+          },
+          {
+            "label": "사용자 오류",
+            "tip": "잘못된 요청 형태의 사용자 오류입니다."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "스로틀된 요청",
+        "expressionLabels": [
+          "read",
+          "write"
+        ]
+      },
+      {
+        "title": "스로틀 이벤트",
+        "expressionLabels": [
+          "read",
+          "write"
+        ]
+      },
+      {
+        "title": "시스템 오류",
+        "expressionLabels": [
+          "read",
+          "write"
+        ]
+      },
+      {
+        "title": "사용자 오류"
+      },
+      {
+        "title": "조건 확인 실패"
+      },
+      {
+        "title": "트랜잭션 충돌"
+      },
+      {
+        "title": "읽기 용량 (unit/s)",
+        "expressionLabels": [
+          "provisioned",
+          "consumed"
+        ]
+      },
+      {
+        "title": "쓰기 용량 (unit/s)",
+        "expressionLabels": [
+          "provisioned",
+          "consumed"
+        ]
+      },
+      {
+        "title": "성공 요청 지연 시간 (ms)",
+        "expressionLabels": [
+          "get",
+          "put",
+          "query",
+          "scan"
+        ]
+      },
+      {
+        "title": "TTL 삭제된 항목"
+      },
+      {
+        "title": "스캔 반환 항목"
+      },
+      {
+        "title": "쿼리 반환 항목"
+      },
+      {
+        "title": "계정 최대 읽기 / 쓰기",
+        "expressionLabels": [
+          "테이블 단위 reads",
+          "테이블 단위 writes",
+          "reads",
+          "writes"
+        ]
+      },
+      {
+        "title": "계정 용량 사용률",
+        "expressionLabels": [
+          "read",
+          "write"
+        ]
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "스로틀된 요청",
+        "expressionLabels": [
+          "read",
+          "write"
+        ]
+      },
+      {
+        "title": "스로틀 이벤트",
+        "expressionLabels": [
+          "read",
+          "write"
+        ]
+      },
+      {
+        "title": "시스템 오류",
+        "expressionLabels": [
+          "read",
+          "write"
+        ]
+      },
+      {
+        "title": "조건 확인 실패"
+      },
+      {
+        "title": "트랜잭션 충돌"
+      },
+      {
+        "title": "TTL 삭제된 항목"
+      },
+      {
+        "title": "읽기 용량",
+        "expressionLabels": [
+          "provisioned",
+          "consumed"
+        ]
+      },
+      {
+        "title": "쓰기 용량",
+        "expressionLabels": [
+          "provisioned",
+          "consumed"
+        ]
+      },
+      {
+        "title": "성공 요청 지연 시간 (ms)",
+        "expressionLabels": [
+          "get",
+          "put",
+          "query",
+          "scan"
+        ]
+      },
+      {
+        "title": "스캔 반환 항목"
+      },
+      {
+        "title": "쿼리 반환 항목"
+      }
+    ]
+  },
+  "slots": {
+    "services": "DynamoDB 계정",
+    "endpoints": "테이블"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.pt.json b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.pt.json
new file mode 100644
index 0000000..1147caf
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.pt.json
@@ -0,0 +1,188 @@
+{
+  "alias": "AWS DynamoDB",
+  "group": "AWS",
+  "slots": {
+    "services": "Contas do DynamoDB",
+    "endpoints": "Tabelas"
+  },
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Leitura limitada"
+      },
+      {
+        "label": "Escrita limitada"
+      },
+      {
+        "label": "Erro de sistema (leitura)"
+      },
+      {
+        "label": "Erro de sistema (escrita)"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Limitação",
+        "metrics": [
+          {
+            "label": "Leituras limitadas",
+            "tip": "Requisições de leitura limitadas — capacidade esgotada."
+          },
+          {
+            "label": "Escritas limitadas",
+            "tip": "Requisições de escrita limitadas."
+          },
+          {
+            "label": "Erros de usuário",
+            "tip": "Erros de usuário tipo bad-request."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Requisições limitadas",
+        "expressionLabels": [
+          "leitura",
+          "escrita"
+        ]
+      },
+      {
+        "title": "Eventos de throttling",
+        "expressionLabels": [
+          "leitura",
+          "escrita"
+        ]
+      },
+      {
+        "title": "Erros do sistema",
+        "expressionLabels": [
+          "leitura",
+          "escrita"
+        ]
+      },
+      {
+        "title": "Erros do usuário"
+      },
+      {
+        "title": "Verificação condicional falhou"
+      },
+      {
+        "title": "Conflito de transação"
+      },
+      {
+        "title": "Capacidade de leitura (unidade/s)",
+        "expressionLabels": [
+          "provisionada",
+          "consumida"
+        ]
+      },
+      {
+        "title": "Capacidade de escrita (unidade/s)",
+        "expressionLabels": [
+          "provisionada",
+          "consumida"
+        ]
+      },
+      {
+        "title": "Latência de requisições bem-sucedidas (ms)",
+        "expressionLabels": [
+          "get",
+          "put",
+          "query",
+          "scan"
+        ]
+      },
+      {
+        "title": "Itens removidos por TTL"
+      },
+      {
+        "title": "Itens retornados por scan"
+      },
+      {
+        "title": "Itens retornados por query"
+      },
+      {
+        "title": "Leituras / escritas máximas da conta",
+        "expressionLabels": [
+          "leituras por tabela",
+          "escritas por tabela",
+          "leituras",
+          "escritas"
+        ]
+      },
+      {
+        "title": "Utilização de capacidade da conta",
+        "expressionLabels": [
+          "leitura",
+          "escrita"
+        ]
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Requisições limitadas",
+        "expressionLabels": [
+          "leitura",
+          "escrita"
+        ]
+      },
+      {
+        "title": "Eventos de throttling",
+        "expressionLabels": [
+          "leitura",
+          "escrita"
+        ]
+      },
+      {
+        "title": "Erros do sistema",
+        "expressionLabels": [
+          "leitura",
+          "escrita"
+        ]
+      },
+      {
+        "title": "Verificação condicional falhou"
+      },
+      {
+        "title": "Conflito de transação"
+      },
+      {
+        "title": "Itens removidos por TTL"
+      },
+      {
+        "title": "Capacidade de leitura",
+        "expressionLabels": [
+          "provisionada",
+          "consumida"
+        ]
+      },
+      {
+        "title": "Capacidade de escrita",
+        "expressionLabels": [
+          "provisionada",
+          "consumida"
+        ]
+      },
+      {
+        "title": "Latência de requisições bem-sucedidas (ms)",
+        "expressionLabels": [
+          "get",
+          "put",
+          "query",
+          "scan"
+        ]
+      },
+      {
+        "title": "Itens retornados por scan"
+      },
+      {
+        "title": "Itens retornados por query"
+      }
+    ]
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.zh-CN.json b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.zh-CN.json
new file mode 100644
index 0000000..5e45627
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.zh-CN.json
@@ -0,0 +1,71 @@
+{
+  "alias": "AWS DynamoDB",
+  "group": "AWS",
+  "slots": {
+    "services": "DynamoDB 账户",
+    "endpoints": "表"
+  },
+  "layer-header": {
+    "columns": [
+      { "label": "读限流" },
+      { "label": "写限流" },
+      { "label": "读系统错误" },
+      { "label": "写系统错误" }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "限流",
+        "metrics": [
+          { "label": "读限流", "tip": "读请求被限流 — 容量耗尽。" },
+          { "label": "写限流", "tip": "写请求被限流。" },
+          { "label": "用户错误", "tip": "类似 bad-request 的用户错误。" }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      { "title": "被限流请求", "expressionLabels": ["read", "write"] },
+      { "title": "限流事件", "expressionLabels": ["read", "write"] },
+      { "title": "系统错误", "expressionLabels": ["read", "write"] },
+      { "title": "用户错误" },
+      { "title": "条件检查失败" },
+      { "title": "事务冲突" },
+      { "title": "读容量(unit/s)", "expressionLabels": ["provisioned", "consumed"] },
+      { "title": "写容量(unit/s)", "expressionLabels": ["provisioned", "consumed"] },
+      {
+        "title": "成功请求延迟(ms)",
+        "expressionLabels": ["get", "put", "query", "scan"]
+      },
+      { "title": "TTL 删除项数" },
+      { "title": "Scan 返回项数" },
+      { "title": "Query 返回项数" },
+      {
+        "title": "账户最大读 / 写",
+        "expressionLabels": ["table-level reads", "table-level writes", "reads", "writes"]
+      },
+      {
+        "title": "账户容量利用率",
+        "expressionLabels": ["read", "write"]
+      }
+    ],
+    "endpoint": [
+      { "title": "被限流请求", "expressionLabels": ["read", "write"] },
+      { "title": "限流事件", "expressionLabels": ["read", "write"] },
+      { "title": "系统错误", "expressionLabels": ["read", "write"] },
+      { "title": "条件检查失败" },
+      { "title": "事务冲突" },
+      { "title": "TTL 删除项数" },
+      { "title": "读容量", "expressionLabels": ["provisioned", "consumed"] },
+      { "title": "写容量", "expressionLabels": ["provisioned", "consumed"] },
+      {
+        "title": "成功请求延迟(ms)",
+        "expressionLabels": ["get", "put", "query", "scan"]
+      },
+      { "title": "Scan 返回项数" },
+      { "title": "Query 返回项数" }
+    ]
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_eks.i18n.de.json b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.de.json
new file mode 100644
index 0000000..ef1f5a9
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.de.json
@@ -0,0 +1,209 @@
+{
+  "alias": "AWS EKS",
+  "group": "AWS",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Knoten"
+      },
+      {
+        "label": "Fehlerhafte Knoten"
+      },
+      {
+        "label": "Namespaces"
+      },
+      {
+        "label": "Dienste"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Ressourcen",
+        "metrics": [
+          {
+            "label": "Knoten",
+            "tip": "EKS-Cluster-Knotenanzahl."
+          },
+          {
+            "label": "Fehlerhafte Knoten",
+            "tip": "Vom Cluster gemeldete fehlerhafte EKS-Knoten."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Knotenanzahl",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Fehlerhafte Knoten",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Namespace-Anzahl",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "EKS-Servicezahl",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Cluster Netzwerk-Fehler",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "rx",
+          "tx"
+        ]
+      },
+      {
+        "title": "Cluster Netzwerk-Drops",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "rx",
+          "tx"
+        ]
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Pod-CPU-Auslastung (%)",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Pod-Speicher-Auslastung (%)",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Pod-Netzwerk RX (KB/s)",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Pod RX-Fehler / s",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Pod-Netzwerk TX (KB/s)",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Pod TX-Fehler / s",
+        "expressions": [
+          null
+        ]
+      }
+    ],
+    "instance": [
+      {
+        "title": "Pod-Anzahl",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "CPU-Auslastung (%)",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Speicherauslastung (%)",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "FS-Nutzung (%)",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Netzwerk RX (KB/s)",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "bytes",
+          "fehler"
+        ],
+        "expressionAxes": [
+          null,
+          null
+        ]
+      },
+      {
+        "title": "Netzwerk TX (KB/s)",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "bytes",
+          "fehler"
+        ],
+        "expressionAxes": [
+          null,
+          null
+        ]
+      },
+      {
+        "title": "Disk-I/O (B/s)",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "lesen",
+          "schreiben"
+        ]
+      },
+      {
+        "title": "Pod-CPU auf Knoten",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Pod-Speicher auf Knoten",
+        "expressions": [
+          null
+        ]
+      }
+    ]
+  },
+  "slots": {
+    "services": "Cluster",
+    "instances": "Knoten",
+    "endpoints": "EKS-Dienste"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_eks.i18n.es.json b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.es.json
new file mode 100644
index 0000000..3e5d022
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.es.json
@@ -0,0 +1,133 @@
+{
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Nodos"
+      },
+      {
+        "label": "Nodos con fallo"
+      },
+      {
+        "label": "Namespaces"
+      },
+      {
+        "label": "Servicios"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "metrics": [
+          {
+            "label": "Nodos",
+            "tip": "Conteo de nodos del clúster EKS."
+          },
+          {
+            "label": "Nodos con fallo",
+            "tip": "Nodos EKS con fallo reportados por el clúster."
+          }
+        ],
+        "title": "Recurso"
+      }
+    ]
+  },
+  "slots": {
+    "services": "Clústeres",
+    "instances": "Nodos",
+    "endpoints": "Servicios de EKS"
+  },
+  "alias": "AWS EKS",
+  "group": "AWS",
+  "dashboards": {
+    "service": [
+      {
+        "title": "Conteo de nodos"
+      },
+      {
+        "title": "Nodos con fallo"
+      },
+      {
+        "title": "Conteo de namespaces"
+      },
+      {
+        "title": "Conteo de servicios EKS"
+      },
+      {
+        "title": "Errores de red del clúster",
+        "expressionLabels": [
+          "rx",
+          "tx"
+        ]
+      },
+      {
+        "title": "Pérdidas de red del clúster",
+        "expressionLabels": [
+          "rx",
+          "tx"
+        ]
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Utilización de CPU del pod (%)"
+      },
+      {
+        "title": "Utilización de memoria del pod (%)"
+      },
+      {
+        "title": "Red RX del pod (KB/s)"
+      },
+      {
+        "title": "Errores RX del pod / s"
+      },
+      {
+        "title": "Red TX del pod (KB/s)"
+      },
+      {
+        "title": "Errores TX del pod / s"
+      }
+    ],
+    "instance": [
+      {
+        "title": "Conteo de pods"
+      },
+      {
+        "title": "Utilización de CPU (%)"
+      },
+      {
+        "title": "Utilización de memoria (%)"
+      },
+      {
+        "title": "Utilización de FS (%)"
+      },
+      {
+        "title": "Red RX (KB/s)",
+        "expressionLabels": [
+          "bytes",
+          "errores"
+        ]
+      },
+      {
+        "title": "Red TX (KB/s)",
+        "expressionLabels": [
+          "bytes",
+          "errores"
+        ]
+      },
+      {
+        "title": "IO de disco (B/s)",
+        "expressionLabels": [
+          "lectura",
+          "escritura"
+        ]
+      },
+      {
+        "title": "CPU de pod en el nodo"
+      },
+      {
+        "title": "Memoria del pod en el nodo"
+      }
+    ]
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_eks.i18n.fr.json b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.fr.json
new file mode 100644
index 0000000..3be325c
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.fr.json
@@ -0,0 +1,133 @@
+{
+  "alias": "AWS EKS",
+  "group": "AWS",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Nœuds"
+      },
+      {
+        "label": "Nœuds en échec"
+      },
+      {
+        "label": "Namespaces"
+      },
+      {
+        "label": "Services"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Ressources",
+        "metrics": [
+          {
+            "label": "Nœuds",
+            "tip": "Nombre de nœuds du cluster EKS."
+          },
+          {
+            "label": "Nœuds en échec",
+            "tip": "Nœuds EKS en échec remontés par le cluster."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Nombre de nœuds"
+      },
+      {
+        "title": "Nœuds en échec"
+      },
+      {
+        "title": "Nombre de namespaces"
+      },
+      {
+        "title": "Nombre de services EKS"
+      },
+      {
+        "title": "Erreurs réseau du cluster",
+        "expressionLabels": [
+          "rx",
+          "tx"
+        ]
+      },
+      {
+        "title": "Drops réseau du cluster",
+        "expressionLabels": [
+          "rx",
+          "tx"
+        ]
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Utilisation CPU pod (%)"
+      },
+      {
+        "title": "Utilisation mémoire pod (%)"
+      },
+      {
+        "title": "Réseau pod RX (Ko/s)"
+      },
+      {
+        "title": "Erreurs RX pod / s"
+      },
+      {
+        "title": "Réseau pod TX (Ko/s)"
+      },
+      {
+        "title": "Erreurs TX pod / s"
+      }
+    ],
+    "instance": [
+      {
+        "title": "Nombre de pods"
+      },
+      {
+        "title": "Utilisation CPU (%)"
+      },
+      {
+        "title": "Utilisation mémoire (%)"
+      },
+      {
+        "title": "Utilisation FS (%)"
+      },
+      {
+        "title": "Réseau RX (Ko/s)",
+        "expressionLabels": [
+          "octets",
+          "erreurs"
+        ]
+      },
+      {
+        "title": "Réseau TX (Ko/s)",
+        "expressionLabels": [
+          "octets",
+          "erreurs"
+        ]
+      },
+      {
+        "title": "I/O disque (o/s)",
+        "expressionLabels": [
+          "lecture",
+          "écriture"
+        ]
+      },
+      {
+        "title": "CPU pod sur le nœud"
+      },
+      {
+        "title": "Mémoire pod sur le nœud"
+      }
+    ]
+  },
+  "slots": {
+    "services": "Clusters",
+    "instances": "Nœuds",
+    "endpoints": "Services EKS"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_eks.i18n.ja.json b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.ja.json
new file mode 100644
index 0000000..d940dfa
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.ja.json
@@ -0,0 +1,133 @@
+{
+  "alias": "AWS EKS",
+  "group": "AWS",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "ノード"
+      },
+      {
+        "label": "失敗ノード"
+      },
+      {
+        "label": "ネームスペース"
+      },
+      {
+        "label": "サービス"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "リソース",
+        "metrics": [
+          {
+            "label": "ノード",
+            "tip": "EKS クラスタのノード数。"
+          },
+          {
+            "label": "失敗ノード",
+            "tip": "クラスタが報告した失敗 EKS ノード。"
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "ノード数"
+      },
+      {
+        "title": "失敗ノード"
+      },
+      {
+        "title": "ネームスペース数"
+      },
+      {
+        "title": "EKS サービス数"
+      },
+      {
+        "title": "クラスタネットワークエラー",
+        "expressionLabels": [
+          "受信",
+          "送信"
+        ]
+      },
+      {
+        "title": "クラスタネットワーク破棄",
+        "expressionLabels": [
+          "受信",
+          "送信"
+        ]
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Pod CPU 使用率 (%)"
+      },
+      {
+        "title": "Pod メモリ使用率 (%)"
+      },
+      {
+        "title": "Pod ネットワーク RX (KB/s)"
+      },
+      {
+        "title": "Pod RX エラー / s"
+      },
+      {
+        "title": "Pod ネットワーク TX (KB/s)"
+      },
+      {
+        "title": "Pod TX エラー / s"
+      }
+    ],
+    "instance": [
+      {
+        "title": "Pod 数"
+      },
+      {
+        "title": "CPU 使用率 (%)"
+      },
+      {
+        "title": "メモリ使用率 (%)"
+      },
+      {
+        "title": "FS 使用率 (%)"
+      },
+      {
+        "title": "ネットワーク RX (KB/s)",
+        "expressionLabels": [
+          "バイト",
+          "エラー"
+        ]
+      },
+      {
+        "title": "ネットワーク TX (KB/s)",
+        "expressionLabels": [
+          "バイト",
+          "エラー"
+        ]
+      },
+      {
+        "title": "ディスク IO (B/s)",
+        "expressionLabels": [
+          "読み取り",
+          "書き込み"
+        ]
+      },
+      {
+        "title": "ノード上の Pod CPU"
+      },
+      {
+        "title": "ノード上の Pod メモリ"
+      }
+    ]
+  },
+  "slots": {
+    "services": "クラスタ",
+    "instances": "ノード",
+    "endpoints": "EKS サービス"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_eks.i18n.ko.json b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.ko.json
new file mode 100644
index 0000000..7b8a467
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.ko.json
@@ -0,0 +1,133 @@
+{
+  "alias": "AWS EKS",
+  "group": "AWS",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "노드"
+      },
+      {
+        "label": "실패 노드"
+      },
+      {
+        "label": "네임스페이스"
+      },
+      {
+        "label": "서비스"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "리소스",
+        "metrics": [
+          {
+            "label": "노드",
+            "tip": "EKS 클러스터의 노드 수입니다."
+          },
+          {
+            "label": "실패 노드",
+            "tip": "클러스터가 보고한 실패 EKS 노드 수입니다."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "노드 수"
+      },
+      {
+        "title": "실패 노드"
+      },
+      {
+        "title": "네임스페이스 수"
+      },
+      {
+        "title": "EKS 서비스 수"
+      },
+      {
+        "title": "클러스터 네트워크 오류",
+        "expressionLabels": [
+          "rx",
+          "tx"
+        ]
+      },
+      {
+        "title": "클러스터 네트워크 드롭",
+        "expressionLabels": [
+          "rx",
+          "tx"
+        ]
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Pod CPU 사용률 (%)"
+      },
+      {
+        "title": "Pod 메모리 사용률 (%)"
+      },
+      {
+        "title": "Pod 네트워크 RX (KB/s)"
+      },
+      {
+        "title": "Pod RX 오류 / s"
+      },
+      {
+        "title": "Pod 네트워크 TX (KB/s)"
+      },
+      {
+        "title": "Pod TX 오류 / s"
+      }
+    ],
+    "instance": [
+      {
+        "title": "Pod 수"
+      },
+      {
+        "title": "CPU 사용률 (%)"
+      },
+      {
+        "title": "메모리 사용률 (%)"
+      },
+      {
+        "title": "파일 시스템 사용률 (%)"
+      },
+      {
+        "title": "네트워크 RX (KB/s)",
+        "expressionLabels": [
+          "바이트",
+          "오류"
+        ]
+      },
+      {
+        "title": "네트워크 TX (KB/s)",
+        "expressionLabels": [
+          "바이트",
+          "오류"
+        ]
+      },
+      {
+        "title": "디스크 I/O (B/s)",
+        "expressionLabels": [
+          "read",
+          "write"
+        ]
+      },
+      {
+        "title": "노드의 Pod CPU"
+      },
+      {
+        "title": "노드의 Pod 메모리"
+      }
+    ]
+  },
+  "slots": {
+    "services": "클러스터",
+    "instances": "노드",
+    "endpoints": "EKS 서비스"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_eks.i18n.pt.json b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.pt.json
new file mode 100644
index 0000000..5c850ae
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.pt.json
@@ -0,0 +1,133 @@
+{
+  "alias": "AWS EKS",
+  "group": "AWS",
+  "slots": {
+    "services": "Clusters",
+    "instances": "Nós",
+    "endpoints": "Serviços do EKS"
+  },
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Nós"
+      },
+      {
+        "label": "Nós com falha"
+      },
+      {
+        "label": "Namespaces"
+      },
+      {
+        "label": "Serviços"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Recurso",
+        "metrics": [
+          {
+            "label": "Nós",
+            "tip": "Quantidade de nós do cluster EKS."
+          },
+          {
+            "label": "Nós com falha",
+            "tip": "Nós EKS com falha reportados pelo cluster."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Quantidade de nós"
+      },
+      {
+        "title": "Nós com falha"
+      },
+      {
+        "title": "Quantidade de namespaces"
+      },
+      {
+        "title": "Quantidade de serviços EKS"
+      },
+      {
+        "title": "Erros de rede do cluster",
+        "expressionLabels": [
+          "rx",
+          "tx"
+        ]
+      },
+      {
+        "title": "Pacotes descartados na rede do cluster",
+        "expressionLabels": [
+          "rx",
+          "tx"
+        ]
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Utilização de CPU do Pod (%)"
+      },
+      {
+        "title": "Utilização de memória do Pod (%)"
+      },
+      {
+        "title": "Rede RX do Pod (KB/s)"
+      },
+      {
+        "title": "Erros RX do Pod / s"
+      },
+      {
+        "title": "Rede TX do Pod (KB/s)"
+      },
+      {
+        "title": "Erros TX do Pod / s"
+      }
+    ],
+    "instance": [
+      {
+        "title": "Quantidade de Pods"
+      },
+      {
+        "title": "Utilização de CPU (%)"
+      },
+      {
+        "title": "Utilização de memória (%)"
+      },
+      {
+        "title": "Utilização do FS (%)"
+      },
+      {
+        "title": "Rede RX (KB/s)",
+        "expressionLabels": [
+          "bytes",
+          "erros"
+        ]
+      },
+      {
+        "title": "Rede TX (KB/s)",
+        "expressionLabels": [
+          "bytes",
+          "erros"
+        ]
+      },
+      {
+        "title": "IO de disco (B/s)",
+        "expressionLabels": [
+          "leitura",
+          "escrita"
+        ]
+      },
+      {
+        "title": "CPU do Pod no nó"
+      },
+      {
+        "title": "Memória do Pod no nó"
+      }
+    ]
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_eks.i18n.zh-CN.json b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.zh-CN.json
new file mode 100644
index 0000000..1a7be20
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.zh-CN.json
@@ -0,0 +1,66 @@
+{
+  "alias": "AWS EKS",
+  "group": "AWS",
+  "slots": {
+    "services": "集群",
+    "instances": "节点",
+    "endpoints": "EKS 服务"
+  },
+  "layer-header": {
+    "columns": [
+      { "label": "节点" },
+      { "label": "失败节点" },
+      { "label": "命名空间" },
+      { "label": "服务" }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "资源",
+        "metrics": [
+          { "label": "节点", "tip": "EKS 集群节点数。" },
+          { "label": "失败节点", "tip": "集群上报的失败 EKS 节点数。" }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      { "title": "节点数" },
+      { "title": "失败节点" },
+      { "title": "命名空间数" },
+      { "title": "EKS 服务数" },
+      { "title": "集群网络错误", "expressionLabels": ["rx", "tx"] },
+      { "title": "集群网络丢包", "expressionLabels": ["rx", "tx"] }
+    ],
+    "endpoint": [
+      { "title": "Pod CPU 使用率(%)" },
+      { "title": "Pod 内存使用率(%)" },
+      { "title": "Pod 网络 RX(KB/s)" },
+      { "title": "Pod RX 错误 / 秒" },
+      { "title": "Pod 网络 TX(KB/s)" },
+      { "title": "Pod TX 错误 / 秒" }
+    ],
+    "instance": [
+      { "title": "Pod 数量" },
+      { "title": "CPU 使用率(%)" },
+      { "title": "内存使用率(%)" },
+      { "title": "文件系统使用率(%)" },
+      {
+        "title": "网络 RX(KB/s)",
+        "expressionLabels": ["bytes", "errors"]
+      },
+      {
+        "title": "网络 TX(KB/s)",
+        "expressionLabels": ["bytes", "errors"]
+      },
+      {
+        "title": "磁盘 IO(B/s)",
+        "expressionLabels": ["read", "write"]
+      },
+      { "title": "节点上的 Pod CPU" },
+      { "title": "节点上的 Pod 内存" }
+    ]
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.de.json b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.de.json
new file mode 100644
index 0000000..92a7f11
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.de.json
@@ -0,0 +1,157 @@
+{
+  "alias": "AWS API Gateway",
+  "group": "AWS",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Anfragen"
+      },
+      {
+        "label": "Latenz"
+      },
+      {
+        "label": "4xx"
+      },
+      {
+        "label": "5xx"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Fehler",
+        "metrics": [
+          {
+            "label": "4xx",
+            "tip": "Anzahl Client-Fehler von CloudWatch."
+          },
+          {
+            "label": "5xx",
+            "tip": "Anzahl Server-Fehler von CloudWatch."
+          },
+          {
+            "label": "Mittlere Latenz",
+            "tip": "Durchschnittliche Ende-zu-Ende-Latenz."
+          }
+        ]
+      },
+      {
+        "title": "Durchsatz",
+        "metrics": [
+          {
+            "label": "Anfragen",
+            "tip": "Gesamtanzahl Anfragen im Zeitfenster."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Anfrageanzahl",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "4xx-Anzahl",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "5xx-Anzahl",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Mittlere Anfragelatenz",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Mittlere Integrations-Latenz",
+        "tip": "Latenz zwischen Gateway und Backend-Integration.",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Verarbeitete Daten (nur HTTP API)",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Cache-Trefferrate (nur REST API)",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Cache-Fehlrate (nur REST API)",
+        "expressions": [
+          null
+        ]
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Anfrageanzahl",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "4xx-Anzahl",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "5xx-Anzahl",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Mittlere Anfragelatenz",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Mittlere Integrations-Latenz",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Verarbeitete Daten",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Cache-Trefferrate",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Cache-Fehlrate",
+        "expressions": [
+          null
+        ]
+      }
+    ]
+  },
+  "slots": {
+    "services": "AWS Gateways",
+    "endpoints": "Routes"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.es.json b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.es.json
new file mode 100644
index 0000000..c6d5a21
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.es.json
@@ -0,0 +1,109 @@
+{
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Peticiones"
+      },
+      {
+        "label": "Latencia"
+      },
+      {
+        "label": "4xx"
+      },
+      {
+        "label": "5xx"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Errores",
+        "metrics": [
+          {
+            "label": "4xx",
+            "tip": "Conteo de errores de cliente desde CloudWatch."
+          },
+          {
+            "label": "5xx",
+            "tip": "Conteo de errores de servidor desde CloudWatch."
+          },
+          {
+            "label": "Latencia media",
+            "tip": "Latencia media extremo a extremo."
+          }
+        ]
+      },
+      {
+        "title": "Rendimiento",
+        "metrics": [
+          {
+            "label": "Peticiones",
+            "tip": "Conteo total de peticiones en la ventana."
+          }
+        ]
+      }
+    ]
+  },
+  "alias": "AWS API Gateway",
+  "group": "AWS",
+  "dashboards": {
+    "service": [
+      {
+        "title": "Conteo de peticiones"
+      },
+      {
+        "title": "Conteo 4xx"
+      },
+      {
+        "title": "Conteo 5xx"
+      },
+      {
+        "title": "Latencia media de petición"
+      },
+      {
+        "title": "Latencia media de integración",
+        "tip": "Latencia entre el gateway y la integración backend."
+      },
+      {
+        "title": "Datos procesados (solo HTTP API)"
+      },
+      {
+        "title": "Tasa de aciertos de caché (solo REST API)"
+      },
+      {
+        "title": "Tasa de fallos de caché (solo REST API)"
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Conteo de peticiones"
+      },
+      {
+        "title": "Conteo 4xx"
+      },
+      {
+        "title": "Conteo 5xx"
+      },
+      {
+        "title": "Latencia media de petición"
+      },
+      {
+        "title": "Latencia media de integración"
+      },
+      {
+        "title": "Datos procesados"
+      },
+      {
+        "title": "Tasa de aciertos de caché"
+      },
+      {
+        "title": "Tasa de fallos de caché"
+      }
+    ]
+  },
+  "slots": {
+    "services": "Gateways de AWS",
+    "endpoints": "Rutas"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.fr.json b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.fr.json
new file mode 100644
index 0000000..1e8bda8
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.fr.json
@@ -0,0 +1,109 @@
+{
+  "alias": "AWS API Gateway",
+  "group": "AWS",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Requêtes"
+      },
+      {
+        "label": "Latence"
+      },
+      {
+        "label": "4xx"
+      },
+      {
+        "label": "5xx"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Erreurs",
+        "metrics": [
+          {
+            "label": "4xx",
+            "tip": "Nombre d'erreurs client depuis CloudWatch."
+          },
+          {
+            "label": "5xx",
+            "tip": "Nombre d'erreurs serveur depuis CloudWatch."
+          },
+          {
+            "label": "Latence moyenne",
+            "tip": "Latence moyenne de bout en bout."
+          }
+        ]
+      },
+      {
+        "title": "Débit",
+        "metrics": [
+          {
+            "label": "Requêtes",
+            "tip": "Nombre total de requêtes sur la fenêtre."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Nombre de requêtes"
+      },
+      {
+        "title": "Nombre de 4xx"
+      },
+      {
+        "title": "Nombre de 5xx"
+      },
+      {
+        "title": "Latence moyenne des requêtes"
+      },
+      {
+        "title": "Latence moyenne d'intégration",
+        "tip": "Latence entre la passerelle et l'intégration backend."
+      },
+      {
+        "title": "Données traitées (HTTP API uniquement)"
+      },
+      {
+        "title": "Taux de hit du cache (REST API uniquement)"
+      },
+      {
+        "title": "Taux de miss du cache (REST API uniquement)"
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Nombre de requêtes"
+      },
+      {
+        "title": "Nombre de 4xx"
+      },
+      {
+        "title": "Nombre de 5xx"
+      },
+      {
+        "title": "Latence moyenne des requêtes"
+      },
+      {
+        "title": "Latence moyenne d'intégration"
+      },
+      {
+        "title": "Données traitées"
+      },
+      {
+        "title": "Taux de hit du cache"
+      },
+      {
+        "title": "Taux de miss du cache"
+      }
+    ]
+  },
+  "slots": {
+    "services": "Passerelles AWS",
+    "endpoints": "Routes"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.ja.json b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.ja.json
new file mode 100644
index 0000000..c619de0
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.ja.json
@@ -0,0 +1,109 @@
+{
+  "alias": "AWS API Gateway",
+  "group": "AWS",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "リクエスト"
+      },
+      {
+        "label": "レイテンシ"
+      },
+      {
+        "label": "4xx"
+      },
+      {
+        "label": "5xx"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "エラー",
+        "metrics": [
+          {
+            "label": "4xx",
+            "tip": "CloudWatch からのクライアントエラー件数。"
+          },
+          {
+            "label": "5xx",
+            "tip": "CloudWatch からのサーバーエラー件数。"
+          },
+          {
+            "label": "平均レイテンシ",
+            "tip": "平均エンドツーエンドレイテンシ。"
+          }
+        ]
+      },
+      {
+        "title": "スループット",
+        "metrics": [
+          {
+            "label": "リクエスト",
+            "tip": "ウィンドウ内の合計リクエスト数。"
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "リクエスト数"
+      },
+      {
+        "title": "4xx 件数"
+      },
+      {
+        "title": "5xx 件数"
+      },
+      {
+        "title": "リクエスト平均レイテンシ"
+      },
+      {
+        "title": "統合平均レイテンシ",
+        "tip": "ゲートウェイとバックエンド統合間のレイテンシ。"
+      },
+      {
+        "title": "処理データ量 (HTTP API のみ)"
+      },
+      {
+        "title": "キャッシュヒット率 (REST API のみ)"
+      },
+      {
+        "title": "キャッシュミス率 (REST API のみ)"
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "リクエスト数"
+      },
+      {
+        "title": "4xx 件数"
+      },
+      {
+        "title": "5xx 件数"
+      },
+      {
+        "title": "リクエスト平均レイテンシ"
+      },
+      {
+        "title": "統合平均レイテンシ"
+      },
+      {
+        "title": "処理データ量"
+      },
+      {
+        "title": "キャッシュヒット率"
+      },
+      {
+        "title": "キャッシュミス率"
+      }
+    ]
+  },
+  "slots": {
+    "services": "AWS ゲートウェイ",
+    "endpoints": "ルート"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.ko.json b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.ko.json
new file mode 100644
index 0000000..840c9bc
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.ko.json
@@ -0,0 +1,109 @@
+{
+  "alias": "AWS API Gateway",
+  "group": "AWS",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "요청"
+      },
+      {
+        "label": "지연 시간"
+      },
+      {
+        "label": "4xx"
+      },
+      {
+        "label": "5xx"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "오류",
+        "metrics": [
+          {
+            "label": "4xx",
+            "tip": "CloudWatch에서 가져온 클라이언트 오류 수입니다."
+          },
+          {
+            "label": "5xx",
+            "tip": "CloudWatch에서 가져온 서버 오류 수입니다."
+          },
+          {
+            "label": "평균 지연 시간",
+            "tip": "평균 종단 간 지연 시간입니다."
+          }
+        ]
+      },
+      {
+        "title": "처리량",
+        "metrics": [
+          {
+            "label": "요청",
+            "tip": "윈도우 내 총 요청 수입니다."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "요청 수"
+      },
+      {
+        "title": "4xx 수"
+      },
+      {
+        "title": "5xx 수"
+      },
+      {
+        "title": "요청 평균 지연 시간"
+      },
+      {
+        "title": "통합 평균 지연 시간",
+        "tip": "게이트웨이와 백엔드 통합 사이의 지연 시간입니다."
+      },
+      {
+        "title": "처리된 데이터 (HTTP API 전용)"
+      },
+      {
+        "title": "캐시 적중률 (REST API 전용)"
+      },
+      {
+        "title": "캐시 미스율 (REST API 전용)"
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "요청 수"
+      },
+      {
+        "title": "4xx 수"
+      },
+      {
+        "title": "5xx 수"
+      },
+      {
+        "title": "요청 평균 지연 시간"
+      },
+      {
+        "title": "통합 평균 지연 시간"
+      },
+      {
+        "title": "처리된 데이터"
+      },
+      {
+        "title": "캐시 적중률"
+      },
+      {
+        "title": "캐시 미스율"
+      }
+    ]
+  },
+  "slots": {
+    "services": "AWS 게이트웨이",
+    "endpoints": "라우트"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.pt.json b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.pt.json
new file mode 100644
index 0000000..b782f01
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.pt.json
@@ -0,0 +1,109 @@
+{
+  "alias": "AWS API Gateway",
+  "group": "AWS",
+  "slots": {
+    "services": "Gateways da AWS",
+    "endpoints": "Rotas"
+  },
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Requisições"
+      },
+      {
+        "label": "Latência"
+      },
+      {
+        "label": "4xx"
+      },
+      {
+        "label": "5xx"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Erros",
+        "metrics": [
+          {
+            "label": "4xx",
+            "tip": "Contagem de erros de cliente vinda do CloudWatch."
+          },
+          {
+            "label": "5xx",
+            "tip": "Contagem de erros de servidor vinda do CloudWatch."
+          },
+          {
+            "label": "Latência média",
+            "tip": "Latência média ponta a ponta."
+          }
+        ]
+      },
+      {
+        "title": "Vazão",
+        "metrics": [
+          {
+            "label": "Requisições",
+            "tip": "Contagem total de requisições na janela."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Contagem de requisições"
+      },
+      {
+        "title": "Contagem de 4xx"
+      },
+      {
+        "title": "Contagem de 5xx"
+      },
+      {
+        "title": "Latência média da requisição"
+      },
+      {
+        "title": "Latência média da integração",
+        "tip": "Latência entre o gateway e a integração backend."
+      },
+      {
+        "title": "Dados processados (apenas HTTP API)"
+      },
+      {
+        "title": "Taxa de cache hit (apenas REST API)"
+      },
+      {
+        "title": "Taxa de cache miss (apenas REST API)"
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Contagem de requisições"
+      },
+      {
+        "title": "Contagem de 4xx"
+      },
+      {
+        "title": "Contagem de 5xx"
+      },
+      {
+        "title": "Latência média da requisição"
+      },
+      {
+        "title": "Latência média da integração"
+      },
+      {
+        "title": "Dados processados"
+      },
+      {
+        "title": "Taxa de cache hit"
+      },
+      {
+        "title": "Taxa de cache miss"
+      }
+    ]
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.zh-CN.json b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.zh-CN.json
new file mode 100644
index 0000000..e03e496
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.zh-CN.json
@@ -0,0 +1,56 @@
+{
+  "alias": "AWS API Gateway",
+  "group": "AWS",
+  "slots": {
+    "services": "AWS Gateway",
+    "endpoints": "路由"
+  },
+  "layer-header": {
+    "columns": [
+      { "label": "请求数" },
+      { "label": "延迟" },
+      { "label": "4xx" },
+      { "label": "5xx" }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "错误",
+        "metrics": [
+          { "label": "4xx", "tip": "来自 CloudWatch 的客户端错误数。" },
+          { "label": "5xx", "tip": "来自 CloudWatch 的服务端错误数。" },
+          { "label": "平均延迟", "tip": "平均端到端延迟。" }
+        ]
+      },
+      {
+        "title": "吞吐量",
+        "metrics": [
+          { "label": "请求数", "tip": "窗口内的请求总数。" }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      { "title": "请求数" },
+      { "title": "4xx 数量" },
+      { "title": "5xx 数量" },
+      { "title": "请求平均延迟" },
+      { "title": "集成平均延迟", "tip": "网关与后端集成之间的延迟。" },
+      { "title": "处理数据量(仅 HTTP API)" },
+      { "title": "缓存命中率(仅 REST API)" },
+      { "title": "缓存未命中率(仅 REST API)" }
+    ],
+    "endpoint": [
+      { "title": "请求数" },
+      { "title": "4xx 数量" },
+      { "title": "5xx 数量" },
+      { "title": "请求平均延迟" },
+      { "title": "集成平均延迟" },
+      { "title": "处理数据量" },
+      { "title": "缓存命中率" },
+      { "title": "缓存未命中率" }
+    ]
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_s3.i18n.de.json b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.de.json
new file mode 100644
index 0000000..8a0dc59
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.de.json
@@ -0,0 +1,108 @@
+{
+  "alias": "AWS S3",
+  "group": "AWS",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Anfragen"
+      },
+      {
+        "label": "Mittlere Latenz"
+      },
+      {
+        "label": "4xx"
+      },
+      {
+        "label": "5xx"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Fehler",
+        "metrics": [
+          {
+            "label": "4xx-Anzahl",
+            "tip": "Client-Fehler, beobachtet von CloudWatch."
+          },
+          {
+            "label": "5xx-Anzahl",
+            "tip": "Server-Fehler, beobachtet von CloudWatch."
+          },
+          {
+            "label": "Mittlere Latenz",
+            "tip": "Durchschnittliche Anfragelatenz."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Gesamtanzahl Anfragen",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "GET-Anfrageanzahl",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "PUT-Anfrageanzahl",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "DELETE-Anfrageanzahl",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "4xx-Anzahl",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "5xx-Anzahl",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Mittlere Anfragelatenz",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "First Byte mittlere Latenz",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Heruntergeladen (KB)",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Hochgeladen (KB)",
+        "expressions": [
+          null
+        ]
+      }
+    ]
+  },
+  "slots": {
+    "services": "S3 Buckets"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_s3.i18n.es.json b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.es.json
new file mode 100644
index 0000000..e03b326
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.es.json
@@ -0,0 +1,78 @@
+{
+  "overview": {
+    "groups": [
+      {
+        "title": "Errores",
+        "metrics": [
+          {
+            "label": "Conteo 4xx",
+            "tip": "Errores de cliente observados por CloudWatch."
+          },
+          {
+            "label": "Conteo 5xx",
+            "tip": "Errores de servidor observados por CloudWatch."
+          },
+          {
+            "label": "Latencia media",
+            "tip": "Latencia media de petición."
+          }
+        ]
+      }
+    ]
+  },
+  "alias": "AWS S3",
+  "group": "AWS",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Peticiones"
+      },
+      {
+        "label": "Latencia media"
+      },
+      {
+        "label": "4xx"
+      },
+      {
+        "label": "5xx"
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Conteo de todas las peticiones"
+      },
+      {
+        "title": "Conteo de peticiones GET"
+      },
+      {
+        "title": "Conteo de peticiones PUT"
+      },
+      {
+        "title": "Conteo de peticiones DELETE"
+      },
+      {
+        "title": "Conteo 4xx"
+      },
+      {
+        "title": "Conteo 5xx"
+      },
+      {
+        "title": "Latencia media de petición"
+      },
+      {
+        "title": "Latencia media del primer byte"
+      },
+      {
+        "title": "Descargado (KB)"
+      },
+      {
+        "title": "Subido (KB)"
+      }
+    ]
+  },
+  "slots": {
+    "services": "Buckets de S3"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_s3.i18n.fr.json b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.fr.json
new file mode 100644
index 0000000..b66f482
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.fr.json
@@ -0,0 +1,78 @@
+{
+  "alias": "AWS S3",
+  "group": "AWS",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Requêtes"
+      },
+      {
+        "label": "Latence moyenne"
+      },
+      {
+        "label": "4xx"
+      },
+      {
+        "label": "5xx"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Erreurs",
+        "metrics": [
+          {
+            "label": "Nombre de 4xx",
+            "tip": "Erreurs client observées par CloudWatch."
+          },
+          {
+            "label": "Nombre de 5xx",
+            "tip": "Erreurs serveur observées par CloudWatch."
+          },
+          {
+            "label": "Latence moyenne",
+            "tip": "Latence moyenne des requêtes."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Nombre total de requêtes"
+      },
+      {
+        "title": "Nombre de requêtes GET"
+      },
+      {
+        "title": "Nombre de requêtes PUT"
+      },
+      {
+        "title": "Nombre de requêtes DELETE"
+      },
+      {
+        "title": "Nombre de 4xx"
+      },
+      {
+        "title": "Nombre de 5xx"
+      },
+      {
+        "title": "Latence moyenne des requêtes"
+      },
+      {
+        "title": "Latence moyenne du premier octet"
+      },
+      {
+        "title": "Téléchargés (Ko)"
+      },
+      {
+        "title": "Téléversés (Ko)"
+      }
+    ]
+  },
+  "slots": {
+    "services": "Buckets S3"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_s3.i18n.ja.json b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.ja.json
new file mode 100644
index 0000000..57f1799
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.ja.json
@@ -0,0 +1,78 @@
+{
+  "alias": "AWS S3",
+  "group": "AWS",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "リクエスト"
+      },
+      {
+        "label": "平均レイテンシ"
+      },
+      {
+        "label": "4xx"
+      },
+      {
+        "label": "5xx"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "エラー",
+        "metrics": [
+          {
+            "label": "4xx 件数",
+            "tip": "CloudWatch で観測されたクライアントエラー。"
+          },
+          {
+            "label": "5xx 件数",
+            "tip": "CloudWatch で観測されたサーバーエラー。"
+          },
+          {
+            "label": "平均レイテンシ",
+            "tip": "平均リクエストレイテンシ。"
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "全リクエスト数"
+      },
+      {
+        "title": "GET リクエスト数"
+      },
+      {
+        "title": "PUT リクエスト数"
+      },
+      {
+        "title": "DELETE リクエスト数"
+      },
+      {
+        "title": "4xx 件数"
+      },
+      {
+        "title": "5xx 件数"
+      },
+      {
+        "title": "リクエスト平均レイテンシ"
+      },
+      {
+        "title": "First Byte 平均レイテンシ"
+      },
+      {
+        "title": "ダウンロード (KB)"
+      },
+      {
+        "title": "アップロード (KB)"
+      }
+    ]
+  },
+  "slots": {
+    "services": "S3 バケット"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_s3.i18n.ko.json b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.ko.json
new file mode 100644
index 0000000..3f3530f
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.ko.json
@@ -0,0 +1,78 @@
+{
+  "alias": "AWS S3",
+  "group": "AWS",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "요청"
+      },
+      {
+        "label": "평균 지연 시간"
+      },
+      {
+        "label": "4xx"
+      },
+      {
+        "label": "5xx"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "오류",
+        "metrics": [
+          {
+            "label": "4xx 수",
+            "tip": "CloudWatch가 관측한 클라이언트 오류입니다."
+          },
+          {
+            "label": "5xx 수",
+            "tip": "CloudWatch가 관측한 서버 오류입니다."
+          },
+          {
+            "label": "평균 지연 시간",
+            "tip": "평균 요청 지연 시간입니다."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "전체 요청 수"
+      },
+      {
+        "title": "GET 요청 수"
+      },
+      {
+        "title": "PUT 요청 수"
+      },
+      {
+        "title": "DELETE 요청 수"
+      },
+      {
+        "title": "4xx 수"
+      },
+      {
+        "title": "5xx 수"
+      },
+      {
+        "title": "요청 평균 지연 시간"
+      },
+      {
+        "title": "첫 바이트 평균 지연 시간"
+      },
+      {
+        "title": "다운로드 (KB)"
+      },
+      {
+        "title": "업로드 (KB)"
+      }
+    ]
+  },
+  "slots": {
+    "services": "S3 버킷"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_s3.i18n.pt.json b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.pt.json
new file mode 100644
index 0000000..31ac937
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.pt.json
@@ -0,0 +1,78 @@
+{
+  "alias": "AWS S3",
+  "group": "AWS",
+  "slots": {
+    "services": "Buckets do S3"
+  },
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Requisições"
+      },
+      {
+        "label": "Latência média"
+      },
+      {
+        "label": "4xx"
+      },
+      {
+        "label": "5xx"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Erros",
+        "metrics": [
+          {
+            "label": "Contagem de 4xx",
+            "tip": "Erros de cliente observados pelo CloudWatch."
+          },
+          {
+            "label": "Contagem de 5xx",
+            "tip": "Erros de servidor observados pelo CloudWatch."
+          },
+          {
+            "label": "Latência média",
+            "tip": "Latência média da requisição."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Contagem total de requisições"
+      },
+      {
+        "title": "Contagem de requisições GET"
+      },
+      {
+        "title": "Contagem de requisições PUT"
+      },
+      {
+        "title": "Contagem de requisições DELETE"
+      },
+      {
+        "title": "Contagem de 4xx"
+      },
+      {
+        "title": "Contagem de 5xx"
+      },
+      {
+        "title": "Latência média da requisição"
+      },
+      {
+        "title": "Latência média do primeiro byte"
+      },
+      {
+        "title": "Baixado (KB)"
+      },
+      {
+        "title": "Enviado (KB)"
+      }
+    ]
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_s3.i18n.zh-CN.json b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.zh-CN.json
new file mode 100644
index 0000000..49764b6
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.zh-CN.json
@@ -0,0 +1,41 @@
+{
+  "alias": "AWS S3",
+  "group": "AWS",
+  "slots": {
+    "services": "S3 存储桶"
+  },
+  "layer-header": {
+    "columns": [
+      { "label": "请求数" },
+      { "label": "平均延迟" },
+      { "label": "4xx" },
+      { "label": "5xx" }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "错误",
+        "metrics": [
+          { "label": "4xx 数量", "tip": "CloudWatch 观测到的客户端错误。" },
+          { "label": "5xx 数量", "tip": "CloudWatch 观测到的服务端错误。" },
+          { "label": "平均延迟", "tip": "平均请求延迟。" }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      { "title": "全部请求数" },
+      { "title": "GET 请求数" },
+      { "title": "PUT 请求数" },
+      { "title": "DELETE 请求数" },
+      { "title": "4xx 数量" },
+      { "title": "5xx 数量" },
+      { "title": "请求平均延迟" },
+      { "title": "首字节平均延迟" },
+      { "title": "下载量(KB)" },
+      { "title": "上传量(KB)" }
+    ]
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.de.json b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.de.json
new file mode 100644
index 0000000..8ee7a3d
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.de.json
@@ -0,0 +1,198 @@
+{
+  "alias": "BookKeeper",
+  "group": "MQ",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Ledger"
+      },
+      {
+        "label": "Einträge"
+      },
+      {
+        "label": "Beschreibbare Verz."
+      },
+      {
+        "label": "Verz.-Nutzung"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Durchsatz",
+        "metrics": [
+          {
+            "label": "Schreiben B/s",
+            "tip": "Bookie Schreib-Durchsatz im Cluster."
+          },
+          {
+            "label": "Lesen B/s",
+            "tip": "Bookie Lese-Durchsatz im Cluster."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Bookie-Ledger",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Bookie-Einträge",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Beschreibbare Ledger-Verz.",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Schreib-Cache",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "größe (MB)",
+          "einträge"
+        ],
+        "expressionAxes": [
+          null,
+          null
+        ]
+      },
+      {
+        "title": "Lese-Cache",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "größe (MB)",
+          "einträge"
+        ],
+        "expressionAxes": [
+          null,
+          null
+        ]
+      },
+      {
+        "title": "Lese-/Schreibrate (B/s)",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "lesen",
+          "schreiben"
+        ]
+      },
+      {
+        "title": "Ledger-Verz.-Nutzung",
+        "expressions": [
+          null
+        ]
+      }
+    ],
+    "instance": [
+      {
+        "title": "JVM-Speicherpool (MB)",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "JVM-Speicher (MB)",
+        "expressions": [
+          null,
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "genutzt",
+          "committed",
+          "init"
+        ]
+      },
+      {
+        "title": "JVM-Threads",
+        "expressions": [
+          null,
+          null,
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "aktuell",
+          "daemon",
+          "spitze",
+          "deadlocked"
+        ]
+      },
+      {
+        "title": "GC",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "sekunden",
+          "anzahl"
+        ],
+        "expressionAxes": [
+          null,
+          null
+        ]
+      },
+      {
+        "title": "Thread Executor",
+        "expressions": [
+          null,
+          null,
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "abgeschlossen",
+          "tasks abgeschlossen",
+          "abgelehnt",
+          "fehlgeschlagen"
+        ]
+      },
+      {
+        "title": "Pool-Threads",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "high-priority",
+          "lesen"
+        ]
+      },
+      {
+        "title": "Pool Max-Queue-Größe",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "high-priority",
+          "lesen"
+        ]
+      }
+    ]
+  },
+  "slots": {
+    "services": "BookKeeper-Cluster",
+    "instances": "Bookies"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.es.json b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.es.json
new file mode 100644
index 0000000..cf29177
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.es.json
@@ -0,0 +1,130 @@
+{
+  "overview": {
+    "groups": [
+      {
+        "title": "Rendimiento",
+        "metrics": [
+          {
+            "label": "Escritura B/s",
+            "tip": "Rendimiento de escritura de bookies en el clúster."
+          },
+          {
+            "label": "Lectura B/s",
+            "tip": "Rendimiento de lectura de bookies en el clúster."
+          }
+        ]
+      }
+    ]
+  },
+  "alias": "BookKeeper",
+  "group": "MQ",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Ledgers"
+      },
+      {
+        "label": "Entradas"
+      },
+      {
+        "label": "Directorios escribibles"
+      },
+      {
+        "label": "Uso de directorio"
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Ledgers del bookie"
+      },
+      {
+        "title": "Entradas del bookie"
+      },
+      {
+        "title": "Directorios de ledger escribibles"
+      },
+      {
+        "title": "Caché de escritura",
+        "expressionLabels": [
+          "tamaño (MB)",
+          "entradas"
+        ]
+      },
+      {
+        "title": "Caché de lectura",
+        "expressionLabels": [
+          "tamaño (MB)",
+          "entradas"
+        ]
+      },
+      {
+        "title": "Tasa de L/E (B/s)",
+        "expressionLabels": [
+          "lectura",
+          "escritura"
+        ]
+      },
+      {
+        "title": "Uso del directorio de ledgers"
+      }
+    ],
+    "instance": [
+      {
+        "title": "Pool de memoria JVM (MB)"
+      },
+      {
+        "title": "Memoria JVM (MB)",
+        "expressionLabels": [
+          "en uso",
+          "confirmadas",
+          "init"
+        ]
+      },
+      {
+        "title": "Hilos JVM",
+        "expressionLabels": [
+          "actual",
+          "daemon",
+          "máximo",
+          "en deadlock"
+        ]
+      },
+      {
+        "title": "GC",
+        "expressionLabels": [
+          "segundos",
+          "conteo"
+        ]
+      },
+      {
+        "title": "Executor de hilos",
+        "expressionLabels": [
+          "completadas",
+          "tareas completadas",
+          "rechazados",
+          "fallidos"
+        ]
+      },
+      {
+        "title": "Hilos en pool",
+        "expressionLabels": [
+          "alta prioridad",
+          "lectura"
+        ]
+      },
+      {
+        "title": "Tamaño máximo de la cola del pool",
+        "expressionLabels": [
+          "alta prioridad",
+          "lectura"
+        ]
+      }
+    ]
+  },
+  "slots": {
+    "services": "Clústeres de BookKeeper",
+    "instances": "Bookies"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.fr.json b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.fr.json
new file mode 100644
index 0000000..e690ece
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.fr.json
@@ -0,0 +1,130 @@
+{
+  "alias": "BookKeeper",
+  "group": "MQ",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Ledgers"
+      },
+      {
+        "label": "Entrées"
+      },
+      {
+        "label": "Répertoires inscriptibles"
+      },
+      {
+        "label": "Utilisation des répertoires"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Débit",
+        "metrics": [
+          {
+            "label": "Écriture o/s",
+            "tip": "Débit d'écriture Bookie sur l'ensemble du cluster."
+          },
+          {
+            "label": "Lecture o/s",
+            "tip": "Débit de lecture Bookie sur l'ensemble du cluster."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Ledgers Bookie"
+      },
+      {
+        "title": "Entrées Bookie"
+      },
+      {
+        "title": "Répertoires de ledgers inscriptibles"
+      },
+      {
+        "title": "Cache d'écriture",
+        "expressionLabels": [
+          "taille (Mo)",
+          "entrées"
+        ]
+      },
+      {
+        "title": "Cache de lecture",
+        "expressionLabels": [
+          "taille (Mo)",
+          "entrées"
+        ]
+      },
+      {
+        "title": "Débit lecture / écriture (o/s)",
+        "expressionLabels": [
+          "lecture",
+          "écriture"
+        ]
+      },
+      {
+        "title": "Utilisation du répertoire de ledgers"
+      }
+    ],
+    "instance": [
+      {
+        "title": "Pool mémoire JVM (Mo)"
+      },
+      {
+        "title": "Mémoire JVM (Mo)",
+        "expressionLabels": [
+          "utilisé",
+          "engagés",
+          "init"
+        ]
+      },
+      {
+        "title": "Threads JVM",
+        "expressionLabels": [
+          "courant",
+          "daemon",
+          "pic",
+          "en deadlock"
+        ]
+      },
+      {
+        "title": "GC",
+        "expressionLabels": [
+          "secondes",
+          "nombre"
+        ]
+      },
+      {
+        "title": "Exécuteur de threads",
+        "expressionLabels": [
+          "terminées",
+          "tâches terminées",
+          "rejetés",
+          "échec"
+        ]
+      },
+      {
+        "title": "Threads poolés",
+        "expressionLabels": [
+          "priorité haute",
+          "lecture"
+        ]
+      },
+      {
+        "title": "Taille max de la file du pool",
+        "expressionLabels": [
+          "priorité haute",
+          "lecture"
+        ]
+      }
+    ]
+  },
+  "slots": {
+    "services": "Clusters BookKeeper",
+    "instances": "Bookies"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.ja.json b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.ja.json
new file mode 100644
index 0000000..c148a6a
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.ja.json
@@ -0,0 +1,130 @@
+{
+  "alias": "BookKeeper",
+  "group": "MQ",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Ledger"
+      },
+      {
+        "label": "Entry"
+      },
+      {
+        "label": "書き込み可能ディレクトリ"
+      },
+      {
+        "label": "ディレクトリ使用量"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "スループット",
+        "metrics": [
+          {
+            "label": "書き込み B/s",
+            "tip": "クラスタ全体の Bookie 書き込みスループット。"
+          },
+          {
+            "label": "読み取り B/s",
+            "tip": "クラスタ全体の Bookie 読み取りスループット。"
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Bookie Ledger"
+      },
+      {
+        "title": "Bookie Entry"
+      },
+      {
+        "title": "書き込み可能 Ledger ディレクトリ"
+      },
+      {
+        "title": "書き込みキャッシュ",
+        "expressionLabels": [
+          "サイズ (MB)",
+          "entry"
+        ]
+      },
+      {
+        "title": "読み取りキャッシュ",
+        "expressionLabels": [
+          "サイズ (MB)",
+          "entry"
+        ]
+      },
+      {
+        "title": "読み取り / 書き込みレート (B/s)",
+        "expressionLabels": [
+          "読み取り",
+          "書き込み"
+        ]
+      },
+      {
+        "title": "Ledger ディレクトリ使用量"
+      }
+    ],
+    "instance": [
+      {
+        "title": "JVM メモリプール (MB)"
+      },
+      {
+        "title": "JVM メモリ (MB)",
+        "expressionLabels": [
+          "使用中",
+          "コミット",
+          "初期化"
+        ]
+      },
+      {
+        "title": "JVM スレッド",
+        "expressionLabels": [
+          "現在",
+          "デーモン",
+          "ピーク",
+          "デッドロック"
+        ]
+      },
+      {
+        "title": "GC",
+        "expressionLabels": [
+          "秒",
+          "件数"
+        ]
+      },
+      {
+        "title": "Thread Executor",
+        "expressionLabels": [
+          "完了",
+          "完了タスク",
+          "拒否",
+          "失敗"
+        ]
+      },
+      {
+        "title": "プールスレッド",
+        "expressionLabels": [
+          "高優先度",
+          "読み取り"
+        ]
+      },
+      {
+        "title": "プール最大キューサイズ",
+        "expressionLabels": [
+          "高優先度",
+          "読み取り"
+        ]
+      }
+    ]
+  },
+  "slots": {
+    "services": "BookKeeper クラスタ",
+    "instances": "Bookie"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.ko.json b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.ko.json
new file mode 100644
index 0000000..4702040
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.ko.json
@@ -0,0 +1,130 @@
+{
+  "alias": "BookKeeper",
+  "group": "MQ",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "원장"
+      },
+      {
+        "label": "Entries"
+      },
+      {
+        "label": "쓰기 가능 디렉토리"
+      },
+      {
+        "label": "디렉토리 사용량"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "처리량",
+        "metrics": [
+          {
+            "label": "쓰기 B/s",
+            "tip": "클러스터 전체의 Bookie 쓰기 처리량입니다."
+          },
+          {
+            "label": "읽기 B/s",
+            "tip": "클러스터 전체의 Bookie 읽기 처리량입니다."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Bookie 원장"
+      },
+      {
+        "title": "Bookie 엔트리"
+      },
+      {
+        "title": "쓰기 가능 원장 디렉토리"
+      },
+      {
+        "title": "쓰기 캐시",
+        "expressionLabels": [
+          "크기 (MB)",
+          "entries"
+        ]
+      },
+      {
+        "title": "읽기 캐시",
+        "expressionLabels": [
+          "크기 (MB)",
+          "entries"
+        ]
+      },
+      {
+        "title": "읽기 / 쓰기 비율 (B/s)",
+        "expressionLabels": [
+          "read",
+          "write"
+        ]
+      },
+      {
+        "title": "원장 디렉토리 사용량"
+      }
+    ],
+    "instance": [
+      {
+        "title": "JVM 메모리 풀 (MB)"
+      },
+      {
+        "title": "JVM 메모리 (MB)",
+        "expressionLabels": [
+          "사용",
+          "committed",
+          "init"
+        ]
+      },
+      {
+        "title": "JVM 스레드",
+        "expressionLabels": [
+          "current",
+          "daemon",
+          "피크",
+          "deadlocked"
+        ]
+      },
+      {
+        "title": "GC",
+        "expressionLabels": [
+          "초",
+          "count"
+        ]
+      },
+      {
+        "title": "스레드 실행기",
+        "expressionLabels": [
+          "completed",
+          "완료된 작업",
+          "rejected",
+          "실패"
+        ]
+      },
+      {
+        "title": "풀링된 스레드",
+        "expressionLabels": [
+          "높은 우선순위",
+          "read"
+        ]
+      },
+      {
+        "title": "풀 최대 큐 크기",
+        "expressionLabels": [
+          "높은 우선순위",
+          "read"
+        ]
+      }
+    ]
+  },
+  "slots": {
+    "services": "BookKeeper 클러스터",
+    "instances": "Bookie"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.pt.json b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.pt.json
new file mode 100644
index 0000000..c4914d2
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.pt.json
@@ -0,0 +1,130 @@
+{
+  "alias": "BookKeeper",
+  "group": "MQ",
+  "slots": {
+    "services": "Clusters do BookKeeper",
+    "instances": "Bookies"
+  },
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Ledgers"
+      },
+      {
+        "label": "Entradas"
+      },
+      {
+        "label": "Diretórios graváveis"
+      },
+      {
+        "label": "Uso de diretório"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Vazão",
+        "metrics": [
+          {
+            "label": "Escrita B/s",
+            "tip": "Vazão de escrita dos bookies no cluster."
+          },
+          {
+            "label": "Leitura B/s",
+            "tip": "Vazão de leitura dos bookies no cluster."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Ledgers do bookie"
+      },
+      {
+        "title": "Entradas do bookie"
+      },
+      {
+        "title": "Diretórios de ledger graváveis"
+      },
+      {
+        "title": "Cache de escrita",
+        "expressionLabels": [
+          "tamanho (MB)",
+          "entradas"
+        ]
+      },
+      {
+        "title": "Cache de leitura",
+        "expressionLabels": [
+          "tamanho (MB)",
+          "entradas"
+        ]
+      },
+      {
+        "title": "Taxa de L/E (B/s)",
+        "expressionLabels": [
+          "leitura",
+          "escrita"
+        ]
+      },
+      {
+        "title": "Uso do diretório de ledgers"
+      }
+    ],
+    "instance": [
+      {
+        "title": "Pool de memória JVM (MB)"
+      },
+      {
+        "title": "Memória JVM (MB)",
+        "expressionLabels": [
+          "em uso",
+          "comprometida",
+          "init"
+        ]
+      },
+      {
+        "title": "Threads JVM",
+        "expressionLabels": [
+          "atual",
+          "daemon",
+          "pico",
+          "em deadlock"
+        ]
+      },
+      {
+        "title": "GC",
+        "expressionLabels": [
+          "segundos",
+          "contagem"
+        ]
+      },
+      {
+        "title": "Executor de threads",
+        "expressionLabels": [
+          "concluídas",
+          "tarefas concluídas",
+          "rejeitadas",
+          "falhas"
+        ]
+      },
+      {
+        "title": "Threads em pool",
+        "expressionLabels": [
+          "alta prioridade",
+          "leitura"
+        ]
+      },
+      {
+        "title": "Tamanho máximo da fila do pool",
+        "expressionLabels": [
+          "alta prioridade",
+          "leitura"
+        ]
+      }
+    ]
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.zh-CN.json b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.zh-CN.json
new file mode 100644
index 0000000..149f1a6
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.zh-CN.json
@@ -0,0 +1,74 @@
+{
+  "alias": "BookKeeper",
+  "group": "MQ",
+  "slots": {
+    "services": "BookKeeper 集群",
+    "instances": "Bookie"
+  },
+  "layer-header": {
+    "columns": [
+      { "label": "Ledger 数" },
+      { "label": "Entry 数" },
+      { "label": "可写目录" },
+      { "label": "目录使用" }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "吞吐量",
+        "metrics": [
+          { "label": "写入 B/s", "tip": "集群所有 Bookie 的写吞吐量。" },
+          { "label": "读取 B/s", "tip": "集群所有 Bookie 的读吞吐量。" }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      { "title": "Bookie Ledger 数" },
+      { "title": "Bookie Entry 数" },
+      { "title": "可写 Ledger 目录数" },
+      {
+        "title": "写缓存",
+        "expressionLabels": ["size (MB)", "entries"]
+      },
+      {
+        "title": "读缓存",
+        "expressionLabels": ["size (MB)", "entries"]
+      },
+      {
+        "title": "读 / 写速率(B/s)",
+        "expressionLabels": ["read", "write"]
+      },
+      { "title": "Ledger 目录使用" }
+    ],
+    "instance": [
+      { "title": "JVM 内存池(MB)" },
+      {
+        "title": "JVM 内存(MB)",
+        "expressionLabels": ["used", "committed", "init"]
+      },
+      {
+        "title": "JVM 线程",
+        "expressionLabels": ["current", "daemon", "peak", "deadlocked"]
+      },
+      {
+        "title": "GC",
+        "expressionLabels": ["seconds", "count"]
+      },
+      {
+        "title": "线程执行器",
+        "expressionLabels": ["completed", "tasks completed", "rejected", "failed"]
+      },
+      {
+        "title": "线程池",
+        "expressionLabels": ["high-priority", "read"]
+      },
+      {
+        "title": "线程池最大队列大小",
+        "expressionLabels": ["high-priority", "read"]
+      }
+    ]
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/browser.i18n.de.json b/apps/bff/src/bundled_templates/layers/browser.i18n.de.json
new file mode 100644
index 0000000..cb6a664
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/browser.i18n.de.json
@@ -0,0 +1,215 @@
+{
+  "alias": "Browser",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Seitenaufrufe"
+      },
+      {
+        "label": "Fehlerrate"
+      },
+      {
+        "label": "Fehler"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Seitenstatus",
+        "metrics": [
+          {
+            "label": "Fehlerrate",
+            "tip": "Prozentsatz der Seitenladevorgänge, die einen Fehler erzeugten."
+          }
+        ]
+      },
+      {
+        "title": "Durchsatz",
+        "metrics": [
+          {
+            "label": "PV / min",
+            "tip": "Seitenaufrufe pro Minute."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "App-Last (PV)",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "App-Fehlerrate",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "App-Fehleranzahl",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Top heiße Seiten",
+        "tip": "Seiten sortiert nach Page Views, Fehlern und Fehlerrate.",
+        "expressions": [
+          null,
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "PV",
+          "Fehler",
+          "Fehlerrate"
+        ],
+        "expressionUnits": [
+          null,
+          null,
+          null
+        ]
+      },
+      {
+        "title": "Top-Versionen",
+        "tip": "App-Versions-Aufschlüsselung — Last + Fehler + Fehlerrate.",
+        "expressions": [
+          null,
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "PV",
+          "Fehler",
+          "Fehlerrate"
+        ],
+        "expressionUnits": [
+          null,
+          null,
+          null
+        ]
+      }
+    ],
+    "instance": [
+      {
+        "title": "Versions-PV",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Versions-Fehlerrate",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Versions-Fehleranzahl",
+        "expressions": [
+          null
+        ]
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "First Meaningful Paint Perzentil",
+        "tip": "p50–p99 der FMP-Latenz für die ausgewählte Seite. Unter 1 s für p75 ist ein übliches Ziel.",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Seitenlade-Perzentil",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Time-to-Live Perzentil",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "First-Pack-Latenz-Perzentil",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Seiten-Performance-Aufschlüsselung",
+        "tip": "Durchschnittliche Zeit in jeder Phase des Seitenladens — Resolve, Redirect, DNS, TCP, TTFB, Transfer, DOM-Analyse, DOM-Bereit, FPT, voll geladen.",
+        "expressions": [
+          null,
+          null,
+          null,
+          null,
+          null,
+          null,
+          null,
+          null,
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "dns",
+          "redirect",
+          "tcp",
+          "ttfb",
+          "transfer",
+          "dom-analyse",
+          "dom-bereit",
+          "fpt",
+          "last",
+          "resource"
+        ]
+      },
+      {
+        "title": "Seitenfehler nach Typ",
+        "tip": "Zähler für Resource- / JS- / AJAX- / unbekannte Fehler pro Minute.",
+        "expressions": [
+          null,
+          null,
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "resource",
+          "js",
+          "ajax",
+          "unbekannt"
+        ]
+      },
+      {
+        "title": "Web Vitals",
+        "tip": "Core Web Vitals — FMP, LCP, CLS (Mittel pro Minute). CLS wird durch 1000 geteilt, um es in den üblichen 0–1-Score-Bereich zu bringen.",
+        "expressions": [
+          null,
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "FMP (ms)",
+          "LCP (ms)",
+          "CLS"
+        ]
+      },
+      {
+        "title": "Interaction-to-Next-Paint-Perzentil",
+        "tip": "INP — Reaktionsmetrik, die FID ersetzt.",
+        "expressions": [
+          null
+        ]
+      }
+    ]
+  },
+  "slots": {
+    "services": "Apps",
+    "instances": "Versionen",
+    "endpoints": "Seiten"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/browser.i18n.es.json b/apps/bff/src/bundled_templates/layers/browser.i18n.es.json
new file mode 100644
index 0000000..ea02391
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/browser.i18n.es.json
@@ -0,0 +1,139 @@
+{
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Vistas de página"
+      },
+      {
+        "label": "Tasa de errores"
+      },
+      {
+        "label": "Errores"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "metrics": [
+          {
+            "label": "Tasa de errores",
+            "tip": "Porcentaje de cargas de página que produjeron un error."
+          }
+        ],
+        "title": "Estado de la página"
+      },
+      {
+        "title": "Rendimiento",
+        "metrics": [
+          {
+            "label": "PV / min",
+            "tip": "Vistas de página por minuto."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Carga de la app (PV)"
+      },
+      {
+        "title": "Tasa de errores de la app"
+      },
+      {
+        "title": "Conteo de errores de la app"
+      },
+      {
+        "expressionLabels": [
+          "PV",
+          "Errores",
+          "Tasa de errores"
+        ],
+        "title": "Páginas más populares",
+        "tip": "Páginas ordenadas por vistas, errores y tasa de errores."
+      },
+      {
+        "expressionLabels": [
+          "PV",
+          "Errores",
+          "Tasa de errores"
+        ],
+        "title": "Versiones top",
+        "tip": "Desglose por versión de la app — carga + errores + tasa de errores."
+      }
+    ],
+    "instance": [
+      {
+        "title": "PV por versión"
+      },
+      {
+        "title": "Tasa de errores de versión"
+      },
+      {
+        "title": "Conteo de errores de versión"
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Percentil de First Meaningful Paint",
+        "tip": "p50–p99 de latencia FMP para la página seleccionada. Por debajo de 1s en p75 es un objetivo común."
+      },
+      {
+        "title": "Percentil de carga de página"
+      },
+      {
+        "title": "Percentil de Time-to-Live"
+      },
+      {
+        "title": "Percentil de latencia del primer paquete"
+      },
+      {
+        "title": "Desglose de rendimiento de página",
+        "tip": "Tiempo medio en cada fase de la carga de página — resolución, redirección, DNS, TCP, TTFB, transferencia, análisis del DOM, DOM listo, FPT, carga completa.",
+        "expressionLabels": [
+          "dns",
+          "redirección",
+          "tcp",
+          "ttfb",
+          "transferencia",
+          "análisis dom",
+          "dom listo",
+          "fpt",
+          "carga",
+          "recurso"
+        ]
+      },
+      {
+        "title": "Errores de página por tipo",
+        "tip": "Contadores de errores Resource / JS / AJAX / unknown por minuto.",
+        "expressionLabels": [
+          "recurso",
+          "js",
+          "ajax",
+          "desconocido"
+        ]
+      },
+      {
+        "title": "Web Vitals",
+        "tip": "Core Web Vitals — FMP, LCP, CLS (media por minuto). CLS se divide por 1000 para llevarlo al rango típico 0–1.",
+        "expressionLabels": [
+          "FMP (ms)",
+          "LCP (ms)",
+          "CLS"
+        ]
+      },
+      {
+        "title": "Percentil de Interaction to Next Paint",
+        "tip": "INP — métrica de responsividad que reemplaza a FID."
+      }
+    ]
+  },
+  "slots": {
+    "instances": "Versiones",
+    "endpoints": "Páginas",
+    "services": "Apps"
+  },
+  "alias": "Navegador"
+}
diff --git a/apps/bff/src/bundled_templates/layers/browser.i18n.fr.json b/apps/bff/src/bundled_templates/layers/browser.i18n.fr.json
new file mode 100644
index 0000000..fee99c0
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/browser.i18n.fr.json
@@ -0,0 +1,139 @@
+{
+  "alias": "Navigateur",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Pages vues"
+      },
+      {
+        "label": "Taux d'erreur"
+      },
+      {
+        "label": "Erreurs"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Santé de la page",
+        "metrics": [
+          {
+            "label": "Taux d'erreur",
+            "tip": "Pourcentage de chargements de page ayant produit une erreur."
+          }
+        ]
+      },
+      {
+        "title": "Débit",
+        "metrics": [
+          {
+            "label": "PV / min",
+            "tip": "Pages vues par minute."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Charge de l'app (PV)"
+      },
+      {
+        "title": "Taux d'erreur de l'app"
+      },
+      {
+        "title": "Nombre d'erreurs de l'app"
+      },
+      {
+        "title": "Top pages chaudes",
+        "tip": "Pages classées par pages vues, erreurs et taux d'erreur.",
+        "expressionLabels": [
+          "PV",
+          "Erreurs",
+          "Taux d'erreur"
+        ]
+      },
+      {
+        "title": "Top versions",
+        "tip": "Ventilation par version de l'app — charge + erreurs + taux d'erreur.",
+        "expressionLabels": [
+          "PV",
+          "Erreurs",
+          "Taux d'erreur"
+        ]
+      }
+    ],
+    "instance": [
+      {
+        "title": "PV par version"
+      },
+      {
+        "title": "Taux d'erreur par version"
+      },
+      {
+        "title": "Nombre d'erreurs par version"
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Centile du First Meaningful Paint",
+        "tip": "p50–p99 de la latence FMP pour la page sélectionnée. Sous 1s au p75 est une cible courante."
+      },
+      {
+        "title": "Centile du chargement de page"
+      },
+      {
+        "title": "Centile du Time-to-Live"
+      },
+      {
+        "title": "Centile de latence du premier paquet"
+      },
+      {
+        "title": "Ventilation des performances de la page",
+        "tip": "Temps moyen passé à chaque phase du chargement de page — resolve, redirect, DNS, TCP, TTFB, transfer, analyse DOM, DOM prêt, FPT, chargement complet.",
+        "expressionLabels": [
+          "dns",
+          "redirect",
+          "tcp",
+          "ttfb",
+          "transfer",
+          "analyse dom",
+          "dom prêt",
+          "fpt",
+          "chargement",
+          "ressource"
+        ]
+      },
+      {
+        "title": "Erreurs de page par type",
+        "tip": "Compteurs d'erreurs resource / JS / AJAX / unknown par minute.",
+        "expressionLabels": [
+          "ressource",
+          "js",
+          "ajax",
+          "inconnu"
+        ]
+      },
+      {
+        "title": "Web Vitals",
+        "tip": "Core Web Vitals — FMP, LCP, CLS (moyenne par minute). CLS est divisé par 1000 pour obtenir la plage de score typique 0–1.",
+        "expressionLabels": [
+          "FMP (ms)",
+          "LCP (ms)",
+          "CLS"
+        ]
+      },
+      {
+        "title": "Centile Interaction to Next Paint",
+        "tip": "INP — métrique de réactivité remplaçant FID."
+      }
+    ]
+  },
+  "slots": {
+    "services": "Apps",
+    "instances": "Versions",
+    "endpoints": "Pages"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/browser.i18n.ja.json b/apps/bff/src/bundled_templates/layers/browser.i18n.ja.json
new file mode 100644
index 0000000..125bced
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/browser.i18n.ja.json
@@ -0,0 +1,139 @@
+{
+  "alias": "ブラウザ",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "ページビュー"
+      },
+      {
+        "label": "エラー率"
+      },
+      {
+        "label": "エラー"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "ページヘルス",
+        "metrics": [
+          {
+            "label": "エラー率",
+            "tip": "エラーを発生させたページロードの割合。"
+          }
+        ]
+      },
+      {
+        "title": "スループット",
+        "metrics": [
+          {
+            "label": "PV / 分",
+            "tip": "1分あたりのページビュー。"
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "アプリ負荷 (PV)"
+      },
+      {
+        "title": "アプリエラー率"
+      },
+      {
+        "title": "アプリエラー件数"
+      },
+      {
+        "title": "上位ホットページ",
+        "tip": "ページビュー、エラー、エラー率でランク付けしたページ。",
+        "expressionLabels": [
+          "PV",
+          "エラー",
+          "エラー率"
+        ]
+      },
+      {
+        "title": "上位バージョン",
+        "tip": "アプリバージョン内訳 — 負荷 + エラー + エラー率。",
+        "expressionLabels": [
+          "PV",
+          "エラー",
+          "エラー率"
+        ]
+      }
+    ],
+    "instance": [
+      {
+        "title": "バージョン PV"
+      },
+      {
+        "title": "バージョン別エラー率"
+      },
+      {
+        "title": "バージョン別エラー件数"
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "First Meaningful Paint パーセンタイル",
+        "tip": "選択中ページの FMP レイテンシ p50–p99。p75 で 1 秒以下が一般的な目標。"
+      },
+      {
+        "title": "ページロードパーセンタイル"
+      },
+      {
+        "title": "Time-to-Live パーセンタイル"
+      },
+      {
+        "title": "First Pack レイテンシパーセンタイル"
+      },
+      {
+        "title": "ページパフォーマンス内訳",
+        "tip": "ページロードの各フェーズに費やされた平均時間 — resolve、redirect、DNS、TCP、TTFB、transfer、DOM 解析、DOM ready、FPT、フルロード。",
+        "expressionLabels": [
+          "DNS",
+          "リダイレクト",
+          "TCP",
+          "TTFB",
+          "転送",
+          "DOM 解析",
+          "DOM ready",
+          "FPT",
+          "ロード",
+          "リソース"
+        ]
+      },
+      {
+        "title": "タイプ別ページエラー",
+        "tip": "1分あたりの Resource / JS / AJAX / 不明エラーカウンタ。",
+        "expressionLabels": [
+          "リソース",
+          "JS",
+          "AJAX",
+          "不明"
+        ]
+      },
+      {
+        "title": "Web Vitals",
+        "tip": "Core Web Vitals — FMP、LCP、CLS(1分あたり平均)。CLS は典型的な 0–1 スコア範囲に収めるため 1000 で除算。",
+        "expressionLabels": [
+          "FMP (ms)",
+          "LCP (ms)",
+          "CLS"
+        ]
+      },
+      {
+        "title": "Interaction to Next Paint パーセンタイル",
+        "tip": "INP — FID を置き換えた応答性メトリクス。"
+      }
+    ]
+  },
+  "slots": {
+    "services": "アプリ",
+    "instances": "バージョン",
+    "endpoints": "ページ"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/browser.i18n.ko.json b/apps/bff/src/bundled_templates/layers/browser.i18n.ko.json
new file mode 100644
index 0000000..0d75014
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/browser.i18n.ko.json
@@ -0,0 +1,139 @@
+{
+  "alias": "브라우저",
+  "layer-header": {
+    "columns": [
+      {
+        "label": "페이지 뷰"
+      },
+      {
+        "label": "오류율"
+      },
+      {
+        "label": "오류"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "페이지 상태",
+        "metrics": [
+          {
+            "label": "오류율",
+            "tip": "오류를 발생시킨 페이지 로드의 비율입니다."
+          }
+        ]
+      },
+      {
+        "title": "처리량",
+        "metrics": [
+          {
+            "label": "PV / 분",
+            "tip": "분당 페이지 뷰입니다."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "앱 로드 (PV)"
+      },
+      {
+        "title": "앱 오류율"
+      },
+      {
+        "title": "앱 오류 수"
+      },
+      {
+        "title": "인기 페이지",
+        "tip": "페이지 뷰, 오류, 오류율 기준으로 정렬된 페이지입니다.",
+        "expressionLabels": [
+          "PV",
+          "오류",
+          "오류율"
+        ]
+      },
+      {
+        "title": "상위 버전",
+        "tip": "앱 버전별 분포 — 로드 + 오류 + 오류율.",
+        "expressionLabels": [
+          "PV",
+          "오류",
+          "오류율"
+        ]
+      }
+    ],
+    "instance": [
+      {
+        "title": "버전 PV"
+      },
+      {
+        "title": "버전 오류율"
+      },
+      {
+        "title": "버전 오류 수"
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "First Meaningful Paint 백분위",
+        "tip": "선택한 페이지의 FMP 지연 시간 p50–p99 입니다. p75가 1초 미만이면 일반적인 목표를 달성한 것입니다."
+      },
+      {
+        "title": "페이지 로드 백분위"
+      },
+      {
+        "title": "TTL 백분위"
+      },
+      {
+        "title": "First Pack 지연 시간 백분위"
+      },
+      {
+        "title": "페이지 성능 분해",
+        "tip": "페이지 로드 각 단계의 평균 시간 — resolve, redirect, DNS, TCP, TTFB, transfer, DOM 분석, DOM ready, FPT, full load.",
+        "expressionLabels": [
+          "dns",
+          "리다이렉트",
+          "tcp",
+          "ttfb",
+          "transfer",
+          "dom 분석",
+          "dom ready",
+          "fpt",
+          "load",
+          "리소스"
+        ]
+      },
+      {
+        "title": "유형별 페이지 오류",
+        "tip": "Resource / JS / AJAX / unknown 오류의 분당 카운터입니다.",
+        "expressionLabels": [
+          "리소스",
+          "js",
+          "ajax",
+          "알 수 없음"
+        ]
+      },
+      {
+        "title": "Web Vitals",
+        "tip": "Core Web Vitals — FMP, LCP, CLS (분당 평균). CLS는 일반적인 0–1 점수 범위로 맞추기 위해 1000으로 나눕니다.",
+        "expressionLabels": [
+          "FMP (ms)",
+          "LCP (ms)",
+          "CLS"
+        ]
+      },
+      {
+        "title": "Interaction to Next Paint 백분위",
+        "tip": "INP — FID를 대체하는 반응성 지표입니다."
+      }
+    ]
+  },
+  "slots": {
+    "services": "앱",
+    "instances": "버전",
+    "endpoints": "페이지"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/browser.i18n.pt.json b/apps/bff/src/bundled_templates/layers/browser.i18n.pt.json
new file mode 100644
index 0000000..ee8a8fe
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/browser.i18n.pt.json
@@ -0,0 +1,139 @@
+{
+  "alias": "Navegador",
+  "slots": {
+    "services": "Apps",
+    "instances": "Versões",
+    "endpoints": "Páginas"
+  },
+  "layer-header": {
+    "columns": [
+      {
+        "label": "Page Views"
+      },
+      {
+        "label": "Taxa de erros"
+      },
+      {
+        "label": "Erros"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Saúde da página",
+        "metrics": [
+          {
+            "label": "Taxa de erros",
+            "tip": "Porcentagem de carregamentos de página que resultaram em erro."
+          }
+        ]
+      },
+      {
+        "title": "Vazão",
+        "metrics": [
+          {
+            "label": "PV / min",
+            "tip": "Page views por minuto."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Carga do app (PV)"
+      },
+      {
+        "title": "Taxa de erros do app"
+      },
+      {
+        "title": "Contagem de erros do app"
+      },
+      {
+        "title": "Páginas mais acessadas",
+        "tip": "Páginas ordenadas por page views, erros e taxa de erros.",
+        "expressionLabels": [
+          "PV",
+          "Erros",
+          "Taxa de erros"
+        ]
+      },
+      {
+        "title": "Top versões",
+        "tip": "Detalhamento por versão do app — carga + erros + taxa de erros.",
+        "expressionLabels": [
+          "PV",
+          "Erros",
+          "Taxa de erros"
+        ]
+      }
+    ],
+    "instance": [
+      {
+        "title": "PV da versão"
+      },
+      {
+        "title": "Taxa de erros da versão"
+      },
+      {
+        "title": "Contagem de erros da versão"
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Percentil de First Meaningful Paint",
+        "tip": "p50–p99 da latência de FMP para a página selecionada. Abaixo de 1s no p75 é uma meta comum."
+      },
+      {
+        "title": "Percentil de carregamento de página"
+      },
+      {
+        "title": "Percentil de Time-to-Live"
+      },
+      {
+        "title": "Percentil de latência do primeiro pacote"
+      },
+      {
+        "title": "Detalhamento de performance da página",
+        "tip": "Tempo médio em cada fase do carregamento — resolve, redirect, DNS, TCP, TTFB, transferência, análise do DOM, DOM ready, FPT, carga completa.",
+        "expressionLabels": [
+          "dns",
+          "redirect",
+          "tcp",
+          "ttfb",
+          "transferência",
+          "análise do dom",
+          "dom ready",
+          "fpt",
+          "load",
+          "recurso"
+        ]
+      },
+      {
+        "title": "Erros da página por tipo",
+        "tip": "Contadores de erro Resource / JS / AJAX / unknown por minuto.",
+        "expressionLabels": [
+          "recurso",
+          "js",
+          "ajax",
+          "desconhecido"
+        ]
+      },
+      {
+        "title": "Web Vitals",
+        "tip": "Core Web Vitals — FMP, LCP, CLS (média por minuto). CLS é dividido por 1000 para entrar na faixa típica de 0–1.",
+        "expressionLabels": [
+          "FMP (ms)",
+          "LCP (ms)",
+          "CLS"
+        ]
+      },
+      {
+        "title": "Percentil de Interaction to Next Paint",
+        "tip": "INP — métrica de responsividade que substitui o FID."
+      }
+    ]
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/browser.i18n.zh-CN.json b/apps/bff/src/bundled_templates/layers/browser.i18n.zh-CN.json
new file mode 100644
index 0000000..f068517
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/browser.i18n.zh-CN.json
@@ -0,0 +1,81 @@
+{
+  "alias": "浏览器",
+  "slots": {
+    "services": "应用",
+    "instances": "版本",
+    "endpoints": "页面"
+  },
+  "layer-header": {
+    "columns": [
+      { "label": "页面浏览量" },
+      { "label": "错误率" },
+      { "label": "错误" }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "页面健康",
+        "metrics": [
+          { "label": "错误率", "tip": "出现错误的页面加载比例。" }
+        ]
+      },
+      {
+        "title": "吞吐量",
+        "metrics": [
+          { "label": "PV / 分钟", "tip": "每分钟页面浏览量。" }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      { "title": "应用负载(PV)" },
+      { "title": "应用错误率" },
+      { "title": "应用错误数" },
+      {
+        "title": "热门页面",
+        "tip": "按页面浏览量、错误数与错误率排名的页面。",
+        "expressionLabels": ["PV", "错误", "错误率"]
+      },
+      {
+        "title": "热门版本",
+        "tip": "按版本统计的负载 + 错误 + 错误率。",
+        "expressionLabels": ["PV", "错误", "错误率"]
+      }
+    ],
+    "instance": [
+      { "title": "版本 PV" },
+      { "title": "版本错误率" },
+      { "title": "版本错误数" }
+    ],
+    "endpoint": [
+      {
+        "title": "首屏渲染(FMP)分位",
+        "tip": "所选页面 FMP 延迟的 p50–p99。常见目标是 p75 低于 1 秒。"
+      },
+      { "title": "页面加载分位" },
+      { "title": "存活时长分位" },
+      { "title": "首包延迟分位" },
+      {
+        "title": "页面性能分解",
+        "tip": "页面加载各阶段的平均耗时 — resolve、redirect、DNS、TCP、TTFB、传输、DOM 分析、DOM Ready、FPT、完整加载。",
+        "expressionLabels": ["dns", "redirect", "tcp", "ttfb", "transfer", "dom analysis", "dom ready", "fpt", "load", "resource"]
+      },
+      {
+        "title": "按类型的页面错误",
+        "tip": "Resource / JS / AJAX / 未知错误每分钟计数。",
+        "expressionLabels": ["resource", "js", "ajax", "unknown"]
+      },
+      {
+        "title": "Web Vitals",
+        "tip": "核心 Web Vitals — FMP、LCP、CLS(每分钟平均值)。CLS 除以 1000 以归一化到典型 0–1 评分范围。",
+        "expressionLabels": ["FMP (ms)", "LCP (ms)", "CLS"]
+      },
+      {
+        "title": "Interaction to Next Paint 分位",
+        "tip": "INP — 替代 FID 的响应性指标。"
+      }
+    ]
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/cilium_service.i18n.de.json b/apps/bff/src/bundled_templates/layers/cilium_service.i18n.de.json
new file mode 100644
index 0000000..ce45bac
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/cilium_service.i18n.de.json
@@ -0,0 +1,311 @@
+{
+  "alias": "Cilium Service",
+  "group": "Kubernetes",
+  "naming": {
+    "alias": "namespace"
+  },
+  "layer-header": {
+    "columns": [
+      {
+        "label": "RPM"
+      },
+      {
+        "label": "Latenz"
+      },
+      {
+        "label": "Erfolgsrate"
+      },
+      {
+        "label": "TCP-Drop"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Latenz & Fehler",
+        "metrics": [
+          {
+            "label": "Mittlere Latenz",
+            "tip": "Durchschnittliche Protokoll-Latenz (ms)."
+          },
+          {
+            "label": "Erfolgsrate",
+            "tip": "Erfolgreiche Aufrufe / Gesamtaufrufe."
+          }
+        ]
+      },
+      {
+        "title": "Durchsatz",
+        "metrics": [
+          {
+            "label": "Protokoll-RPM",
+            "tip": "Protokollaufrufe pro Minute."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "L4 Read-Pakete/min",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "L4 Write-Pakete/min",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "TCP-Drop / min",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "lesen",
+          "schreiben"
+        ]
+      },
+      {
+        "title": "TCP-Drop nach Grund",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "HTTP-Last",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "aufrufe",
+          "erfolg"
+        ]
+      },
+      {
+        "title": "HTTP-Dauer",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "HTTP Non-2xx-Status",
+        "expressions": [
+          null,
+          null,
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "1xx",
+          "3xx",
+          "4xx",
+          "5xx"
+        ]
+      },
+      {
+        "title": "DNS-Last",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "aufrufe",
+          "erfolg"
+        ]
+      },
+      {
+        "title": "DNS-Dauer",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "DNS-Fehler / min",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Kafka-Last",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "aufrufe",
+          "erfolg"
+        ]
+      },
+      {
+        "title": "Kafka-Dauer",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Kafka-Fehler / min",
+        "expressions": [
+          null
+        ]
+      }
+    ],
+    "instance": [
+      {
+        "title": "L4 Read-Pakete/min",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "L4 Write-Pakete/min",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "HTTP-Last",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "aufrufe",
+          "erfolg"
+        ]
+      },
+      {
+        "title": "HTTP Non-2xx-Status",
+        "expressions": [
+          null,
+          null,
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "1xx",
+          "3xx",
+          "4xx",
+          "5xx"
+        ]
+      },
+      {
+        "title": "DNS-Last",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "aufrufe",
+          "erfolg"
+        ]
+      },
+      {
+        "title": "DNS-Fehler",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "Kafka-Last",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "aufrufe",
+          "erfolg"
+        ]
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "HTTP-Last",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "aufrufe",
+          "erfolg"
+        ]
+      },
+      {
+        "title": "HTTP-Dauer",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "HTTP Non-2xx-Status",
+        "expressions": [
+          null,
+          null,
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "1xx",
+          "3xx",
+          "4xx",
+          "5xx"
+        ]
+      },
+      {
+        "title": "DNS-Last",
+        "expressions": [
+          null,
+          null
+        ],
+        "expressionLabels": [
+          "aufrufe",
+          "erfolg"
+        ]
+      },
+      {
+        "title": "DNS-Dauer",
+        "expressions": [
+          null
+        ]
+      },
+      {
+        "title": "DNS-Fehler",
+        "expressions": [
+          null
+        ]
+      }
+    ]
+  },
+  "topology": {
+    "nodeMetrics": [
+      {
+        "label": "RPM"
+      },
+      {
+        "label": "Erfolg %"
+      },
+      {
+        "label": "Latenz"
+      }
+    ],
+    "linkServerMetrics": [
+      {
+        "label": "HTTP RPM"
+      },
+      {
+        "label": "Mittlere Latenz"
+      }
+    ]
+  },
+  "slots": {
+    "services": "Dienste",
+    "instances": "Pods",
+    "endpoints": "Endpunkte"
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/cilium_service.i18n.es.json b/apps/bff/src/bundled_templates/layers/cilium_service.i18n.es.json
new file mode 100644
index 0000000..29a164f
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/cilium_service.i18n.es.json
@@ -0,0 +1,215 @@
+{
+  "layer-header": {
+    "columns": [
+      {
+        "label": "RPM"
+      },
+      {
+        "label": "Latencia"
+      },
+      {
+        "label": "Tasa de éxito"
+      },
+      {
+        "label": "TCP Drop"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Latencia y errores",
+        "metrics": [
+          {
+            "label": "Latencia media",
+            "tip": "Latencia media del protocolo (ms)."
+          },
+          {
+            "label": "Tasa de éxito",
+            "tip": "Llamadas exitosas / total de llamadas."
+          }
+        ]
+      },
+      {
+        "title": "Rendimiento",
+        "metrics": [
+          {
+            "label": "RPM de protocolo",
+            "tip": "Llamadas de protocolo por minuto."
+          }
+        ]
+      }
+    ]
+  },
+  "topology": {
+    "nodeMetrics": [
+      {
+        "label": "RPM"
+      },
+      {
+        "label": "Éxito %"
+      },
+      {
+        "label": "Latencia"
+      }
+    ],
+    "linkServerMetrics": [
+      {
+        "label": "RPM HTTP"
+      },
+      {
+        "label": "Latencia media"
+      }
+    ]
+  },
+  "slots": {
+    "services": "Servicios",
+    "instances": "Pods",
+    "endpoints": "Endpoints"
+  },
+  "alias": "Cilium Service",
+  "group": "Kubernetes",
+  "naming": {
+    "alias": "namespace"
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Paquetes L4 de lectura/min"
+      },
+      {
+        "title": "Paquetes L4 de escritura/min"
+      },
+      {
+        "title": "TCP Drop / min",
+        "expressionLabels": [
+          "lectura",
+          "escritura"
+        ]
+      },
+      {
+        "title": "TCP Drop por motivo"
+      },
+      {
+        "title": "Carga HTTP",
+        "expressionLabels": [
+          "llamadas",
+          "éxito"
+        ]
+      },
+      {
+        "title": "Duración HTTP"
+      },
+      {
+        "title": "Estado HTTP no-2xx",
+        "expressionLabels": [
+          "1xx",
+          "3xx",
+          "4xx",
+          "5xx"
+        ]
+      },
+      {
+        "title": "Carga DNS",
+        "expressionLabels": [
+          "llamadas",
+          "éxito"
+        ]
+      },
+      {
+        "title": "Duración DNS"
+      },
+      {
+        "title": "Errores DNS / min"
+      },
+      {
+        "title": "Carga de Kafka",
+        "expressionLabels": [
+          "llamadas",
+          "éxito"
+        ]
+      },
+      {
+        "title": "Duración de Kafka"
+      },
+      {
+        "title": "Errores de Kafka / min"
+      }
+    ],
+    "instance": [
+      {
+        "title": "Paquetes L4 de lectura/min"
+      },
+      {
+        "title": "Paquetes L4 de escritura/min"
+      },
+      {
+        "title": "Carga HTTP",
+        "expressionLabels": [
+          "llamadas",
+          "éxito"
+        ]
+      },
+      {
+        "title": "Estado HTTP no-2xx",
+        "expressionLabels": [
+          "1xx",
+          "3xx",
+          "4xx",
+          "5xx"
+        ]
+      },
+      {
+        "title": "Carga DNS",
+        "expressionLabels": [
+          "llamadas",
+          "éxito"
+        ]
+      },
+      {
+        "title": "Errores DNS"
+      },
+      {
+        "title": "Carga de Kafka",
+        "expressionLabels": [
+          "llamadas",
+          "éxito"
+        ]
+      }
+    ],
+    "endpoint": [
+      {
+        "title": "Carga HTTP",
+        "expressionLabels": [
+          "llamadas",
+          "éxito"
+        ]
+      },
+      {
+        "title": "Duración HTTP"
+      },
+      {
+        "title": "Estado HTTP no-2xx",
+        "expressionLabels": [
+          "1xx",
+          "3xx",
+          "4xx",
+          "5xx"
+        ]
+      },
+      {
+        "title": "Carga DNS",
+        "expressionLabels": [
+          "llamadas",
+          "éxito"
+        ]
+      },
+      {
+        "title": "Duración DNS"
+      },
+      {
+        "title": "Errores DNS"
+      }
+    ]
+  }
+}
diff --git a/apps/bff/src/bundled_templates/layers/cilium_service.i18n.fr.json b/apps/bff/src/bundled_templates/layers/cilium_service.i18n.fr.json
new file mode 100644
index 0000000..8121a55
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/cilium_service.i18n.fr.json
@@ -0,0 +1,215 @@
+{
+  "alias": "Service Cilium",
+  "group": "Kubernetes",
+  "naming": {
+    "alias": "namespace"
+  },
+  "layer-header": {
+    "columns": [
+      {
+        "label": "RPM"
+      },
+      {
+        "label": "Latence"
+      },
+      {
+        "label": "Taux de succès"
+      },
+      {
+        "label": "Drop TCP"
+      }
+    ]
+  },
+  "overview": {
+    "groups": [
+      {
+        "title": "Latence et erreurs",
+        "metrics": [
+          {
+            "label": "Latence moyenne",
+            "tip": "Latence moyenne du protocole (ms)."
+          },
+          {
+            "label": "Taux de succès",
+            "tip": "Appels réussis / appels totaux."
+          }
+        ]
+      },
+      {
+        "title": "Débit",
+        "metrics": [
+          {
+            "label": "RPM de protocole",
+            "tip": "Appels de protocole par minute."
+          }
+        ]
+      }
+    ]
+  },
+  "dashboards": {
+    "service": [
+      {
+        "title": "Paquets L4 en lecture/min"
+      },
... 55407 lines suppressed ...