From c6e1aaf5daded753fb04a83a59f912455ce48aca Mon Sep 17 00:00:00 2001 From: neverland Date: Mon, 7 Jan 2019 15:24:34 +0800 Subject: [PATCH] [improvement] use i18n (#2454) --- babel.config.js | 3 ++- packages/locale/index.js | 13 +++++++++---- packages/utils/use/i18n.js | 10 ++++++++++ packages/utils/use/index.js | 3 ++- 4 files changed, 23 insertions(+), 6 deletions(-) create mode 100644 packages/utils/use/i18n.js diff --git a/babel.config.js b/babel.config.js index ca3e911c2..74091d09a 100644 --- a/babel.config.js +++ b/babel.config.js @@ -17,7 +17,8 @@ module.exports = function (api) { '@vue/babel-preset-jsx', { vModel: true, - injectH: true + injectH: true, + functional: false } ] ], diff --git a/packages/locale/index.js b/packages/locale/index.js index ab56b32bc..564c20479 100644 --- a/packages/locale/index.js +++ b/packages/locale/index.js @@ -1,19 +1,23 @@ +/* eslint-disable import/no-mutable-exports */ import Vue from 'vue'; import deepAssign from '../utils/deep-assign'; import defaultMessages from './lang/zh-CN'; +let lang = 'zh-CN'; const proto = Vue.prototype; -const defaultLang = 'zh-CN'; +const messages = { [lang]: defaultMessages }; + const locale = { install() { if (proto.$vantLang) { return; } - Vue.util.defineReactive(proto, '$vantLang', defaultLang); - Vue.util.defineReactive(proto, '$vantMessages', { [defaultLang]: defaultMessages }); + Vue.util.defineReactive(proto, '$vantLang', lang); + Vue.util.defineReactive(proto, '$vantMessages', messages); }, - use(lang, messages) { + use(newLang, messages) { + lang = newLang; proto.$vantLang = lang; this.add({ [lang]: messages }); }, @@ -26,3 +30,4 @@ const locale = { locale.install(); export default locale; +export { lang, messages }; diff --git a/packages/utils/use/i18n.js b/packages/utils/use/i18n.js new file mode 100644 index 000000000..da8181df8 --- /dev/null +++ b/packages/utils/use/i18n.js @@ -0,0 +1,10 @@ +import { get, camelize } from '..'; +import { lang, messages } from '../../locale'; + +export default name => { + const prefix = camelize(name) + '.'; + return (path, ...args) => { + const message = get(messages[lang], prefix + path) || get(messages[lang], path); + return typeof message === 'function' ? message(...args) : message; + }; +}; diff --git a/packages/utils/use/index.js b/packages/utils/use/index.js index bf9a6298a..da1e785e2 100644 --- a/packages/utils/use/index.js +++ b/packages/utils/use/index.js @@ -1,7 +1,8 @@ import useBem from './bem'; import useSfc from './sfc'; +import useI18n from './i18n'; export default function (name) { name = 'van-' + name; - return [useSfc(name), useBem(name)]; + return [useSfc(name), useBem(name), useI18n(name)]; }