@hua-labs/i18n-beginner 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +4 -0
- package/CHANGELOG.md +14 -0
- package/LICENSE +21 -0
- package/README.md +830 -0
- package/README_EN.md +506 -0
- package/dist/easy.d.ts +54 -0
- package/dist/easy.d.ts.map +1 -0
- package/dist/easy.js +243 -0
- package/dist/easy.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/simple.d.ts +65 -0
- package/dist/simple.d.ts.map +1 -0
- package/dist/simple.js +57 -0
- package/dist/simple.js.map +1 -0
- package/package.json +61 -0
- package/src/easy.tsx +292 -0
- package/src/index.ts +21 -0
- package/src/simple.ts +62 -0
- package/tsconfig.json +25 -0
package/dist/easy.js
ADDED
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* 진짜 한 줄로 시작하는 다국어 지원
|
|
5
|
+
* 초보자를 위한 최대한 간단한 API
|
|
6
|
+
*/
|
|
7
|
+
import { createContext, useContext, useState, useEffect, useCallback } from 'react';
|
|
8
|
+
// 기본 번역 데이터
|
|
9
|
+
const defaultTranslations = {
|
|
10
|
+
ko: {
|
|
11
|
+
welcome: "환영합니다",
|
|
12
|
+
hello: "안녕하세요",
|
|
13
|
+
click_me: "클릭하세요",
|
|
14
|
+
loading: "로딩 중...",
|
|
15
|
+
error: "오류가 발생했습니다",
|
|
16
|
+
success: "성공했습니다",
|
|
17
|
+
cancel: "취소",
|
|
18
|
+
confirm: "확인",
|
|
19
|
+
save: "저장",
|
|
20
|
+
delete: "삭제",
|
|
21
|
+
edit: "편집",
|
|
22
|
+
add: "추가",
|
|
23
|
+
search: "검색",
|
|
24
|
+
back: "뒤로",
|
|
25
|
+
next: "다음",
|
|
26
|
+
home: "홈",
|
|
27
|
+
about: "소개",
|
|
28
|
+
contact: "연락처",
|
|
29
|
+
settings: "설정",
|
|
30
|
+
profile: "프로필",
|
|
31
|
+
logout: "로그아웃",
|
|
32
|
+
login: "로그인",
|
|
33
|
+
register: "회원가입",
|
|
34
|
+
// 추가 기본 번역들
|
|
35
|
+
email: "이메일",
|
|
36
|
+
password: "비밀번호",
|
|
37
|
+
name: "이름",
|
|
38
|
+
phone: "전화번호",
|
|
39
|
+
address: "주소",
|
|
40
|
+
submit: "제출",
|
|
41
|
+
reset: "초기화",
|
|
42
|
+
close: "닫기",
|
|
43
|
+
open: "열기",
|
|
44
|
+
yes: "예",
|
|
45
|
+
no: "아니오",
|
|
46
|
+
ok: "확인",
|
|
47
|
+
loading_text: "잠시만 기다려주세요...",
|
|
48
|
+
error_message: "문제가 발생했습니다. 다시 시도해주세요.",
|
|
49
|
+
success_message: "성공적으로 완료되었습니다!",
|
|
50
|
+
not_found: "찾을 수 없습니다",
|
|
51
|
+
unauthorized: "권한이 없습니다",
|
|
52
|
+
forbidden: "접근이 거부되었습니다",
|
|
53
|
+
server_error: "서버 오류가 발생했습니다"
|
|
54
|
+
},
|
|
55
|
+
en: {
|
|
56
|
+
welcome: "Welcome",
|
|
57
|
+
hello: "Hello",
|
|
58
|
+
click_me: "Click me",
|
|
59
|
+
loading: "Loading...",
|
|
60
|
+
error: "An error occurred",
|
|
61
|
+
success: "Success",
|
|
62
|
+
cancel: "Cancel",
|
|
63
|
+
confirm: "Confirm",
|
|
64
|
+
save: "Save",
|
|
65
|
+
delete: "Delete",
|
|
66
|
+
edit: "Edit",
|
|
67
|
+
add: "Add",
|
|
68
|
+
search: "Search",
|
|
69
|
+
back: "Back",
|
|
70
|
+
next: "Next",
|
|
71
|
+
home: "Home",
|
|
72
|
+
about: "About",
|
|
73
|
+
contact: "Contact",
|
|
74
|
+
settings: "Settings",
|
|
75
|
+
profile: "Profile",
|
|
76
|
+
logout: "Logout",
|
|
77
|
+
login: "Login",
|
|
78
|
+
register: "Register",
|
|
79
|
+
// 추가 기본 번역들
|
|
80
|
+
email: "Email",
|
|
81
|
+
password: "Password",
|
|
82
|
+
name: "Name",
|
|
83
|
+
phone: "Phone",
|
|
84
|
+
address: "Address",
|
|
85
|
+
submit: "Submit",
|
|
86
|
+
reset: "Reset",
|
|
87
|
+
close: "Close",
|
|
88
|
+
open: "Open",
|
|
89
|
+
yes: "Yes",
|
|
90
|
+
no: "No",
|
|
91
|
+
ok: "OK",
|
|
92
|
+
loading_text: "Please wait...",
|
|
93
|
+
error_message: "An error occurred. Please try again.",
|
|
94
|
+
success_message: "Successfully completed!",
|
|
95
|
+
not_found: "Not found",
|
|
96
|
+
unauthorized: "Unauthorized",
|
|
97
|
+
forbidden: "Forbidden",
|
|
98
|
+
server_error: "Server error occurred"
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
// 컨텍스트 생성
|
|
102
|
+
const I18nContext = createContext(null);
|
|
103
|
+
// 기본 언어 감지 (서버에서는 항상 한국어)
|
|
104
|
+
function detectLanguage() {
|
|
105
|
+
if (typeof window === 'undefined')
|
|
106
|
+
return 'ko';
|
|
107
|
+
const saved = localStorage.getItem('hua-i18n-language');
|
|
108
|
+
if (saved && (saved === 'ko' || saved === 'en')) {
|
|
109
|
+
return saved;
|
|
110
|
+
}
|
|
111
|
+
const browserLang = navigator.language.toLowerCase();
|
|
112
|
+
if (browserLang.startsWith('ko')) {
|
|
113
|
+
return 'ko';
|
|
114
|
+
}
|
|
115
|
+
return 'en';
|
|
116
|
+
}
|
|
117
|
+
// Provider 컴포넌트
|
|
118
|
+
export function SimpleI18n({ children }) {
|
|
119
|
+
const [language, setLanguageState] = useState('ko'); // 서버와 클라이언트 모두 한국어로 시작
|
|
120
|
+
const [translations, setTranslations] = useState(defaultTranslations);
|
|
121
|
+
const [isClient, setIsClient] = useState(false);
|
|
122
|
+
// 클라이언트에서만 언어 감지 및 설정
|
|
123
|
+
useEffect(() => {
|
|
124
|
+
setIsClient(true);
|
|
125
|
+
const detectedLanguage = detectLanguage();
|
|
126
|
+
setLanguageState(detectedLanguage);
|
|
127
|
+
}, []);
|
|
128
|
+
const setLanguage = (lang) => {
|
|
129
|
+
setLanguageState(lang);
|
|
130
|
+
if (typeof window !== 'undefined') {
|
|
131
|
+
localStorage.setItem('hua-i18n-language', lang);
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
const t = (key) => {
|
|
135
|
+
return translations[language]?.[key] || key;
|
|
136
|
+
};
|
|
137
|
+
// 추가 편의 기능들
|
|
138
|
+
const isKorean = language === 'ko';
|
|
139
|
+
const isEnglish = language === 'en';
|
|
140
|
+
const toggleLanguage = () => {
|
|
141
|
+
setLanguage(language === 'ko' ? 'en' : 'ko');
|
|
142
|
+
};
|
|
143
|
+
const addTranslation = useCallback((lang, key, value) => {
|
|
144
|
+
setTranslations(prev => ({
|
|
145
|
+
...prev,
|
|
146
|
+
[lang]: { ...prev[lang], [key]: value }
|
|
147
|
+
}));
|
|
148
|
+
}, []);
|
|
149
|
+
const getCurrentLanguage = () => language;
|
|
150
|
+
const value = {
|
|
151
|
+
language,
|
|
152
|
+
setLanguage,
|
|
153
|
+
t,
|
|
154
|
+
translations,
|
|
155
|
+
isKorean,
|
|
156
|
+
isEnglish,
|
|
157
|
+
toggleLanguage,
|
|
158
|
+
addTranslation,
|
|
159
|
+
getCurrentLanguage,
|
|
160
|
+
isClient
|
|
161
|
+
};
|
|
162
|
+
return (_jsx(I18nContext.Provider, { value: value, children: children }));
|
|
163
|
+
}
|
|
164
|
+
// 훅들
|
|
165
|
+
export function useTranslate() {
|
|
166
|
+
const context = useContext(I18nContext);
|
|
167
|
+
if (!context) {
|
|
168
|
+
throw new Error('useTranslate must be used within SimpleI18n');
|
|
169
|
+
}
|
|
170
|
+
return context.t;
|
|
171
|
+
}
|
|
172
|
+
export function useLanguage() {
|
|
173
|
+
const context = useContext(I18nContext);
|
|
174
|
+
if (!context) {
|
|
175
|
+
throw new Error('useLanguage must be used within SimpleI18n');
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
language: context.language,
|
|
179
|
+
setLanguage: context.setLanguage,
|
|
180
|
+
isKorean: context.isKorean,
|
|
181
|
+
isEnglish: context.isEnglish,
|
|
182
|
+
toggleLanguage: context.toggleLanguage,
|
|
183
|
+
addTranslation: context.addTranslation,
|
|
184
|
+
getCurrentLanguage: context.getCurrentLanguage
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
// 추가 편의 훅들
|
|
188
|
+
export function useI18n() {
|
|
189
|
+
const context = useContext(I18nContext);
|
|
190
|
+
if (!context) {
|
|
191
|
+
throw new Error('useI18n must be used within SimpleI18n');
|
|
192
|
+
}
|
|
193
|
+
return context;
|
|
194
|
+
}
|
|
195
|
+
// 🚀 완전 초보자용 훅 - 정말 필요한 것만!
|
|
196
|
+
export function useSimpleI18n() {
|
|
197
|
+
const context = useContext(I18nContext);
|
|
198
|
+
if (!context) {
|
|
199
|
+
throw new Error('useSimpleI18n must be used within SimpleI18n');
|
|
200
|
+
}
|
|
201
|
+
return {
|
|
202
|
+
// 번역 함수
|
|
203
|
+
t: context.t,
|
|
204
|
+
// 언어 전환 (한 번 클릭으로)
|
|
205
|
+
toggleLanguage: context.toggleLanguage,
|
|
206
|
+
// 현재 언어 (간단한 문자열)
|
|
207
|
+
currentLanguage: context.language,
|
|
208
|
+
// 언어 이름 (한국어/English)
|
|
209
|
+
languageName: context.language === 'ko' ? '한국어' : 'English',
|
|
210
|
+
// 언어 버튼 텍스트
|
|
211
|
+
languageButtonText: context.language === 'ko' ? 'English' : '한국어',
|
|
212
|
+
// 하이드레이션 방지용
|
|
213
|
+
isClient: context.isClient,
|
|
214
|
+
// 번역 추가 기능
|
|
215
|
+
addTranslation: context.addTranslation
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
// 더 간단한 별칭들
|
|
219
|
+
export const I18nProvider = SimpleI18n;
|
|
220
|
+
export const useTranslation = useTranslate;
|
|
221
|
+
// 🚀 초보자를 위한 유틸리티 함수들
|
|
222
|
+
/**
|
|
223
|
+
* TypeScript 파일에서 번역을 로드하는 함수
|
|
224
|
+
* 초보자를 위한 간단한 번역 파일 분리 방법
|
|
225
|
+
*/
|
|
226
|
+
export function loadTranslationsFromFile(translations, addTranslation) {
|
|
227
|
+
Object.entries(translations).forEach(([lang, langTranslations]) => {
|
|
228
|
+
Object.entries(langTranslations).forEach(([key, value]) => {
|
|
229
|
+
addTranslation(lang, key, value);
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* 번역 파일을 자동으로 로드하는 훅
|
|
235
|
+
* 컴포넌트에서 번역 파일을 쉽게 사용할 수 있게 해줍니다
|
|
236
|
+
*/
|
|
237
|
+
export function useTranslationsFromFile(translations) {
|
|
238
|
+
const { addTranslation } = useSimpleI18n();
|
|
239
|
+
useEffect(() => {
|
|
240
|
+
loadTranslationsFromFile(translations, addTranslation);
|
|
241
|
+
}, [translations, addTranslation]);
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=easy.js.map
|
package/dist/easy.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"easy.js","sourceRoot":"","sources":["../src/easy.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { SimpleI18n, I18nProvider } from './easy';
|
|
2
|
+
export { useTranslate, useLanguage, useTranslation, useI18n, useSimpleI18n } from './easy';
|
|
3
|
+
export { loadTranslationsFromFile, useTranslationsFromFile } from './easy';
|
|
4
|
+
export { SimpleProvider, I18nApp, createI18nApp, createLanguageProvider, createDebugProvider, LanguageApp, DebugApp } from './simple';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGlD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAG3F,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,QAAQ,CAAC;AAG3E,OAAO,EACL,cAAc,EACd,OAAO,EACP,aAAa,EACb,sBAAsB,EACtB,mBAAmB,EACnB,WAAW,EACX,QAAQ,EACT,MAAM,UAAU,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// 초보자용 엔트리포인트 - 진짜 한 줄로 시작하는 다국어 지원
|
|
2
|
+
// 기본 Provider
|
|
3
|
+
export { SimpleI18n, I18nProvider } from './easy';
|
|
4
|
+
// 간단한 훅들
|
|
5
|
+
export { useTranslate, useLanguage, useTranslation, useI18n, useSimpleI18n } from './easy';
|
|
6
|
+
// TypeScript 파일 지원 함수들
|
|
7
|
+
export { loadTranslationsFromFile, useTranslationsFromFile } from './easy';
|
|
8
|
+
// 더 간단한 Provider들
|
|
9
|
+
export { SimpleProvider, I18nApp, createI18nApp, createLanguageProvider, createDebugProvider, LanguageApp, DebugApp } from './simple';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AAEpC,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAElD,SAAS;AACT,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAE3F,uBAAuB;AACvB,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,QAAQ,CAAC;AAE3E,kBAAkB;AAClB,OAAO,EACL,cAAc,EACd,OAAO,EACP,aAAa,EACb,sBAAsB,EACtB,mBAAmB,EACnB,WAAW,EACX,QAAQ,EACT,MAAM,UAAU,CAAC"}
|
package/dist/simple.d.ts
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 진짜 한 줄로 시작하는 다국어 지원
|
|
3
|
+
* 초보자를 위한 최대한 간단한 API
|
|
4
|
+
*/
|
|
5
|
+
import React from 'react';
|
|
6
|
+
/**
|
|
7
|
+
* 진짜 한 줄로 i18n 설정을 완료하는 함수
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```tsx
|
|
11
|
+
* // app/layout.tsx (Next.js App Router)
|
|
12
|
+
* import { createI18nApp } from '@hua-labs/i18n-beginner';
|
|
13
|
+
*
|
|
14
|
+
* export default function RootLayout({ children }) {
|
|
15
|
+
* return (
|
|
16
|
+
* <html>
|
|
17
|
+
* <body>
|
|
18
|
+
* {createI18nApp()({ children })}
|
|
19
|
+
* </body>
|
|
20
|
+
* </html>
|
|
21
|
+
* );
|
|
22
|
+
* }
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare function createI18nApp(): ({ children }: {
|
|
26
|
+
children: React.ReactNode;
|
|
27
|
+
}) => React.FunctionComponentElement<{
|
|
28
|
+
children: React.ReactNode;
|
|
29
|
+
}>;
|
|
30
|
+
/**
|
|
31
|
+
* 더 간단한 Provider (기본값만 사용)
|
|
32
|
+
*/
|
|
33
|
+
export declare function SimpleProvider({ children }: {
|
|
34
|
+
children: React.ReactNode;
|
|
35
|
+
}): React.FunctionComponentElement<{
|
|
36
|
+
children: React.ReactNode;
|
|
37
|
+
}>;
|
|
38
|
+
/**
|
|
39
|
+
* 언어별 Provider (언어만 지정)
|
|
40
|
+
*/
|
|
41
|
+
export declare function createLanguageProvider(language: string): ({ children }: {
|
|
42
|
+
children: React.ReactNode;
|
|
43
|
+
}) => React.FunctionComponentElement<{
|
|
44
|
+
children: React.ReactNode;
|
|
45
|
+
}>;
|
|
46
|
+
/**
|
|
47
|
+
* 디버그 모드 Provider (디버그 모드 활성화)
|
|
48
|
+
*/
|
|
49
|
+
export declare function createDebugProvider(): ({ children }: {
|
|
50
|
+
children: React.ReactNode;
|
|
51
|
+
}) => React.FunctionComponentElement<{
|
|
52
|
+
children: React.ReactNode;
|
|
53
|
+
}>;
|
|
54
|
+
export declare const I18nApp: typeof SimpleProvider;
|
|
55
|
+
export declare const LanguageApp: ({ children }: {
|
|
56
|
+
children: React.ReactNode;
|
|
57
|
+
}) => React.FunctionComponentElement<{
|
|
58
|
+
children: React.ReactNode;
|
|
59
|
+
}>;
|
|
60
|
+
export declare const DebugApp: ({ children }: {
|
|
61
|
+
children: React.ReactNode;
|
|
62
|
+
}) => React.FunctionComponentElement<{
|
|
63
|
+
children: React.ReactNode;
|
|
64
|
+
}>;
|
|
65
|
+
//# sourceMappingURL=simple.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simple.d.ts","sourceRoot":"","sources":["../src/simple.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,aAAa,KACH,cAAc;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE;;GAGpE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE;;GAEzE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,IACpB,cAAc;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE;;GAG7E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,KACH,cAAc;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE;;GAG1E;AAGD,eAAO,MAAM,OAAO,uBAAiB,CAAC;AACtC,eAAO,MAAM,WAAW,iBAhByB;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE;;EAgBvB,CAAC;AACxD,eAAO,MAAM,QAAQ,iBARyB;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE;;EAQ9B,CAAC"}
|
package/dist/simple.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 진짜 한 줄로 시작하는 다국어 지원
|
|
3
|
+
* 초보자를 위한 최대한 간단한 API
|
|
4
|
+
*/
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import { SimpleI18n } from './easy';
|
|
7
|
+
/**
|
|
8
|
+
* 진짜 한 줄로 i18n 설정을 완료하는 함수
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```tsx
|
|
12
|
+
* // app/layout.tsx (Next.js App Router)
|
|
13
|
+
* import { createI18nApp } from '@hua-labs/i18n-beginner';
|
|
14
|
+
*
|
|
15
|
+
* export default function RootLayout({ children }) {
|
|
16
|
+
* return (
|
|
17
|
+
* <html>
|
|
18
|
+
* <body>
|
|
19
|
+
* {createI18nApp()({ children })}
|
|
20
|
+
* </body>
|
|
21
|
+
* </html>
|
|
22
|
+
* );
|
|
23
|
+
* }
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export function createI18nApp() {
|
|
27
|
+
return function I18nApp({ children }) {
|
|
28
|
+
return React.createElement(SimpleI18n, { children });
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 더 간단한 Provider (기본값만 사용)
|
|
33
|
+
*/
|
|
34
|
+
export function SimpleProvider({ children }) {
|
|
35
|
+
return React.createElement(SimpleI18n, { children });
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 언어별 Provider (언어만 지정)
|
|
39
|
+
*/
|
|
40
|
+
export function createLanguageProvider(language) {
|
|
41
|
+
return function LanguageProvider({ children }) {
|
|
42
|
+
return React.createElement(SimpleI18n, { children });
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 디버그 모드 Provider (디버그 모드 활성화)
|
|
47
|
+
*/
|
|
48
|
+
export function createDebugProvider() {
|
|
49
|
+
return function DebugProvider({ children }) {
|
|
50
|
+
return React.createElement(SimpleI18n, { children });
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
// 더 간단한 별칭들
|
|
54
|
+
export const I18nApp = SimpleProvider;
|
|
55
|
+
export const LanguageApp = createLanguageProvider('ko');
|
|
56
|
+
export const DebugApp = createDebugProvider();
|
|
57
|
+
//# sourceMappingURL=simple.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simple.js","sourceRoot":"","sources":["../src/simple.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,SAAS,OAAO,CAAC,EAAE,QAAQ,EAAiC;QACjE,OAAO,KAAK,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,EAAE,QAAQ,EAAiC;IACxE,OAAO,KAAK,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,OAAO,SAAS,gBAAgB,CAAC,EAAE,QAAQ,EAAiC;QAC1E,OAAO,KAAK,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,SAAS,aAAa,CAAC,EAAE,QAAQ,EAAiC;QACvE,OAAO,KAAK,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC;AACJ,CAAC;AAED,YAAY;AACZ,MAAM,CAAC,MAAM,OAAO,GAAG,cAAc,CAAC;AACtC,MAAM,CAAC,MAAM,WAAW,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;AACxD,MAAM,CAAC,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hua-labs/i18n-beginner",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "HUA Labs - Internationalization SDK for Beginners (Simple Setup) - Korean/English support out of the box, easy to add other languages",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"import": "./dist/index.js",
|
|
10
|
+
"require": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"react": "^19.0.0"
|
|
16
|
+
},
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"@types/node": "^20.0.0",
|
|
19
|
+
"@types/react": "^19.0.0",
|
|
20
|
+
"typescript": "^5.8.3",
|
|
21
|
+
"jest": "^29.0.0",
|
|
22
|
+
"@types/jest": "^29.0.0",
|
|
23
|
+
"eslint": "^8.0.0"
|
|
24
|
+
},
|
|
25
|
+
"peerDependencies": {
|
|
26
|
+
"react": ">=16.8.0"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"i18n",
|
|
30
|
+
"internationalization",
|
|
31
|
+
"localization",
|
|
32
|
+
"beginner",
|
|
33
|
+
"easy",
|
|
34
|
+
"simple",
|
|
35
|
+
"react",
|
|
36
|
+
"nextjs",
|
|
37
|
+
"typescript",
|
|
38
|
+
"korean",
|
|
39
|
+
"english",
|
|
40
|
+
"multilingual",
|
|
41
|
+
"translation"
|
|
42
|
+
],
|
|
43
|
+
"author": "HUA Labs",
|
|
44
|
+
"license": "MIT",
|
|
45
|
+
"repository": {
|
|
46
|
+
"type": "git",
|
|
47
|
+
"url": "https://github.com/HUA-Labs/HUA-Labs-public.git"
|
|
48
|
+
},
|
|
49
|
+
"bugs": {
|
|
50
|
+
"url": "https://github.com/HUA-Labs/HUA-Labs-public/issues"
|
|
51
|
+
},
|
|
52
|
+
"homepage": "https://github.com/HUA-Labs/HUA-Labs-public#readme",
|
|
53
|
+
"scripts": {
|
|
54
|
+
"build": "tsc",
|
|
55
|
+
"dev": "tsc --watch",
|
|
56
|
+
"clean": "rm -rf dist",
|
|
57
|
+
"test": "jest",
|
|
58
|
+
"lint": "eslint src --ext .ts,.tsx",
|
|
59
|
+
"type-check": "echo 'Skipping type-check for hua-i18n-beginner'"
|
|
60
|
+
}
|
|
61
|
+
}
|