@ethora/chat-component-rn 26.5.21 → 26.6.11

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.
Files changed (372) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/README.md +3 -3
  3. package/index.js +1 -1
  4. package/lib/commonjs/components/MainComponents/ChatHeader.js +20 -8
  5. package/lib/commonjs/components/MainComponents/ChatHeader.js.map +1 -1
  6. package/lib/commonjs/components/MainComponents/ChatWrapper.js +17 -0
  7. package/lib/commonjs/components/MainComponents/ChatWrapper.js.map +1 -1
  8. package/lib/commonjs/components/MainComponents/LanguageSelectorButton.js +62 -0
  9. package/lib/commonjs/components/MainComponents/LanguageSelectorButton.js.map +1 -0
  10. package/lib/commonjs/components/MainComponents/LanguageSelectorModal.js +253 -0
  11. package/lib/commonjs/components/MainComponents/LanguageSelectorModal.js.map +1 -0
  12. package/lib/commonjs/components/MainComponents/MediaMessage.js +7 -1
  13. package/lib/commonjs/components/MainComponents/MediaMessage.js.map +1 -1
  14. package/lib/commonjs/components/MainComponents/RoomList.js +23 -9
  15. package/lib/commonjs/components/MainComponents/RoomList.js.map +1 -1
  16. package/lib/commonjs/components/MessageBubble/Message.js +72 -11
  17. package/lib/commonjs/components/MessageBubble/Message.js.map +1 -1
  18. package/lib/commonjs/components/MessageBubble/MessageTranslate.js +160 -0
  19. package/lib/commonjs/components/MessageBubble/MessageTranslate.js.map +1 -0
  20. package/lib/commonjs/components/MessageBubble/TranslatedMessageBody.js +59 -0
  21. package/lib/commonjs/components/MessageBubble/TranslatedMessageBody.js.map +1 -0
  22. package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js +3 -3
  23. package/lib/commonjs/components/UsersList/UsersList.js +3 -1
  24. package/lib/commonjs/components/UsersList/UsersList.js.map +1 -1
  25. package/lib/commonjs/components/VideoCalls/CallButtons.js +159 -0
  26. package/lib/commonjs/components/VideoCalls/CallButtons.js.map +1 -0
  27. package/lib/commonjs/components/VideoCalls/CallIcons.js +328 -0
  28. package/lib/commonjs/components/VideoCalls/CallIcons.js.map +1 -0
  29. package/lib/commonjs/components/VideoCalls/VideoCallOverlay.js +550 -0
  30. package/lib/commonjs/components/VideoCalls/VideoCallOverlay.js.map +1 -0
  31. package/lib/commonjs/components/VideoCalls/VideoCallSession.js +636 -0
  32. package/lib/commonjs/components/VideoCalls/VideoCallSession.js.map +1 -0
  33. package/lib/commonjs/components/VideoCalls/livekitRuntime.js +91 -0
  34. package/lib/commonjs/components/VideoCalls/livekitRuntime.js.map +1 -0
  35. package/lib/commonjs/components/VideoCalls/useCallKeep.js +215 -0
  36. package/lib/commonjs/components/VideoCalls/useCallKeep.js.map +1 -0
  37. package/lib/commonjs/components/styled/AudioMessage.js +91 -33
  38. package/lib/commonjs/components/styled/AudioMessage.js.map +1 -1
  39. package/lib/commonjs/components/styled/RoomListComponents/index.js +13 -1
  40. package/lib/commonjs/components/styled/RoomListComponents/index.js.map +1 -1
  41. package/lib/commonjs/components/styled/SendInput.js +83 -49
  42. package/lib/commonjs/components/styled/SendInput.js.map +1 -1
  43. package/lib/commonjs/components/styled/StyledComponents.js +9 -4
  44. package/lib/commonjs/components/styled/StyledComponents.js.map +1 -1
  45. package/lib/commonjs/components/styled/StyledInputComponents/Composing.js +2 -0
  46. package/lib/commonjs/components/styled/StyledInputComponents/Composing.js.map +1 -1
  47. package/lib/commonjs/components/styled/VideoMessage.js +110 -26
  48. package/lib/commonjs/components/styled/VideoMessage.js.map +1 -1
  49. package/lib/commonjs/context/xmppProvider.js +10 -3
  50. package/lib/commonjs/context/xmppProvider.js.map +1 -1
  51. package/lib/commonjs/helpers/callLogMessage.js +162 -0
  52. package/lib/commonjs/helpers/callLogMessage.js.map +1 -0
  53. package/lib/commonjs/helpers/callPush.js +61 -0
  54. package/lib/commonjs/helpers/callPush.js.map +1 -0
  55. package/lib/commonjs/helpers/constants/LANGUAGE_OPTIONS.js +24 -12
  56. package/lib/commonjs/helpers/constants/LANGUAGE_OPTIONS.js.map +1 -1
  57. package/lib/commonjs/helpers/createUserNameFromSetUser.js +51 -2
  58. package/lib/commonjs/helpers/createUserNameFromSetUser.js.map +1 -1
  59. package/lib/commonjs/helpers/getDataFromXml.js +19 -1
  60. package/lib/commonjs/helpers/getDataFromXml.js.map +1 -1
  61. package/lib/commonjs/helpers/incomingCallFromPush.js +74 -0
  62. package/lib/commonjs/helpers/incomingCallFromPush.js.map +1 -0
  63. package/lib/commonjs/helpers/insertMessageWithDelimiter.js +13 -1
  64. package/lib/commonjs/helpers/insertMessageWithDelimiter.js.map +1 -1
  65. package/lib/commonjs/helpers/isUnresolvedSenderId.js +32 -0
  66. package/lib/commonjs/helpers/isUnresolvedSenderId.js.map +1 -0
  67. package/lib/commonjs/hooks/useChatSettingState.js +2 -0
  68. package/lib/commonjs/hooks/useChatSettingState.js.map +1 -1
  69. package/lib/commonjs/hooks/useMessageTranslation.js +51 -0
  70. package/lib/commonjs/hooks/useMessageTranslation.js.map +1 -0
  71. package/lib/commonjs/hooks/usePushNotifications.js +13 -3
  72. package/lib/commonjs/hooks/usePushNotifications.js.map +1 -1
  73. package/lib/commonjs/hooks/useSendMessage.js +14 -4
  74. package/lib/commonjs/hooks/useSendMessage.js.map +1 -1
  75. package/lib/commonjs/i18n/strings.js +1308 -0
  76. package/lib/commonjs/i18n/strings.js.map +1 -0
  77. package/lib/commonjs/i18n/useT.js +60 -0
  78. package/lib/commonjs/i18n/useT.js.map +1 -0
  79. package/lib/commonjs/main.js +44 -0
  80. package/lib/commonjs/main.js.map +1 -1
  81. package/lib/commonjs/networking/api-requests/auth.api.js +81 -52
  82. package/lib/commonjs/networking/api-requests/auth.api.js.map +1 -1
  83. package/lib/commonjs/networking/api-requests/push.api.js +34 -5
  84. package/lib/commonjs/networking/api-requests/push.api.js.map +1 -1
  85. package/lib/commonjs/networking/api-requests/rooms.api.js +108 -0
  86. package/lib/commonjs/networking/api-requests/rooms.api.js.map +1 -1
  87. package/lib/commonjs/networking/callTokenStanza.js +531 -0
  88. package/lib/commonjs/networking/callTokenStanza.js.map +1 -0
  89. package/lib/commonjs/networking/outboundQueue.js.map +1 -1
  90. package/lib/commonjs/networking/stanzaHandlers.js +75 -8
  91. package/lib/commonjs/networking/stanzaHandlers.js.map +1 -1
  92. package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js +47 -11
  93. package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
  94. package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js +2 -1
  95. package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
  96. package/lib/commonjs/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js +42 -5
  97. package/lib/commonjs/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js.map +1 -1
  98. package/lib/commonjs/networking/xmppClient.js +78 -16
  99. package/lib/commonjs/networking/xmppClient.js.map +1 -1
  100. package/lib/commonjs/roomStore/callSlice.js +144 -0
  101. package/lib/commonjs/roomStore/callSlice.js.map +1 -0
  102. package/lib/commonjs/roomStore/chatSettingsSlice.js +8 -2
  103. package/lib/commonjs/roomStore/chatSettingsSlice.js.map +1 -1
  104. package/lib/commonjs/roomStore/index.js +7 -1
  105. package/lib/commonjs/roomStore/index.js.map +1 -1
  106. package/lib/commonjs/roomStore/persistence.js +69 -5
  107. package/lib/commonjs/roomStore/persistence.js.map +1 -1
  108. package/lib/commonjs/roomStore/roomsSlice.js +136 -6
  109. package/lib/commonjs/roomStore/roomsSlice.js.map +1 -1
  110. package/lib/commonjs/utils/translateModePolicy.js +33 -0
  111. package/lib/commonjs/utils/translateModePolicy.js.map +1 -0
  112. package/lib/module/components/MainComponents/ChatHeader.js +20 -8
  113. package/lib/module/components/MainComponents/ChatHeader.js.map +1 -1
  114. package/lib/module/components/MainComponents/ChatWrapper.js +17 -0
  115. package/lib/module/components/MainComponents/ChatWrapper.js.map +1 -1
  116. package/lib/module/components/MainComponents/LanguageSelectorButton.js +57 -0
  117. package/lib/module/components/MainComponents/LanguageSelectorButton.js.map +1 -0
  118. package/lib/module/components/MainComponents/LanguageSelectorModal.js +246 -0
  119. package/lib/module/components/MainComponents/LanguageSelectorModal.js.map +1 -0
  120. package/lib/module/components/MainComponents/MediaMessage.js +7 -1
  121. package/lib/module/components/MainComponents/MediaMessage.js.map +1 -1
  122. package/lib/module/components/MainComponents/RoomList.js +23 -9
  123. package/lib/module/components/MainComponents/RoomList.js.map +1 -1
  124. package/lib/module/components/MessageBubble/Message.js +73 -12
  125. package/lib/module/components/MessageBubble/Message.js.map +1 -1
  126. package/lib/module/components/MessageBubble/MessageTranslate.js +155 -0
  127. package/lib/module/components/MessageBubble/MessageTranslate.js.map +1 -0
  128. package/lib/module/components/MessageBubble/TranslatedMessageBody.js +53 -0
  129. package/lib/module/components/MessageBubble/TranslatedMessageBody.js.map +1 -0
  130. package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js +3 -3
  131. package/lib/module/components/UsersList/UsersList.js +3 -1
  132. package/lib/module/components/UsersList/UsersList.js.map +1 -1
  133. package/lib/module/components/VideoCalls/CallButtons.js +154 -0
  134. package/lib/module/components/VideoCalls/CallButtons.js.map +1 -0
  135. package/lib/module/components/VideoCalls/CallIcons.js +309 -0
  136. package/lib/module/components/VideoCalls/CallIcons.js.map +1 -0
  137. package/lib/module/components/VideoCalls/VideoCallOverlay.js +544 -0
  138. package/lib/module/components/VideoCalls/VideoCallOverlay.js.map +1 -0
  139. package/lib/module/components/VideoCalls/VideoCallSession.js +630 -0
  140. package/lib/module/components/VideoCalls/VideoCallSession.js.map +1 -0
  141. package/lib/module/components/VideoCalls/livekitRuntime.js +83 -0
  142. package/lib/module/components/VideoCalls/livekitRuntime.js.map +1 -0
  143. package/lib/module/components/VideoCalls/useCallKeep.js +210 -0
  144. package/lib/module/components/VideoCalls/useCallKeep.js.map +1 -0
  145. package/lib/module/components/styled/AudioMessage.js +91 -33
  146. package/lib/module/components/styled/AudioMessage.js.map +1 -1
  147. package/lib/module/components/styled/RoomListComponents/index.js +13 -1
  148. package/lib/module/components/styled/RoomListComponents/index.js.map +1 -1
  149. package/lib/module/components/styled/SendInput.js +83 -49
  150. package/lib/module/components/styled/SendInput.js.map +1 -1
  151. package/lib/module/components/styled/StyledComponents.js +9 -4
  152. package/lib/module/components/styled/StyledComponents.js.map +1 -1
  153. package/lib/module/components/styled/StyledInputComponents/Composing.js +2 -0
  154. package/lib/module/components/styled/StyledInputComponents/Composing.js.map +1 -1
  155. package/lib/module/components/styled/VideoMessage.js +111 -27
  156. package/lib/module/components/styled/VideoMessage.js.map +1 -1
  157. package/lib/module/context/xmppProvider.js +11 -4
  158. package/lib/module/context/xmppProvider.js.map +1 -1
  159. package/lib/module/helpers/callLogMessage.js +152 -0
  160. package/lib/module/helpers/callLogMessage.js.map +1 -0
  161. package/lib/module/helpers/callPush.js +55 -0
  162. package/lib/module/helpers/callPush.js.map +1 -0
  163. package/lib/module/helpers/constants/LANGUAGE_OPTIONS.js +24 -12
  164. package/lib/module/helpers/constants/LANGUAGE_OPTIONS.js.map +1 -1
  165. package/lib/module/helpers/createUserNameFromSetUser.js +49 -1
  166. package/lib/module/helpers/createUserNameFromSetUser.js.map +1 -1
  167. package/lib/module/helpers/getDataFromXml.js +20 -1
  168. package/lib/module/helpers/getDataFromXml.js.map +1 -1
  169. package/lib/module/helpers/incomingCallFromPush.js +70 -0
  170. package/lib/module/helpers/incomingCallFromPush.js.map +1 -0
  171. package/lib/module/helpers/insertMessageWithDelimiter.js +13 -1
  172. package/lib/module/helpers/insertMessageWithDelimiter.js.map +1 -1
  173. package/lib/module/helpers/isUnresolvedSenderId.js +27 -0
  174. package/lib/module/helpers/isUnresolvedSenderId.js.map +1 -0
  175. package/lib/module/hooks/useChatSettingState.js +2 -0
  176. package/lib/module/hooks/useChatSettingState.js.map +1 -1
  177. package/lib/module/hooks/useMessageTranslation.js +46 -0
  178. package/lib/module/hooks/useMessageTranslation.js.map +1 -0
  179. package/lib/module/hooks/usePushNotifications.js +13 -3
  180. package/lib/module/hooks/usePushNotifications.js.map +1 -1
  181. package/lib/module/hooks/useSendMessage.js +15 -5
  182. package/lib/module/hooks/useSendMessage.js.map +1 -1
  183. package/lib/module/i18n/strings.js +1300 -0
  184. package/lib/module/i18n/strings.js.map +1 -0
  185. package/lib/module/i18n/useT.js +55 -0
  186. package/lib/module/i18n/useT.js.map +1 -0
  187. package/lib/module/main.js +7 -1
  188. package/lib/module/main.js.map +1 -1
  189. package/lib/module/networking/api-requests/auth.api.js +80 -51
  190. package/lib/module/networking/api-requests/auth.api.js.map +1 -1
  191. package/lib/module/networking/api-requests/push.api.js +35 -5
  192. package/lib/module/networking/api-requests/push.api.js.map +1 -1
  193. package/lib/module/networking/api-requests/rooms.api.js +109 -1
  194. package/lib/module/networking/api-requests/rooms.api.js.map +1 -1
  195. package/lib/module/networking/callTokenStanza.js +526 -0
  196. package/lib/module/networking/callTokenStanza.js.map +1 -0
  197. package/lib/module/networking/outboundQueue.js.map +1 -1
  198. package/lib/module/networking/stanzaHandlers.js +76 -9
  199. package/lib/module/networking/stanzaHandlers.js.map +1 -1
  200. package/lib/module/networking/xmpp/handleStanzas.xmpp.js +48 -11
  201. package/lib/module/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
  202. package/lib/module/networking/xmpp/sendTextMessage.xmpp.js +1 -1
  203. package/lib/module/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
  204. package/lib/module/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js +43 -5
  205. package/lib/module/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js.map +1 -1
  206. package/lib/module/networking/xmppClient.js +78 -16
  207. package/lib/module/networking/xmppClient.js.map +1 -1
  208. package/lib/module/roomStore/callSlice.js +130 -0
  209. package/lib/module/roomStore/callSlice.js.map +1 -0
  210. package/lib/module/roomStore/chatSettingsSlice.js +6 -1
  211. package/lib/module/roomStore/chatSettingsSlice.js.map +1 -1
  212. package/lib/module/roomStore/index.js +6 -1
  213. package/lib/module/roomStore/index.js.map +1 -1
  214. package/lib/module/roomStore/persistence.js +69 -5
  215. package/lib/module/roomStore/persistence.js.map +1 -1
  216. package/lib/module/roomStore/roomsSlice.js +134 -5
  217. package/lib/module/roomStore/roomsSlice.js.map +1 -1
  218. package/lib/module/utils/translateModePolicy.js +27 -0
  219. package/lib/module/utils/translateModePolicy.js.map +1 -0
  220. package/lib/typescript/components/MainComponents/ChatHeader.d.ts.map +1 -1
  221. package/lib/typescript/components/MainComponents/ChatWrapper.d.ts.map +1 -1
  222. package/lib/typescript/components/MainComponents/LanguageSelectorButton.d.ts +12 -0
  223. package/lib/typescript/components/MainComponents/LanguageSelectorButton.d.ts.map +1 -0
  224. package/lib/typescript/components/MainComponents/LanguageSelectorModal.d.ts +31 -0
  225. package/lib/typescript/components/MainComponents/LanguageSelectorModal.d.ts.map +1 -0
  226. package/lib/typescript/components/MainComponents/MediaMessage.d.ts.map +1 -1
  227. package/lib/typescript/components/MainComponents/RoomList.d.ts.map +1 -1
  228. package/lib/typescript/components/MessageBubble/Message.d.ts.map +1 -1
  229. package/lib/typescript/components/MessageBubble/MessageTranslate.d.ts +44 -0
  230. package/lib/typescript/components/MessageBubble/MessageTranslate.d.ts.map +1 -0
  231. package/lib/typescript/components/MessageBubble/TranslatedMessageBody.d.ts +24 -0
  232. package/lib/typescript/components/MessageBubble/TranslatedMessageBody.d.ts.map +1 -0
  233. package/lib/typescript/components/UsersList/UsersList.d.ts.map +1 -1
  234. package/lib/typescript/components/VideoCalls/CallButtons.d.ts +16 -0
  235. package/lib/typescript/components/VideoCalls/CallButtons.d.ts.map +1 -0
  236. package/lib/typescript/components/VideoCalls/CallIcons.d.ts +30 -0
  237. package/lib/typescript/components/VideoCalls/CallIcons.d.ts.map +1 -0
  238. package/lib/typescript/components/VideoCalls/VideoCallOverlay.d.ts +10 -0
  239. package/lib/typescript/components/VideoCalls/VideoCallOverlay.d.ts.map +1 -0
  240. package/lib/typescript/components/VideoCalls/VideoCallSession.d.ts +38 -0
  241. package/lib/typescript/components/VideoCalls/VideoCallSession.d.ts.map +1 -0
  242. package/lib/typescript/components/VideoCalls/livekitRuntime.d.ts +52 -0
  243. package/lib/typescript/components/VideoCalls/livekitRuntime.d.ts.map +1 -0
  244. package/lib/typescript/components/VideoCalls/useCallKeep.d.ts +32 -0
  245. package/lib/typescript/components/VideoCalls/useCallKeep.d.ts.map +1 -0
  246. package/lib/typescript/components/styled/AudioMessage.d.ts.map +1 -1
  247. package/lib/typescript/components/styled/RoomListComponents/index.d.ts.map +1 -1
  248. package/lib/typescript/components/styled/SendInput.d.ts.map +1 -1
  249. package/lib/typescript/components/styled/StyledComponents.d.ts.map +1 -1
  250. package/lib/typescript/components/styled/StyledInputComponents/Composing.d.ts.map +1 -1
  251. package/lib/typescript/components/styled/VideoMessage.d.ts +2 -0
  252. package/lib/typescript/components/styled/VideoMessage.d.ts.map +1 -1
  253. package/lib/typescript/context/xmppProvider.d.ts.map +1 -1
  254. package/lib/typescript/helpers/callLogMessage.d.ts +34 -0
  255. package/lib/typescript/helpers/callLogMessage.d.ts.map +1 -0
  256. package/lib/typescript/helpers/callPush.d.ts +23 -0
  257. package/lib/typescript/helpers/callPush.d.ts.map +1 -0
  258. package/lib/typescript/helpers/constants/LANGUAGE_OPTIONS.d.ts +14 -0
  259. package/lib/typescript/helpers/constants/LANGUAGE_OPTIONS.d.ts.map +1 -1
  260. package/lib/typescript/helpers/createUserNameFromSetUser.d.ts +33 -1
  261. package/lib/typescript/helpers/createUserNameFromSetUser.d.ts.map +1 -1
  262. package/lib/typescript/helpers/getDataFromXml.d.ts.map +1 -1
  263. package/lib/typescript/helpers/incomingCallFromPush.d.ts +14 -0
  264. package/lib/typescript/helpers/incomingCallFromPush.d.ts.map +1 -0
  265. package/lib/typescript/helpers/insertMessageWithDelimiter.d.ts.map +1 -1
  266. package/lib/typescript/helpers/isUnresolvedSenderId.d.ts +2 -0
  267. package/lib/typescript/helpers/isUnresolvedSenderId.d.ts.map +1 -0
  268. package/lib/typescript/hooks/useChatSettingState.d.ts +2 -1
  269. package/lib/typescript/hooks/useChatSettingState.d.ts.map +1 -1
  270. package/lib/typescript/hooks/useMessageTranslation.d.ts +25 -0
  271. package/lib/typescript/hooks/useMessageTranslation.d.ts.map +1 -0
  272. package/lib/typescript/hooks/usePushNotifications.d.ts.map +1 -1
  273. package/lib/typescript/hooks/useSendMessage.d.ts.map +1 -1
  274. package/lib/typescript/i18n/strings.d.ts +16 -0
  275. package/lib/typescript/i18n/strings.d.ts.map +1 -0
  276. package/lib/typescript/i18n/useT.d.ts +34 -0
  277. package/lib/typescript/i18n/useT.d.ts.map +1 -0
  278. package/lib/typescript/main.d.ts +6 -1
  279. package/lib/typescript/main.d.ts.map +1 -1
  280. package/lib/typescript/networking/api-requests/auth.api.d.ts +27 -1
  281. package/lib/typescript/networking/api-requests/auth.api.d.ts.map +1 -1
  282. package/lib/typescript/networking/api-requests/push.api.d.ts.map +1 -1
  283. package/lib/typescript/networking/api-requests/rooms.api.d.ts +3 -0
  284. package/lib/typescript/networking/api-requests/rooms.api.d.ts.map +1 -1
  285. package/lib/typescript/networking/callTokenStanza.d.ts +14 -0
  286. package/lib/typescript/networking/callTokenStanza.d.ts.map +1 -0
  287. package/lib/typescript/networking/outboundQueue.d.ts +1 -0
  288. package/lib/typescript/networking/outboundQueue.d.ts.map +1 -1
  289. package/lib/typescript/networking/stanzaHandlers.d.ts.map +1 -1
  290. package/lib/typescript/networking/xmpp/handleStanzas.xmpp.d.ts.map +1 -1
  291. package/lib/typescript/networking/xmpp/sendTextMessage.xmpp.d.ts +10 -0
  292. package/lib/typescript/networking/xmpp/sendTextMessage.xmpp.d.ts.map +1 -1
  293. package/lib/typescript/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.d.ts +16 -1
  294. package/lib/typescript/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.d.ts.map +1 -1
  295. package/lib/typescript/networking/xmppClient.d.ts +1 -1
  296. package/lib/typescript/networking/xmppClient.d.ts.map +1 -1
  297. package/lib/typescript/roomStore/callSlice.d.ts +39 -0
  298. package/lib/typescript/roomStore/callSlice.d.ts.map +1 -0
  299. package/lib/typescript/roomStore/chatSettingsSlice.d.ts +10 -1
  300. package/lib/typescript/roomStore/chatSettingsSlice.d.ts.map +1 -1
  301. package/lib/typescript/roomStore/index.d.ts +4 -0
  302. package/lib/typescript/roomStore/index.d.ts.map +1 -1
  303. package/lib/typescript/roomStore/persistence.d.ts.map +1 -1
  304. package/lib/typescript/roomStore/roomsSlice.d.ts +6 -1
  305. package/lib/typescript/roomStore/roomsSlice.d.ts.map +1 -1
  306. package/lib/typescript/types/models/language.model.d.ts +1 -1
  307. package/lib/typescript/types/models/language.model.d.ts.map +1 -1
  308. package/lib/typescript/types/models/message.model.d.ts +7 -0
  309. package/lib/typescript/types/models/message.model.d.ts.map +1 -1
  310. package/lib/typescript/types/types.d.ts +135 -1
  311. package/lib/typescript/types/types.d.ts.map +1 -1
  312. package/lib/typescript/utils/translateModePolicy.d.ts +20 -0
  313. package/lib/typescript/utils/translateModePolicy.d.ts.map +1 -0
  314. package/package.json +20 -4
  315. package/src/components/MainComponents/ChatHeader.tsx +30 -9
  316. package/src/components/MainComponents/ChatWrapper.tsx +15 -0
  317. package/src/components/MainComponents/LanguageSelectorButton.tsx +53 -0
  318. package/src/components/MainComponents/LanguageSelectorModal.tsx +276 -0
  319. package/src/components/MainComponents/MediaMessage.tsx +5 -0
  320. package/src/components/MainComponents/RoomList.tsx +27 -9
  321. package/src/components/MessageBubble/Message.tsx +109 -17
  322. package/src/components/MessageBubble/MessageTranslate.tsx +182 -0
  323. package/src/components/MessageBubble/TranslatedMessageBody.tsx +59 -0
  324. package/src/components/Modals/FilePreviewModal/FilePreviewModal.tsx +3 -3
  325. package/src/components/UsersList/UsersList.tsx +3 -1
  326. package/src/components/VideoCalls/CallButtons.tsx +171 -0
  327. package/src/components/VideoCalls/CallIcons.tsx +246 -0
  328. package/src/components/VideoCalls/VideoCallOverlay.tsx +627 -0
  329. package/src/components/VideoCalls/VideoCallSession.tsx +675 -0
  330. package/src/components/VideoCalls/livekitRuntime.ts +100 -0
  331. package/src/components/VideoCalls/useCallKeep.ts +252 -0
  332. package/src/components/styled/AudioMessage.tsx +97 -37
  333. package/src/components/styled/RoomListComponents/index.tsx +15 -3
  334. package/src/components/styled/SendInput.tsx +94 -51
  335. package/src/components/styled/StyledComponents.ts +9 -6
  336. package/src/components/styled/StyledInputComponents/Composing.tsx +7 -1
  337. package/src/components/styled/VideoMessage.tsx +114 -20
  338. package/src/context/xmppProvider.tsx +14 -1
  339. package/src/helpers/callLogMessage.ts +174 -0
  340. package/src/helpers/callPush.ts +90 -0
  341. package/src/helpers/constants/LANGUAGE_OPTIONS.ts +20 -5
  342. package/src/helpers/createUserNameFromSetUser.ts +68 -2
  343. package/src/helpers/getDataFromXml.ts +40 -4
  344. package/src/helpers/incomingCallFromPush.ts +83 -0
  345. package/src/helpers/insertMessageWithDelimiter.ts +27 -9
  346. package/src/helpers/isUnresolvedSenderId.ts +25 -0
  347. package/src/hooks/useChatSettingState.tsx +4 -0
  348. package/src/hooks/useMessageTranslation.ts +70 -0
  349. package/src/hooks/usePushNotifications.ts +15 -3
  350. package/src/hooks/useSendMessage.tsx +18 -5
  351. package/src/i18n/strings.ts +1322 -0
  352. package/src/i18n/useT.ts +56 -0
  353. package/src/main.ts +18 -1
  354. package/src/networking/api-requests/auth.api.ts +79 -44
  355. package/src/networking/api-requests/push.api.ts +39 -8
  356. package/src/networking/api-requests/rooms.api.ts +109 -1
  357. package/src/networking/callTokenStanza.ts +636 -0
  358. package/src/networking/outboundQueue.ts +1 -0
  359. package/src/networking/stanzaHandlers.ts +74 -15
  360. package/src/networking/xmpp/handleStanzas.xmpp.ts +52 -11
  361. package/src/networking/xmpp/sendTextMessage.xmpp.ts +1 -1
  362. package/src/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.ts +41 -5
  363. package/src/networking/xmppClient.ts +97 -28
  364. package/src/roomStore/callSlice.ts +190 -0
  365. package/src/roomStore/chatSettingsSlice.ts +16 -0
  366. package/src/roomStore/index.ts +5 -0
  367. package/src/roomStore/persistence.ts +103 -3
  368. package/src/roomStore/roomsSlice.ts +149 -4
  369. package/src/types/models/language.model.ts +17 -1
  370. package/src/types/models/message.model.ts +9 -0
  371. package/src/types/types.ts +142 -2
  372. package/src/utils/translateModePolicy.ts +31 -0
