+8

Đa ngôn ngữ với vue, nuxt i18n cho dự án Vue, Nuxt

Mở Đầu

Hello các bạn xin chào các bạn mình đã trở lại rồi đây :v lâu quá rồi mình cũng chưa viết bài rồi nhân dịp Viblo đang có sự kiện Mayfest mà mình cũng đã hoàn thành được các thử thách khác trên Viblo code với ctf rồi nên phải quyết tâm hoàn thành 2 bài viết để còn nhận quà chứ 😄. Thôi không lan man nữa vào việc luôn nhé hôm nay mình sẽ nói đến việc tích hợp đa ngôn ngữ cho dự án vue và nuxtjs bằng vue-i18n và nuxt-i18n. Quá quen thuộc rồi đúng không :v bắt đầu luôn nhé.

Tích hợp vue-i18n cho project vue

tích hợp cho project vue thì đầu tiên phải tạo project đã đúng không. Mình tạo project với lệnh

vue create vue-i18n

với "vue-i18n" là tên project, mình chọn default là Vue2 và eslint, rồi để nó tạo project thôi 😄, sau khi tạo xong thì cd vào "vue-i18n" vì mình dùng yarn lên sẽ chạy yarn serve để xem project có hoạt động không nào :v, ok vậy là đã tạo xong project rồi. Tiếp theo là cài "vue-i18n" các bạn chỉ cần chạy

yarn add vue-i18n

Sau khi add xong vue-i18n thì chúng ta tiến hành thêm một folder "locale" bên trong folder "src" của dự án, bên trong "locale" lại tạo thêm 3 file vi.js, en.js, index.js như hình bên dưới đây.

Trong file vi.js, en.js sẽ chứa data theo ngôn ngữ tương ứng và chúng ta cần export nó ra, nội dung file như sau:

const vi = {
    welcome: 'Chào mừng bạn đến với ứng dụng Vue.js',
}

export default vi;

tương tự với file en.js. Tiếp theo ở file index.js mình sẽ gọi đến 2 file trên và cũng export nó ra (phần sau sẽ gọi đến nó 😄) như sau:

import en from './en';
import vi from './vi';

export default {
    en,
    vi,
};

Tiếp theo là sẽ gọi nó ở main.js. Mình cần import vue-i18n và messages của ngôn ngữ tương ứng vào, khởi tạo nó kèm ngôn ngữ mặc định và cuối cùng là render ra, file main.js của mình sẽ như thế này:

import Vue from 'vue'
import App from './App.vue'
import VueI18n from 'vue-i18n';
import messages from '../src/locale/index';

Vue.use(VueI18n)

const i18n = new VueI18n({
    locale: 'vi', // locale mặc định
    messages,
});

Vue.config.productionTip = false

const app = new Vue({
  i18n,
  render: h => h(App),
});

app.$mount('#app');

Tiếp theo là cần có 1 component để có thể chuyển đổi qua lại giữa các ngôn ngữ, mình có component như sau:

      <div>
        <select v-model="$i18n.locale" class="switch-locale">
            <option
                v-for="lang in langs"
                :key="lang.key"
                :value="lang.key"
            >
                {{ lang.lable }}
            </option>
        </select>
      </div>

với phần data

data() {
    return {
        langs: [
            {
                key: 'vi',
                lable: 'Tiếng việt',
            },
            {
                key: 'en',
                lable: 'English',
            },
        ],
    };
  }

và thêm 1 chút css 😄

.switch-locale {
    width: 130px;
    height: 35px;
    outline: 0;
    border-radius: 4px;
    border: 1px solid #909399d9;
    background: white;
}

các bạn cũng có thể style thêm cờ cho từng ngôn ngữ chẳng hạn. Và cuối cùng là thay những đoạn text cần đã ngôn ngữ bằng { $t('welcome') }} với welcome là cái mà chúng ta đã khai báo trong file vi.js và en.js đó. Cùng xem kết quả nhé 😄

Peek 2022-05-27 22-02.gif

oke vậy là đã xong phần tích hợp vue-i18n cho project vue, bây giờ chúng ta cùng chuyển sang tích hợp nuxt-i18n cho project nuxt nhé gét gô ✌️

Tích hợp nuxt-i18n cho project nuxtjs

Cũng như project vue thôi đầu tiên chúng ta cũng tạo một project nuxtjs mình dùng yarn nên câu lệnh tạo sẽ là

yarn create nuxt-app nuxt-i18n

với nuxt-i18n là tên project, mình cũng có 1 bài giới thiệu mọi người có thể xem lại kỹ hơn về một project nuxtjs ở đây. Tiếp theo sẽ là cài nuxt-i18n cũng tương tự như vue-i18n mình chạy câu lệnh

yarn add nuxt-i18n

Sau khi cài xong chúng ta cũng cần tạo 1 folder "lang" để chứa ngôn ngữ trong folder mình có 2 file là vi.js và en.js như hình bên dưới với nội dung file vi.js như sau

export default {
    hi: 'xin chào'
}

Tương tự với file en.js. Tiếp theo bạn vào file "nuxt.config.js" ở phần "modules" để import nuxt i18n với nội dung như sau:

[
      'nuxt-i18n',
      {
          locales: [
              {
                  code: 'vi',
                  file: 'vi.js',
                  name: 'Tiếng Việt',
              },
              {
                  code: 'en',
                  file: 'en.js',
                  name: 'english',
              },
          ],
          detectBrowserLanguage: {
              useCookie: true,
              cookieKey: 'i18n_redirected',
          },
          langDir: 'lang/',
          vueI18nLoader: true,
          defaultLocale: 'vi',

          vueI18n: {
              fallbackLocale: 'vi',
          },
      },
    ],

như vậy là đã gần hoàn thành rồi đó :v, chúng ta cũng cần thêm một component để chuyển giữa các ngôn ngữ với nhau:

<select v-model="locale" class="language">
    <option value="en">
        English
    </option>
    <option value="vi">
        Tiếng Việt
    </option>
</select>

với Data là

  data() {
      const lang = 'vi'
      this.$i18n.locale = lang
      return { locale: 'vi' }
  },

mình sử dụng watch để phát hiện sự thay đổi ngôn ngữ và cập nhật theo đúng sự thay đổi đó

  watch: {
    locale(val) {
        this.$i18n.locale = val
    },
  },

cũng thay các đoạn text cần đa ngôn ngữ tương tự với vue-i18n `{{ $t('text') }}, oke vậy là đã xong cùng chạy thử nhé 😄

Peek 2022-05-27 23-21.gif

Kết Luận

Như vậy là mình đã giới thiệu về đa ngôn ngữ cho dự án vue, và nuxt dùng vue, nuxt-i18n, nếu mọi người thấy bài viết hưu ích thì hãy cho mình một upvote nhé, biết là muộn nhưng biết đâu nhờ các bạn mà mình lại có thể đua vào top 10 của Mayfest 😄. Có thắc mắc hay góp ý gì thì mọi người hay commnent xuống dưới bài viết nhé, cảm ơn các bạn đã đọc


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí