codeQ Blog

Chào mừng mọi người đã đến với codeQ Blog

Sử dụng đa ngôn ngữ trong react-native (Multi-Languages) với i18n

Đăng vào ngày
Cover Image for Sử dụng đa ngôn ngữ trong react-native (Multi-Languages) với i18n

1. Cài đặt i18next và react-i18next

Đầu tiên bạn cài 2 package i18next và react-i18next vào, có thể sử dụng npm hoặc yarn

npm install react-i18next i18next
// hoặc
yarn add react-i18next i18next

2. Tạo 4 file cùng cấp: App.js, Component.js, en.json, vi.json

App.js . (Thường mặc định có trong app react-native nếu không dùng expo). Các bạn chỉnh lại như sau:

import type {Node} from 'react';
import React from 'react';
// App.js
import i18next from 'i18next';
import {I18nextProvider} from 'react-i18next';
import Component from './Component';
import common from './common.json';
import en from './en.json';
import vi from './vi.json';

i18next.init({
  interpolation: {escapeValue: false},
  lng: 'en', //default language
  resources: {
    en: {
      //name of language
      lang: en, //namespace
    },
    vi: {
      lang: vi,
    },
  },
});

const App: () => Node = () => {
  return (
    <I18nextProvider i18n={i18next}>
      <Component />
    </I18nextProvider>
  );
};

export default App;

Trong đó: i18next.init để tạo config cho đa ngôn ngữ, và I18nextProvider để đưa đa ngôn ngữ xuống các component con thông qua context API.

en.json: file ngôn ngữ tiếng anh

{
  "Menu" : {
    "Setting" : {
      "title" : "Setting"
    }
  }
}

vi.json: file ngôn ngữ tiếng việt

{
  "Menu" : {
    "Setting" : {
      "title" : "Cài đặt"
    }
  }
}

Component.js: file sử dụng đa ngôn ngữ

import React from 'react';
import {View, Text} from 'react-native';
import {useTranslation} from 'react-i18next';

const Component = () => {

  const language = 'en';
  const {t, i18n} = useTranslation('lang'); // lang là namespace lúc cài đặt ở file App.js
  if(i18n.language !== language){
    i18n.changeLanguage(language);
  }

  return (
    <View
      style={{
        flex: 1,
        alignItems: 'center',
        justifyContent: 'center',
        backgroundColor: '#17a2b8',
      }}>
      <Text style={{fontWeight: 'bold', fontSize: 25}}>
        {t(`Menu.Setting.title`)}
      </Text>
    </View>
  );
};
export default Component;

Ở đây mình dùng hook useTranslation để sử dụng translate. i18n.changeLanguage(language) để thay đổi ngôn ngữ. Ở đây mình tạo 1 ứng dụng demo đơn giản nên mình đăt changeLanguage ở đây để dễ test. Trong dự án chính của các bạn nên đặt lại ngôn ngữ lúc mới vào app hoặc khi cài đặt ngôn ngữ ở setting thì sẽ tốt hơn. Làm giống mình ở trên nó sẽ chạy nhiều lần không cần thiết.

Sau khi thêm 4 file bạn chạy app trên android. Bạn có thể thay đổi giá trị const language = 'en' thành const language = 'vi' để đổi ngôn ngữ thành tiếng việt.

Để xác định ngôn ngữ hiện tại của người dùng bạn có thể kết hợp với locize. Mình sẽ chia sẻ phần này ở một bài khác.

Chúc các bạn thành công!