i18n实现货币本地化如何无需手动传locale ISO码,让其内部自动识别
解决方案
最优方案:内置全局货币格式配置(无需额外传参)
Vue I18n 本身支持按locale预设数字/货币格式,配置完成后会自动识别当前激活的locale,完全不需要手动传入locale参数,不需要写任何计算属性。
配置方式如下:
// 你的i18n初始化文件中加入numberFormats配置 import { createI18n } from 'vue-i18n' // Vue2对应引入VueI18n即可 const i18n = createI18n({ // 保留你原本的所有配置,比如locales、messages、默认locale等 locale: 'zh-CN', locales: [/* 你原有locale配置 */], messages: { /* 你原有多语言文案 */ }, // 新增全局数字格式配置 numberFormats: { // 中文环境对应人民币格式 'zh-CN': { currency: { style: 'currency', currency: 'CNY', minimumFractionDigits: 2 } }, // 英文环境对应美元格式 'en-US': { currency: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 } }, // 按照你的业务需求补充其他locale对应的货币配置即可 } }) export default i18n
配置完成后,你业务组件的代码可以直接简化为:
<i18n-n :value="Price" format="currency" />
不需要任何额外参数,自动跟随当前语言切换货币格式。
方案2:扩展i18n实例暴露全局ISO属性
如果你的业务场景需要单独复用ISO码,不想封装组件,可以直接在i18n初始化时扩展实例属性,一次配置所有组件都可以直接用:
// i18n初始化文件 const i18n = createI18n({ // 原有配置不变 }) // 给i18n实例新增只读的currentLocaleISO属性 Object.defineProperty(i18n, 'currentLocaleISO', { get() { const currentLang = i18n.locale return i18n.locales.find(item => item.code === currentLang).iso } }) // Vue2项目可以额外挂到Vue原型上,更方便调用 // Vue.prototype.$currentLocaleISO = i18n.currentLocaleISO
之后组件中使用时直接调用即可,不需要每个组件写重复的计算属性:
<i18n-n :value="Price" format="currency" :locale="$i18n.currentLocaleISO" />
方案3:封装全局通用货币组件
如果业务中有大量统一的货币渲染逻辑(比如统一保留小数位数、加前缀后缀等),可以把i18n-n封装成全局通用组件,一次封装到处调用:
<!-- 全局注册的通用货币组件 src/components/AppCurrency.vue --> <template> <i18n-n :value="value" format="currency" :locale="currentLocaleISO" /> </template> <script> export default { props: { value: { type: Number, required: true } }, computed: { currentLocaleISO() { const currentLang = this.$i18n.locale return this.$i18n.locales.find(item => item.code === currentLang).iso } } } </script>
在main.js中全局注册组件后,所有业务组件都可以直接调用:
<app-currency :value="Price" />
内容的提问来源于stack exchange,提问作者morteza mortezaie
相关产品推荐
相关产品推荐

