728x90

React에서 다국어 지원을 구현하기 위해 몇 가지 방법이 있습니다. 가장 일반적인 방법은 국제화(i18n) 라이브러리를 사용하는 것이며, 대표적으로 `react-i18next`, `react-intl`, `next-i18next` (Next.js 프로젝트의 경우) 등이 있습니다.

이 답변에서는 가장 널리 사용되는 `react-i18next` 라이브러리를 사용하여 다국어 지원을 구현하는 방법을 설명하겠습니다. `react-i18next`는 React와 잘 통합되며, 다양한 기능을 제공하여 국제화를 쉽게 구현할 수 있도록 도와줍니다.

### 1. 프로젝트 설정

먼저, React 프로젝트를 설정하고 필요한 패키지를 설치합니다.

#### 프로젝트 생성

```bash
npx create-react-app my-i18n-app
cd my-i18n-app
```

#### 패키지 설치

`react-i18next`와 `i18next` 패키지를 설치합니다.

```bash
npm install react-i18next i18next
```

### 2. i18n 설정

다음으로, `i18n` 설정 파일을 만들어서 사용할 언어 및 번역 파일을 설정합니다.

#### `src/i18n.js` 파일 생성

```javascript
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';

// 번역 리소스 정의
const resources = {
  en: {
    translation: {
      welcome: 'Welcome to our application!',
      description: 'This is a sample description.',
      // Add more keys and translations as needed
    },
  },
  ko: {
    translation: {
      welcome: '우리 애플리케이션에 오신 것을 환영합니다!',
      description: '이것은 샘플 설명입니다.',
      // 필요한 만큼 추가
    },
  },
  // 다른 언어도 추가 가능
};

// i18n 초기화
i18n
  .use(initReactI18next) // react-i18next를 사용하기 위해 초기화
  .init({
    resources, // 번역 리소스 설정
    lng: 'en', // 초기 언어 설정
    fallbackLng: 'en', // 언어를 찾지 못했을 때 대체 언어
    interpolation: {
      escapeValue: false, // React는 자동으로 안전한 escaping을 처리함
    },
  });

export default i18n;
```

### 3. i18n 설정을 React에 통합

`i18n`을 설정한 후, 이를 React 애플리케이션에 통합해야 합니다.

#### `src/index.js` 파일 수정

```javascript
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import './i18n'; // i18n 설정 파일 불러오기

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById('root')
);
```

### 4. 컴포넌트에서 번역 사용

이제 React 컴포넌트에서 `useTranslation` 훅을 사용하여 번역 문자열을 쉽게 사용할 수 있습니다.

#### `src/App.js` 파일 수정

```javascript
import React from 'react';
import { useTranslation } from 'react-i18next';

function App() {
  const { t, i18n } = useTranslation(); // useTranslation 훅 사용

  // 언어 변경 함수
  const changeLanguage = (lng) => {
    i18n.changeLanguage(lng);
  };

  return (
    <div className="App">
      <header className="App-header">
        <h1>{t('welcome')}</h1> {/* 번역 키 사용 */}
        <p>{t('description')}</p> {/* 번역 키 사용 */}

        {/* 언어 변경 버튼 */}
        <button onClick={() => changeLanguage('en')}>English</button>
        <button onClick={() => changeLanguage('ko')}>한국어</button>
      </header>
    </div>
  );
}

export default App;
```

### 5. 번역 리소스 외부 파일로 분리

위 예제에서는 번역 리소스를 `i18n.js`에 직접 정의했지만, 실제 프로젝트에서는 리소스를 외부 JSON 파일로 분리하여 관리하는 것이 더 효율적입니다.

#### 번역 파일 생성

- `src/locales/en/translation.json`

  ```json
  {
    "welcome": "Welcome to our application!",
    "description": "This is a sample description."
  }
  ```

- `src/locales/ko/translation.json`

  ```json
  {
    "welcome": "우리 애플리케이션에 오신 것을 환영합니다!",
    "description": "이것은 샘플 설명입니다."
  }
  ```

#### `src/i18n.js` 파일 수정

번역 리소스를 외부 파일에서 가져오도록 수정합니다.

```javascript
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import Backend from 'i18next-http-backend';
import LanguageDetector from 'i18next-browser-languagedetector';

// i18n 초기화
i18n
  .use(Backend) // 백엔드 사용 설정
  .use(LanguageDetector) // 언어 감지 사용 설정
  .use(initReactI18next) // react-i18next 초기화
  .init({
    backend: {
      loadPath: '/locales/{{lng}}/translation.json', // 번역 파일 경로
    },
    fallbackLng: 'en', // 언어를 찾지 못했을 때 대체 언어
    interpolation: {
      escapeValue: false, // React는 자동으로 안전한 escaping을 처리함
    },
  });

export default i18n;
```

### 6. 자동 언어 감지

위에서 설정한 `i18next-browser-languagedetector`를 사용하면 사용자의 브라우저 언어 설정을 자동으로 감지하여 초기 언어를 설정할 수 있습니다. 이를 통해 사용자에게 더 나은 경험을 제공할 수 있습니다.

### 7. 다국어 지원 추가 고려 사항

- **플레이스홀더와 변수**: 번역 문자열에서 플레이스홀더를 사용하여 동적으로 값을 삽입할 수 있습니다. 예를 들어, `{{name}}`과 같은 변수를 사용하여 사용자 이름을 포함한 메시지를 만들 수 있습니다.
  
  ```javascript
  // translation.json
  {
    "greeting": "Hello, {{name}}!"
  }

  // 사용
  <p>{t('greeting', { name: 'John' })}</p>
  ```

- **언어 번역 상태 관리**: 언어 설정은 전역 상태로 관리할 수 있으며, `Redux`나 `React Context`를 사용하여 구현할 수 있습니다.

- **유닛 테스트**: 번역 파일 및 다국어 기능을 유닛 테스트하여 잘못된 번역이나 기능적 오류를 사전에 방지할 수 있습니다.

- **번역 파일 관리**: 큰 프로젝트에서는 번역 파일의 관리가 복잡할 수 있습니다. 이를 해결하기 위해 번역 관리 도구(TMS, Translation Management System)를 사용하면 효율적으로 번역 작업을 수행할 수 있습니다.

이제 React 애플리케이션에서 다국어 지원을 설정하고 사용할 수 있는 방법을 이해하셨습니다. 이 예제를 기반으로 다양한 언어를 지원하고, 사용자가 쉽게 언어를 전환할 수 있도록 애플리케이션을 확장할 수 있습니다. 추가적으로, `react-i18next` 문서를 참고하여 더욱 고급 기능을 적용해보세요.

728x90
반응형

+ Recent posts