---
tags: Vue 直播班 - 2022 冬季班
---
# 第七週:文字編輯器、多國語系
* [Vite 模版](https://github.com/hexschool/vite-template)
## 文字編輯器 ckeditor5+Vue3([官方文件](https://ckeditor.com/docs/ckeditor5/latest/installation/frameworks/vuejs-v3.html))
```
// .env
VITE_APP_URL=https://vue3-course-api.hexschool.io/
VITE_APP_PATH=casper-hexschool
```
### 安裝方法
```
npm install --save @ckeditor/ckeditor5-vue @ckeditor/ckeditor5-build-classic
```
1. `@ckeditor/ckeditor5-vue`:提供了一個 CKEditor5 Vue 元件,您可以在 Vue 模板中使用它,並使用相應的屬性來自訂編輯器。
2. `@ckeditor/ckeditor5-build-classic` :是一個經典版本的 CKEditor5 基本 UI 庫與相關常用插件設定,以及默認的編輯器使用者介面。可以直接使用無需進行額外的配置。
### 載入 Vue3+Vite 流程
在 `main.js` 全域加入 `@ckeditor/ckeditor5-vue`:
``` JavaScript
import { createApp } from 'vue'
// 加入 CKEditor
import CKEditor from '@ckeditor/ckeditor5-vue'
import App from './App.vue'
import router from './router'
const app = createApp(App)
// 載入元件
app.use(CKEditor)
app.use(router)
app.mount('#app')
```
### 在需要的 `.vue` 檔案載入 `@ckeditor/ckeditor5-build-classic`
* [config 設定](https://ckeditor.com/docs/ckeditor5/latest/installation/frameworks/vuejs-v3.html#config)
``` JavaScript
<template>
<h1>This is About page.</h1>
<router-link to="/">Home</router-link> |
<router-link to="/about">About</router-link>
<ckeditor :editor="editor" v-model="editorData" :config="editorConfig"></ckeditor>
</template>
<script>
import ClassicEditor from '@ckeditor/ckeditor5-build-classic'
export default {
data () {
return {
editor: ClassicEditor,
editorData: '<p>Hello world!!</p>',
editorConfig: {
toolbar: ['heading', '|', 'bold', 'italic', 'link']
}
}
}
}
</script>
<style scoped>
</style>
```
### 從 API 載入到 ckedior
``` JavaScript
<template>
<h1>This is About page.</h1>
<router-link to="/">Home</router-link> |
<router-link to="/about">About</router-link>
<ckeditor :editor="editor" v-model="editorData" :config="editorConfig"></ckeditor>
</template>
<script>
import axios from 'axios'
import ClassicEditor from '@ckeditor/ckeditor5-build-classic'
const { VITE_APP_URL, VITE_APP_PATH } = import.meta.env
export default {
data () {
return {
editor: ClassicEditor,
editorData: '',
editorConfig: {
toolbar: ['heading', '|', 'bold', 'italic', 'link'],
dataProcessor: {
writer: {
enter: '<br>'
}
}
}
}
},
mounted () {
this.fetchProduct()
},
methods: {
fetchProduct () {
axios
.get(`${VITE_APP_URL}/v2/api/${VITE_APP_PATH}/product/-MucepnBq3-jnRqY0pNx`)
.then(response => {
if (response.data.success) {
this.editorData = response.data.product.content.replace(/\n/g, '<br>')
} else {
console.error('找不到產品編號!')
}
})
.catch(error => {
console.error(error)
})
}
}
}
</script>
<style scoped>
</style>
```
## 多國語系 [vue-i18n-next](https://github.com/intlify/vue-i18n-next)
```
npm install vue-i18n@9
```
### 新增語系檔
在 Vue3 建立一個 languages 文件夾,增加中英語系 JSON,分別是 en.json 和 zh-TW.json 兩個文件
```JSON=
// en.json
{
"menu.aboutUs": "About Us",
"menu.productContent": "Product Content",
"menu.blog": "Blog",
"menu.faq": "FAQ"
}
// zh-TW.json
{
"menu.aboutUs": "關於我們",
"menu.productContent": "產品內容",
"menu.blog": "部落格",
"menu.faq": "常見QA"
}
```
* Main.js
```javascript=
import { createApp } from 'vue'
import { createI18n } from 'vue-i18n'
import zh from './languages/zh-TW.json'
import en from './languages/en.json'
import './style.css'
import App from './App.vue'
import router from './router'
const i18n = createI18n({
legacy: false, // 啟用新的 Vue3 選項
locale: 'en', // 設置默認語言
messages: {
en,
'zh-TW': zh // 引入 zh-TW.json 文件
}
})
const app = createApp(App)
app.use(i18n)
app.use(router)
app.mount('#app')
```
* AboutView
```HTML
<template>
<h1>This is About page.</h1>
<router-link to="/">Home</router-link> |
<router-link to="/about">About</router-link>
<div>
<button @click="switchToEnglish">English</button>
<button @click="switchToChinese">中文</button>
</div>
<h1>{{ $t('menu.aboutUs') }}</h1>
<h1>{{ $t('menu.productContent') }}</h1>
<h1>{{ $t('menu.blog') }}</h1>
<h1>{{ $t('menu.faq') }}</h1>
</template>
<script>
export default {
methods: {
switchToEnglish () {
this.$i18n.locale = 'en'
},
switchToChinese () {
this.$i18n.locale = 'zh-TW'
}
}
}
</script>
<style scoped>
</style>
```