매일 업데이트
2023-07-29 19:25 9 min

React Intl을 사용하여 React 애플리케이션을 국제화하는 방법

React Intl은 리액트 애플리케이션의 국제화를 지원하는 데 필수적인 라이브러리입니다. 다양한 컴포넌트와 유틸리티를 제공하여 애플리케이션이 여러 언어와 문화적 배경에 적합하도록 돕습니다. 국제화, 또는 i18n으로 불리는 이 과정은 단순히 번역을 넘어서, 다양한 사용자 경험을 고려하는 것을 의미합니다.

ReactIntl을 활용하면 React 애플리케이션이 다양한 언어 및 지역 설정을 원활하게 지원할 수 있습니다.

React Intl 설치

React Intl 라이브러리를 프로젝트에 추가하기 위해서는 먼저 설치해야 합니다. npm, yarn, 또는 pnpm과 같은 패키지 관리자를 사용하여 손쉽게 설치할 수 있습니다.

npm을 사용한 설치는 터미널에서 다음 명령어를 실행함으로써 가능합니다:

npm install react-intl

yarn을 통한 설치는 아래 명령어로 이루어집니다:

yarn add react-intl

React Intl 라이브러리 사용법

라이브러리가 설치되면, React 애플리케이션 내에서 다양한 기능들을 활용할 수 있습니다. React Intl은 JavaScript Intl API와 유사한 기능을 제공합니다.

라이브러리에서 제공하는 중요한 컴포넌트 중 일부는 `FormattedMessage`와 `IntlProvider`입니다.

`FormattedMessage` 컴포넌트는 애플리케이션 내에서 번역된 문자열을 표시하는 역할을 하며, `IntlProvider` 컴포넌트는 애플리케이션 전체에 번역 및 형식 설정 정보를 제공합니다.

번역을 적용하기 위해서는 먼저 번역 파일을 생성해야 합니다. 이 파일에는 애플리케이션에서 사용되는 모든 번역 데이터가 포함됩니다. 각 언어나 지역 설정별로 별도의 파일을 만들거나, 하나의 파일에 모든 번역을 모아 관리할 수 있습니다.

아래는 예시입니다:

export const messagesInFrench = {
    greeting: "Bonjour {name}"
}

export const messagesInItalian = {
    greeting: "Buongiorno {name}"
}

이 예시 번역 파일에는 프랑스어(`messagesInFrench`)와 이탈리아어(`messagesInItalian`)에 대한 번역 객체가 포함되어 있습니다. `{name}`과 같은 자리 표시자는 런타임 시 동적으로 대체될 수 있습니다.

애플리케이션에서 번역을 사용하기 위해서는 최상위 컴포넌트를 `IntlProvider`로 감싸야 합니다. `IntlProvider`는 `locale`, `defaultLocale`, 그리고 `messages`라는 세 가지 중요한 props를 받습니다.

`locale` prop은 사용자의 지역 설정을 문자열로 지정하고, `defaultLocale`은 사용자의 설정이 없을 경우 기본으로 사용될 언어를 지정합니다. 마지막으로 `messages` prop은 번역 객체를 전달받습니다.

다음은 `IntlProvider` 사용 예시입니다:

import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import { IntlProvider } from "react-intl";
import { messagesInFrench } from "./translation";

ReactDOM.createRoot(document.getElementById("root")).render(
  <React.StrictMode>
    <IntlProvider locale="fr" messages={messagesInFrench} defaultLocale="en">
      <App />
    </IntlProvider>
  </React.StrictMode>
);

위 예시에서는 프랑스어 로케일(`fr`), 프랑스어 번역(`messagesInFrench`), 그리고 기본 영어 로케일(`en`)을 `IntlProvider`에 전달하고 있습니다.

여러 로케일 또는 번역 객체를 전달할 수 있으며, `IntlProvider`는 자동으로 사용자의 브라우저 언어를 감지하여 적절한 번역을 선택합니다.

번역된 문자열을 표시하려면 `FormattedMessage` 컴포넌트를 사용합니다. 이 컴포넌트는 `id` prop을 통해 메시지 객체 내의 메시지 ID와 일치하는 번역을 찾습니다.

`FormattedMessage`는 `defaultMessage` 및 `values` prop도 사용합니다. `defaultMessage`는 현재 로케일에 대한 번역이 없을 때 대체 메시지를 지정하고, `values` prop은 번역 메시지의 자리 표시자에 동적 값을 제공합니다.

다음은 사용 예시입니다:

import React from "react";
import { FormattedMessage } from "react-intl";

function App() {
    return (
        <div>
            <p>
                <FormattedMessage
                    id="greeting"
                    defaultMessage="Good morning {name}"
                    values={{ name: 'John'}}
                />
            </p>
        </div>
    );
}

export default App;

위 코드에서 `FormattedMessage` 컴포넌트의 `id` prop은 `messagesInFrench` 객체의 `greeting` 키를 사용하고, `values` prop은 `{name}` 자리 표시자를 "John" 값으로 대체합니다.

`FormattedNumber` 컴포넌트를 이용한 숫자 서식 지정

React Intl은 현재 로케일을 기반으로 숫자 형식을 지정할 수 있는 `FormattedNumber` 컴포넌트도 제공합니다. 이 컴포넌트는 스타일, 통화, 최소 및 최대 소수 자릿수와 같은 서식을 사용자 정의하기 위한 다양한 prop을 제공합니다.

