์ฑ์ ์ ์ธ๊ณ๋ก ๋ฐฐํฌํ๊ฑฐ๋,
๊ธฐ๋ณธ์ ์ผ๋ก ํ๊ตญ์ด/์์ด๋ฅผ ๋ชจ๋ ์ง์ํ๊ณ ์ถ๋ค๋ฉด
๋ค๊ตญ์ด ์ฒ๋ฆฌ(i18n: Internationalization)๊ฐ ํ์ํ๋ค.
์น์์๋ ๊ฐ๋จํ ๋ฌธ์์ด ์นํ ์ ๋์๋ ๊ฒ,
React Native์์๋ ์ธ์ด ๊ฐ์ง, ๋ณ๊ฒฝ, ์ํ ์ ์ฅ๊น์ง ๋ ๊ณ ๋ คํด์ผ ํ ์์๊ฐ ๋ง๋ค.
์ด๋ฒ ๊ธ์ React Native์์ ๋ค๊ตญ์ด ์ฒ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ฒ์๋ถํฐ ์ค๊ณํ๊ณ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํ ๊ธ์ด๋ค.
npm install i18next react-i18next i18next-browser-languagedetector
npm install @react-native-async-storage/async-storage
Expo๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
expo-localization
๋ ํจ๊ป ์ฌ์ฉ
npx expo install expo-localization
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import * as Localization from 'expo-localization';
import AsyncStorage from '@react-native-async-storage/async-storage';
import en from './locales/en.json';
import ko from './locales/ko.json';
i18n
.use(initReactI18next)
.init({
compatibilityJSON: 'v3',
lng: Localization.locale.split('-')[0], // ex: 'ko', 'en'
fallbackLng: 'en',
resources: {
en: { translation: en },
ko: { translation: ko },
},
interpolation: {
escapeValue: false,
},
});
export default i18n;
locales/
โโโ en.json
โโโ ko.json
// en.json
{
"greeting": "Hello!",
"login": {
"title": "Login",
"button": "Sign in"
}
}
// ko.json
{
"greeting": "์๋
ํ์ธ์!",
"login": {
"title": "๋ก๊ทธ์ธ",
"button": "๋ก๊ทธ์ธ"
}
}
import { useTranslation } from 'react-i18next';
const { t } = useTranslation();
<Text>{t('greeting')}</Text>
<Text>{t('login.title')}</Text>
const changeLanguage = (lng: 'en' | 'ko') => {
i18n.changeLanguage(lng);
AsyncStorage.setItem('lang', lng); // ์ ํํ ์ธ์ด ์ ์ฅ
};
ํญ๋ชฉ | ์ ๋ต |
---|---|
๊ธฐ๋ณธ ์ธ์ด | expo-localization or ๋ธ๋ผ์ฐ์ ์ธ์ด ๊ธฐ๋ฐ ์ค์ |
fallback ์ธ์ด | 'en' ๋๋ 'ko'๋ก ๋ช ํํ ์ค์ |
๋ค๊ตญ์ด ํค ์ด๋ฆ | ์๋ฌธ์ + dot notation (login.title ) ์ถ์ฒ |
ํ ์คํธ ๋ค์์ผ ๊ฒฝ์ฐ | useTranslation() ๋์ Trans ์ปดํฌ๋ํธ ์ฌ์ฉ ๊ฐ๋ฅ |
ํ ๋ง, ์ธ์ด, ๋ชจ๋ ๊ฐ์ด ๊ด๋ฆฌ | Zustand ๋๋ Context๋ก appSettings ๋ถ๋ฆฌ ๊ฐ๋ฅ |
๋ค๊ตญ์ด ์ฒ๋ฆฌ๋ฅผ ๋จ์ํ "๋ฌธ์์ด ๋ฐ๊พธ๊ธฐ"๋ผ๊ณ ์๊ฐํ๋๋ฐ,
์ค์ ๋ก ํด๋ณด๋ฉด ์ฑ์ ์ ๋ฐ์ ์ธ ๊ตฌ์กฐ์ ์ํฅ์ ์ฃผ๋ ์์๋ผ๋ ๊ฑธ ์๊ฒ ๋๋ค.
ํนํ ์ธ์ด ๋ณ๊ฒฝ ํ ์ฑ ์ ์ฒด ๋ฆฌ๋ ๋๋ง ์ฒ๋ฆฌ,
๋น๋๊ธฐ ๋ก๋ฉ, ์ ์ฅ ๋ฐฉ์ ๋ฑ์์ ์ ๊ฒฝ ์จ์ผ ํ ์ ์ด ๋ง์๋ค.
์ง๊ธ์ ์ํ ์ ์ฅ์ AsyncStorage,
์ด๊ธฐ ์ธ์ด ๊ฐ์ง๋ expo-localization,
๋ฌธ์์ด์ json ๊ด๋ฆฌ๋ก ์์ ์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์๋ค.
๐ โ์ฑ์ ํ์ฅ์ฑ์ i18n ์ค๊ณ์์ ์์๋๋ค.โ