@@ -0,0 +1,1322 @@
1
+ // Static UI i18n for the chat component.
2
+ //
3
+ // Design: a built-in flat string table per base language (no external i18n
4
+ // dependency, so SDK consumers don't have to install/configure anything). The
5
+ // host selects a language by passing `config.i18n.locale` (a BCP-47 tag like
6
+ // "en", "en-CA", "fr-CA", "es-US"); we resolve it down to the base language
7
+ // for UI captions (region only matters for message translation, not labels).
8
+ // The host can override or extend any string via `config.i18n.strings`.
9
+ //
10
+ // Keys use dotted namespaces and `{var}` placeholders. Use the `useT()` hook
11
+ // (see ./useT) inside components; call `resolveStringTable()` directly in
12
+ // non-React helpers.
13
+
14
+ export type UiStringTable = Record<string, string>;
15
+
16
+ const en: UiStringTable = {
17
+ 'search.placeholder': 'Search...',
18
+ 'input.placeholder': 'Type message',
19
+ 'room.created': 'Room created',
20
+ 'room.empty': 'This chat is empty',
21
+ 'date.today': 'Today',
22
+ 'date.yesterday': 'Yesterday',
23
+ 'message.deleted': 'Message deleted',
24
+ 'message.edited': 'edited',
25
+ 'presence.online': 'online',
26
+ 'presence.offline': 'offline',
27
+ 'presence.onlineCount': '{count} online',
28
+ 'header.userCountSingular': '{count} user',
29
+ 'header.userCountPlural': '{count} users',
30
+ 'call.outgoing': 'Outgoing call',
31
+ 'call.incoming': 'Incoming call',
32
+ 'call.noAnswer': 'No answer',
33
+ 'call.missed': 'Missed call',
34
+ 'call.durationSec': '{n} sec',
35
+ 'call.durationMin': '{n} min',
36
+ 'call.durationMinSec': '{m} min {s} sec',
37
+ 'call.title': 'Call',
38
+ 'call.unknownCaller': 'Unknown caller',
39
+ 'call.incomingAudio': 'Incoming audio call',
40
+ 'call.incomingVideo': 'Incoming video call',
41
+ 'call.calling': 'Calling...',
42
+ 'call.connecting': 'Connecting...',
43
+ 'call.failed': 'Call failed',
44
+ 'call.audioCall': 'Audio call',
45
+ 'call.videoCall': 'Video call',
46
+ 'call.connectingToRoom': 'Connecting to room',
47
+ 'call.tryAgainLater': 'Please try again later',
48
+ 'call.status.inCall': 'In call',
49
+ 'call.status.connecting': 'Connecting...',
50
+ 'call.status.waitingForPeer': 'Waiting for the other person',
51
+ 'call.status.cameraOff': 'Camera is off',
52
+ 'call.action.accept': 'Accept',
53
+ 'call.action.decline': 'Decline',
54
+ 'call.action.cancel': 'Cancel',
55
+ 'call.action.dismiss': 'Dismiss',
56
+ 'call.action.hangUp': 'Hang up',
57
+ 'call.action.minimize': 'Minimize call',
58
+ 'call.action.expand': 'Expand call',
59
+ 'call.action.muteMic': 'Mute microphone',
60
+ 'call.action.unmuteMic': 'Unmute microphone',
61
+ 'call.action.stopCamera': 'Turn camera off',
62
+ 'call.action.startCamera': 'Turn camera on',
63
+ 'call.action.switchCamera': 'Switch camera',
64
+ 'call.action.speakerOn': 'Turn speaker on',
65
+ 'call.action.speakerOff': 'Turn speaker off',
66
+ 'call.action.startAudioCall': 'Start audio call',
67
+ 'call.action.startVideoCall': 'Start video call',
68
+ 'call.error.sdkMissing': 'Calls are unavailable: the LiveKit packages are not installed in this app.',
69
+ 'call.error.missingConfig': 'Calls are unavailable: missing call token or server URL.',
70
+ 'call.error.missingLivekitUrl': 'Calls are unavailable: missing livekitUrl in config.videoCalls',
71
+ 'call.error.connectFailed': 'Could not connect to the call',
72
+ 'call.error.deviceBlocked': 'Camera/microphone access is blocked. Allow it in Settings, then try again.',
73
+ 'call.error.deviceNotFound': 'No camera or microphone found on this device.',
74
+ 'call.error.deviceInUse': 'Your camera or microphone is already in use by another app.',
75
+ 'call.error.deviceGeneric': 'Could not access your camera or microphone.',
76
+ 'call.error.noAnswerTimeout': 'No answer, the call timed out',
77
+ 'action.send': 'Send',
78
+ 'action.cancel': 'Cancel',
79
+ 'action.save': 'Save',
80
+ 'action.delete': 'Delete',
81
+ 'action.leave': 'Leave',
82
+ 'action.create': 'Create',
83
+ 'action.submit': 'Submit',
84
+ 'action.translate': 'Translate',
85
+ 'action.showOriginal': 'Show original',
86
+ 'action.newChat': 'New chat',
87
+ 'action.addUsers': 'Add users',
88
+ 'action.addMoreUsers': 'Add more Users',
89
+ 'action.add': 'Add',
90
+ 'action.backToCreation': 'Back to creation',
91
+ 'action.report': 'Report',
92
+ 'status.connecting': 'Connecting…',
93
+ 'status.noInternet': 'No internet connection',
94
+ 'translation.translating': 'Translating…',
95
+ 'translation.failed': 'Could not translate',
96
+ 'translation.enableToggleLabel': 'Translate my messages',
97
+ 'translation.enableToggleDisclaimer': 'If translations were not enabled, only new messages sent from now on will be translated.',
98
+ 'translation.modeLabel': 'Translation display',
99
+ 'translation.modeAuto': 'Auto',
100
+ 'translation.modeManual': 'Manual',
101
+ 'language.select': 'Select language',
102
+ 'modal.newChat.title': 'Create New Chat',
103
+ 'modal.newChat.roomNamePlaceholder': 'Enter Room Name',
104
+ 'modal.newChat.chatTypePlaceholder': 'Select chat type',
105
+ 'modal.newChat.selectUsersTitle': 'Select users to add to Chat',
106
+ 'modal.selectUsers.title': 'Select Users (max 20)',
107
+ 'modal.selectUsers.searchPlaceholder': 'Search users...',
108
+ 'toast.roomCreationTitle': 'Room creation',
109
+ 'toast.roomCreating': 'Room is being created...',
110
+ 'toast.success': 'Success!',
111
+ 'toast.roomCreatedSuccess': 'Room created successfully!',
112
+ 'toast.usersAddedSuccess': 'Users added successfully!',
113
+ 'settings.menu.title': 'Settings',
114
+ 'modal.filePreview.title': 'File preview',
115
+ 'toast.error': 'Error',
116
+ 'toast.couldNotOpenPrivateChat': 'Could not open the new private chat',
117
+ 'toast.couldNotResolveRecipient': 'Could not resolve recipient',
118
+ 'toast.failedToCreatePrivateChat': 'Failed to create private chat',
119
+ 'toast.failedToCreateCall': 'Failed to create call',
120
+ 'toast.failedToDeleteUser': 'Failed to delete user.',
121
+ 'toast.userRemovedFromRoom': '{userId} has been removed from the room.',
122
+ 'toast.failedToAddUser': 'Failed to add user.',
123
+ 'toast.userAddedToRoom': '{userName} has been added to the room.',
124
+ 'toast.loginFailedTitle': 'Login Failed',
125
+ 'toast.invalidCredentials': 'Invalid credentials',
126
+ 'toast.loginSuccessfulTitle': 'Login Successful',
127
+ 'toast.welcomeBack': 'Welcome back!',
128
+ 'toast.loginErrorTitle': 'Login Error',
129
+ 'toast.loginErrorMessage': 'An error occurred during login',
130
+ 'validation.invalidEmail': 'Invalid email format',
131
+ 'validation.passwordTooShort': 'Password must be at least 6 characters long',
132
+ 'validation.wrongCredentials': 'You entered wrong data. Try again',
133
+ 'field.email': 'Email',
134
+ 'field.password': 'Password',
135
+ 'field.firstName': 'First Name',
136
+ 'field.lastName': 'Last Name',
137
+ 'field.additionalDetails': 'Additional Details',
138
+ 'field.referralCode': 'Your referral code',
139
+ 'action.logOut': 'Log Out',
140
+ 'action.message': 'Message',
141
+ 'action.videoCall': 'Video call',
142
+ 'action.call': 'Call',
143
+ 'action.audioCall': 'Audio call',
144
+ 'action.copyUserId': 'Copy User Id',
145
+ 'action.deleteChat': 'Delete chat',
146
+ 'action.appointAsAdmin': 'Appoint as an admin',
147
+ 'action.moreOptions': 'More Options',
148
+ 'action.addMembers': 'Add members',
149
+ 'action.no': 'No',
150
+ 'action.yes': 'Yes',
151
+ 'action.addNewShare': 'Add New Share',
152
+ 'action.deleteMyAccount': 'Delete My Account',
153
+ 'auth.loginButton': 'Login to Ethora Chat',
154
+ 'auth.loginWithGoogle': 'Login with Google',
155
+ 'auth.orDelimiter': 'or',
156
+ 'auth.noAccount': "Don't have an account?",
157
+ 'auth.signUp': 'Sign Up to Ethora',
158
+ 'auth.loginAnonymously': 'Login anonymously',
159
+ 'auth.anonymousTextOnly': 'Only could send text messages',
160
+ 'auth.anonymousLoginMessage': 'You are logged in anonymously!',
161
+ 'modal.profile.title': 'Profile',
162
+ 'modal.profile.about': 'About',
163
+ 'modal.profile.noDescription': 'No description',
164
+ 'modal.chatProfile.title': 'Chat Profile',
165
+ 'modal.chatProfile.description': 'Description',
166
+ 'modal.chatProfile.chatType': 'Chat type',
167
+ 'modal.chatProfile.memberCountSingular': '{count} member',
168
+ 'modal.chatProfile.memberCountPlural': '{count} members',
169
+ 'modal.deleteChat.title': 'Delete this chat ?',
170
+ 'modal.addMembers.title': 'Add New Member',
171
+ 'modal.addMembers.userIdPlaceholder': 'Enter User Id',
172
+ 'modal.leaveChat.title': 'Leave Chat',
173
+ 'modal.leaveChat.description': 'Are you sure you want to leave this chat?',
174
+ 'modal.report.chatTitle': 'Report Chat',
175
+ 'modal.report.messageTitle': 'Report Message',
176
+ 'modal.report.otherDetails': 'Please enter additional details relevant to your report.',
177
+ 'report.category.spam': 'Spam',
178
+ 'report.category.violence': 'Violence',
179
+ 'report.category.childAbuse': 'Child Abuse',
180
+ 'report.category.pornography': 'Pornography',
181
+ 'report.category.personalDetails': 'Personal Details',
182
+ 'report.category.illegalDrugs': 'Illegal Drugs',
183
+ 'report.category.other': 'Other',
184
+ 'notification.saved': 'Saved',
185
+ 'sort.name': 'Name',
186
+ 'sort.surname': 'Surname',
187
+ 'settings.shares.listOfShares': 'List of shares',
188
+ 'settings.documentShares.title': 'Document Shares',
189
+ 'settings.documentShares.currentShares': 'Current Document Shares',
190
+ 'settings.documentShares.description': 'Listed below are your currently active document sharing links. You can share or delete them.',
191
+ 'settings.documentShares.emptyState': 'There are no shares yet, or you can add them by clicking the "Add New Share" button',
192
+ 'settings.profileShares.title': 'Profile Shares',
193
+ 'settings.profileShares.currentShares': 'Current Profile Shares',
194
+ 'settings.profileShares.description': 'Listed below are your currently active profile sharing links. You can share or delete them.',
195
+ 'settings.blockedUsers.title': 'Blocked Users',
196
+ 'settings.blockedUsers.label': 'Blocked Users',
197
+ 'settings.blockedUsers.description': 'Users you have blocked cannot send you messages or see when you are online.',
198
+ 'settings.blockedUsers.emptyState': "You haven't blocked anyone yet.",
199
+ 'settings.visibility.title': 'Visibility',
200
+ 'settings.visibility.profileLabel': 'Profile Visibility',
201
+ 'settings.visibility.open': 'Open (default)',
202
+ 'settings.visibility.openDescription': 'Your profile can be viewed by anyone who follows your profile link or QR code.',
203
+ 'settings.visibility.restricted': 'Restricted',
204
+ 'settings.visibility.restrictedDescription': 'Only users with your permission or temporary secure link can see your profile.',
205
+ 'settings.visibility.documentsLabel': 'Documents Visibility',
206
+ 'settings.visibility.full': 'Full (default)',
207
+ 'settings.visibility.fullDescription': 'Show all Documents to those who can see your profile.',
208
+ 'settings.visibility.individual': 'Individual',
209
+ 'settings.visibility.individualDescription': 'You need to share each document individually before others can see them.',
210
+ 'settings.referrals.title': 'Referrals',
211
+ 'settings.referrals.giftPart1': 'Gift friends 25',
212
+ 'settings.referrals.giftPart2': 'and receive 25',
213
+ 'settings.referrals.giftPart3': 'Send friends invite with your personal invitation code.',
214
+ 'settings.referrals.yourCode': 'Your invitation code',
215
+ 'settings.referrals.enterReferralCode': 'Or enter your referral code to earn coins',
216
+ 'settings.manageData.title': 'Manage Data',
217
+ 'settings.manageData.downloadLabel': 'Download your data',
218
+ 'settings.manageData.downloadDescription': 'You own your data. Tap the button below to download a copy of your data',
219
+ 'settings.manageData.deleteLabel': 'Delete your account',
220
+ 'settings.manageData.deleteDescription': 'Use this only if you want to permanently delete your account & data from our system.',
221
+ 'settings.manageData.deleteDisclosure': 'Due to the immutable nature of distributed ledger technology, network nodes operated by the community may still retain historical transactions generated by your account, however your personally identifiable information such as your name, e-mail, your key-value storage etc will be removed. Any of your digital assets will be lost.',
222
+ };
223
+
224
+ const fr: UiStringTable = {
225
+ 'search.placeholder': 'Rechercher...',
226
+ 'input.placeholder': 'Écrire un message',
227
+ 'room.created': 'Salon créé',
228
+ 'room.empty': 'Ce salon est vide',
229
+ 'date.today': "Aujourd'hui",
230
+ 'date.yesterday': 'Hier',
231
+ 'message.deleted': 'Message supprimé',
232
+ 'message.edited': 'modifié',
233
+ 'presence.online': 'en ligne',
234
+ 'presence.offline': 'hors ligne',
235
+ 'presence.onlineCount': '{count} en ligne',
236
+ 'header.userCountSingular': '{count} utilisateur',
237
+ 'header.userCountPlural': '{count} utilisateurs',
238
+ 'call.outgoing': 'Appel sortant',
239
+ 'call.incoming': 'Appel entrant',
240
+ 'call.noAnswer': 'Pas de réponse',
241
+ 'call.missed': 'Appel manqué',
242
+ 'call.durationSec': '{n} s',
243
+ 'call.durationMin': '{n} min',
244
+ 'call.durationMinSec': '{m} min {s} s',
245
+ 'call.title': 'Appel',
246
+ 'call.unknownCaller': 'Appelant inconnu',
247
+ 'call.incomingAudio': 'Appel audio entrant',
248
+ 'call.incomingVideo': 'Appel vidéo entrant',
249
+ 'call.calling': 'Appel en cours...',
250
+ 'call.connecting': 'Connexion...',
251
+ 'call.failed': 'Échec de l\'appel',
252
+ 'call.audioCall': 'Appel audio',
253
+ 'call.videoCall': 'Appel vidéo',
254
+ 'call.connectingToRoom': 'Connexion au salon',
255
+ 'call.tryAgainLater': 'Veuillez réessayer plus tard',
256
+ 'call.status.inCall': 'En communication',
257
+ 'call.status.connecting': 'Connexion...',
258
+ 'call.status.waitingForPeer': 'En attente de votre correspondant',
259
+ 'call.status.cameraOff': 'Caméra désactivée',
260
+ 'call.action.accept': 'Accepter',
261
+ 'call.action.decline': 'Refuser',
262
+ 'call.action.cancel': 'Annuler',
263
+ 'call.action.dismiss': 'Fermer',
264
+ 'call.action.hangUp': 'Raccrocher',
265
+ 'call.action.minimize': 'Réduire l\'appel',
266
+ 'call.action.expand': 'Agrandir l\'appel',
267
+ 'call.action.muteMic': 'Couper le micro',
268
+ 'call.action.unmuteMic': 'Activer le micro',
269
+ 'call.action.stopCamera': 'Désactiver la caméra',
270
+ 'call.action.startCamera': 'Activer la caméra',
271
+ 'call.action.switchCamera': 'Changer de caméra',
272
+ 'call.action.speakerOn': 'Activer le haut-parleur',
273
+ 'call.action.speakerOff': 'Désactiver le haut-parleur',
274
+ 'call.action.startAudioCall': 'Démarrer un appel audio',
275
+ 'call.action.startVideoCall': 'Démarrer un appel vidéo',
276
+ 'call.error.sdkMissing': 'Appels indisponibles : les paquets LiveKit ne sont pas installés dans cette application.',
277
+ 'call.error.missingConfig': 'Appels indisponibles : jeton d\'appel ou URL du serveur manquant.',
278
+ 'call.error.missingLivekitUrl': 'Appels indisponibles : livekitUrl manquant dans config.videoCalls',
279
+ 'call.error.connectFailed': 'Impossible de se connecter à l\'appel',
280
+ 'call.error.deviceBlocked': 'L\'accès à la caméra/au micro est bloqué. Autorisez-le dans les réglages, puis réessayez.',
281
+ 'call.error.deviceNotFound': 'Aucune caméra ni microphone trouvé sur cet appareil.',
282
+ 'call.error.deviceInUse': 'Votre caméra ou microphone est déjà utilisé par une autre application.',
283
+ 'call.error.deviceGeneric': 'Impossible d\'accéder à votre caméra ou microphone.',
284
+ 'call.error.noAnswerTimeout': 'Pas de réponse, l\'appel a expiré',
285
+ 'action.send': 'Envoyer',
286
+ 'action.cancel': 'Annuler',
287
+ 'action.save': 'Enregistrer',
288
+ 'action.delete': 'Supprimer',
289
+ 'action.leave': 'Quitter',
290
+ 'action.create': 'Créer',
291
+ 'action.submit': 'Soumettre',
292
+ 'action.translate': 'Traduire',
293
+ 'action.showOriginal': "Afficher l'original",
294
+ 'action.newChat': 'Nouvelle discussion',
295
+ 'action.addUsers': 'Ajouter des utilisateurs',
296
+ 'action.addMoreUsers': "Ajouter d'autres utilisateurs",
297
+ 'action.add': 'Ajouter',
298
+ 'action.backToCreation': 'Retour à la création',
299
+ 'action.report': 'Signaler',
300
+ 'status.connecting': 'Connexion…',
301
+ 'status.noInternet': 'Pas de connexion internet',
302
+ 'translation.translating': 'Traduction…',
303
+ 'translation.failed': 'Traduction impossible',
304
+ 'translation.enableToggleLabel': 'Traduire mes messages',
305
+ 'translation.enableToggleDisclaimer': "Si les traductions n'étaient pas activées, seuls les nouveaux messages envoyés à partir de maintenant seront traduits.",
306
+ 'translation.modeLabel': 'Affichage des traductions',
307
+ 'translation.modeAuto': 'Automatique',
308
+ 'translation.modeManual': 'Manuel',
309
+ 'language.select': 'Choisir la langue',
310
+ 'modal.newChat.title': 'Créer une discussion',
311
+ 'modal.newChat.roomNamePlaceholder': 'Nom du salon',
312
+ 'modal.newChat.chatTypePlaceholder': 'Choisir le type de discussion',
313
+ 'modal.newChat.selectUsersTitle': 'Sélectionner des utilisateurs à ajouter',
314
+ 'modal.selectUsers.title': 'Sélectionner des utilisateurs (max 20)',
315
+ 'modal.selectUsers.searchPlaceholder': 'Rechercher des utilisateurs...',
316
+ 'toast.roomCreationTitle': 'Création du salon',
317
+ 'toast.roomCreating': 'Le salon est en cours de création...',
318
+ 'toast.success': 'Succès !',
319
+ 'toast.roomCreatedSuccess': 'Salon créé avec succès !',
320
+ 'toast.usersAddedSuccess': 'Utilisateurs ajoutés avec succès !',
321
+ 'settings.menu.title': 'Paramètres',
322
+ 'modal.filePreview.title': 'Aperçu du fichier',
323
+ 'toast.error': 'Erreur',
324
+ 'toast.couldNotOpenPrivateChat': "Impossible d'ouvrir la nouvelle discussion privée",
325
+ 'toast.couldNotResolveRecipient': 'Impossible de résoudre le destinataire',
326
+ 'toast.failedToCreatePrivateChat': 'Échec de la création de la discussion privée',
327
+ 'toast.failedToCreateCall': "Échec de la création de l'appel",
328
+ 'toast.failedToDeleteUser': "Échec de la suppression de l'utilisateur.",
329
+ 'toast.userRemovedFromRoom': '{userId} a été retiré du salon.',
330
+ 'toast.failedToAddUser': "Échec de l'ajout de l'utilisateur.",
331
+ 'toast.userAddedToRoom': '{userName} a été ajouté au salon.',
332
+ 'toast.loginFailedTitle': 'Échec de la connexion',
333
+ 'toast.invalidCredentials': 'Identifiants invalides',
334
+ 'toast.loginSuccessfulTitle': 'Connexion réussie',
335
+ 'toast.welcomeBack': 'Content de vous revoir !',
336
+ 'toast.loginErrorTitle': 'Erreur de connexion',
337
+ 'toast.loginErrorMessage': "Une erreur s'est produite lors de la connexion",
338
+ 'validation.invalidEmail': "Format d'e-mail invalide",
339
+ 'validation.passwordTooShort': 'Le mot de passe doit comporter au moins 6 caractères',
340
+ 'validation.wrongCredentials': 'Données incorrectes. Réessayez',
341
+ 'field.email': 'E-mail',
342
+ 'field.password': 'Mot de passe',
343
+ 'field.firstName': 'Prénom',
344
+ 'field.lastName': 'Nom',
345
+ 'field.additionalDetails': 'Détails supplémentaires',
346
+ 'field.referralCode': 'Votre code de parrainage',
347
+ 'action.logOut': 'Déconnexion',
348
+ 'action.message': 'Message',
349
+ 'action.videoCall': 'Appel vidéo',
350
+ 'action.call': 'Appeler',
351
+ 'action.audioCall': 'Appel audio',
352
+ 'action.copyUserId': "Copier l'ID utilisateur",
353
+ 'action.deleteChat': 'Supprimer la discussion',
354
+ 'action.appointAsAdmin': 'Nommer administrateur',
355
+ 'action.moreOptions': "Plus d'options",
356
+ 'action.addMembers': 'Ajouter des membres',
357
+ 'action.no': 'Non',
358
+ 'action.yes': 'Oui',
359
+ 'action.addNewShare': 'Ajouter un nouveau partage',
360
+ 'action.deleteMyAccount': 'Supprimer mon compte',
361
+ 'auth.loginButton': 'Se connecter à Ethora Chat',
362
+ 'auth.loginWithGoogle': 'Se connecter avec Google',
363
+ 'auth.orDelimiter': 'ou',
364
+ 'auth.noAccount': "Vous n'avez pas de compte ?",
365
+ 'auth.signUp': "S'inscrire sur Ethora",
366
+ 'auth.loginAnonymously': 'Se connecter anonymement',
367
+ 'auth.anonymousTextOnly': 'Peut seulement envoyer des messages texte',
368
+ 'auth.anonymousLoginMessage': 'Vous êtes connecté anonymement !',
369
+ 'modal.profile.title': 'Profil',
370
+ 'modal.profile.about': 'À propos',
371
+ 'modal.profile.noDescription': 'Aucune description',
372
+ 'modal.chatProfile.title': 'Profil de la discussion',
373
+ 'modal.chatProfile.description': 'Description',
374
+ 'modal.chatProfile.chatType': 'Type de discussion',
375
+ 'modal.chatProfile.memberCountSingular': '{count} membre',
376
+ 'modal.chatProfile.memberCountPlural': '{count} membres',
377
+ 'modal.deleteChat.title': 'Supprimer cette discussion ?',
378
+ 'modal.addMembers.title': 'Ajouter un nouveau membre',
379
+ 'modal.addMembers.userIdPlaceholder': "Entrez l'ID utilisateur",
380
+ 'modal.leaveChat.title': 'Quitter la discussion',
381
+ 'modal.leaveChat.description': 'Voulez-vous vraiment quitter cette discussion ?',
382
+ 'modal.report.chatTitle': 'Signaler la discussion',
383
+ 'modal.report.messageTitle': 'Signaler le message',
384
+ 'modal.report.otherDetails': 'Veuillez indiquer des détails supplémentaires concernant votre signalement.',
385
+ 'report.category.spam': 'Spam',
386
+ 'report.category.violence': 'Violence',
387
+ 'report.category.childAbuse': "Maltraitance d'enfants",
388
+ 'report.category.pornography': 'Pornographie',
389
+ 'report.category.personalDetails': 'Informations personnelles',
390
+ 'report.category.illegalDrugs': 'Drogues illégales',
391
+ 'report.category.other': 'Autre',
392
+ 'notification.saved': 'Enregistré',
393
+ 'sort.name': 'Prénom',
394
+ 'sort.surname': 'Nom',
395
+ 'settings.shares.listOfShares': 'Liste des partages',
396
+ 'settings.documentShares.title': 'Partages de documents',
397
+ 'settings.documentShares.currentShares': 'Partages de documents actuels',
398
+ 'settings.documentShares.description': 'Voici la liste de vos liens de partage de documents actifs. Vous pouvez les partager ou les supprimer.',
399
+ 'settings.documentShares.emptyState': 'Aucun partage pour le moment - vous pouvez en ajouter en cliquant sur le bouton "Ajouter un nouveau partage"',
400
+ 'settings.profileShares.title': 'Partages de profil',
401
+ 'settings.profileShares.currentShares': 'Partages de profil actuels',
402
+ 'settings.profileShares.description': 'Voici la liste de vos liens de partage de profil actifs. Vous pouvez les partager ou les supprimer.',
403
+ 'settings.blockedUsers.title': 'Utilisateurs bloqués',
404
+ 'settings.blockedUsers.label': 'Utilisateurs bloqués',
405
+ 'settings.blockedUsers.description': "Les utilisateurs que vous avez bloqués ne peuvent pas vous envoyer de messages ni voir quand vous êtes en ligne.",
406
+ 'settings.blockedUsers.emptyState': "Vous n'avez encore bloqué personne.",
407
+ 'settings.visibility.title': 'Visibilité',
408
+ 'settings.visibility.profileLabel': 'Visibilité du profil',
409
+ 'settings.visibility.open': 'Ouvert (par défaut)',
410
+ 'settings.visibility.openDescription': 'Votre profil peut être consulté par quiconque suit votre lien de profil ou votre code QR.',
411
+ 'settings.visibility.restricted': 'Restreint',
412
+ 'settings.visibility.restrictedDescription': 'Seuls les utilisateurs autorisés ou disposant d\'un lien sécurisé temporaire peuvent voir votre profil.',
413
+ 'settings.visibility.documentsLabel': 'Visibilité des documents',
414
+ 'settings.visibility.full': 'Complète (par défaut)',
415
+ 'settings.visibility.fullDescription': 'Montrer tous les documents à ceux qui peuvent voir votre profil.',
416
+ 'settings.visibility.individual': 'Individuelle',
417
+ 'settings.visibility.individualDescription': 'Vous devez partager chaque document individuellement avant que d\'autres puissent le voir.',
418
+ 'settings.referrals.title': 'Parrainages',
419
+ 'settings.referrals.giftPart1': 'Offrez 25 à vos amis',
420
+ 'settings.referrals.giftPart2': 'et recevez 25',
421
+ 'settings.referrals.giftPart3': 'Envoyez une invitation à vos amis avec votre code d\'invitation personnel.',
422
+ 'settings.referrals.yourCode': "Votre code d'invitation",
423
+ 'settings.referrals.enterReferralCode': 'Ou entrez votre code de parrainage pour gagner des pièces',
424
+ 'settings.manageData.title': 'Gérer les données',
425
+ 'settings.manageData.downloadLabel': 'Télécharger vos données',
426
+ 'settings.manageData.downloadDescription': 'Vos données vous appartiennent. Appuyez sur le bouton ci-dessous pour en télécharger une copie',
427
+ 'settings.manageData.deleteLabel': 'Supprimer votre compte',
428
+ 'settings.manageData.deleteDescription': 'À utiliser uniquement si vous souhaitez supprimer définitivement votre compte et vos données de notre système.',
429
+ 'settings.manageData.deleteDisclosure': "En raison de la nature immuable de la technologie des registres distribués, les nœuds du réseau exploités par la communauté peuvent conserver des transactions historiques générées par votre compte ; toutefois, vos informations personnelles identifiables telles que votre nom, e-mail, stockage clé-valeur, etc. seront supprimées. Tous vos actifs numériques seront perdus.",
430
+ };
431
+
432
+ const es: UiStringTable = {
433
+ 'search.placeholder': 'Buscar...',
434
+ 'input.placeholder': 'Escribe un mensaje',
435
+ 'room.created': 'Sala creada',
436
+ 'room.empty': 'Este chat está vacío',
437
+ 'date.today': 'Hoy',
438
+ 'date.yesterday': 'Ayer',
439
+ 'message.deleted': 'Mensaje eliminado',
440
+ 'message.edited': 'editado',
441
+ 'presence.online': 'en línea',
442
+ 'presence.offline': 'desconectado',
443
+ 'presence.onlineCount': '{count} en línea',
444
+ 'header.userCountSingular': '{count} usuario',
445
+ 'header.userCountPlural': '{count} usuarios',
446
+ 'call.outgoing': 'Llamada saliente',
447
+ 'call.incoming': 'Llamada entrante',
448
+ 'call.noAnswer': 'Sin respuesta',
449
+ 'call.missed': 'Llamada perdida',
450
+ 'call.durationSec': '{n} s',
451
+ 'call.durationMin': '{n} min',
452
+ 'call.durationMinSec': '{m} min {s} s',
453
+ 'call.title': 'Llamada',
454
+ 'call.unknownCaller': 'Llamante desconocido',
455
+ 'call.incomingAudio': 'Llamada de audio entrante',
456
+ 'call.incomingVideo': 'Videollamada entrante',
457
+ 'call.calling': 'Llamando...',
458
+ 'call.connecting': 'Conectando...',
459
+ 'call.failed': 'Error en la llamada',
460
+ 'call.audioCall': 'Llamada de audio',
461
+ 'call.videoCall': 'Videollamada',
462
+ 'call.connectingToRoom': 'Conectando a la sala',
463
+ 'call.tryAgainLater': 'Vuelve a intentarlo más tarde',
464
+ 'call.status.inCall': 'En llamada',
465
+ 'call.status.connecting': 'Conectando...',
466
+ 'call.status.waitingForPeer': 'Esperando a la otra persona',
467
+ 'call.status.cameraOff': 'Cámara desactivada',
468
+ 'call.action.accept': 'Aceptar',
469
+ 'call.action.decline': 'Rechazar',
470
+ 'call.action.cancel': 'Cancelar',
471
+ 'call.action.dismiss': 'Cerrar',
472
+ 'call.action.hangUp': 'Colgar',
473
+ 'call.action.minimize': 'Minimizar llamada',
474
+ 'call.action.expand': 'Ampliar llamada',
475
+ 'call.action.muteMic': 'Silenciar micrófono',
476
+ 'call.action.unmuteMic': 'Activar micrófono',
477
+ 'call.action.stopCamera': 'Apagar la cámara',
478
+ 'call.action.startCamera': 'Encender la cámara',
479
+ 'call.action.switchCamera': 'Cambiar de cámara',
480
+ 'call.action.speakerOn': 'Activar el altavoz',
481
+ 'call.action.speakerOff': 'Desactivar el altavoz',
482
+ 'call.action.startAudioCall': 'Iniciar llamada de audio',
483
+ 'call.action.startVideoCall': 'Iniciar videollamada',
484
+ 'call.error.sdkMissing': 'Llamadas no disponibles: los paquetes de LiveKit no están instalados en esta aplicación.',
485
+ 'call.error.missingConfig': 'Llamadas no disponibles: falta el token de llamada o la URL del servidor.',
486
+ 'call.error.missingLivekitUrl': 'Llamadas no disponibles: falta livekitUrl en config.videoCalls',
487
+ 'call.error.connectFailed': 'No se pudo conectar a la llamada',
488
+ 'call.error.deviceBlocked': 'El acceso a la cámara/micrófono está bloqueado. Actívalo en Ajustes y vuelve a intentarlo.',
489
+ 'call.error.deviceNotFound': 'No se encontró cámara ni micrófono en este dispositivo.',
490
+ 'call.error.deviceInUse': 'Tu cámara o micrófono ya está siendo usado por otra aplicación.',
491
+ 'call.error.deviceGeneric': 'No se pudo acceder a tu cámara o micrófono.',
492
+ 'call.error.noAnswerTimeout': 'Sin respuesta, la llamada expiró',
493
+ 'action.send': 'Enviar',
494
+ 'action.cancel': 'Cancelar',
495
+ 'action.save': 'Guardar',
496
+ 'action.delete': 'Eliminar',
497
+ 'action.leave': 'Salir',
498
+ 'action.create': 'Crear',
499
+ 'action.submit': 'Enviar',
500
+ 'action.translate': 'Traducir',
501
+ 'action.showOriginal': 'Ver original',
502
+ 'action.newChat': 'Nuevo chat',
503
+ 'action.addUsers': 'Añadir usuarios',
504
+ 'action.addMoreUsers': 'Añadir más usuarios',
505
+ 'action.add': 'Añadir',
506
+ 'action.backToCreation': 'Volver a la creación',
507
+ 'action.report': 'Reportar',
508
+ 'status.connecting': 'Conectando…',
509
+ 'status.noInternet': 'Sin conexión a internet',
510
+ 'translation.translating': 'Traduciendo…',
511
+ 'translation.failed': 'No se pudo traducir',
512
+ 'translation.enableToggleLabel': 'Traducir mis mensajes',
513
+ 'translation.enableToggleDisclaimer': 'Si las traducciones no estaban activadas, solo se traducirán los mensajes nuevos enviados a partir de ahora.',
514
+ 'translation.modeLabel': 'Visualización de traducciones',
515
+ 'translation.modeAuto': 'Automático',
516
+ 'translation.modeManual': 'Manual',
517
+ 'language.select': 'Seleccionar idioma',
518
+ 'modal.newChat.title': 'Crear nuevo chat',
519
+ 'modal.newChat.roomNamePlaceholder': 'Nombre de la sala',
520
+ 'modal.newChat.chatTypePlaceholder': 'Selecciona el tipo de chat',
521
+ 'modal.newChat.selectUsersTitle': 'Selecciona usuarios para añadir al chat',
522
+ 'modal.selectUsers.title': 'Seleccionar usuarios (máx. 20)',
523
+ 'modal.selectUsers.searchPlaceholder': 'Buscar usuarios...',
524
+ 'toast.roomCreationTitle': 'Creación de sala',
525
+ 'toast.roomCreating': 'La sala se está creando...',
526
+ 'toast.success': '¡Éxito!',
527
+ 'toast.roomCreatedSuccess': '¡Sala creada correctamente!',
528
+ 'toast.usersAddedSuccess': '¡Usuarios añadidos correctamente!',
529
+ 'settings.menu.title': 'Configuración',
530
+ 'modal.filePreview.title': 'Vista previa del archivo',
531
+ 'toast.error': 'Error',
532
+ 'toast.couldNotOpenPrivateChat': 'No se pudo abrir el nuevo chat privado',
533
+ 'toast.couldNotResolveRecipient': 'No se pudo resolver el destinatario',
534
+ 'toast.failedToCreatePrivateChat': 'No se pudo crear el chat privado',
535
+ 'toast.failedToCreateCall': 'No se pudo crear la llamada',
536
+ 'toast.failedToDeleteUser': 'No se pudo eliminar el usuario.',
537
+ 'toast.userRemovedFromRoom': '{userId} ha sido eliminado de la sala.',
538
+ 'toast.failedToAddUser': 'No se pudo añadir al usuario.',
539
+ 'toast.userAddedToRoom': '{userName} ha sido añadido a la sala.',
540
+ 'toast.loginFailedTitle': 'Error al iniciar sesión',
541
+ 'toast.invalidCredentials': 'Credenciales inválidas',
542
+ 'toast.loginSuccessfulTitle': 'Inicio de sesión exitoso',
543
+ 'toast.welcomeBack': '¡Bienvenido de nuevo!',
544
+ 'toast.loginErrorTitle': 'Error de inicio de sesión',
545
+ 'toast.loginErrorMessage': 'Ocurrió un error durante el inicio de sesión',
546
+ 'validation.invalidEmail': 'Formato de correo inválido',
547
+ 'validation.passwordTooShort': 'La contraseña debe tener al menos 6 caracteres',
548
+ 'validation.wrongCredentials': 'Datos incorrectos. Inténtalo de nuevo',
549
+ 'field.email': 'Correo electrónico',
550
+ 'field.password': 'Contraseña',
551
+ 'field.firstName': 'Nombre',
552
+ 'field.lastName': 'Apellido',
553
+ 'field.additionalDetails': 'Detalles adicionales',
554
+ 'field.referralCode': 'Tu código de referido',
555
+ 'action.logOut': 'Cerrar sesión',
556
+ 'action.message': 'Mensaje',
557
+ 'action.videoCall': 'Videollamada',
558
+ 'action.call': 'Llamar',
559
+ 'action.audioCall': 'Llamada de audio',
560
+ 'action.copyUserId': 'Copiar ID de usuario',
561
+ 'action.deleteChat': 'Eliminar chat',
562
+ 'action.appointAsAdmin': 'Nombrar administrador',
563
+ 'action.moreOptions': 'Más opciones',
564
+ 'action.addMembers': 'Añadir miembros',
565
+ 'action.no': 'No',
566
+ 'action.yes': 'Sí',
567
+ 'action.addNewShare': 'Añadir nuevo recurso compartido',
568
+ 'action.deleteMyAccount': 'Eliminar mi cuenta',
569
+ 'auth.loginButton': 'Iniciar sesión en Ethora Chat',
570
+ 'auth.loginWithGoogle': 'Iniciar sesión con Google',
571
+ 'auth.orDelimiter': 'o',
572
+ 'auth.noAccount': '¿No tienes una cuenta?',
573
+ 'auth.signUp': 'Regístrate en Ethora',
574
+ 'auth.loginAnonymously': 'Iniciar sesión de forma anónima',
575
+ 'auth.anonymousTextOnly': 'Solo se pueden enviar mensajes de texto',
576
+ 'auth.anonymousLoginMessage': '¡Has iniciado sesión de forma anónima!',
577
+ 'modal.profile.title': 'Perfil',
578
+ 'modal.profile.about': 'Acerca de',
579
+ 'modal.profile.noDescription': 'Sin descripción',
580
+ 'modal.chatProfile.title': 'Perfil del chat',
581
+ 'modal.chatProfile.description': 'Descripción',
582
+ 'modal.chatProfile.chatType': 'Tipo de chat',
583
+ 'modal.chatProfile.memberCountSingular': '{count} miembro',
584
+ 'modal.chatProfile.memberCountPlural': '{count} miembros',
585
+ 'modal.deleteChat.title': '¿Eliminar este chat?',
586
+ 'modal.addMembers.title': 'Añadir nuevo miembro',
587
+ 'modal.addMembers.userIdPlaceholder': 'Introduce el ID de usuario',
588
+ 'modal.leaveChat.title': 'Salir del chat',
589
+ 'modal.leaveChat.description': '¿Seguro que quieres salir de este chat?',
590
+ 'modal.report.chatTitle': 'Reportar chat',
591
+ 'modal.report.messageTitle': 'Reportar mensaje',
592
+ 'modal.report.otherDetails': 'Introduce detalles adicionales relevantes para tu reporte.',
593
+ 'report.category.spam': 'Spam',
594
+ 'report.category.violence': 'Violencia',
595
+ 'report.category.childAbuse': 'Abuso infantil',
596
+ 'report.category.pornography': 'Pornografía',
597
+ 'report.category.personalDetails': 'Datos personales',
598
+ 'report.category.illegalDrugs': 'Drogas ilegales',
599
+ 'report.category.other': 'Otro',
600
+ 'notification.saved': 'Guardado',
601
+ 'sort.name': 'Nombre',
602
+ 'sort.surname': 'Apellido',
603
+ 'settings.shares.listOfShares': 'Lista de recursos compartidos',
604
+ 'settings.documentShares.title': 'Documentos compartidos',
605
+ 'settings.documentShares.currentShares': 'Documentos compartidos actuales',
606
+ 'settings.documentShares.description': 'A continuación se muestran tus enlaces de documentos compartidos activos. Puedes compartirlos o eliminarlos.',
607
+ 'settings.documentShares.emptyState': 'Todavía no hay recursos compartidos, o puedes añadirlos haciendo clic en el botón "Añadir nuevo recurso compartido"',
608
+ 'settings.profileShares.title': 'Perfil compartido',
609
+ 'settings.profileShares.currentShares': 'Perfiles compartidos actuales',
610
+ 'settings.profileShares.description': 'A continuación se muestran tus enlaces de perfil compartido activos. Puedes compartirlos o eliminarlos.',
611
+ 'settings.blockedUsers.title': 'Usuarios bloqueados',
612
+ 'settings.blockedUsers.label': 'Usuarios bloqueados',
613
+ 'settings.blockedUsers.description': 'Los usuarios que hayas bloqueado no podrán enviarte mensajes ni ver cuándo estás en línea.',
614
+ 'settings.blockedUsers.emptyState': 'Todavía no has bloqueado a nadie.',
615
+ 'settings.visibility.title': 'Visibilidad',
616
+ 'settings.visibility.profileLabel': 'Visibilidad del perfil',
617
+ 'settings.visibility.open': 'Abierto (predeterminado)',
618
+ 'settings.visibility.openDescription': 'Cualquiera que siga el enlace de tu perfil o tu código QR puede ver tu perfil.',
619
+ 'settings.visibility.restricted': 'Restringido',
620
+ 'settings.visibility.restrictedDescription': 'Solo los usuarios con tu permiso o un enlace seguro temporal pueden ver tu perfil.',
621
+ 'settings.visibility.documentsLabel': 'Visibilidad de documentos',
622
+ 'settings.visibility.full': 'Completa (predeterminada)',
623
+ 'settings.visibility.fullDescription': 'Mostrar todos los documentos a quienes puedan ver tu perfil.',
624
+ 'settings.visibility.individual': 'Individual',
625
+ 'settings.visibility.individualDescription': 'Debes compartir cada documento individualmente antes de que otros puedan verlo.',
626
+ 'settings.referrals.title': 'Referidos',
627
+ 'settings.referrals.giftPart1': 'Regala 25 a tus amigos',
628
+ 'settings.referrals.giftPart2': 'y recibe 25',
629
+ 'settings.referrals.giftPart3': 'Envía una invitación a tus amigos con tu código de invitación personal.',
630
+ 'settings.referrals.yourCode': 'Tu código de invitación',
631
+ 'settings.referrals.enterReferralCode': 'O introduce tu código de referido para ganar monedas',
632
+ 'settings.manageData.title': 'Gestionar datos',
633
+ 'settings.manageData.downloadLabel': 'Descarga tus datos',
634
+ 'settings.manageData.downloadDescription': 'Tus datos te pertenecen. Toca el botón de abajo para descargar una copia de tus datos',
635
+ 'settings.manageData.deleteLabel': 'Elimina tu cuenta',
636
+ 'settings.manageData.deleteDescription': 'Utiliza esto solo si deseas eliminar permanentemente tu cuenta y tus datos de nuestro sistema.',
637
+ 'settings.manageData.deleteDisclosure': 'Debido a la naturaleza inmutable de la tecnología de registro distribuido, los nodos de red operados por la comunidad pueden seguir conservando transacciones históricas generadas por tu cuenta; sin embargo, tu información personal identificable, como tu nombre, correo electrónico y almacenamiento clave-valor, será eliminada. Se perderán todos tus activos digitales.',
638
+ };
639
+
640
+ const pt: UiStringTable = {
641
+ 'search.placeholder': 'Pesquisar...',
642
+ 'input.placeholder': 'Escreva uma mensagem',
643
+ 'room.created': 'Sala criada',
644
+ 'room.empty': 'Este chat está vazio',
645
+ 'date.today': 'Hoje',
646
+ 'date.yesterday': 'Ontem',
647
+ 'message.deleted': 'Mensagem eliminada',
648
+ 'message.edited': 'editado',
649
+ 'presence.online': 'online',
650
+ 'presence.offline': 'offline',
651
+ 'presence.onlineCount': '{count} online',
652
+ 'header.userCountSingular': '{count} usuário',
653
+ 'header.userCountPlural': '{count} usuários',
654
+ 'call.outgoing': 'Chamada efetuada',
655
+ 'call.incoming': 'Chamada recebida',
656
+ 'call.noAnswer': 'Sem resposta',
657
+ 'call.missed': 'Chamada perdida',
658
+ 'call.durationSec': '{n} s',
659
+ 'call.durationMin': '{n} min',
660
+ 'call.durationMinSec': '{m} min {s} s',
661
+ 'call.title': 'Chamada',
662
+ 'call.unknownCaller': 'Chamador desconhecido',
663
+ 'call.incomingAudio': 'Chamada de áudio recebida',
664
+ 'call.incomingVideo': 'Videochamada recebida',
665
+ 'call.calling': 'A chamar...',
666
+ 'call.connecting': 'A ligar...',
667
+ 'call.failed': 'A chamada falhou',
668
+ 'call.audioCall': 'Chamada de áudio',
669
+ 'call.videoCall': 'Videochamada',
670
+ 'call.connectingToRoom': 'A ligar à sala',
671
+ 'call.tryAgainLater': 'Tente novamente mais tarde',
672
+ 'call.status.inCall': 'Em chamada',
673
+ 'call.status.connecting': 'A ligar...',
674
+ 'call.status.waitingForPeer': 'À espera da outra pessoa',
675
+ 'call.status.cameraOff': 'Câmara desligada',
676
+ 'call.action.accept': 'Atender',
677
+ 'call.action.decline': 'Recusar',
678
+ 'call.action.cancel': 'Cancelar',
679
+ 'call.action.dismiss': 'Fechar',
680
+ 'call.action.hangUp': 'Desligar',
681
+ 'call.action.minimize': 'Minimizar chamada',
682
+ 'call.action.expand': 'Expandir chamada',
683
+ 'call.action.muteMic': 'Silenciar microfone',
684
+ 'call.action.unmuteMic': 'Ativar microfone',
685
+ 'call.action.stopCamera': 'Desligar a câmara',
686
+ 'call.action.startCamera': 'Ligar a câmara',
687
+ 'call.action.switchCamera': 'Mudar de câmara',
688
+ 'call.action.speakerOn': 'Ligar o altifalante',
689
+ 'call.action.speakerOff': 'Desligar o altifalante',
690
+ 'call.action.startAudioCall': 'Iniciar chamada de áudio',
691
+ 'call.action.startVideoCall': 'Iniciar videochamada',
692
+ 'call.error.sdkMissing': 'Chamadas indisponíveis: os pacotes LiveKit não estão instalados nesta aplicação.',
693
+ 'call.error.missingConfig': 'Chamadas indisponíveis: falta o token da chamada ou o URL do servidor.',
694
+ 'call.error.missingLivekitUrl': 'Chamadas indisponíveis: falta livekitUrl em config.videoCalls',
695
+ 'call.error.connectFailed': 'Não foi possível ligar à chamada',
696
+ 'call.error.deviceBlocked': 'O acesso à câmara/microfone está bloqueado. Ative-o nas Definições e tente novamente.',
697
+ 'call.error.deviceNotFound': 'Nenhuma câmara ou microfone encontrado neste dispositivo.',
698
+ 'call.error.deviceInUse': 'A sua câmara ou microfone já está a ser utilizado por outra aplicação.',
699
+ 'call.error.deviceGeneric': 'Não foi possível aceder à câmara ou microfone.',
700
+ 'call.error.noAnswerTimeout': 'Sem resposta, a chamada expirou',
701
+ 'action.send': 'Enviar',
702
+ 'action.cancel': 'Cancelar',
703
+ 'action.save': 'Guardar',
704
+ 'action.delete': 'Eliminar',
705
+ 'action.leave': 'Sair',
706
+ 'action.create': 'Criar',
707
+ 'action.submit': 'Enviar',
708
+ 'action.translate': 'Traduzir',
709
+ 'action.showOriginal': 'Ver original',
710
+ 'action.newChat': 'Novo chat',
711
+ 'action.addUsers': 'Adicionar utilizadores',
712
+ 'action.addMoreUsers': 'Adicionar mais utilizadores',
713
+ 'action.add': 'Adicionar',
714
+ 'action.backToCreation': 'Voltar à criação',
715
+ 'action.report': 'Denunciar',
716
+ 'status.connecting': 'A ligar…',
717
+ 'status.noInternet': 'Sem ligação à internet',
718
+ 'translation.translating': 'A traduzir…',
719
+ 'translation.failed': 'Não foi possível traduzir',
720
+ 'translation.enableToggleLabel': 'Traduzir minhas mensagens',
721
+ 'translation.enableToggleDisclaimer': 'Se as traduções não estavam ativadas, apenas as novas mensagens enviadas a partir de agora serão traduzidas.',
722
+ 'translation.modeLabel': 'Exibição de traduções',
723
+ 'translation.modeAuto': 'Automático',
724
+ 'translation.modeManual': 'Manual',
725
+ 'language.select': 'Selecionar idioma',
726
+ 'modal.newChat.title': 'Criar novo chat',
727
+ 'modal.newChat.roomNamePlaceholder': 'Nome da sala',
728
+ 'modal.newChat.chatTypePlaceholder': 'Selecione o tipo de chat',
729
+ 'modal.newChat.selectUsersTitle': 'Selecione utilizadores para adicionar ao chat',
730
+ 'modal.selectUsers.title': 'Selecionar utilizadores (máx. 20)',
731
+ 'modal.selectUsers.searchPlaceholder': 'Pesquisar utilizadores...',
732
+ 'toast.roomCreationTitle': 'Criação de sala',
733
+ 'toast.roomCreating': 'A sala está a ser criada...',
734
+ 'toast.success': 'Sucesso!',
735
+ 'toast.roomCreatedSuccess': 'Sala criada com sucesso!',
736
+ 'toast.usersAddedSuccess': 'Utilizadores adicionados com sucesso!',
737
+ 'settings.menu.title': 'Definições',
738
+ 'modal.filePreview.title': 'Pré-visualização do ficheiro',
739
+ 'toast.error': 'Erro',
740
+ 'toast.couldNotOpenPrivateChat': 'Não foi possível abrir o novo chat privado',
741
+ 'toast.couldNotResolveRecipient': 'Não foi possível identificar o destinatário',
742
+ 'toast.failedToCreatePrivateChat': 'Falha ao criar o chat privado',
743
+ 'toast.failedToCreateCall': 'Falha ao criar a chamada',
744
+ 'toast.failedToDeleteUser': 'Falha ao eliminar o utilizador.',
745
+ 'toast.userRemovedFromRoom': '{userId} foi removido da sala.',
746
+ 'toast.failedToAddUser': 'Falha ao adicionar o utilizador.',
747
+ 'toast.userAddedToRoom': '{userName} foi adicionado à sala.',
748
+ 'toast.loginFailedTitle': 'Falha ao iniciar sessão',
749
+ 'toast.invalidCredentials': 'Credenciais inválidas',
750
+ 'toast.loginSuccessfulTitle': 'Sessão iniciada',
751
+ 'toast.welcomeBack': 'Bem-vindo de volta!',
752
+ 'toast.loginErrorTitle': 'Erro ao iniciar sessão',
753
+ 'toast.loginErrorMessage': 'Ocorreu um erro ao iniciar sessão',
754
+ 'validation.invalidEmail': 'Formato de email inválido',
755
+ 'validation.passwordTooShort': 'A palavra-passe deve ter pelo menos 6 caracteres',
756
+ 'validation.wrongCredentials': 'Dados incorretos. Tente novamente',
757
+ 'field.email': 'Email',
758
+ 'field.password': 'Palavra-passe',
759
+ 'field.firstName': 'Nome',
760
+ 'field.lastName': 'Apelido',
761
+ 'field.additionalDetails': 'Detalhes adicionais',
762
+ 'field.referralCode': 'O seu código de referência',
763
+ 'action.logOut': 'Terminar sessão',
764
+ 'action.message': 'Mensagem',
765
+ 'action.videoCall': 'Videochamada',
766
+ 'action.call': 'Ligar',
767
+ 'action.audioCall': 'Chamada de áudio',
768
+ 'action.copyUserId': 'Copiar ID do utilizador',
769
+ 'action.deleteChat': 'Eliminar chat',
770
+ 'action.appointAsAdmin': 'Nomear administrador',
771
+ 'action.moreOptions': 'Mais opções',
772
+ 'action.addMembers': 'Adicionar membros',
773
+ 'action.no': 'Não',
774
+ 'action.yes': 'Sim',
775
+ 'action.addNewShare': 'Adicionar nova partilha',
776
+ 'action.deleteMyAccount': 'Eliminar a minha conta',
777
+ 'auth.loginButton': 'Entrar no Ethora Chat',
778
+ 'auth.loginWithGoogle': 'Entrar com o Google',
779
+ 'auth.orDelimiter': 'ou',
780
+ 'auth.noAccount': 'Ainda não tem conta?',
781
+ 'auth.signUp': 'Registar-se no Ethora',
782
+ 'auth.loginAnonymously': 'Entrar anonimamente',
783
+ 'auth.anonymousTextOnly': 'Só é possível enviar mensagens de texto',
784
+ 'auth.anonymousLoginMessage': 'Iniciou sessão anonimamente!',
785
+ 'modal.profile.title': 'Perfil',
786
+ 'modal.profile.about': 'Sobre',
787
+ 'modal.profile.noDescription': 'Sem descrição',
788
+ 'modal.chatProfile.title': 'Perfil do chat',
789
+ 'modal.chatProfile.description': 'Descrição',
790
+ 'modal.chatProfile.chatType': 'Tipo de chat',
791
+ 'modal.chatProfile.memberCountSingular': '{count} membro',
792
+ 'modal.chatProfile.memberCountPlural': '{count} membros',
793
+ 'modal.deleteChat.title': 'Eliminar este chat?',
794
+ 'modal.addMembers.title': 'Adicionar novo membro',
795
+ 'modal.addMembers.userIdPlaceholder': 'Introduza o ID do utilizador',
796
+ 'modal.leaveChat.title': 'Sair do chat',
797
+ 'modal.leaveChat.description': 'Tem a certeza de que quer sair deste chat?',
798
+ 'modal.report.chatTitle': 'Denunciar chat',
799
+ 'modal.report.messageTitle': 'Denunciar mensagem',
800
+ 'modal.report.otherDetails': 'Indique detalhes adicionais relevantes para a sua denúncia.',
801
+ 'report.category.spam': 'Spam',
802
+ 'report.category.violence': 'Violência',
803
+ 'report.category.childAbuse': 'Abuso infantil',
804
+ 'report.category.pornography': 'Pornografia',
805
+ 'report.category.personalDetails': 'Dados pessoais',
806
+ 'report.category.illegalDrugs': 'Drogas ilegais',
807
+ 'report.category.other': 'Outro',
808
+ 'notification.saved': 'Guardado',
809
+ 'sort.name': 'Nome',
810
+ 'sort.surname': 'Apelido',
811
+ 'settings.shares.listOfShares': 'Lista de partilhas',
812
+ 'settings.documentShares.title': 'Partilhas de documentos',
813
+ 'settings.documentShares.currentShares': 'Partilhas de documentos atuais',
814
+ 'settings.documentShares.description': 'Abaixo estão as suas ligações de partilha de documentos ativas. Pode partilhá-las ou eliminá-las.',
815
+ 'settings.documentShares.emptyState': 'Ainda não há partilhas, ou pode adicioná-las clicando no botão "Adicionar nova partilha"',
816
+ 'settings.profileShares.title': 'Partilhas de perfil',
817
+ 'settings.profileShares.currentShares': 'Partilhas de perfil atuais',
818
+ 'settings.profileShares.description': 'Abaixo estão as suas ligações de partilha de perfil ativas. Pode partilhá-las ou eliminá-las.',
819
+ 'settings.blockedUsers.title': 'Utilizadores bloqueados',
820
+ 'settings.blockedUsers.label': 'Utilizadores bloqueados',
821
+ 'settings.blockedUsers.description': 'Os utilizadores que bloqueou não lhe podem enviar mensagens nem ver quando está online.',
822
+ 'settings.blockedUsers.emptyState': 'Ainda não bloqueou ninguém.',
823
+ 'settings.visibility.title': 'Visibilidade',
824
+ 'settings.visibility.profileLabel': 'Visibilidade do perfil',
825
+ 'settings.visibility.open': 'Aberto (predefinição)',
826
+ 'settings.visibility.openDescription': 'O seu perfil pode ser visto por qualquer pessoa que siga a ligação do seu perfil ou o código QR.',
827
+ 'settings.visibility.restricted': 'Restrito',
828
+ 'settings.visibility.restrictedDescription': 'Só os utilizadores com a sua permissão ou com uma ligação segura temporária podem ver o seu perfil.',
829
+ 'settings.visibility.documentsLabel': 'Visibilidade dos documentos',
830
+ 'settings.visibility.full': 'Total (predefinição)',
831
+ 'settings.visibility.fullDescription': 'Mostrar todos os documentos a quem pode ver o seu perfil.',
832
+ 'settings.visibility.individual': 'Individual',
833
+ 'settings.visibility.individualDescription': 'Tem de partilhar cada documento individualmente antes que outros o possam ver.',
834
+ 'settings.referrals.title': 'Referências',
835
+ 'settings.referrals.giftPart1': 'Ofereça 25 aos amigos',
836
+ 'settings.referrals.giftPart2': 'e receba 25',
837
+ 'settings.referrals.giftPart3': 'Envie um convite aos amigos com o seu código de convite pessoal.',
838
+ 'settings.referrals.yourCode': 'O seu código de convite',
839
+ 'settings.referrals.enterReferralCode': 'Ou introduza o seu código de referência para ganhar moedas',
840
+ 'settings.manageData.title': 'Gerir dados',
841
+ 'settings.manageData.downloadLabel': 'Transferir os seus dados',
842
+ 'settings.manageData.downloadDescription': 'Os dados são seus. Toque no botão abaixo para transferir uma cópia dos seus dados',
843
+ 'settings.manageData.deleteLabel': 'Eliminar a sua conta',
844
+ 'settings.manageData.deleteDescription': 'Use isto apenas se quiser eliminar permanentemente a sua conta e os seus dados do nosso sistema.',
845
+ 'settings.manageData.deleteDisclosure': 'Devido à natureza imutável da tecnologia de registo distribuído, os nós da rede operados pela comunidade podem manter transações históricas geradas pela sua conta; no entanto, as suas informações de identificação pessoal, como nome, email e armazenamento chave-valor, serão removidas. Todos os seus ativos digitais serão perdidos.',
846
+ };
847
+
848
+ const ht: UiStringTable = {
849
+ 'search.placeholder': 'Chèche...',
850
+ 'input.placeholder': 'Ekri yon mesaj',
851
+ 'room.created': 'Sal la kreye',
852
+ 'room.empty': 'Chat sa a vid',
853
+ 'date.today': 'Jodi a',
854
+ 'date.yesterday': 'Yè',
855
+ 'message.deleted': 'Mesaj efase',
856
+ 'message.edited': 'modifye',
857
+ 'presence.online': 'an liy',
858
+ 'presence.offline': 'pa an liy',
859
+ 'presence.onlineCount': '{count} an liy',
860
+ 'header.userCountSingular': '{count} itilizatè',
861
+ 'header.userCountPlural': '{count} itilizatè',
862
+ 'call.outgoing': 'Apèl sòtan',
863
+ 'call.incoming': 'Apèl antran',
864
+ 'call.noAnswer': 'Pa gen repons',
865
+ 'call.missed': 'Apèl ou rate',
866
+ 'call.durationSec': '{n} segond',
867
+ 'call.durationMin': '{n} minit',
868
+ 'call.durationMinSec': '{m} minit {s} segond',
869
+ 'call.title': 'Apèl',
870
+ 'call.unknownCaller': 'Moun ki rele a enkoni',
871
+ 'call.incomingAudio': 'Apèl odyo antran',
872
+ 'call.incomingVideo': 'Apèl videyo antran',
873
+ 'call.calling': 'Ap rele...',
874
+ 'call.connecting': 'Ap konekte...',
875
+ 'call.failed': 'Apèl la echwe',
876
+ 'call.audioCall': 'Apèl odyo',
877
+ 'call.videoCall': 'Apèl videyo',
878
+ 'call.connectingToRoom': 'Ap konekte nan sal la',
879
+ 'call.tryAgainLater': 'Tanpri eseye ankò pita',
880
+ 'call.status.inCall': 'Nan apèl',
881
+ 'call.status.connecting': 'Ap konekte...',
882
+ 'call.status.waitingForPeer': 'Ap tann lòt moun nan',
883
+ 'call.status.cameraOff': 'Kamera a etenn',
884
+ 'call.action.accept': 'Aksepte',
885
+ 'call.action.decline': 'Refize',
886
+ 'call.action.cancel': 'Anile',
887
+ 'call.action.dismiss': 'Fèmen',
888
+ 'call.action.hangUp': 'Rakwoche',
889
+ 'call.action.minimize': 'Diminye apèl la',
890
+ 'call.action.expand': 'Agrandi apèl la',
891
+ 'call.action.muteMic': 'Etenn mikwo a',
892
+ 'call.action.unmuteMic': 'Limen mikwo a',
893
+ 'call.action.stopCamera': 'Etenn kamera a',
894
+ 'call.action.startCamera': 'Limen kamera a',
895
+ 'call.action.switchCamera': 'Chanje kamera',
896
+ 'call.action.speakerOn': 'Limen opalè a',
897
+ 'call.action.speakerOff': 'Etenn opalè a',
898
+ 'call.action.startAudioCall': 'Kòmanse yon apèl odyo',
899
+ 'call.action.startVideoCall': 'Kòmanse yon apèl videyo',
900
+ 'call.error.sdkMissing': 'Apèl pa disponib: pakè LiveKit yo pa enstale nan aplikasyon sa a.',
901
+ 'call.error.missingConfig': 'Apèl pa disponib: token apèl la oswa URL sèvè a manke.',
902
+ 'call.error.missingLivekitUrl': 'Apèl pa disponib: livekitUrl manke nan config.videoCalls',
903
+ 'call.error.connectFailed': 'Nou pa t kapab konekte nan apèl la',
904
+ 'call.error.deviceBlocked': 'Aksè kamera/mikwofòn bloke. Otorize l nan Paramèt, epi eseye ankò.',
905
+ 'call.error.deviceNotFound': 'Pa gen kamera ni mikwofòn jwenn sou aparèy sa a.',
906
+ 'call.error.deviceInUse': 'Kamera oswa mikwofòn ou deja ap itilize pa yon lòt app.',
907
+ 'call.error.deviceGeneric': 'Nou pa t kapab jwenn aksè nan kamera oswa mikwofòn ou.',
908
+ 'call.error.noAnswerTimeout': 'Pa gen repons, apèl la fini',
909
+ 'action.send': 'Voye',
910
+ 'action.cancel': 'Anile',
911
+ 'action.save': 'Anrejistre',
912
+ 'action.delete': 'Efase',
913
+ 'action.leave': 'Kite',
914
+ 'action.create': 'Kreye',
915
+ 'action.submit': 'Soumèt',
916
+ 'action.translate': 'Tradui',
917
+ 'action.showOriginal': 'Montre orijinal la',
918
+ 'action.newChat': 'Nouvo chat',
919
+ 'action.addUsers': 'Ajoute itilizatè',
920
+ 'action.addMoreUsers': 'Ajoute plis itilizatè',
921
+ 'action.add': 'Ajoute',
922
+ 'action.backToCreation': 'Retounen nan kreyasyon',
923
+ 'action.report': 'Rapòte',
924
+ 'status.connecting': 'Koneksyon…',
925
+ 'status.noInternet': 'Pa gen koneksyon entènèt',
926
+ 'translation.translating': 'Ap tradui…',
927
+ 'translation.failed': 'Pa t kapab tradui',
928
+ 'translation.enableToggleLabel': 'Tradui mesaj mwen yo',
929
+ 'translation.enableToggleDisclaimer': "Si tradiksyon yo pa t aktive, se sèlman nouvo mesaj ou voye apati kounye a ki pral tradui.",
930
+ 'translation.modeLabel': 'Afichaj tradiksyon',
931
+ 'translation.modeAuto': 'Otomatik',
932
+ 'translation.modeManual': 'Manyèl',
933
+ 'language.select': 'Chwazi lang',
934
+ 'modal.newChat.title': 'Kreye yon nouvo chat',
935
+ 'modal.newChat.roomNamePlaceholder': 'Antre non sal la',
936
+ 'modal.newChat.chatTypePlaceholder': 'Chwazi tip chat la',
937
+ 'modal.newChat.selectUsersTitle': 'Chwazi itilizatè pou ajoute nan chat la',
938
+ 'modal.selectUsers.title': 'Chwazi itilizatè (maksimòm 20)',
939
+ 'modal.selectUsers.searchPlaceholder': 'Chèche itilizatè...',
940
+ 'toast.roomCreationTitle': 'Kreyasyon sal',
941
+ 'toast.roomCreating': 'Sal la ap kreye...',
942
+ 'toast.success': 'Siksè!',
943
+ 'toast.roomCreatedSuccess': 'Sal la kreye avèk siksè!',
944
+ 'toast.usersAddedSuccess': 'Itilizatè yo ajoute avèk siksè!',
945
+ 'settings.menu.title': 'Paramèt',
946
+ 'modal.filePreview.title': 'Apèsi fichye',
947
+ 'toast.error': 'Erè',
948
+ 'toast.couldNotOpenPrivateChat': 'Pa t kapab louvri nouvo chat prive a',
949
+ 'toast.couldNotResolveRecipient': 'Pa t kapab jwenn destinatè a',
950
+ 'toast.failedToCreatePrivateChat': 'Echèk pou kreye chat prive a',
951
+ 'toast.failedToCreateCall': 'Echèk pou kreye apèl la',
952
+ 'toast.failedToDeleteUser': 'Echèk pou efase itilizatè a.',
953
+ 'toast.userRemovedFromRoom': '{userId} retire nan sal la.',
954
+ 'toast.failedToAddUser': 'Echèk pou ajoute itilizatè a.',
955
+ 'toast.userAddedToRoom': '{userName} ajoute nan sal la.',
956
+ 'toast.loginFailedTitle': 'Koneksyon echwe',
957
+ 'toast.invalidCredentials': 'Enfòmasyon koneksyon yo pa valab',
958
+ 'toast.loginSuccessfulTitle': 'Koneksyon reyisi',
959
+ 'toast.welcomeBack': 'Byenveni ankò!',
960
+ 'toast.loginErrorTitle': 'Erè koneksyon',
961
+ 'toast.loginErrorMessage': 'Yon erè rive pandan koneksyon an',
962
+ 'validation.invalidEmail': 'Fòma imèl la pa valab',
963
+ 'validation.passwordTooShort': 'Modpas la dwe gen omwen 6 karaktè',
964
+ 'validation.wrongCredentials': 'Ou antre move enfòmasyon. Eseye ankò',
965
+ 'field.email': 'Imèl',
966
+ 'field.password': 'Modpas',
967
+ 'field.firstName': 'Prenon',
968
+ 'field.lastName': 'Siyati',
969
+ 'field.additionalDetails': 'Detay anplis',
970
+ 'field.referralCode': 'Kòd referans ou',
971
+ 'action.logOut': 'Dekonekte',
972
+ 'action.message': 'Mesaj',
973
+ 'action.videoCall': 'Apèl videyo',
974
+ 'action.call': 'Rele',
975
+ 'action.audioCall': 'Apèl odyo',
976
+ 'action.copyUserId': 'Kopye ID itilizatè a',
977
+ 'action.deleteChat': 'Efase chat la',
978
+ 'action.appointAsAdmin': 'Nonmen kòm administratè',
979
+ 'action.moreOptions': 'Plis opsyon',
980
+ 'action.addMembers': 'Ajoute manm',
981
+ 'action.no': 'Non',
982
+ 'action.yes': 'Wi',
983
+ 'action.addNewShare': 'Ajoute yon nouvo pataj',
984
+ 'action.deleteMyAccount': 'Efase kont mwen',
985
+ 'auth.loginButton': 'Konekte nan Ethora Chat',
986
+ 'auth.loginWithGoogle': 'Konekte ak Google',
987
+ 'auth.orDelimiter': 'oswa',
988
+ 'auth.noAccount': 'Ou pa gen yon kont?',
989
+ 'auth.signUp': 'Enskri nan Ethora',
990
+ 'auth.loginAnonymously': 'Konekte anonim',
991
+ 'auth.anonymousTextOnly': 'Ou ka voye sèlman mesaj tèks',
992
+ 'auth.anonymousLoginMessage': 'Ou konekte anonim!',
993
+ 'modal.profile.title': 'Pwofil',
994
+ 'modal.profile.about': 'Konsènan',
995
+ 'modal.profile.noDescription': 'Pa gen deskripsyon',
996
+ 'modal.chatProfile.title': 'Pwofil chat la',
997
+ 'modal.chatProfile.description': 'Deskripsyon',
998
+ 'modal.chatProfile.chatType': 'Tip chat',
999
+ 'modal.chatProfile.memberCountSingular': '{count} manm',
1000
+ 'modal.chatProfile.memberCountPlural': '{count} manm',
1001
+ 'modal.deleteChat.title': 'Efase chat sa a?',
1002
+ 'modal.addMembers.title': 'Ajoute yon nouvo manm',
1003
+ 'modal.addMembers.userIdPlaceholder': 'Antre ID itilizatè a',
1004
+ 'modal.leaveChat.title': 'Kite chat la',
1005
+ 'modal.leaveChat.description': 'Èske ou sèten ou vle kite chat sa a?',
1006
+ 'modal.report.chatTitle': 'Rapòte chat la',
1007
+ 'modal.report.messageTitle': 'Rapòte mesaj la',
1008
+ 'modal.report.otherDetails': 'Tanpri antre detay anplis ki gen rapò ak rapò ou a.',
1009
+ 'report.category.spam': 'Spam',
1010
+ 'report.category.violence': 'Vyolans',
1011
+ 'report.category.childAbuse': 'Abi sou timoun',
1012
+ 'report.category.pornography': 'Pònografi',
1013
+ 'report.category.personalDetails': 'Enfòmasyon pèsonèl',
1014
+ 'report.category.illegalDrugs': 'Dwòg ilegal',
1015
+ 'report.category.other': 'Lòt',
1016
+ 'notification.saved': 'Anrejistre',
1017
+ 'sort.name': 'Prenon',
1018
+ 'sort.surname': 'Siyati',
1019
+ 'settings.shares.listOfShares': 'Lis pataj yo',
1020
+ 'settings.documentShares.title': 'Pataj dokiman',
1021
+ 'settings.documentShares.currentShares': 'Pataj dokiman aktyèl yo',
1022
+ 'settings.documentShares.description': 'Anba a se lyen pataj dokiman ou yo ki aktif. Ou ka pataje yo oswa efase yo.',
1023
+ 'settings.documentShares.emptyState': 'Pa gen pataj pou kounye a, oswa ou ka ajoute yo lè ou klike sou bouton "Ajoute yon nouvo pataj"',
1024
+ 'settings.profileShares.title': 'Pataj pwofil',
1025
+ 'settings.profileShares.currentShares': 'Pataj pwofil aktyèl yo',
1026
+ 'settings.profileShares.description': 'Anba a se lyen pataj pwofil ou yo ki aktif. Ou ka pataje yo oswa efase yo.',
1027
+ 'settings.blockedUsers.title': 'Itilizatè bloke',
1028
+ 'settings.blockedUsers.label': 'Itilizatè bloke',
1029
+ 'settings.blockedUsers.description': 'Itilizatè ou bloke yo pa ka voye mesaj ba ou ni wè lè ou an liy.',
1030
+ 'settings.blockedUsers.emptyState': 'Ou poko bloke pèsonn.',
1031
+ 'settings.visibility.title': 'Vizibilite',
1032
+ 'settings.visibility.profileLabel': 'Vizibilite pwofil la',
1033
+ 'settings.visibility.open': 'Louvri (default)',
1034
+ 'settings.visibility.openDescription': 'Nenpòt moun ki swiv lyen pwofil ou a oswa kòd QR ou a ka wè pwofil ou.',
1035
+ 'settings.visibility.restricted': 'Limite',
1036
+ 'settings.visibility.restrictedDescription': 'Sèlman itilizatè ki gen pèmisyon ou oswa yon lyen sekirize tanporè ka wè pwofil ou.',
1037
+ 'settings.visibility.documentsLabel': 'Vizibilite dokiman yo',
1038
+ 'settings.visibility.full': 'Konplè (default)',
1039
+ 'settings.visibility.fullDescription': 'Montre tout dokiman yo bay moun ki ka wè pwofil ou.',
1040
+ 'settings.visibility.individual': 'Endividyèl',
1041
+ 'settings.visibility.individualDescription': 'Ou dwe pataje chak dokiman endividyèlman anvan lòt moun ka wè yo.',
1042
+ 'settings.referrals.title': 'Referans',
1043
+ 'settings.referrals.giftPart1': 'Bay zanmi 25',
1044
+ 'settings.referrals.giftPart2': 'epi resevwa 25',
1045
+ 'settings.referrals.giftPart3': 'Voye yon envitasyon bay zanmi ou ak kòd envitasyon pèsonèl ou.',
1046
+ 'settings.referrals.yourCode': 'Kòd envitasyon ou',
1047
+ 'settings.referrals.enterReferralCode': 'Oswa antre kòd referans ou pou touche pyès monnen',
1048
+ 'settings.manageData.title': 'Jere done',
1049
+ 'settings.manageData.downloadLabel': 'Telechaje done ou yo',
1050
+ 'settings.manageData.downloadDescription': 'Done yo se pa ou. Peze bouton anba a pou telechaje yon kopi done ou yo',
1051
+ 'settings.manageData.deleteLabel': 'Efase kont ou',
1052
+ 'settings.manageData.deleteDescription': 'Sèvi ak sa a sèlman si ou vle efase kont ou ak done ou yo nèt nan sistèm nou an.',
1053
+ 'settings.manageData.deleteDisclosure': 'Akoz nati imityab teknoloji rejis distribiye a, nœud rezo kominote a opere yo ka toujou kenbe tranzaksyon istorik kont ou an te jenere; sepandan, enfòmasyon idantifyab pèsonèl ou yo tankou non ou, imèl ou ak depo kle-valè ou yo ap retire. Tout byen dijital ou yo ap pèdi.',
1054
+ };
1055
+
1056
+ const zh: UiStringTable = {
1057
+ 'search.placeholder': '搜索...',
1058
+ 'input.placeholder': '输入消息',
1059
+ 'room.created': '聊天室已创建',
1060
+ 'room.empty': '此聊天为空',
1061
+ 'date.today': '今天',
1062
+ 'date.yesterday': '昨天',
1063
+ 'message.deleted': '消息已删除',
1064
+ 'message.edited': '已编辑',
1065
+ 'presence.online': '在线',
1066
+ 'presence.offline': '离线',
1067
+ 'presence.onlineCount': '{count} 人在线',
1068
+ 'header.userCountSingular': '{count} 位用户',
1069
+ 'header.userCountPlural': '{count} 位用户',
1070
+ 'call.outgoing': '拨出通话',
1071
+ 'call.incoming': '来电',
1072
+ 'call.noAnswer': '无人接听',
1073
+ 'call.missed': '未接来电',
1074
+ 'call.durationSec': '{n} 秒',
1075
+ 'call.durationMin': '{n} 分钟',
1076
+ 'call.durationMinSec': '{m} 分 {s} 秒',
1077
+ 'call.title': '通话',
1078
+ 'call.unknownCaller': '未知来电者',
1079
+ 'call.incomingAudio': '语音来电',
1080
+ 'call.incomingVideo': '视频来电',
1081
+ 'call.calling': '正在呼叫…',
1082
+ 'call.connecting': '正在连接…',
1083
+ 'call.failed': '通话失败',
1084
+ 'call.audioCall': '语音通话',
1085
+ 'call.videoCall': '视频通话',
1086
+ 'call.connectingToRoom': '正在连接房间',
1087
+ 'call.tryAgainLater': '请稍后再试',
1088
+ 'call.status.inCall': '通话中',
1089
+ 'call.status.connecting': '正在连接…',
1090
+ 'call.status.waitingForPeer': '正在等待对方',
1091
+ 'call.status.cameraOff': '摄像头已关闭',
1092
+ 'call.action.accept': '接听',
1093
+ 'call.action.decline': '拒接',
1094
+ 'call.action.cancel': '取消',
1095
+ 'call.action.dismiss': '关闭',
1096
+ 'call.action.hangUp': '挂断',
1097
+ 'call.action.minimize': '最小化通话',
1098
+ 'call.action.expand': '展开通话',
1099
+ 'call.action.muteMic': '静音麦克风',
1100
+ 'call.action.unmuteMic': '取消静音',
1101
+ 'call.action.stopCamera': '关闭摄像头',
1102
+ 'call.action.startCamera': '打开摄像头',
1103
+ 'call.action.switchCamera': '切换摄像头',
1104
+ 'call.action.speakerOn': '打开扬声器',
1105
+ 'call.action.speakerOff': '关闭扬声器',
1106
+ 'call.action.startAudioCall': '发起语音通话',
1107
+ 'call.action.startVideoCall': '发起视频通话',
1108
+ 'call.error.sdkMissing': '无法通话:此应用未安装 LiveKit 组件包。',
1109
+ 'call.error.missingConfig': '无法通话:缺少通话令牌或服务器地址。',
1110
+ 'call.error.missingLivekitUrl': '无法通话:config.videoCalls 中缺少 livekitUrl',
1111
+ 'call.error.connectFailed': '无法连接到通话',
1112
+ 'call.error.deviceBlocked': '摄像头/麦克风访问被阻止。请在设置中允许后重试。',
1113
+ 'call.error.deviceNotFound': '此设备未找到摄像头或麦克风。',
1114
+ 'call.error.deviceInUse': '您的摄像头或麦克风正被其他应用占用。',
1115
+ 'call.error.deviceGeneric': '无法访问您的摄像头或麦克风。',
1116
+ 'call.error.noAnswerTimeout': '无人接听,通话已超时',
1117
+ 'action.send': '发送',
1118
+ 'action.cancel': '取消',
1119
+ 'action.save': '保存',
1120
+ 'action.delete': '删除',
1121
+ 'action.leave': '退出',
1122
+ 'action.create': '创建',
1123
+ 'action.submit': '提交',
1124
+ 'action.translate': '翻译',
1125
+ 'action.showOriginal': '显示原文',
1126
+ 'action.newChat': '新建聊天',
1127
+ 'action.addUsers': '添加用户',
1128
+ 'action.addMoreUsers': '添加更多用户',
1129
+ 'action.add': '添加',
1130
+ 'action.backToCreation': '返回创建',
1131
+ 'action.report': '举报',
1132
+ 'status.connecting': '连接中…',
1133
+ 'status.noInternet': '无网络连接',
1134
+ 'translation.translating': '翻译中…',
1135
+ 'translation.failed': '无法翻译',
1136
+ 'translation.enableToggleLabel': '翻译我的消息',
1137
+ 'translation.enableToggleDisclaimer': '如果之前未启用翻译,只有从现在开始发送的新消息才会被翻译。',
1138
+ 'translation.modeLabel': '翻译显示方式',
1139
+ 'translation.modeAuto': '自动',
1140
+ 'translation.modeManual': '手动',
1141
+ 'language.select': '选择语言',
1142
+ 'modal.newChat.title': '创建新聊天',
1143
+ 'modal.newChat.roomNamePlaceholder': '输入聊天室名称',
1144
+ 'modal.newChat.chatTypePlaceholder': '选择聊天类型',
1145
+ 'modal.newChat.selectUsersTitle': '选择要添加到聊天的用户',
1146
+ 'modal.selectUsers.title': '选择用户(最多 20 个)',
1147
+ 'modal.selectUsers.searchPlaceholder': '搜索用户...',
1148
+ 'toast.roomCreationTitle': '创建聊天室',
1149
+ 'toast.roomCreating': '正在创建聊天室...',
1150
+ 'toast.success': '成功!',
1151
+ 'toast.roomCreatedSuccess': '聊天室创建成功!',
1152
+ 'toast.usersAddedSuccess': '用户添加成功!',
1153
+ 'settings.menu.title': '设置',
1154
+ 'modal.filePreview.title': '文件预览',
1155
+ 'toast.error': '错误',
1156
+ 'toast.couldNotOpenPrivateChat': '无法打开新的私聊',
1157
+ 'toast.couldNotResolveRecipient': '无法识别收件人',
1158
+ 'toast.failedToCreatePrivateChat': '创建私聊失败',
1159
+ 'toast.failedToCreateCall': '创建通话失败',
1160
+ 'toast.failedToDeleteUser': '删除用户失败。',
1161
+ 'toast.userRemovedFromRoom': '{userId} 已被移出聊天室。',
1162
+ 'toast.failedToAddUser': '添加用户失败。',
1163
+ 'toast.userAddedToRoom': '{userName} 已被添加到聊天室。',
1164
+ 'toast.loginFailedTitle': '登录失败',
1165
+ 'toast.invalidCredentials': '凭据无效',
1166
+ 'toast.loginSuccessfulTitle': '登录成功',
1167
+ 'toast.welcomeBack': '欢迎回来!',
1168
+ 'toast.loginErrorTitle': '登录错误',
1169
+ 'toast.loginErrorMessage': '登录过程中发生错误',
1170
+ 'validation.invalidEmail': '邮箱格式无效',
1171
+ 'validation.passwordTooShort': '密码至少需要 6 个字符',
1172
+ 'validation.wrongCredentials': '您输入的信息有误。请重试',
1173
+ 'field.email': '邮箱',
1174
+ 'field.password': '密码',
1175
+ 'field.firstName': '名字',
1176
+ 'field.lastName': '姓氏',
1177
+ 'field.additionalDetails': '补充信息',
1178
+ 'field.referralCode': '您的推荐码',
1179
+ 'action.logOut': '退出登录',
1180
+ 'action.message': '发消息',
1181
+ 'action.videoCall': '视频通话',
1182
+ 'action.call': '通话',
1183
+ 'action.audioCall': '语音通话',
1184
+ 'action.copyUserId': '复制用户 ID',
1185
+ 'action.deleteChat': '删除聊天',
1186
+ 'action.appointAsAdmin': '设为管理员',
1187
+ 'action.moreOptions': '更多选项',
1188
+ 'action.addMembers': '添加成员',
1189
+ 'action.no': '否',
1190
+ 'action.yes': '是',
1191
+ 'action.addNewShare': '添加新分享',
1192
+ 'action.deleteMyAccount': '删除我的账户',
1193
+ 'auth.loginButton': '登录 Ethora Chat',
1194
+ 'auth.loginWithGoogle': '使用 Google 登录',
1195
+ 'auth.orDelimiter': '或',
1196
+ 'auth.noAccount': '还没有账户?',
1197
+ 'auth.signUp': '注册 Ethora',
1198
+ 'auth.loginAnonymously': '匿名登录',
1199
+ 'auth.anonymousTextOnly': '仅能发送文字消息',
1200
+ 'auth.anonymousLoginMessage': '您已匿名登录!',
1201
+ 'modal.profile.title': '个人资料',
1202
+ 'modal.profile.about': '简介',
1203
+ 'modal.profile.noDescription': '暂无简介',
1204
+ 'modal.chatProfile.title': '聊天资料',
1205
+ 'modal.chatProfile.description': '描述',
1206
+ 'modal.chatProfile.chatType': '聊天类型',
1207
+ 'modal.chatProfile.memberCountSingular': '{count} 位成员',
1208
+ 'modal.chatProfile.memberCountPlural': '{count} 位成员',
1209
+ 'modal.deleteChat.title': '删除此聊天?',
1210
+ 'modal.addMembers.title': '添加新成员',
1211
+ 'modal.addMembers.userIdPlaceholder': '输入用户 ID',
1212
+ 'modal.leaveChat.title': '退出聊天',
1213
+ 'modal.leaveChat.description': '确定要退出此聊天吗?',
1214
+ 'modal.report.chatTitle': '举报聊天',
1215
+ 'modal.report.messageTitle': '举报消息',
1216
+ 'modal.report.otherDetails': '请填写与您举报相关的补充信息。',
1217
+ 'report.category.spam': '垃圾信息',
1218
+ 'report.category.violence': '暴力',
1219
+ 'report.category.childAbuse': '虐待儿童',
1220
+ 'report.category.pornography': '色情内容',
1221
+ 'report.category.personalDetails': '个人信息',
1222
+ 'report.category.illegalDrugs': '违禁药物',
1223
+ 'report.category.other': '其他',
1224
+ 'notification.saved': '已保存',
1225
+ 'sort.name': '名字',
1226
+ 'sort.surname': '姓氏',
1227
+ 'settings.shares.listOfShares': '分享列表',
1228
+ 'settings.documentShares.title': '文档分享',
1229
+ 'settings.documentShares.currentShares': '当前文档分享',
1230
+ 'settings.documentShares.description': '以下是您当前有效的文档分享链接。您可以分享或删除它们。',
1231
+ 'settings.documentShares.emptyState': '暂无分享,您可以点击“添加新分享”按钮来添加',
1232
+ 'settings.profileShares.title': '资料分享',
1233
+ 'settings.profileShares.currentShares': '当前资料分享',
1234
+ 'settings.profileShares.description': '以下是您当前有效的资料分享链接。您可以分享或删除它们。',
1235
+ 'settings.blockedUsers.title': '已屏蔽用户',
1236
+ 'settings.blockedUsers.label': '已屏蔽用户',
1237
+ 'settings.blockedUsers.description': '被您屏蔽的用户无法向您发送消息,也无法看到您何时在线。',
1238
+ 'settings.blockedUsers.emptyState': '您还没有屏蔽任何人。',
1239
+ 'settings.visibility.title': '可见性',
1240
+ 'settings.visibility.profileLabel': '资料可见性',
1241
+ 'settings.visibility.open': '公开(默认)',
1242
+ 'settings.visibility.openDescription': '任何打开您资料链接或扫描您二维码的人都可以查看您的资料。',
1243
+ 'settings.visibility.restricted': '受限',
1244
+ 'settings.visibility.restrictedDescription': '只有获得您许可或持有临时安全链接的用户才能查看您的资料。',
1245
+ 'settings.visibility.documentsLabel': '文档可见性',
1246
+ 'settings.visibility.full': '全部(默认)',
1247
+ 'settings.visibility.fullDescription': '向所有能查看您资料的人显示全部文档。',
1248
+ 'settings.visibility.individual': '单独',
1249
+ 'settings.visibility.individualDescription': '您需要单独分享每个文档,其他人才能查看。',
1250
+ 'settings.referrals.title': '推荐',
1251
+ 'settings.referrals.giftPart1': '赠送好友 25',
1252
+ 'settings.referrals.giftPart2': '并获得 25',
1253
+ 'settings.referrals.giftPart3': '用您的专属邀请码向好友发送邀请。',
1254
+ 'settings.referrals.yourCode': '您的邀请码',
1255
+ 'settings.referrals.enterReferralCode': '或输入您的推荐码以赚取代币',
1256
+ 'settings.manageData.title': '管理数据',
1257
+ 'settings.manageData.downloadLabel': '下载您的数据',
1258
+ 'settings.manageData.downloadDescription': '您的数据归您所有。点击下方按钮下载您的数据副本',
1259
+ 'settings.manageData.deleteLabel': '删除您的账户',
1260
+ 'settings.manageData.deleteDescription': '仅当您希望从我们的系统中永久删除您的账户及数据时才使用此功能。',
1261
+ 'settings.manageData.deleteDisclosure': '由于分布式账本技术的不可篡改特性,社区运营的网络节点可能仍会保留您账户生成的历史交易记录;但您的个人身份信息,如姓名、电子邮箱、键值存储等将被移除。您的所有数字资产都将丢失。',
1262
+ };
1263
+
1264
+ // Built-in tables keyed by base language. Add a language here (plus the code
1265
+ // in language.model.ts if it should also be a message-translation target).
1266
+ export const BUILTIN_STRINGS: Record<string, UiStringTable> = {
1267
+ en,
1268
+ fr,
1269
+ es,
1270
+ pt,
1271
+ ht,
1272
+ zh,
1273
+ };
1274
+
1275
+ export const DEFAULT_UI_LANGUAGE = 'en';
1276
+
1277
+ /** Reduce a BCP-47 locale ("fr-CA") to its base language ("fr"), lowercased. */
1278
+ export const toBaseLanguage = (locale?: string | null): string =>
1279
+ String(locale || DEFAULT_UI_LANGUAGE)
1280
+ .split('-')[0]
1281
+ .trim()
1282
+ .toLowerCase() || DEFAULT_UI_LANGUAGE;
1283
+
1284
+ /**
1285
+ * Build the effective string table for a locale: the built-in table for that
1286
+ * base language (falling back to English for any missing key), with host
1287
+ * overrides from `config.i18n.strings` merged on top.
1288
+ */
1289
+ export const resolveStringTable = (
1290
+ locale?: string | null,
1291
+ overrides?: UiStringTable | null
1292
+ ): UiStringTable => {
1293
+ const base = toBaseLanguage(locale);
1294
+ const table = BUILTIN_STRINGS[base] || BUILTIN_STRINGS[DEFAULT_UI_LANGUAGE];
1295
+ return {
1296
+ ...BUILTIN_STRINGS[DEFAULT_UI_LANGUAGE],
1297
+ ...table,
1298
+ ...(overrides || {}),
1299
+ };
1300
+ };
1301
+
1302
+ /** Replace `{name}` placeholders with values from `vars`. */
1303
+ export const interpolate = (
1304
+ template: string,
1305
+ vars?: Record<string, string | number>
1306
+ ): string => {
1307
+ if (!vars) return template;
1308
+ return template.replace(/\{(\w+)\}/g, (_, k) =>
1309
+ k in vars ? String(vars[k]) : `{${k}}`
1310
+ );
1311
+ };
1312
+
1313
+ /** One-shot translate for non-React code (helpers). */
1314
+ export const translateKey = (
1315
+ key: string,
1316
+ locale?: string | null,
1317
+ overrides?: UiStringTable | null,
1318
+ vars?: Record<string, string | number>
1319
+ ): string => {
1320
+ const table = resolveStringTable(locale, overrides);
1321
+ return interpolate(table[key] ?? key, vars);
1322
+ };