iT邦幫忙

2024 iThome 鐵人賽

DAY 14
0

上一回我們說到要給我們的todolist加一些功能,這一次我們所要添加的功能是多語系的內容,當然我們也會順便將之前無資料的畫面也給一併完成:

首先我們先來完成無資料的畫面:

https://ithelp.ithome.com.tw/upload/images/20240923/20169170uDbrND3cn9.png

我們其實只要在相對應的區塊去判斷toDoList.length是不是>0就可以了,當然更簡潔的我們還可以寫vif和velse去做表示:

https://ithelp.ithome.com.tw/upload/images/20240923/201691704FaOmITgaD.png

看一下畫面,就可以看到確實在沒有資料的情況下是會跑出來沒有資料的畫面的

接下來我們要來開始講解多語系的應用,首先我們需要安裝相關套件

https://ithelp.ithome.com.tw/upload/images/20240923/20169170FoIUw2jSMF.png

我們需要去Vue I18n 的官網去安裝我們所需要的多語系套件,指令碼如下:

npm install vue-i18n@9

如果根據官網上面的介紹,她會引導我們在main.js裡面創造一個i18n的實體,但為了避免讓main.js過於複雜,我們其實可以在utils等資料夾去建立實體,然後再讓main.js去做引用:

https://ithelp.ithome.com.tw/upload/images/20240923/20169170XxzvGt6fTF.png

我們先做了一個叫做loacles的資料夾,裡面放著我們各語系的json檔做備用,接下來我們建立一個叫做utils資料夾,並在裡面的i18n.js新增圖中的內容:

// src/utils/i18n.ts
import { createI18n } from 'vue-i18n';
import zhTW from '@/locales/zh-tw.json';
import zhCN from '@/locales/zh-cn.json';
import en from '@/locales/en.json';

// 解析 URL 中的 locale 參數,並設置預設值
const urlParams = new URLSearchParams(window.location.search);
export const defaultLocale = urlParams.get('locale') || 'zh_TW';

// 設置文檔語言屬性
document.body.lang = defaultLocale;

// 創建 I18n 實例
export const i18n = createI18n({
	legacy: false,
	locale: defaultLocale,
	fallbackLocale: 'en',
	messages: {
		zh_TW: zhTW,
		zh_CN: zhCN,
		en: en
	},
	globalInjection: true
});

我們將各個語系檔引入,並且引入一個createI18n的方法去創造一個i18n實體,並且宣告urlParams 的內容是一個url的內容,然後在導出我們在window.location.search中是否有locale的參數作為我們的預設語言,如果沒有我們就選擇 zh_TW作為我們的預設語系,下面則是I18N實體中的各個內容和其參數所代表的語言,最後我們再回到main.js做引用即可:

https://ithelp.ithome.com.tw/upload/images/20240923/20169170tRgla1GI3k.png

接下來我們先下載一個i18n的外掛:

https://ithelp.ithome.com.tw/upload/images/20240923/20169170feXxzslJCn.png

i18n ally可以大幅的提高你在編寫多語系變數的體驗,是很方便的套件:

https://ithelp.ithome.com.tw/upload/images/20240923/20169170MqjWwGcwA8.png

她可以追蹤你現在綁定的i18n的數量,還有檢查尚未完成翻譯綁定的內容,當然他還有更棒的功能,我們下面會展現出來。

首先先讓我們來編寫一些我們需要翻譯的多語系內容吧:

https://ithelp.ithome.com.tw/upload/images/20240923/20169170DFIykdyUit.png

可以看到我們在 zh-TW.json 寫了一個這樣的json物件檔,注意,我們也要在 en.json 及 zh-CN.json都編寫key相同,但是value不同的內容,value則是各自內容的語系翻譯。

完成了之後讓我們回到app.vue,開始進行 i18n 的導入和變數綁定:

https://ithelp.ithome.com.tw/upload/images/20240923/20169170BONcT6NWV1.png

可以看到我們引入了i18n的相關內容,我們導入了一個t和locale,接下來我們就該來進行變數綁定了,首先簡單示範一下,我們可以將下面的:

<div v-if="toDoList.length === 0">
				<a-empty>
					<template #description>
						<span> 沒有資料 </span>
					</template>
				</a-empty>
			</div>

換成:

<div v-if="toDoList.length === 0">
				<a-empty>
					<template #description>
						<span> {{t('store')}} </span>
					</template>
				</a-empty>
			</div>

然後我們看看結果:

https://ithelp.ithome.com.tw/upload/images/20240923/20169170FvUEC3qlWC.png

可以看到我們的畫面內容還是沒有資料,這是因為i18n用了一個t的函數去為我們翻譯store這個key值在繁中(zh_TW)的環境下的內容,而且因為裝了i18n ally的關係所以我們可以看到我們的vs code畫面

https://ithelp.ithome.com.tw/upload/images/20240923/20169170nPtqXnxiii.png

他所呈現的並不是{{t('store')}},而是”沒有資料”的內容,這樣子我們就不用擔心我們寫的變數會不會寫錯,因為當下綁定的變數都會馬上呈現在vs code中,整個就會方便很多!

接下來我們可以在header下面用 a-radio 新增切換語系的按鈕:

https://ithelp.ithome.com.tw/upload/images/20240923/20169170dLapQXzybl.png

我們新增了一個叫做 langSelect 的 computed 陣列,並且用 antd 的 a-radio做出了三語系的按鈕,這是紅圈的部分,黃圈部分的a-radio所mdoel的數值我們稱為langValue,當我們點擊按鈕的時候,我們的語系就會跟著改變:

https://ithelp.ithome.com.tw/upload/images/20240923/20169170bqoqp6AMd8.png

我們寫了一個getLangValue的函式去捕捉現在瀏覽器所使用的語言(const lang = document.body.lang; ),在用for迴圈去比對langSelect的數值有哪個是和瀏覽器目前的語言是相同的,找到相同的那個賦值給langValue,然後我們在寫watch去監聽langValue,因為a-radio和langValue是雙向綁定的,所以當我們點擊按鈕切換語系的時候langValue也會跟著改變,這時候就用watch去監聽langValue的變化,並改變locale的value,就可以完成變化了

https://ithelp.ithome.com.tw/upload/images/20240923/20169170Uk7DepxkRG.png

基本上todolist我們就完成了大概了,接下還我們就可以開始再來做點別的度過剩下的日子(?


上一篇
和2魚坐牢的第十三天-todolist之儲存功能
下一篇
和2魚坐牢的第十五天-todolist之vercel佈署
系列文
和鱷魚組長的坐牢30天之vue的簡易todolist和Astro的簡易部落格實現30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言