k2-im 0.1.18 → 0.1.20

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/dist/i18n.d.ts CHANGED
@@ -32,7 +32,7 @@ interface ConversationRef<TType extends ConversationType = ConversationType> {
32
32
  conversationId: string;
33
33
  }
34
34
  /** 消息内容类型。sticker=表情/贴图(BMessage contentType=7);call=单聊通话记录(contentType=10);transfer=转账(contentType=16);miniProgram=小程序分享卡(contentType=22);redPacket=红包卡(contentType=25);game=小游戏(contentType=27);未知 wire 正文统一归一为 unknown。 */
35
- type MessageContentType = 'text' | 'system' | 'image' | 'video' | 'voice' | 'file' | 'sticker' | 'contact' | 'miniProgram' | 'game' | 'transfer' | 'call' | 'redPacket' | 'unknown';
35
+ type MessageContentType = 'text' | 'system' | 'image' | 'video' | 'voice' | 'file' | 'sticker' | 'contact' | 'miniProgram' | 'game' | 'transfer' | 'call' | 'redPacket' | 'mediaAlbum' | 'unknown';
36
36
  /**
37
37
  * 发送态(客户端态):消息从本地创建到服务端确认的生命周期。
38
38
  * `uploading` 仅媒体消息使用:文件上传阶段(uploading→pending→sending→sent);
@@ -42,7 +42,7 @@ type MessageSendStatus = 'pending' | 'uploading' | 'sending' | 'sent' | 'failed'
42
42
  /** 送达/已读态(服务端态):消息在对端的回执状态。 */
43
43
  type MessageReceipt = 'unread' | 'delivered' | 'read';
44
44
  /** 群系统提示事件类型(结构化语义;UI/i18n 层据此渲染文案,**不在 mapper 写死中文**)。 */
45
- type ImSystemEventType = 'direct_contact_established' | 'direct_contact_required' | 'direct_message_refused' | 'group_info_changed' | 'group_activated' | 'group_member_joined' | 'group_member_invited' | 'group_member_left' | 'group_member_removed' | 'group_master_changed' | 'group_dismissed' | 'group_member_renamed' | 'group_message_pinned' | 'group_message_unpinned' | 'channel_name_changed' | 'channel_avatar_changed' | 'channel_announcement_changed' | 'channel_member_joined' | 'channel_member_invited' | 'channel_member_left' | 'channel_member_removed' | 'channel_owner_transferred' | 'channel_admin_added' | 'channel_admin_removed' | 'channel_dismissed' | 'channel_all_muted' | 'channel_all_unmuted' | 'channel_created' | 'channel_private_chat_disabled' | 'channel_private_chat_enabled' | 'channel_member_renamed' | 'channel_member_muted' | 'channel_member_unmuted' | 'channel_message_pinned' | 'channel_message_unpinned' | 'channel_unknown' | 'red_packet_claimed' | 'red_packet_claimed_thunder' | 'unknown';
45
+ type ImSystemEventType = 'direct_contact_established' | 'direct_contact_required' | 'direct_message_refused' | 'group_info_changed' | 'group_activated' | 'group_member_joined' | 'group_member_invited' | 'group_member_left' | 'group_member_removed' | 'group_master_changed' | 'group_dismissed' | 'group_member_renamed' | 'group_message_pinned' | 'group_message_unpinned' | 'group_call_started' | 'group_call_ended' | 'group_call_missed' | 'channel_name_changed' | 'channel_avatar_changed' | 'channel_announcement_changed' | 'channel_member_joined' | 'channel_member_invited' | 'channel_member_left' | 'channel_member_removed' | 'channel_owner_transferred' | 'channel_admin_added' | 'channel_admin_removed' | 'channel_dismissed' | 'channel_all_muted' | 'channel_all_unmuted' | 'channel_created' | 'channel_private_chat_disabled' | 'channel_private_chat_enabled' | 'channel_member_renamed' | 'channel_member_muted' | 'channel_member_unmuted' | 'channel_message_pinned' | 'channel_message_unpinned' | 'channel_unknown' | 'red_packet_claimed' | 'red_packet_claimed_thunder' | 'unknown';
46
46
  /** 系统提示结构化内容(contentType==='system'):存语义,不把最终中文句子当主数据源(UI/composable 据 eventType + 资料生成文案)。 */
