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)];
 }