
์ฑ์ด ๊ธ๋ก๋ฒ ์ ์ ๋ฅผ ๋์์ผ๋ก ๋ฐฐํฌ๋๊ธฐ ์์ํ๋ฉด
๋ค๊ตญ์ด(i18n, internationalization) ์ฒ๋ฆฌ๋ ํ์ ์กฐ๊ฑด์ด ๋๋ค.
React Native์์๋ ์ฝ๊ณ ์ ์ฐํ๊ฒ ๋ค๊ตญ์ด ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ ๋๊ตฌ๋ค์ด ์๋ค.
๊ฐ์ฅ ๋ง์ด ์ฐ์ด๋ ๋ฐฉ์์ ๋ฐ๋ก i18next + react-i18next ์กฐํฉ์ด๋ค.
npm install i18next react-i18next i18next-http-backend i18next-browser-languagedetector
๐ฆ Expo ํ๊ฒฝ์์ ์ถ๊ฐ ์ค์ ์์ด ๋ฐ๋ก ๊ฐ๋ฅ
// i18n.ts
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import en from './locales/en.json';
import ko from './locales/ko.json';
i18n.use(initReactI18next).init({
resources: {
en: { translation: en },
ko: { translation: ko },
},
lng: 'ko',
fallbackLng: 'en',
interpolation: {
escapeValue: false,
},
});
export default i18n;
๐ locales
โฃ ๐ en.json
โ ๐ ko.json
// en.json
{
"welcome": "Welcome",
"login": "Login"
}
// ko.json
{
"welcome": "ํ์ํฉ๋๋ค",
"login": "๋ก๊ทธ์ธ"
}
import { useTranslation } from 'react-i18next';
export default function Home() {
const { t } = useTranslation();
return <Text>{t('welcome')}</Text>;
}
<Button title="๐บ๐ธ English" onPress={() => i18n.changeLanguage('en')} />
<Button title="๐ฐ๐ท ํ๊ตญ์ด" onPress={() => i18n.changeLanguage('ko')} />
i18n.changeLanguage(code)๋ก ์ธ์ ๋ ์ค์๊ฐ ์ธ์ด ์ ํ ๊ฐ๋ฅ | ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ๋ํดํธ ์ธ์ด ์ค์ | lng: 'ko', fallbackLng: 'en' ๋ฑ์ผ๋ก ์ฒ๋ฆฌ |
| ํ ์คํธ fallback | ํค ๋๋ฝ ์ key ์์ฒด ํ์๋จ ({t('missing.key')}) |
| ๋ฆฌ์คํธ/๋ฐฐ์ด ์ฒ๋ฆฌ | t('list', { returnObjects: true }) ์ฌ์ฉ |
| ์ค์ฒฉ๋ ํ ์คํธ | "title": { "main": "Hello", "sub": "World" } ํ์ ๊ฐ๋ฅ |
<View>
<Text>{t('choose_language')}</Text>
<Button onPress={() => i18n<.changeLanguage('en')} title="๐บ๐ธ English" />
<Button onPress={() => i18n.changeLanguage('ko')} title="๐ฐ๐ท ํ๊ตญ์ด" />
</View>
์น์์ i18n์ ์์ฃผ ์จ๋ดค์ง๋ง,
React Native์์๋ ์๊ฐ๋ณด๋ค ํธํ๊ฒ ์ ์ฉ๋์๋ค.
ํนํ ๋ค๊ตญ์ด๊ฐ ํ์์ธ ์ฑ์ ๊ฐ๋ฐํ ๋
์ด๊ธฐ๋ถํฐ ๊ตฌ์กฐ์ ์ผ๋ก ์ค๋นํด๋๋ฉด ๋์ค์ ์๊ฐ ์๋ ์ ์์.
๐ โ์ ์ธ๊ณ ์ ์ ์๊ฒ ๋ค๊ฐ๊ฐ๋ ์ฒซ ๊ฑธ์์ ๋ฒ์ญ์์ ์์๋๋ค.โ