47
47
  interface ImSystemMessageBody {
48
48
  eventType: ImSystemEventType;
@@ -109,6 +109,18 @@ type LastMessageSummary = {
109
109
  } | {
110
110
  kind: 'voice';
111
111
  durationMs?: number;
112
+ }
113
+ /**
114
+ * 媒体合集(contentType 28)。
115
+ *
116
+ * 只给结构化计数与配文,**不在这里拼「2 张照片, 1 个视频」这种文案**——中英文的量词、复数与
117
+ * 连接符各不相同,必须由 im-i18n 按 locale 组装。`caption` 非空时宿主优先显示配文(对齐三端)。
118
+ */
119
+ | {
120
+ kind: 'mediaAlbum';
121
+ imageCount: number;
122
+ videoCount: number;
123
+ caption?: string;
112
124
  } | {
113
125
  kind: 'encrypted';
114
126
  } | {
@@ -405,6 +417,59 @@ interface UnknownMessageBody {
405
417
  reason: 'unsupported-content-type' | 'malformed-content';
406
418
  }
407
419
  /** 按 contentType 的结构化内容体。 */
420
+ /**
421
+ * 媒体合集单项:一张图片或一个视频。
422
+ *
423
+ * 对应协议 `content` JSON 里 `items[]` 的一个元素(wire `mediaType` 1=图片 2=视频)。
424
+ * 与 `ImImageBody` / `ImVideoBody` 的区别是它**不是**独立的一条消息——同一条合集消息里的
425
+ * 若干项共享消息级的撤回、已读、引用与转发语义。
426
+ */
427
+ interface ImMediaAlbumItem {
428
+ /** 该项是图片还是视频;由协议 `mediaType` 归一而来,未知取值的项在解析阶段已被丢弃。 */
429
+ kind: 'image' | 'video';
430
+ /** 远端地址。加密项也是这个地址,解密用本项自己的 `teaKey`。 */
431
+ url: string;
432
+ /** 原始像素宽。宫格按它判定朝向,为 0 时宿主用兜底几何。 */
433
+ width: number;
434
+ /** 原始像素高。 */
435
+ height: number;
436
+ /**
437
+ * 视频时长,**毫秒**。
438
+ *
439
+ * 协议 `items[].duration` 本身就是毫秒,这里不做换算——注意这与单视频消息
440
+ * `ImVideoBody.duration`(秒)单位不同,所以刻意用 `durationMs` 命名区分。图片项没有此字段。
441
+ */
442
+ durationMs?: number;
443
+ /** 远端缩略图地址;可能缺省,此时只能用 `thumbData`。 */
444
+ thumbUrl?: string;
445
+ /** 内嵌缩略图/封面 JPEG 字节。加密消息服务端出不了封面,宫格首屏只能靠它。 */
446
+ thumbData?: Uint8Array;
447
+ /** 原文件 MD5。 */
448
+ md5?: string;
449
+ /** 原文件大小(字节)。 */
450
+ size?: number;
451
+ /** 本项的文件解密 TEA key;`fileEncryptType` 为 0/2/3 时必有。 */
452
+ teaKey?: Uint8Array;
453
+ /** 文件加密类型:0=跟随消息 1=不加密 2=前 32 字节 TEA 3=完整 TEA。 */
454
+ fileEncryptType?: number;
455
+ /** 发送方勾选了「原图」。仅作展示角标,不影响下载与解密。 */
456
+ hd?: boolean;
457
+ }
458
+ /**
459
+ * 媒体合集正文(`contentType === 'mediaAlbum'`,协议 28)。
460
+ *
461
+ * 一条消息同时承载一段可选配文和 1–9 个图片/视频项。产品上的「图文消息」就是
462
+ * `items.length === 1 && caption` 非空的情形,所以**分档判断一律看 `items.length`,不要看 contentType**。
463
+ *
464
+ * `items` 为空数组只会出现在入站解析残缺时(所有项的 `mediaType` 都不认识,或都无法解密);
465
+ * 这种正文不可出站——出站编码会显式拒绝,避免把坏消息转发出去。
466
+ */
467
+ interface ImMediaAlbumBody {
468
+ /** 配文;缺省与空串等价,出站不写空串。 */
469
+ caption?: string;
470
+ /** 媒体项,顺序即用户选择顺序(决定宫格 index 与首项朝向)。 */
471
+ items: readonly ImMediaAlbumItem[];
472
+ }
408
473
  interface ImMessageBody {
409
474
  /** P0 文本内容(明文,解密后的结果)。 */
410
475
  text?: string;
@@ -432,6 +497,8 @@ interface ImMessageBody {
432
497
  call?: ImCallRecordBody;
433
498
  /** contentType==='redPacket' 时的红包卡片。 */
434
499
  redPacket?: ImRedPacketBody;
500
+ /** contentType==='mediaAlbum' 时的媒体合集正文(配文 + 1~9 个图片/视频项)。 */
501
+ mediaAlbum?: ImMediaAlbumBody;
435
502
  /** contentType==='unknown' 时的稳定未知正文,不含原始 wire type。 */
436
503
  unknown?: UnknownMessageBody;
437
504
  }
@@ -466,7 +533,7 @@ type ImMessageFailureReason = 'timeout' | 'rejected' | 'encrypt_failed' | 'netwo
466
533
  * 失败**展示语义**码(强类型枚举,非裸串):供 im-i18n 按 locale 渲染失败气泡文案。
467
534
  * 由 `reason` / `SendMediaFailReason` / ACK errcode 穷尽映射而来,与 im-i18n failure catalog 键一一对应(media.* 带 mediaKind 参数)。
468
535
  */
469
- type ImFailureDisplayCode = 'media.empty' | 'media.noCrypto' | 'media.previewFailed' | 'media.encryptFailed' | 'media.uploadFailed' | 'media.cancelled' | 'media.invalidDuration' | 'media.uploadInterrupted' | 'contactRequired' | 'messageRefused' | 'forbiddenOrLeft' | 'contentRejected' | 'groupDismissed' | 'groupUnavailable' | 'channelDismissed' | 'channelMuted' | 'channelNotMember' | 'channelAdminRequired' | 'conversationUnsupported' | 'sendCanceled' | 'sessionLoggedOut' | 'timeout' | 'network' | 'unknown';
536
+ type ImFailureDisplayCode = 'media.empty' | 'media.noCrypto' | 'media.previewFailed' | 'media.encryptFailed' | 'media.uploadFailed' | 'media.cancelled' | 'media.invalidDuration' | 'media.uploadInterrupted' | 'media.contentTooLarge' | 'contactRequired' | 'messageRefused' | 'forbiddenOrLeft' | 'contentRejected' | 'groupDismissed' | 'groupUnavailable' | 'channelDismissed' | 'channelMuted' | 'channelNotMember' | 'channelAdminRequired' | 'conversationUnsupported' | 'sendCanceled' | 'sessionLoggedOut' | 'timeout' | 'network' | 'unknown';
470
537
  interface ImMessageFailure {
471
538
  /** 归一后的错误码(来自 MESChatAck.errcode 或本地失败码,本地码用负值)。 */
472
539
  code: number;
@@ -723,6 +790,14 @@ interface ImSystemCatalog {
723
790
  groupMessagePinned: string;
724
791
  /** 移除置顶。参数:{operator}。 */
725
792
  groupMessageUnpinned: string;
793
+ /** 自己发起群通话。对齐 Android `you_started_a_group_call` / iOS `rea_yousendgroupmediasession`。 */
794
+ groupCallStartedBySelf: string;
795
+ /** 他人发起群通话。参数:{operator}。对齐 Android `somebody_started_a_group_call` / iOS `rea_othersendgroupmediasession`。 */
796
+ groupCallStarted: string;
797
+ /** 群通话已结束。对齐 Android `group_cal_ended` / iOS `rea_grouphaveend`。 */
798
+ groupCallEnded: string;
799
+ /** 群通话未接听。对齐 Android `group_call_missed` / iOS `rea_groupunconnect`。 */
800
+ groupCallMissed: string;
726
801
  channelNameChanged: string;
727
802
  channelAvatarChanged: string;
728
803
  channelAnnouncementChanged: string;
@@ -802,6 +877,18 @@ interface ImMediaCatalog {
802
877
  gameDice: string;
803
878
  /** 石头剪刀布消息的回复摘要。 */
804
879
  gameRockPaperScissors: string;
880
+ /**
881
+ * 媒体合集:多张照片,参数 `{count}`(≥2;恰好 1 项时复用 `image`,避免每种语言再写一套单数模板)。
882
+ *
883
+ * 这一组与 `lastMessage.mediaAlbum*` 是**两套文案**:会话列表带方括号(`[2 张照片]`),
884
+ * 引用摘要不带(`2 张照片`)。有配文的合集显示配文而不是这些文案,但那是调用方的取舍——
885
+ * 与单视频消息的 `describe` 一样,`formatMediaPlaceholder` 只负责类型占位,不读正文文本。
886
+ */
887
+ mediaAlbumPhotos: string;
888
+ /** 媒体合集:多个视频,参数 `{count}`(≥2;恰好 1 项时复用 `video`)。 */
889
+ mediaAlbumVideos: string;
890
+ /** 媒体合集:图片与视频混合,参数 `{photoCount}` `{videoCount}`(各语言自行决定量词与连接符)。 */
891
+ mediaAlbumMixed: string;
805
892
  }
806
893
  /** 失败气泡文案(formatFailure 用;逐字对齐 core 现有 ImMessageFailure.message,阶段 4b 零回归)。 */
807
894
  interface ImFailureCatalog {
@@ -823,6 +910,12 @@ interface ImFailureCatalog {
823
910
  mediaInvalidDuration: string;
824
911
  /** media.uploadInterrupted,参数 {label}。 */
825
912
  mediaUploadInterrupted: string;
913
+ /**
914
+ * media.contentTooLarge:媒体合集的出站正文体积未通过发送前闸门。
915
+ *
916
+ * 与其它 media.* 不同,**不带 {label}**——一条合集里可能同时有照片和视频,没有单一媒体类型名。
917
+ */
918
+ mediaContentTooLarge: string;
826
919
  /** direct 0x8201:双方已不是好友。 */
827
920
  contactRequired: string;
828
921
  /** direct 0x8212:消息因对方黑名单策略被拒收。 */
@@ -874,6 +967,15 @@ interface ImLastMessageCatalog {
874
967
  redPacket: string;
875
968
  /** 小游戏消息的统一会话列表摘要;不在列表中暴露骰子/RPS 的具体类型。 */
876
969
  game: string;
970
+ /**
971
+ * 媒体合集:多张照片,参数 `{count}`(≥2;恰好 1 项时复用 `image`,避免各语言再写一套单数模板)。
972
+ * 有配文的合集直接显示配文,不用这些 key。
973
+ */
974
+ mediaAlbumPhotos: string;
975
+ /** 媒体合集:多个视频,参数 `{count}`(≥2;恰好 1 项时复用 `video`)。 */
976
+ mediaAlbumVideos: string;
977
+ /** 媒体合集:图片与视频混合,参数 `{photoCount}` `{videoCount}`(各语言自行决定量词与连接符)。 */
978
+ mediaAlbumMixed: string;
877
979
  encrypted: string;
878
980
  /** 未注册或无法解析的正文。 */
879
981
  unknown: string;
@@ -889,7 +991,7 @@ interface ImLastMessageCatalog {
889
991
  * 二期收敛:kit 框架无关层不再直接产中文,改产本联合里的码 + 参数(如 {reason}/{label}/{size}),由宿主经 im-i18n 渲染。
890
992
  * 动态原始报错(error.message)作为 `{reason}` 参数拼接,不入 catalog(属诊断,不翻译)。
891
993
  */
892
- type ImServiceTextKey = 'common.notConnected' | 'common.selectOrOpenConversation' | 'common.conversationTypeNotReady' | 'common.conversationNotReady' | `recall.${RecallFailReason}` | `edit.${EditFailReason}` | 'localDelete.done' | 'localDelete.notFound' | 'localDelete.inFlight' | 'localDelete.failed' | 'channelDelete.notFound' | 'channelDelete.unsupported' | 'channelDelete.notSent' | 'channelDelete.unavailable' | 'channelDelete.forbidden' | 'channelDelete.timeout' | 'channelDelete.failed' | 'channelDelete.disconnected' | 'directBlock.contactRequired' | 'groupBlock.left' | 'groupBlock.removed' | 'groupBlock.dismissed' | 'groupBlock.unknownRestricted' | 'channelBlock.guest' | 'channelBlock.left' | 'channelBlock.removed' | 'channelBlock.dismissed' | 'channelBlock.muted' | 'channelBlock.allMembersMuted' | 'channelBlock.currentUserMuted' | 'channelBlock.blacklisted' | 'channelBlock.unknownRestricted' | 'channelProfile.loadFailed' | 'channelProfile.notFound' | 'channelProfile.retryAction' | 'channelMembers.title' | 'channelMembers.searchPlaceholder' | 'channelMembers.loading' | 'channelMembers.loadFailed' | 'channelMembers.retryAction' | 'channelMembers.empty' | 'channelMembers.loadingMore' | 'channelMembers.loadMoreFailed' | 'channelMembers.exhausted' | 'channelMembers.loadMoreAction' | 'label.image' | 'label.video' | 'label.file' | 'label.sticker' | 'send.failed' | 'send.retryFailed' | 'send.cancelFailed' | 'send.mediaFailed' | 'send.mediaEmpty' | 'send.mediaCancelled' | 'send.mediaCountLimit' | 'send.mediaTooLarge' | 'send.videoTooLong' | 'send.videoDurationUnavailable' | 'send.voiceEmpty' | 'send.voiceStorageNotConfigured' | 'send.voiceCancelled' | 'send.voiceFailed' | 'media.voiceNotReady' | 'media.voiceLoadEmpty' | 'media.voiceLoadFailed' | 'media.videoOpenEmpty' | 'media.videoLoadFailed' | 'media.imageInvalid' | 'media.imageLoadFailed' | 'media.fileDownloadEmpty' | 'media.fileDownloadFailed' | 'conversation.muteEnableFailed' | 'conversation.muteDisableFailed' | 'read.markReadFailed' | 'pinned.forbidden' | 'pinned.network' | 'pinned.contract' | 'pinned.unsupported' | 'pinned.failed' | 'pinned.previewUnavailable' | 'pinned.locateFailed' | 'pinned.recalled' | 'pinned.deleted' | 'pinned.protected' | 'pinned.pinAction' | 'pinned.unpinAction' | 'pinned.unpinConfirm' | 'pinned.cancelAction' | 'lifecycle.missingLoginState' | 'lifecycle.prepareFailed' | 'lifecycle.missingConnectParams' | 'lifecycle.connectFailed' | 'lifecycle.disposed' | 'forward.emptyInput' | 'forward.allSkipped' | 'forward.partialSkipped' | 'forward.done' | 'forward.failed';
994
+ type ImServiceTextKey = 'common.notConnected' | 'common.selectOrOpenConversation' | 'common.conversationTypeNotReady' | 'common.conversationNotReady' | `recall.${RecallFailReason}` | `edit.${EditFailReason}` | 'localDelete.done' | 'localDelete.notFound' | 'localDelete.inFlight' | 'localDelete.failed' | 'channelDelete.notFound' | 'channelDelete.unsupported' | 'channelDelete.notSent' | 'channelDelete.unavailable' | 'channelDelete.forbidden' | 'channelDelete.timeout' | 'channelDelete.failed' | 'channelDelete.disconnected' | 'directBlock.contactRequired' | 'groupBlock.left' | 'groupBlock.removed' | 'groupBlock.dismissed' | 'groupBlock.unknownRestricted' | 'channelBlock.guest' | 'channelBlock.left' | 'channelBlock.removed' | 'channelBlock.dismissed' | 'channelBlock.muted' | 'channelBlock.allMembersMuted' | 'channelBlock.currentUserMuted' | 'channelBlock.blacklisted' | 'channelBlock.unknownRestricted' | 'channelProfile.loadFailed' | 'channelProfile.notFound' | 'channelProfile.retryAction' | 'channelMembers.title' | 'channelMembers.searchPlaceholder' | 'channelMembers.loading' | 'channelMembers.loadFailed' | 'channelMembers.retryAction' | 'channelMembers.empty' | 'channelMembers.loadingMore' | 'channelMembers.loadMoreFailed' | 'channelMembers.exhausted' | 'channelMembers.loadMoreAction' | 'label.image' | 'label.video' | 'label.file' | 'label.sticker' | 'send.failed' | 'send.retryFailed' | 'send.cancelFailed' | 'send.mediaFailed' | 'send.mediaEmpty' | 'send.mediaCancelled' | 'send.mediaCountLimit' | 'send.mediaTooLarge' | 'send.mediaFormatMismatch' | 'send.videoTooLong' | 'send.videoDurationUnavailable' | 'send.voiceEmpty' | 'send.voiceStorageNotConfigured' | 'send.voiceCancelled' | 'send.voiceFailed' | 'media.uploadWaiting' | 'media.voiceNotReady' | 'media.voiceLoadEmpty' | 'media.voiceLoadFailed' | 'media.videoOpenEmpty' | 'media.videoLoadFailed' | 'media.imageInvalid' | 'media.imageLoadFailed' | 'media.fileDownloadEmpty' | 'media.fileDownloadFailed' | 'conversation.muteEnableFailed' | 'conversation.muteDisableFailed' | 'conversation.backgroundLoadFailed' | 'read.markReadFailed' | 'storage.failed' | 'sync.failed' | 'draft.saveFailed' | 'history.returnLatestFailed' | 'pinned.forbidden' | 'pinned.network' | 'pinned.contract' | 'pinned.unsupported' | 'pinned.failed' | 'pinned.previewUnavailable' | 'pinned.locateFailed' | 'pinned.recalled' | 'pinned.deleted' | 'pinned.protected' | 'pinned.pinAction' | 'pinned.unpinAction' | 'pinned.unpinConfirm' | 'pinned.cancelAction' | 'lifecycle.missingLoginState' | 'lifecycle.prepareFailed' | 'lifecycle.missingConnectParams' | 'lifecycle.connectFailed' | 'lifecycle.disposed' | 'forward.emptyInput' | 'forward.allSkipped' | 'forward.partialSkipped' | 'forward.done' | 'forward.failed';
893
995
  /** 命令/生命周期操作提示 catalog(key 齐全,模板含 {reason}/{label}/{size} 占位)。 */
894
996
  type ImServiceCatalog = Record<ImServiceTextKey, string>;
895
997
  /** 星期文案键按 JavaScript `Date#getDay()` 的 Sunday-first 顺序命名。 */
@@ -985,6 +1087,11 @@ interface ImI18n {
985
1087
  durationMs?: number;
986
1088
  stickerImageType?: number;
987
1089
  gameType?: ImGameType;
1090
+ callKind?: 'audio' | 'video';
1091
+ mediaAlbum?: {
1092
+ imageCount: number;
1093
+ videoCount: number;
1094
+ };
988
1095
  }) => string;
989
1096
  formatMentionAll: () => string;
990
1097
  formatFailure: (displayCode: ImFailureDisplayCode, opts?: {
@@ -1047,6 +1154,16 @@ interface FormatMediaPlaceholderContext {
1047
1154
  gameType?: ImGameType;
1048
1155
  /** 通话记录媒体类型;缺失时不把损坏正文伪装成语音或视频通话。 */
1049
1156
  callKind?: 'audio' | 'video';
1157
+ /**
1158
+ * 媒体合集的项数构成;缺失或两个计数都是 0 时返回空串,不假装有内容。
1159
+ *
1160
+ * **不含配文**:与单视频消息的 `describe` 一样,本函数只负责类型占位,正文文本由调用方决定
1161
+ * 要不要优先显示(引用摘要通常会把配文走自己的表情/@ 分段管线,不该从这里绕过去)。
1162
+ */
1163
+ mediaAlbum?: {
1164
+ imageCount: number;
1165
+ videoCount: number;
1166
+ };
1050
1167
  }
1051
1168
  /**
1052
1169
  * 媒体消息 → 单行占位文案(回复摘要 / 会话预览降级用)。对齐 use-message-preview:
package/dist/i18n.js CHANGED
@@ -1 +1 @@
1
- import'./chunk-SXY56EVC.js';export{a as DEFAULT_LOCALE,k as createImI18n,f as formatFailure,h as formatLastMessageSummary,i as formatMediaPlaceholder,j as formatMentionAll,l as formatServiceText,g as formatSystemMessage,c as getImTimeCatalog,b as normalizeImLocale,d as registerImCatalogOverrides,e as resetImCatalogOverrides}from'./chunk-G7IJFU6R.js';import'./chunk-RKZTPXBQ.js';import'./chunk-WOT6VMZA.js';
1
+ import'./chunk-SXY56EVC.js';export{a as DEFAULT_LOCALE,k as createImI18n,f as formatFailure,h as formatLastMessageSummary,i as formatMediaPlaceholder,j as formatMentionAll,l as formatServiceText,g as formatSystemMessage,c as getImTimeCatalog,b as normalizeImLocale,d as registerImCatalogOverrides,e as resetImCatalogOverrides}from'./chunk-IYDCZ2PY.js';import'./chunk-ZDD7A2BS.js';import'./chunk-WOT6VMZA.js';