@vibexnpm/talkx 3.0.4 → 3.0.6

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibexnpm/talkx",
3
- "version": "3.0.4",
3
+ "version": "3.0.6",
4
4
  "type": "module",
5
5
  "description": "TalkFlow SDK - Chat & WebRTC unified client",
6
6
  "main": "dist/talkflow-sdk.umd.js",
@@ -299,7 +299,14 @@ class TalkFlowClient extends EventEmitter {
299
299
  }
300
300
 
301
301
  /**
302
- * 브라우저 locale 감지 — {@code navigator.language} 를 BCP-47 소문자로 정규화. 비브라우저/미가용 시 null.
302
+ * 브라우저 locale 감지 — {@code navigator.language} 를 BCP-47 소문자로 정규화하고 지역 변형을 primary 로
303
+ * 축약한다({@code ko-KR → 'ko'}, {@code en-US → 'en'}). 단 {@code zh} 계열은 간체/번체 구분을 위해
304
+ * 변형을 보존한다({@code zh-TW → 'zh-tw'}). 비브라우저/미가용 시 null.
305
+ *
306
+ * <p>축약 이유(값공간 통일): 서버 저장·번역·요약 키는 짧은 코드({@code 'ko'}/{@code 'en'}) 기준이다. 시드가
307
+ * 지역 변형을 그대로 보내면 명시 요청({@code lang: 'en'})과 키가 분열되어 같은 언어 이중 생성·조회 miss 가
308
+ * 발생한다. 서버 {@code LanguageCode} 도 동일 규칙으로 축약하므로 어느 쪽으로 들어와도 같은 값이 된다.</p>
309
+ *
303
310
  * <p>{@link #registerUser} 자동 시드에 사용되며, 고객사 BFF 의 {@code /users/auth} 시드에도 쓸 수 있다.</p>
304
311
  * @returns {string|null}
305
312
  */
@@ -307,7 +314,33 @@ class TalkFlowClient extends EventEmitter {
307
314
  if (typeof navigator === 'undefined' || !navigator.language) {
308
315
  return null;
309
316
  }
310
- return navigator.language.trim().toLowerCase() || null;
317
+ return TalkFlowClient.normalizeLanguageCode(navigator.language);
318
+ }
319
+
320
+ /**
321
+ * 언어 코드 canonical 정규화 — 소문자 + 지역 변형 축약(zh 계열 보존). 서버 {@code LanguageCode} 규칙의 미러.
322
+ * <p>{@code 'OFF'}(원문 sentinel)는 대문자 그대로 유지한다. 빈 값은 null.</p>
323
+ * @param {string|null|undefined} code - BCP-47 코드(예 'ko-KR') / 'OFF' / null
324
+ * @returns {string|null}
325
+ */
326
+ static normalizeLanguageCode(code) {
327
+ if (!code || typeof code !== 'string') {
328
+ return null;
329
+ }
330
+ const trimmed = code.trim();
331
+ if (!trimmed) {
332
+ return null;
333
+ }
334
+ if (trimmed.toUpperCase() === 'OFF') {
335
+ return 'OFF';
336
+ }
337
+ const lower = trimmed.toLowerCase();
338
+ const dash = lower.indexOf('-');
339
+ if (dash < 0) {
340
+ return lower;
341
+ }
342
+ const primary = lower.slice(0, dash);
343
+ return primary === 'zh' ? lower : primary;
311
344
  }
312
345
 
313
346
  /**
@@ -319,8 +352,10 @@ class TalkFlowClient extends EventEmitter {
319
352
  * @returns {string|null}
320
353
  */
321
354
  static displayText(message, myLang) {
322
- if (message && message.translations && myLang && message.translations[myLang]) {
323
- return message.translations[myLang];
355
+ // myLang 도 canonical 로 정규화 — 앱이 'ko-KR' 처럼 지역 변형을 넘겨도 서버 저장 키('ko')와 일치시킨다.
356
+ const lang = TalkFlowClient.normalizeLanguageCode(myLang);
357
+ if (message && message.translations && lang && message.translations[lang]) {
358
+ return message.translations[lang];
324
359
  }
325
360
  return message ? message.content : null;
326
361
  }
package/types/index.d.ts CHANGED
@@ -1735,9 +1735,11 @@ export default class TalkFlowClient implements SdkEventEmitter<TalkFlowClientEve
1735
1735
  // 다국어 (Multilingual)
1736
1736
  /** 내 기본 선호 언어 설정 (전 방 공통) — BCP-47 / 'OFF'(원문) / null·''(미설정). 방별은 setMyRoomLanguage. */
1737
1737
  setPreferredLanguage(language: string | null): Promise<unknown>;
1738
- /** 브라우저 locale 감지 — navigator.language 를 BCP-47 소문자로. 비브라우저/미가용 시 null. */
1738
+ /** 브라우저 locale 감지 — 소문자 + 지역 변형 축약('ko-KR'→'ko', zh 계열은 'zh-tw' 보존). 비브라우저/미가용 시 null. */
1739
1739
  static detectBrowserLanguage(): string | null;
1740
- /** 표시 헬퍼 — message.translations[myLang] ?? message.content. */
1740
+ /** 언어 코드 canonical 정규화 — 소문자 + 지역 변형 축약(zh 보존). 서버 LanguageCode 규칙 미러. 'OFF' 는 유지. */
1741
+ static normalizeLanguageCode(code: string | null | undefined): string | null;
1742
+ /** 표시 헬퍼 — message.translations[myLang] ?? message.content. myLang 은 자동 canonical 정규화. */
1741
1743
  static displayText(message: ChatMessage, myLang?: string): string | null;
1742
1744
 
1743
1745
  // Push