iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 30
0
Modern Web

實作小範例入門 Vue & Vuex 2.0系列 第 30

vue & vuex 30 - 網站系統國際化 - 多語系(i18n)與持續學習相關資源

web 無遠弗屆可以接觸到世界各地的人們,因此網站的內容必須要準備多種語言供應不同的 user 讓大家知道我們正在解決什麼問題,所以最後一天就來看看 Vue 怎麼套用多語系(i18n)吧。

vue & vuex 30 - i18n

最後一天目標:

  1. 建立多語系國際化內容 i18n
  2. 持續學習 Vue 相關資源

網站系統國際化 (i18n)

internationalization

i ~~ n 中間有18個字母,因此常以 i18n 代替說明。

我們使用 vue-i18n 套件 | vue-i18n documentation

install

npm install vue-i18n --save-dev

準備好翻譯語言包

所有的語言包會放在 i18n folder 下,新增兩隻 JSON ( en.json, tw.json )

└─src
   └─i18n
      ├─en.json
      └─tw.json

利用 JSON 儲存兩種語言的翻譯檔案。

key value
template 使用字串對應 翻譯內容
// tw.json
{
  "Please_sign_in": "請登入。",
  "Email_address": "輸入電子郵件",
  "Password": "輸入密碼",
  "Show_password": "顯示密碼",
  "Sign_in": "登入"
}

// en.json
{
  "Please_sign_in": "Please sign in",
  "Email_address": "Email address",
  "Password": "Password",
  "Show_password": "Show Password",
  "Sign_in": "Sign in"
}

main.js 設定:

import VueI18n from 'vue-i18n';

// init
Vue.use( VueRouter );
Vue.use( VueI18n );

// i18n
import en from './i18n/en.json'; // 存放英文翻譯
import tw from './i18n/tw.json'; // 存放繁體中文翻譯
const locales = {
  en: en,
  tw: tw,
};
// set lang from state
// lang 對應的是 locales 的 key 目前有:en, tw
Vue.config.lang = store.state.lang; // 從 state 獲取預設語言設定。

// set locales
Object.keys(locales).forEach(function (lang) {
  Vue.locale(lang, locales[lang]);
});

結合 vuex

語系 state 也是設計在 root 上,因為整個系統的語系是統一的設定。

store/root.js 只列出修改的

import * as types from './mutations_types.js';
// 為了設定語系引入 Vue
import Vue from 'vue';

export const state = {
  lang: 'en',
}

export const actions = {
  setLanguage ({ commit }, lang) {
    commit(types.LANGUAGE, lang);
  },
}

export const mutations = {
  [types.LANGUAGE] (state, setlang) {    
    state.lang = setlang;
    // 設定 Vue config 將會改變 i18n 使用的語言包而更改語系!
    Vue.config.lang = state.lang;
  },
}


使用

在 template 的使用上要改成:$t( key字串 )

以 login 頁面範例。


<!-- 在 tag 內容,外面一樣使用 {{ }} -->
<h2>{{ $t("Please_sign_in") }}</h2>

<!-- 在 attribute 上使用 -->
:placeholder="$t('Email_address')"
<!-- 記得使用 v-bind: 不然不會更新 -->

改變語系

在 switch 按鈕使用 @change 發出 action: setLanguage

然後用比較偷懶的方法,bind true & false value 分別是 tw, en 傳給 action

直接帶到 mutation set lang

<template>
  <input 
    type="checkbox"
    v-model="lang"
    :true-value="'tw'"
    :false-value="'en'"
    @change="setLanguage( lang )"
    id="slideThree" />
  <label for="slideThree"></label>
</template>

<script>
export default {
  data () {
    return {
      lang: this.$store.state.lang, // get lang 預設值 `en`
    }
  },
}
</script>

以上

在 vue-i18n 與 vuex 搭配上,目前想到這個方法,

如果有更好的方式或流程在提出來討論囉。


持續學習 Vue

轉貼 Vue in 2016 medium

相關資源:

  1. Vue 套件軍火庫 awesome-vue
    • 蒐集世界各地開發者實作項目。
    • 想要什麼功能?先來這裡找吧!
  2. the vue point medium
    • 一些 Vue 近期的改動,未來計畫等.. 消息會在這邊發布。
  3. 追蹤 Vue twitter
  4. Vue.js 台灣 facebook
    • 台灣的開發者都在這了,快加入!
  5. Vue 中文討論區
  6. 掘金 | infoQ
    • 討論平台,有大量的 Vue 與其他技術討論。
  7. Develop Web Apps with Vue.js - egghead
    • egghead 出品必屬佳作。
  8. Weex - 使用 Vue 開發跨平台 Native APP

