diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue
index e50163c1837d1b7b1faf7ce9025f91675be500b4..a30fe0cdb0af1ee89753b49d168abffb6fe18aa3 100644
--- a/src/components/Breadcrumb/index.vue
+++ b/src/components/Breadcrumb/index.vue
@@ -10,6 +10,8 @@
 </template>
 
 <script>
+import { generateTitle } from '@/utils/i18n'
+
 export default {
   created() {
     this.getBreadcrumb()
@@ -25,6 +27,7 @@ export default {
     }
   },
   methods: {
+    generateTitle,
     getBreadcrumb() {
       let matched = this.$route.matched.filter(item => item.name)
       const first = matched[0]
@@ -32,9 +35,6 @@ export default {
         matched = [{ path: '/dashboard', meta: { title: 'dashboard' }}].concat(matched)
       }
       this.levelList = matched
-    },
-    generateTitle(title) {
-      return this.$t('route.' + title)
     }
   }
 }
diff --git a/src/utils/i18n.js b/src/utils/i18n.js
new file mode 100644
index 0000000000000000000000000000000000000000..6c9a8689fcc00e205095a60dc30daebbb413fcd3
--- /dev/null
+++ b/src/utils/i18n.js
@@ -0,0 +1,3 @@
+export function generateTitle(title) {
+  return this.$t('route.' + title) // $t :this method from vue-i18n ,inject in @/lang/index.js
+}
diff --git a/src/views/layout/components/Sidebar/SidebarItem.vue b/src/views/layout/components/Sidebar/SidebarItem.vue
index 4c5a3f5a8b29aef341dfb9f0d105cb5ea4d544c7..c948748d258fa8f55695bb9314f502426383f180 100644
--- a/src/views/layout/components/Sidebar/SidebarItem.vue
+++ b/src/views/layout/components/Sidebar/SidebarItem.vue
@@ -32,6 +32,8 @@
 </template>
 
 <script>
+import { generateTitle } from '@/utils/i18n'
+
 export default {
   name: 'SidebarItem',
   props: {
@@ -40,9 +42,7 @@ export default {
     }
   },
   methods: {
-    generateTitle(title) {
-      return this.$t('route.' + title)
-    }
+    generateTitle
   }
 }
 </script>
diff --git a/src/views/layout/components/TagsView.vue b/src/views/layout/components/TagsView.vue
index 134efc5fc46af6687b3aa2355fff549ea76216a8..704f274d3301cbfde6101f27d2bc2e298068fc95 100644
--- a/src/views/layout/components/TagsView.vue
+++ b/src/views/layout/components/TagsView.vue
@@ -1,7 +1,7 @@
 <template>
   <scroll-pane class='tags-view-container' ref='scrollPane'>
     <router-link ref='tag' class="tags-view-item" :class="isActive(tag)?'active':''" v-for="tag in Array.from(visitedViews)" :to="tag.path":key="tag.path">
-      {{$t('route.'+tag.title)}}
+      {{generateTitle(tag.title)}}
       <span class='el-icon-close' @click='closeViewTags(tag,$event)'></span>
     </router-link>
   </scroll-pane>
@@ -9,6 +9,7 @@
 
 <script>
 import ScrollPane from '@/components/ScrollPane'
+import { generateTitle } from '@/utils/i18n'
 
 export default {
   components: { ScrollPane },
@@ -21,6 +22,7 @@ export default {
     this.addViewTags()
   },
   methods: {
+    generateTitle,
     closeViewTags(view, $event) {
       this.$store.dispatch('delVisitedViews', view).then((views) => {
         if (this.isActive(view)) {
@@ -61,7 +63,6 @@ export default {
         }
       })
     }
-
   },
   watch: {
     $route() {