다음은 몇 가지 사용 예시입니다:

import React from "react";
import { FormattedNumber } from "react-intl";

function App() {
    return (
        <div>
            <p>
                Decimal: <FormattedNumber value={123.456} style="decimal" />
            </p>
            <p>
                Percent: <FormattedNumber value={123.456} style="percent" />
            </p>
        </div>
    );
}

export default App;

이 예시에서는 `value` prop을 통해 서식을 지정하려는 숫자를 지정하고 있습니다.

`style` prop을 사용하여 숫자의 형식을 사용자 정의할 수 있습니다. 이 prop은 `decimal`, `percent`, 또는 `currency` 값으로 설정할 수 있습니다.

`style` 속성을 `currency`로 설정하면 `FormattedNumber` 컴포넌트는 `currency` prop에 지정된 코드를 사용하여 숫자를 통화 값으로 변환합니다.

import React from "react";
import { FormattedNumber } from "react-intl";

function App() {
    return (
        <div>
            <p>
                Price: <FormattedNumber value={123.456} style="currency" currency="USD" />
            </p>
        </div>
    );
}

export default App;

위 코드 블록은 `currency` 스타일과 `USD` 통화 코드를 사용하여 숫자를 형식화합니다.

또한 `minimumFractionDigits` 및 `maximumFractionDigits` prop을 사용하여 특정 소수 자릿수로 숫자를 형식화할 수도 있습니다.

`minimumFractionDigits` prop은 표시할 최소 소수 자릿수를 지정하고, `maximumFractionDigits` prop은 최대 소수 자릿수를 지정합니다.

숫자의 소수 자릿수가 지정된 `minimumFractionDigits`보다 적으면, React Intl은 숫자를 0으로 채웁니다. 반대로 숫자에 지정된 `maximumFractionDigits`보다 많은 소수 자릿수가 있는 경우에는 숫자를 반올림합니다.

다음은 이러한 prop을 사용하는 예시입니다:

import React from "react";
import { FormattedNumber } from "react-intl";

function App() {
    return (
        <div>
            <p>
                <FormattedNumber
                    value={123.4567}
                    minimumFractionDigits={2}
                    maximumFractionDigits={3}
                />
            </p>
        </div>
    );
}

export default App;

`FormattedDate` 컴포넌트를 이용한 날짜 서식 지정

React Intl을 사용하면 일관되고 읽기 쉬운 방식으로 날짜 형식을 지정할 수 있습니다. `FormattedDate` 컴포넌트는 날짜 형식을 지정하는 간단하면서도 강력한 방법을 제공합니다. 이 컴포넌트는 Moment.js와 같은 날짜-시간 라이브러리와 유사하게 작동합니다.

`FormattedDate` 컴포넌트는 `value`, `day`, `month`, 및 `year`과 같은 다양한 prop을 사용합니다. `value` prop은 형식화할 날짜를 받고, 다른 prop들은 날짜의 형식을 구성합니다.

다음은 예시입니다:

import React from "react";
import { FormattedDate } from "react-intl";

function App() {
    const today = new Date();

    return (
        <div>
            <p>
                Today's date is
                <FormattedDate
                    value={today}
                    day="numeric"
                    month="long"
                    year="numeric"
                />
            </p>
        </div>
    );
}

export default App;

이 예시에서 `value` prop은 현재 날짜를 사용합니다. 또한 `day`, `month`, 및 `year` prop을 사용하여 각각 날짜, 월, 연도를 긴 형식으로 표시하도록 지정합니다.

날짜, 월, 연도 외에도 다양한 prop을 사용하여 날짜의 표현을 추가로 사용자 정의할 수 있습니다. 아래는 이들이 사용할 수 있는 prop과 값입니다.

  • year: "numeric", "2-digit"
  • month: "numeric", "2-digit", "narrow", "short", "long"
  • day: "numeric", "2-digit"
  • hour: "numeric", "2-digit"
  • minute: "numeric", "2-digit"
  • second: "numeric", "2-digit"
  • timeZoneName: "short", "long"

`FormattedDate` 컴포넌트를 사용하여 시간 형식을 지정하고 표시하는 것도 가능합니다.

import React from "react";
import { FormattedDate } from "react-intl";

function App() {
    const today = new Date();

    return (
        <div>
            <p>
                The time is
                <FormattedDate
                    value={today}
                    hour="numeric"
                    minute="numeric"
                    second="numeric"
                />
            </p>
        </div>
    );
}

export default App;

더 넓은 사용자층을 위한 React 애플리케이션 국제화

이 글을 통해 React 애플리케이션에서 React-Intl 라이브러리를 설치하고 설정하는 방법을 학습했습니다. React-intl을 사용하면 React 애플리케이션의 숫자, 날짜, 통화 형식을 간편하게 관리할 수 있습니다. `FormattedMessage`, `FormattedNumber`, 및 `FormattedDate` 컴포넌트를 활용하여 사용자 로케일을 기반으로 데이터 형식을 사용자 정의할 수 있습니다.

React 개발자들이 흔히 저지르는 실수는 심각한 문제로 이어질 수 있습니다. 예를 들어 상태를 적절히 업데이트하지 못하는 경우가 있습니다. 따라서 이러한 일반적인 오류들을 인지하고 조기에 수정하여 불필요한 비용 발생을 줄이는 것이 중요합니다.

저자
Korea

기술 트렌드와 실용적인 팁을 전하는 लेखक입니다.