其中 Weex 感覺是可以追蹤的項目: Vue x 阿里巴巴 合作
React 有 React Native
Vue 有 Weex

一些好文章:

  1. 我們為什麼選擇 Vue.js 而不是 React
    • 一些觀點可以參考,我們 不是 強調 React 不好!事實是 Vue 涵蓋了很多 React 的概念。
  2. Vuex 2.0 原始碼分析
  3. 透過 Vue-CLI 建置專案時,自動切換 devtools 的 debug 環境 - Kuro's Blog
    • deploy 要注意的事。

有看到再補..


完賽心得:

在 2016 年最後一天,完成了三十天連續發文的鐵人賽,

是今年參加最有意義的活動之一。

參賽前還在猶豫沒有把握可以完賽,

感謝 卡斯伯 推坑。

從第一週每天趕在 11: 59 以前發出文章,

到中期每天都在思考我今天有發文了嗎?

就這樣.. 跌跌撞撞的走完三十天 :D

感謝 ithome ithelp 舉辦 ironman 活動。

感謝 HackMD 跨平台 markdown 服務,用瀏覽器就可以寫作,所有文章都是在這邊撰寫的。

感謝公司主管與同事,默默支持。

最後祝大家新年快樂,身體健康,專案順心。

Just Do It !


github 完整範例:

實作小範例入門 Vue & Vuex 2.0 - github 完整範例

使用 git checkout 切換每天範例。


上一篇
vue & vuex 29 - custom Filter (currency、Letter Grade、GPA、lowercase)
系列文
實作小範例入門 Vue & Vuex 2.030
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
kinanson
iT邦新手 4 級 ‧ 2016-12-31 09:51:38

恭喜您,這系列寫得有深度,感謝分享

Jacky iT邦新手 5 級 ‧ 2016-12-31 11:41:03 檢舉

謝謝,希望有幫助到你一點點。

0
ye0205414225
iT邦新手 5 級 ‧ 2017-02-06 14:04:53

你好 請問一下 store/root.js 路徑在哪裡呢
或者大大有 DEMO 可否參考?

看更多先前的回應...收起先前的回應...
Jacky iT邦新手 5 級 ‧ 2017-02-06 14:38:08 檢舉

Hi 你好,歡迎下載 github 在每篇文章後面,並使用 checkout 切換每天的紀錄

Jacky iT邦新手 5 級 ‧ 2017-02-06 14:50:27 檢舉

感謝大大~受益了

在想請教~ 我切換語言版本後,如若刷新 則回到原先預設語言,可有方法讓他維持著切換當下版本呢?

Jacky iT邦新手 5 級 ‧ 2017-02-10 12:47:23 檢舉

我猜可以記到 sessionStoragelocalStorage init 的時候先去抓吧

0
ye0205414225
iT邦新手 5 級 ‧ 2017-02-10 12:09:17

依照您所做 我已經可以切換了。

但想更進一步的用get出來的數據庫資料,也能做語言上的切換該如何做呢?

Jacky iT邦新手 5 級 ‧ 2017-02-10 12:51:50 檢舉

vue-i18n 可以帶變數進去,相當於一段文字,挖掉幾個位子讓你帶參數進去組合:https://kazupon.github.io/vue-i18n/formatting.html

0
ekekvivi
iT邦新手 5 級 ‧ 2017-07-27 11:28:16

大大, 我想請問我該如何開啟您在git上的檔案? (.vue)
只看到結果 ~"~?

看更多先前的回應...收起先前的回應...
Jacky iT邦新手 5 級 ‧ 2017-07-27 11:31:53 檢舉

一般文字編輯器,或開發工具皆可如: Sublime Text, VS Code, Notepad++ 等..

另外關於 .vue 檔案是什麼,在先前文章有簡易介紹。

ekekvivi iT邦新手 5 級 ‧ 2017-07-27 11:41:57 檢舉

sorry大大 我的意思是 git下載下來的檔案(.vue) 用編譯器開起來是沒問題的. 發怖出去是只有html檔才能打開, 我該如何把您的範例(.vue)轉成html檔案然後在網頁上顯示出來?

Jacky iT邦新手 5 級 ‧ 2017-07-27 13:38:57 檢舉

vue-cli 內建 build code 程式腳本,試試看:

npm run build
ekekvivi iT邦新手 5 級 ‧ 2017-07-31 16:56:56 檢舉

可是一直出現錯誤 ~"~

"bind is not a function"

Jacky iT邦新手 5 級 ‧ 2017-08-09 18:03:41 檢舉

build ?

我要留言

立即登入留言