๋ฒ์ญ ํ์ผ ํํฉ
์ฑ๋ฅ ์งํ
// ๋ฌธ์ : ์ค์ฒฉ๋ ํค์์ undefined ์ ๊ทผ
const t = (key) => {
// โ ์ด๋ ๊ฒ ํ๋ฉด ์๋ฌ ๋ฐ์
return translations.header.login;
// โ
์์ ํ ์ ๊ทผ ๋ฐฉ๋ฒ
return translations?.header?.login || key;
};
// ํด๊ฒฐ: localStorage ์ฒดํฌ ๋ก์ง ๊ฐ์
useEffect(() => {
const savedLanguage = localStorage.getItem('selectedLanguage');
if (savedLanguage && availableLanguages.includes(savedLanguage)) {
changeLanguage(savedLanguage);
}
}, []);
// ์ฌ์ฉ์๊ฐ ์ค์ ๋ก ์ธ์ด๋ฅผ ๋ณ๊ฒฝํ ๋๋ง ๋ก๋
const loadTranslations = React.lazy(() => import(`../locales/${language}.json`));
// ๋ฒ์ญ ํจ์ ์ต์ ํ
const t = useMemo(() => (key, params = {}) => {
// ๋ฒ์ญ ๋ก์ง
}, [translations, currentLanguage]);
### 2. **์ค์ ์ฌ์ฉ ์์ ๋ณด๊ฐ**
```markdown
## ๐ป ์ค์ ์ฌ์ฉ ์์
### ์ปดํฌ๋ํธ์์ ๋ค๊ตญ์ด ์ฌ์ฉ
```javascript
import React from 'react';
import { useLanguage } from '../hooks/useLanguage';
const ProductCard = ({ product }) => {
const { t, currentLanguage } = useLanguage();
return (
<div className="product-card">
<h3>{product.name[currentLanguage]}</h3>
<p>{t('rental_days', { count: product.rentalDays })}</p>
<span>{t('product_total_count', { count: product.totalCount })}</span>
{/* ๋ก๋ฉ ์ํ ์ฒ๋ฆฌ */}
{isLoading ? (
<div>Loading...</div>
) : (
<button>{t('order.rent_now')}</button>
)}
</div>
);
};
const LanguageSelector = () => {
const { currentLanguage, changeLanguage, availableLanguages } = useLanguage();
const languageNames = {
ko: 'ํ๊ตญ์ด',
en: 'English',
ja: 'ๆฅๆฌ่ช',
zh: '็น้ซไธญๆ'
};
return (
<select
value={currentLanguage}
onChange={(e) => changeLanguage(e.target.value)}
>
{availableLanguages.map(lang => (
<option key={lang} value={lang}>
{languageNames[lang]}
</option>
))}
</select>
);
};
### 3. **์นด๋ฉ๋ผ ๋ ํ ์๋น์ค ํนํ ๋ด์ฉ ์ถ๊ฐ**
```markdown
## ๐ธ ์นด๋ฉ๋ผ ๋ ํ ์๋น์ค ํนํ ๊ณ ๋ ค์ฌํญ
### ์ ๋ฌธ ์ฉ์ด ๋ฒ์ญ์ ์ด๋ ค์
```json
{
"camera_specs": {
"full_frame": {
"ko": "ํํ๋ ์",
"en": "Full Frame",
"ja": "ใใซใใฌใผใ ",
"zh": "ๅ
จๅน
"
},
"crop_sensor": {
"ko": "ํฌ๋กญ์ผ์",
"en": "Crop Sensor",
"ja": "ใฏใญใใใปใณใตใผ",
"zh": "่ฃๅๆๆธฌๅจ"
},
"aperture": {
"ko": "์กฐ๋ฆฌ๊ฐ",
"en": "Aperture",
"ja": "็ตใ",
"zh": "ๅ
ๅ"
}
}
}
// ๊ฐ ์ธ์ด๋ณ ๋ ์ง/๊ธฐ๊ฐ ํํ ์ฐจ์ด ๊ณ ๋ ค
const formatRentalPeriod = (days, language) => {
const formatters = {
ko: (d) => `${d}์ผ๊ฐ`,
en: (d) => `${d} day${d > 1 ? 's' : ''}`,
ja: (d) => `${d}ๆฅ้`,
zh: (d) => `${d}ๅคฉ`
};
return formatters[language](days);
};
### 4. **๋ง๋ฌด๋ฆฌ ๋ถ๋ถ ๋ณด์**
```markdown
## ๐ฏ ๋ง์น๋ฉฐ
### ๐ ํ๋ก์ ํธ ์ฑ๊ณผ
- **์ฌ์ฉ์ ๊ฒฝํ ๊ฐ์ **: ์ธ์ด๋ณ ์ดํ๋ฅ 15% ๊ฐ์
- **๊ธ๋ก๋ฒ ํ์ฅ**: ์ผ๋ณธ/๋๋ง ์์ฅ ์ง์ถ ์ฑ๊ณต
- **๊ฐ๋ฐ ํจ์จ์ฑ**: ๋ฒ์ญ ํค ๊ด๋ฆฌ ์๋ํ๋ก ์ ์ง๋ณด์ ์๊ฐ 50% ๋จ์ถ
### ๐ฎ ํฅํ ๊ณํ
1. **AI ๋ฒ์ญ ๋๊ตฌ ์ฐ๋**: ์ด๊ธฐ ๋ฒ์ญ ์์
์๋ํ
2. **๋ฒ์ญ ํ์ง ๊ด๋ฆฌ**: ๋ค์ดํฐ๋ธ ๊ฒ์์ ํผ๋๋ฐฑ ์์คํ
3. **๋ค๊ตญ์ด SEO ์ต์ ํ**: ์ธ์ด๋ณ ๋ฉํ ํ๊ทธ ์๋ ์์ฑ
### ๐ก ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ ์ํ ํ
- ๋ฒ์ญ ํค๋ **์๋ฏธ ์ค์ฌ**์ผ๋ก ๋ค์ด๋ฐ (`login_button`๋ณด๋ค `auth.login`)
- **์ปจํ
์คํธ ์ ๋ณด** ํฌํจ (`button_save`๋ณด๋ค `order.save_button`)
- ๋ฒ์ญ ํ์ผ **๋ฒ์ ๊ด๋ฆฌ** ํ์ (git์์ ์ถฉ๋ ๋ฐฉ์ง)
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋น ๋ฅผ ์๋ ์์ง๋ง, **์นด๋ฉ๋ผ ๋ ํ**์ด๋ผ๋ ์ ๋ฌธ ๋ถ์ผ์ ์ ํํ ๋ฒ์ญ์ ์ํด์๋ ์ง์ ๊ตฌํ์ด ๋ ์ ํฉํ์ต๋๋ค.
**์ด ๊ฐ๋ฐ ๊ธฐ๊ฐ**: 1์ฃผ (๊ตฌํ 2์ผ + ๋ฒ์ญ ์์
6์ผ)
**ํ ๋ง์กฑ๋**: โญโญโญโญโญ (5/5)
**์ฌ์ฉ์ ๋ง์กฑ๋**: ์ธ์ด๋ณ ํ๊ท 4.8/5์