v1.2.0 - React μ ν리μΌμ΄μ μ μν κ°λ¨νκ³ κ°λ ₯ν κ΅μ ν SDK
β μ΄ νλ‘μ νΈκ° λμμ΄ λμλ€λ©΄ μ€νλ₯Ό λλ¬μ£ΌμΈμ!
- κ°λ¨ν API: μ§κ΄μ μ΄κ³ μ¬μ©νκΈ° μ¬μ΄ μΈν°νμ΄μ€
- μ΄λ³΄μ μΉνμ :
withDefaultConfig()λ‘ ν μ€ μ€μ - νμ μμ μ±: TypeScriptλ‘ μμ ν νμ μ§μ
- SSR μ§μ: Next.js μλ² μ»΄ν¬λνΈμ μλ²½ νΈν
- κ°λ ₯ν μλ¬ μ²λ¦¬: μλ μ¬μλ, 볡ꡬ μ λ΅, μ¬μ©μ μΉνμ λ©μμ§
- κ°λ²Όμ΄ λ²λ€: Tree-shaking μ§μμΌλ‘ μ΅μ νλ ν¬κΈ°
- μ€μκ° μΈμ΄ λ³κ²½: λμ μΈμ΄ μ ν μ§μ
- κ°λ°μ μΉνμ : λλ²κ·Έ λͺ¨λ, λλ½ ν€ νμ, μμΈν λ‘κΉ
npm install hua-i18n-sdk
# λλ
yarn add hua-i18n-sdk
# λλ
pnpm add hua-i18n-sdk// μ΄λ³΄μ μ μ© μνΈλ¦¬ν¬μΈνΈ - 볡μ‘ν μ€μ μμ΄ λ°λ‘ μμ!
import { withDefaultConfig, useTranslation } from 'hua-i18n-sdk/easy';
// ν μ€λ‘ λ! κΈ°λ³Έ μ€μ μΌλ‘ μμ
export const I18nProvider = withDefaultConfig();
function App() {
return (
<I18nProvider>
<MyComponent />
</I18nProvider>
);
}
function MyComponent() {
const { t, tWithParams } = useTranslation();
return (
<div>
<h1>{t('common.welcome')}</h1>
<p>{tWithParams('common.greeting', { name: 'μ² μ' })}</p>
</div>
);
}import { withDefaultConfig, useTranslation } from 'hua-i18n-sdk';
// ν μ€λ‘ λ! κΈ°λ³Έ μ€μ μΌλ‘ μμ
export const I18nProvider = withDefaultConfig();
function App() {
return (
<I18nProvider>
<MyComponent />
</I18nProvider>
);
}
function MyComponent() {
const { t, tWithParams } = useTranslation();
return (
<div>
<h1>{t('common.welcome')}</h1>
<p>{tWithParams('common.greeting', { name: 'μ² μ' })}</p>
</div>
);
}import { withDefaultConfig } from 'hua-i18n-sdk';
// νμν λΆλΆλ§ 컀μ€ν°λ§μ΄μ§
export const I18nProvider = withDefaultConfig({
defaultLanguage: 'en',
namespaces: ['common', 'auth'],
debug: true,
});import { I18nProvider, useTranslation, createI18nConfig } from 'hua-i18n-sdk';
const i18nConfig = createI18nConfig({
defaultLanguage: 'ko',
fallbackLanguage: 'en',
supportedLanguages: [
{ code: 'ko', name: 'Korean', nativeName: 'νκ΅μ΄' },
{ code: 'en', name: 'English', nativeName: 'English' },
],
namespaces: ['common', 'auth'],
loadTranslations: async (language, namespace) => {
const module = await import(`./translations/${language}/${namespace}.json`);
return module.default;
},
// v1.1.0: μλ¬ μ²λ¦¬ κ°ν
errorHandling: {
recoveryStrategy: {
maxRetries: 3,
retryDelay: 1000,
backoffMultiplier: 2
},
logging: { enabled: true, level: 'error' },
userFriendlyMessages: true
}
});
function App() {
return (
<I18nProvider config={i18nConfig}>
<MyComponent />
</I18nProvider>
);
}translations/
βββ ko/
β βββ common.json
β βββ auth.json
βββ en/
βββ common.json
βββ auth.json
// translations/ko/common.json
{
"welcome": "νμν©λλ€",
"greeting": "μλ
νμΈμ, {{name}}λ!",
"buttons": {
"save": "μ μ₯",
"cancel": "μ·¨μ"
}
}// translations/en/common.json
{
"welcome": "Welcome",
"greeting": "Hello, {{name}}!",
"buttons": {
"save": "Save",
"cancel": "Cancel"
}
}export const I18nProvider = withDefaultConfig({
// κΈ°λ³Έ μΈμ΄ (κΈ°λ³Έκ°: 'ko')
defaultLanguage: 'en',
// ν΄λ°± μΈμ΄ (κΈ°λ³Έκ°: 'en')
fallbackLanguage: 'ko',
// λ€μμ€νμ΄μ€ (κΈ°λ³Έκ°: ['common'])
namespaces: ['common', 'auth', 'dashboard'],
// λλ²κ·Έ λͺ¨λ (κΈ°λ³Έκ°: NODE_ENV === 'development')
debug: true,
// μλ μΈμ΄ μ ν μ΄λ²€νΈ μ²λ¦¬ (κΈ°λ³Έκ°: true)
// μ΄λ²€νΈ 리μ€λ μλ λ±λ‘: huaI18nLanguageChange, i18nLanguageChanged
// λΈλΌμ°μ μΈμ΄ λ³κ²½μ΄λ μΈλΆ μΈμ΄ μ ν μ΄λ²€νΈλ₯Ό μλμΌλ‘ κ°μ§
autoLanguageSync: true,
});autoLanguageSync μ΅μ
μ μΈμ΄ μ ν μ΄λ²€νΈλ₯Ό μλμΌλ‘ κ°μ§νκ³ μ²λ¦¬ν©λλ€:
// μλμΌλ‘ κ°μ§νλ μ΄λ²€νΈλ€
window.addEventListener('huaI18nLanguageChange', (event) => {
// SDK λ΄λΆ μΈμ΄ λ³κ²½ μ΄λ²€νΈ
const newLanguage = event.detail;
});
window.addEventListener('i18nLanguageChanged', (event) => {
// μΌλ°μ μΈ μΈμ΄ λ³κ²½ μ΄λ²€νΈ
const newLanguage = event.detail;
});μ¬μ© μμ:
// λ€λ₯Έ μ»΄ν¬λνΈμμ μΈμ΄ λ³κ²½ μ
const changeLanguage = (language) => {
// μ΄λ²€νΈ λ°μ β withDefaultConfig()κ° μλμΌλ‘ κ°μ§
window.dispatchEvent(new CustomEvent('i18nLanguageChanged', {
detail: language
}));
};import { useLanguageChange } from 'hua-i18n-sdk';
function LanguageSwitcher() {
const { currentLanguage, changeLanguage, supportedLanguages } = useLanguageChange();
return (
<select
value={currentLanguage}
onChange={(e) => changeLanguage(e.target.value)}
>
{supportedLanguages.map(lang => (
<option key={lang.code} value={lang.code}>
{lang.nativeName}
</option>
))}
</select>
);
}import { ssrTranslate } from 'hua-i18n-sdk';
export default function ServerComponent() {
const title = ssrTranslate({
translations: translations.ko.common(),
key: 'common.welcome',
language: 'ko',
});
return <h1>{title}</h1>;
}interface MyTranslations {
common: {
welcome: string;
greeting: string;
};
auth: {
login: string;
logout: string;
};
}
const { t } = useI18n<MyTranslations>();
// μλμμ± μ§μ
t('common.welcome'); // β
νμ
μμ
t('common.invalid'); // β νμ
μλ¬const config = {
// ... κΈ°λ³Έ μ€μ
errorHandling: {
recoveryStrategy: {
maxRetries: 3,
retryDelay: 1000,
backoffMultiplier: 2,
shouldRetry: (error) => ['NETWORK_ERROR', 'LOAD_FAILED'].includes(error.code),
onRetry: (error, attempt) => console.log(`μ¬μλ ${attempt}ν:`, error.message),
onMaxRetriesExceeded: (error) => alert('λ²μ λ°μ΄ν°λ₯Ό λΆλ¬μ¬ μ μμ΅λλ€')
},
logging: {
enabled: true,
level: 'error',
includeStack: true,
includeContext: true
},
userFriendlyMessages: true
}
};import { createTranslationError, logTranslationError } from 'hua-i18n-sdk';
try {
// λ²μ λ‘λ©
} catch (error) {
const translationError = createTranslationError(
'LOAD_FAILED',
error.message,
error,
{ language: 'ko', namespace: 'common' }
);
logTranslationError(translationError);
}β κΈ°μ‘΄ μ½λλ λ³κ²½ μμ΄ λμν©λλ€
// v1.0.x μ½λ (κ·Έλλ‘ λμ)
const config: I18nConfig = {
defaultLanguage: 'ko',
fallbackLanguage: 'en',
supportedLanguages: [
{ code: 'ko', name: 'Korean', nativeName: 'νκ΅μ΄' },
{ code: 'en', name: 'English', nativeName: 'English' },
],
namespaces: ['common'],
loadTranslations: async (language, namespace) => {
const module = await import(`./translations/${language}/${namespace}.json`);
return module.default;
},
};
// v1.1.0μμλ λμΌνκ² λμ// v1.1.0: μλ¬ μ²λ¦¬ κ°ν (μ νμ )
const config: I18nConfig = {
// ... κΈ°μ‘΄ μ€μ
errorHandling: {
recoveryStrategy: {
maxRetries: 3,
retryDelay: 1000,
backoffMultiplier: 2
},
logging: { enabled: true, level: 'error' },
userFriendlyMessages: true
}
};- SDK λ νΌλ°μ€ - μμ ν API λ¬Έμ
- λ³κ²½ λ‘κ·Έ - λ²μ λ³ λ³κ²½μ¬ν
- νκ²½ μ€μ κ°μ΄λ - λ€μν νκ²½ μ€μ
- νκ²½λ³ μμ - νκ²½λ³ μ€μ μμ
- κΈ°μ¬ κ°μ΄λ - νλ‘μ νΈ κΈ°μ¬ λ°©λ²
npm test
npm run test:watch
npm run test:coveragenpm run buildνλ‘μ νΈμ κΈ°μ¬νκ³ μΆμΌμλ€λ©΄ κΈ°μ¬ κ°μ΄λλ₯Ό μ°Έκ³ ν΄μ£ΌμΈμ.
git clone https://github.com/HUA-Labs/i18n-sdk.git
cd hua-i18n-sdk
npm install
npm run devμ΄ νλ‘μ νΈλ MIT λΌμ΄μ μ€ νμ λ°°ν¬λ©λλ€.
- React - λ©μ§ UI λΌμ΄λΈλ¬λ¦¬
- TypeScript - νμ μμ μ±
- Next.js - SSR μ§μ
- λͺ¨λ κΈ°μ¬μλΆλ€κ» κ°μ¬λ립λλ€!
Made with β€οΈ by the hua-i18n-sdk team