Pinia Getters 适合封装多语言文本动态匹配,通过 state 存储 locale 和 messages,getter 基于其响应式查找:基础 getter 如 helloText 直接返回文案;带参 getter 如 t(key) 支持嵌套键与兜底;formatMessage 可处理变量替换。

Pinia Getters 本身不直接处理多语言(i18n)逻辑,但它非常适合封装多语言文本的动态匹配计算——关键在于把语言标识(如 locale)、翻译映射表(如 messages)和当前上下文状态作为依赖项,交由 getter 响应式地组合与查找。
用 state 存语言环境和词典数据
先把多语言所需的基础数据放进 store 的 state 中,比如:
-
locale: 'zh-CN'—— 当前激活的语言标签 -
messages: { 'zh-CN': { hello: '你好', loading: '加载中...' }, 'en-US': { hello: 'Hello', loading: 'Loading...' } }—— 按 locale 组织的翻译对象
这样 getter 就能基于这些可变状态实时响应。
基础文本查找 getter(无参)
适用于固定 key 的静态文案,例如页面标题、按钮文字:
- 写法示例:
helloText: (state) => state.messages[state.locale]?.hello || 'Hello' - 特点:简洁、自动缓存、依赖
locale和messages变化而更新 - 组件中直接使用:
{{ store.helloText }}
带参数的动态翻译 getter
实际项目中常需按 key 动态取文案(如 t('user.name')),这时 getter 应返回一个函数:
- 写法示例:
t: (state) => (key: string) => { const keys = key.split('.'); let val = state.messages[state.locale] || {}; for (const k of keys) { val = val?.[k]; if (val === undefined) break; } return val ?? key; } - 支持嵌套结构(
user.profile.title)和兜底(找不到时返回 key 本身) - 组件中调用:
{{ store.t('button.submit') }},响应式跟随locale切换
结合上下文做格式化匹配(如带变量)
纯 getter 不执行副作用,但可以返回预编译的格式化函数。例如:
- 定义:
formatMessage: (state) => (key: string, params: Record<string string>) => { const raw = state.messages[state.locale]?.[key] || key; return raw.replace(/\{(\w+)\}/g, (_, k) => params[k] ?? ''); }</string> - 使用:
{{ store.formatMessage('welcome.user', { name: userName }) }} - 注意:参数对象本身不响应式,若
userName是响应式变量,需在组件内触发重新计算(或配合computed封装)
本质上,Pinia getters 把 i18n 的“查表+拼接”逻辑集中管理,避免组件重复判断 locale、遍历嵌套、处理缺失 fallback。只要 state 中的语言和词典是响应式的,整个匹配过程就是响应式且可缓存的。


















