livechat 0.5.0 → 0.5.2

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 (38) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/app/controllers/livechat/attachments_controller.rb +4 -4
  4. data/app/helpers/livechat/inbox_helper.rb +5 -2
  5. data/app/models/livechat/message.rb +5 -3
  6. data/app/views/layouts/livechat/application.html.erb +10 -0
  7. data/app/views/livechat/conversations/show.html.erb +10 -1
  8. data/config/locales/livechat.ar.yml +14 -0
  9. data/config/locales/livechat.bg.yml +14 -0
  10. data/config/locales/livechat.bn.yml +14 -0
  11. data/config/locales/livechat.de.yml +14 -0
  12. data/config/locales/livechat.el.yml +14 -0
  13. data/config/locales/livechat.en.yml +14 -0
  14. data/config/locales/livechat.es.yml +14 -0
  15. data/config/locales/livechat.fr.yml +14 -0
  16. data/config/locales/livechat.hi.yml +14 -0
  17. data/config/locales/livechat.hr.yml +14 -0
  18. data/config/locales/livechat.id.yml +14 -0
  19. data/config/locales/livechat.it.yml +14 -0
  20. data/config/locales/livechat.ja.yml +14 -0
  21. data/config/locales/livechat.ko.yml +14 -0
  22. data/config/locales/livechat.lb.yml +14 -0
  23. data/config/locales/livechat.nl.yml +14 -0
  24. data/config/locales/livechat.pl.yml +14 -0
  25. data/config/locales/livechat.pt.yml +14 -0
  26. data/config/locales/livechat.ro.yml +14 -0
  27. data/config/locales/livechat.ru.yml +14 -0
  28. data/config/locales/livechat.th.yml +14 -0
  29. data/config/locales/livechat.tr.yml +14 -0
  30. data/config/locales/livechat.uk.yml +14 -0
  31. data/config/locales/livechat.ur.yml +14 -0
  32. data/config/locales/livechat.vi.yml +14 -0
  33. data/config/locales/livechat.zh-CN.yml +14 -0
  34. data/lib/livechat/dashboard.js +185 -2
  35. data/lib/livechat/version.rb +1 -1
  36. data/lib/livechat/widget.js +270 -10
  37. data/lib/livechat/widget.rb +8 -0
  38. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c43b02b890218a998865cc1e5e48d03aa292a120cac3a07045bf18e52f92f33b
4
- data.tar.gz: eb8be46400159aef252e0d2bcd2ffed67a086f9c98cc7b4e2d055543e52e657c
3
+ metadata.gz: 69c3cd167112ced4976fb8b759c45586255c4f9c94f8d89aedfc481efd138e09
4
+ data.tar.gz: c1762cc48eb85e28d203c4ac272137f12ced552a1dc96555be8c8c9af14d7161
5
5
  SHA512:
6
- metadata.gz: a73f3a61db23291760581906d03b2886dff33ff58a68eeceb5f52ce1826deff66e2c0867d3ac4d058824ba297aa923515e9c42a5675d8a9b5705977b945223b6
7
- data.tar.gz: 81b7e4f24815ccd1c549f7fbc885ed108a800e3906e7d168f91c4a33a4a269dd596ee14ac2066d6a98e0f34e13c10caba60fb0702b0569a3f89540466173db11
6
+ metadata.gz: b84e5860f58d5cffc5da5eb0694f600597e5c7932805ab7a376a12997fbfb8e0ba3e380eecfe1462bdf7f167f46c79cdb46d52f4c5a63ebfe2c4458bb8165263
7
+ data.tar.gz: 0dc49e26bf29a41797a96317a5c4cbaeca3c3ec5edbe6a0b253c451ad1ab08cbec4c60c1f66faf14de0916a118d6f4ede433b6c3db6ca42d5dfe434bc2e5ddab
data/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.5.2
4
+
5
+ - Added audio messages. Visitors can record a voice note from the widget, send
6
+ it as an attachment, and both visitors and agents can play audio files
7
+ inline in the conversation.
8
+ - Tightened the mobile chat modal scroll lock for iOS keyboard edge cases. The
9
+ widget now locks both root elements, blocks touch scrolling that escapes the
10
+ chat thread, and re-checks the lock when the viewport switches between phone
11
+ and desktop widths while the panel is open.
12
+
13
+ ## 0.5.1
14
+
15
+ - Fixed the mobile chat panel letting the page scroll behind it (and the host
16
+ page showing through above/below the panel) while the keyboard was open.
17
+ The scroll lock now pins `<body>` with `position: fixed` — `overflow:hidden`
18
+ alone is ignored by iOS Safari for touch — so the background is truly frozen
19
+ and the keyboard-pinned panel covers the visible area with no gaps.
20
+
3
21
  ## 0.5.0
4
22
 
5
23
  - The full-screen mobile panel now survives the on-screen keyboard. On phones
@@ -46,12 +46,12 @@ module Livechat
46
46
  end
47
47
  end
48
48
 
49
- # Images render inline (so the widget can show them in an <img>); anything
50
- # else downloads. nosniff keeps the browser from second-guessing the type
51
- # of a visitor-supplied file.
49
+ # Images and audio render inline (so the clients can show native media
50
+ # controls); anything else downloads. nosniff keeps the browser from
51
+ # second-guessing the type of a visitor-supplied file.
52
52
  def stream(blob)
53
53
  response.headers['X-Content-Type-Options'] = 'nosniff'
54
- inline = blob.content_type.to_s.start_with?('image/')
54
+ inline = blob.content_type.to_s.start_with?('image/', 'audio/')
55
55
  send_data blob.download,
56
56
  filename: blob.filename.to_s,
57
57
  type: blob.content_type.presence || 'application/octet-stream',
@@ -16,8 +16,8 @@ module Livechat
16
16
  end
17
17
 
18
18
  # A message's attachments, rendered like the widget: images inline as
19
- # thumbnails, everything else as a download link. Both point at the gated
20
- # engine route, never a public blob URL.
19
+ # thumbnails, audio as native controls, everything else as a download link.
20
+ # All point at the gated engine route, never a public blob URL.
21
21
  def livechat_message_attachments(message)
22
22
  attachments = message.attachments_json
23
23
  return if attachments.empty?
@@ -41,6 +41,9 @@ module Livechat
41
41
  if attachment[:image]
42
42
  link_to image_tag(attachment[:url], alt: attachment[:name], loading: 'lazy'),
43
43
  attachment[:url], target: '_blank', rel: 'noopener', class: 'att-img'
44
+ elsif attachment[:audio]
45
+ tag.audio(controls: true, preload: 'metadata', src: attachment[:url],
46
+ class: 'att-audio', aria: { label: attachment[:name] })
44
47
  else
45
48
  link_to attachment[:name], attachment[:url],
46
49
  target: '_blank', rel: 'noopener', class: 'att-file'
@@ -97,17 +97,19 @@ module Livechat
97
97
  end
98
98
  end
99
99
 
100
- # [{ id:, name:, url:, image:, size: }] — url is the gated engine route,
101
- # image flags the ones the client renders inline instead of as a link.
100
+ # [{ id:, name:, url:, image:, audio:, size: }] — url is the gated engine
101
+ # route; image/audio flags tell clients which native preview to render.
102
102
  def attachments_json
103
103
  return [] unless files_attached?
104
104
 
105
105
  base = Livechat.config.mount_path.to_s.chomp('/')
106
106
  files.map do |file|
107
+ content_type = file.content_type.to_s
107
108
  { id: file.id,
108
109
  name: file.filename.to_s,
109
110
  url: "#{base}/attachments/#{file.id}",
110
- image: file.content_type.to_s.start_with?('image/'),
111
+ image: content_type.start_with?('image/'),
112
+ audio: content_type.start_with?('audio/'),
111
113
  size: file.byte_size }
112
114
  end
113
115
  end
@@ -87,6 +87,7 @@
87
87
  .thread .system { align-self: center; color: var(--muted); font-size: 12px; margin: 8px 0; }
88
88
  .thread .msg .atts { display: flex; flex-direction: column; gap: 6px; margin-top: 6px; }
89
89
  .thread .msg .att-img img { max-width: 100%; max-height: 240px; border-radius: 8px; display: block; }
90
+ .thread .msg .att-audio { display: block; width: 280px; max-width: 100%; height: 36px; }
90
91
  .thread .msg .att-file { display: inline-block; padding: 6px 10px; border-radius: 8px;
91
92
  background: rgba(0,0,0,.06); color: inherit; font-size: 13px;
92
93
  overflow-wrap: anywhere; }
@@ -109,6 +110,7 @@
109
110
  color: var(--muted); border-radius: 8px; cursor: pointer;
110
111
  display: flex; align-items: center; justify-content: center; }
111
112
  .reply .attach:hover { background: var(--border); color: var(--text); }
113
+ .reply .attach.recording-on { color: var(--danger); }
112
114
  .reply .chips { display: flex; flex-wrap: wrap; gap: 6px; }
113
115
  .reply .chip { display: inline-flex; align-items: center; gap: 6px; max-width: 100%;
114
116
  padding: 4px 6px 4px 10px; border: 1px solid var(--border); border-radius: 999px;
@@ -117,6 +119,14 @@
117
119
  .reply .chip-x { padding: 0 2px; border: none; background: none; color: var(--muted);
118
120
  font-size: 16px; line-height: 1; cursor: pointer; }
119
121
  .reply .chip-x:hover { color: var(--text); }
122
+ .reply .recording { display: flex; align-items: center; justify-content: space-between; gap: 8px;
123
+ padding: 6px 4px 0; color: var(--muted); font-size: 12px; }
124
+ .reply .recording[hidden] { display: none; }
125
+ .reply .recording-status { display: inline-flex; align-items: center; gap: 6px; }
126
+ .reply .recording-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--danger); }
127
+ .reply .recording-actions { display: flex; align-items: center; gap: 4px; }
128
+ .reply .recording-actions button { padding: 6px 8px; border-radius: 8px; font-size: 12px; line-height: 1; }
129
+ .reply .recording-actions .stop-recording { border-color: var(--danger); color: var(--danger); }
120
130
  .reply .send { width: 32px; min-width: 32px; height: 32px; padding: 0; border: none; border-radius: 50%;
121
131
  background: var(--accent); color: var(--accent-text); cursor: pointer;
122
132
  display: flex; align-items: center; justify-content: center; }
@@ -66,7 +66,16 @@
66
66
  <%# One bordered composer box (matches the visitor widget): the reply on top,
67
67
  a toolbar row below with tools on the left and send on the right. %>
68
68
  <%= form_with url: conversation_messages_path(@conversation), method: :post,
69
- multipart: true, class: 'reply' do |form| %>
69
+ multipart: true, class: 'reply',
70
+ data: {
71
+ record_audio: t('livechat.dashboard.record_audio', default: 'Record audio'),
72
+ stop_recording: t('livechat.dashboard.stop_recording', default: 'Stop recording'),
73
+ cancel_recording: t('livechat.dashboard.cancel_recording', default: 'Cancel recording'),
74
+ recording: t('livechat.dashboard.recording', default: 'Recording %{time}'),
75
+ microphone_unsupported: t('livechat.dashboard.microphone_unsupported', default: 'Audio recording is not supported in this browser.'),
76
+ microphone_denied: t('livechat.dashboard.microphone_denied', default: 'Microphone access was blocked. Allow microphone access in your browser and try again.'),
77
+ microphone_error: t('livechat.dashboard.microphone_error', default: 'Could not start audio recording.')
78
+ } do |form| %>
70
79
  <%= form.text_area :body, rows: 2, autofocus: true, required: !Livechat.attachments_enabled?,
71
80
  placeholder: t('livechat.dashboard.reply_placeholder', default: 'Write your reply…') %>
72
81
  <%# dashboard.js hides this and swaps in a paperclip button (into .reply-tools)
@@ -18,6 +18,13 @@ ar:
18
18
  error_rate_limited: "رسائل كثيرة جدًا. يرجى الانتظار قليلًا والمحاولة مرة أخرى."
19
19
  unread_aria: "رسائل غير مقروءة"
20
20
  attach: "إرفاق ملفات"
21
+ record_audio: "Record audio"
22
+ stop_recording: "Stop recording"
23
+ cancel_recording: "Cancel recording"
24
+ recording: "Recording %{time}"
25
+ microphone_unsupported: "Audio recording is not supported in this browser."
26
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
27
+ microphone_error: "Could not start audio recording."
21
28
  remove_file: "إزالة الملف"
22
29
  attachment_error: "تعذر إرسال بعض الملفات."
23
30
  expand: "تكبير"
@@ -46,6 +53,13 @@ ar:
46
53
  reply_placeholder: "اكتب ردك…"
47
54
  send: "إرسال"
48
55
  attach: "إرفاق ملفات"
56
+ record_audio: "Record audio"
57
+ stop_recording: "Stop recording"
58
+ cancel_recording: "Cancel recording"
59
+ recording: "Recording %{time}"
60
+ microphone_unsupported: "Audio recording is not supported in this browser."
61
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
62
+ microphone_error: "Could not start audio recording."
49
63
  newer: "الأحدث"
50
64
  older: "الأقدم"
51
65
  mail:
@@ -18,6 +18,13 @@ bg:
18
18
  error_rate_limited: "Твърде много съобщения. Моля, изчакайте малко и опитайте отново."
19
19
  unread_aria: "непрочетени съобщения"
20
20
  attach: "Прикачване на файлове"
21
+ record_audio: "Record audio"
22
+ stop_recording: "Stop recording"
23
+ cancel_recording: "Cancel recording"
24
+ recording: "Recording %{time}"
25
+ microphone_unsupported: "Audio recording is not supported in this browser."
26
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
27
+ microphone_error: "Could not start audio recording."
21
28
  remove_file: "Премахване на файла"
22
29
  attachment_error: "Някои файлове не можаха да бъдат изпратени."
23
30
  expand: "Уголеми"
@@ -46,6 +53,13 @@ bg:
46
53
  reply_placeholder: "Напишете отговора си…"
47
54
  send: "Изпрати"
48
55
  attach: "Прикачване на файлове"
56
+ record_audio: "Record audio"
57
+ stop_recording: "Stop recording"
58
+ cancel_recording: "Cancel recording"
59
+ recording: "Recording %{time}"
60
+ microphone_unsupported: "Audio recording is not supported in this browser."
61
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
62
+ microphone_error: "Could not start audio recording."
49
63
  newer: "По-нови"
50
64
  older: "По-стари"
51
65
  mail:
@@ -18,6 +18,13 @@ bn:
18
18
  error_rate_limited: "অনেক বেশি বার্তা। একটু অপেক্ষা করে আবার চেষ্টা করুন।"
19
19
  unread_aria: "অপঠিত বার্তা"
20
20
  attach: "ফাইল সংযুক্ত করুন"
21
+ record_audio: "Record audio"
22
+ stop_recording: "Stop recording"
23
+ cancel_recording: "Cancel recording"
24
+ recording: "Recording %{time}"
25
+ microphone_unsupported: "Audio recording is not supported in this browser."
26
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
27
+ microphone_error: "Could not start audio recording."
21
28
  remove_file: "ফাইল সরান"
22
29
  attachment_error: "কিছু ফাইল পাঠানো যায়নি।"
23
30
  expand: "বড় করুন"
@@ -46,6 +53,13 @@ bn:
46
53
  reply_placeholder: "আপনার উত্তর লিখুন…"
47
54
  send: "পাঠান"
48
55
  attach: "ফাইল সংযুক্ত করুন"
56
+ record_audio: "Record audio"
57
+ stop_recording: "Stop recording"
58
+ cancel_recording: "Cancel recording"
59
+ recording: "Recording %{time}"
60
+ microphone_unsupported: "Audio recording is not supported in this browser."
61
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
62
+ microphone_error: "Could not start audio recording."
49
63
  newer: "নতুনতর"
50
64
  older: "পুরনো"
51
65
  mail:
@@ -18,6 +18,13 @@ de:
18
18
  error_rate_limited: "Zu viele Nachrichten. Bitte warten Sie einen Moment und versuchen Sie es erneut."
19
19
  unread_aria: "ungelesene Nachrichten"
20
20
  attach: "Dateien anhängen"
21
+ record_audio: "Record audio"
22
+ stop_recording: "Stop recording"
23
+ cancel_recording: "Cancel recording"
24
+ recording: "Recording %{time}"
25
+ microphone_unsupported: "Audio recording is not supported in this browser."
26
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
27
+ microphone_error: "Could not start audio recording."
21
28
  remove_file: "Datei entfernen"
22
29
  attachment_error: "Einige Dateien konnten nicht gesendet werden."
23
30
  expand: "Vergrößern"
@@ -46,6 +53,13 @@ de:
46
53
  reply_placeholder: "Antwort schreiben…"
47
54
  send: "Senden"
48
55
  attach: "Dateien anhängen"
56
+ record_audio: "Record audio"
57
+ stop_recording: "Stop recording"
58
+ cancel_recording: "Cancel recording"
59
+ recording: "Recording %{time}"
60
+ microphone_unsupported: "Audio recording is not supported in this browser."
61
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
62
+ microphone_error: "Could not start audio recording."
49
63
  newer: "Neuere"
50
64
  older: "Ältere"
51
65
  mail:
@@ -18,6 +18,13 @@ el:
18
18
  error_rate_limited: "Πάρα πολλά μηνύματα. Περιμένετε λίγο και δοκιμάστε ξανά."
19
19
  unread_aria: "μη αναγνωσμένα μηνύματα"
20
20
  attach: "Επισύναψη αρχείων"
21
+ record_audio: "Record audio"
22
+ stop_recording: "Stop recording"
23
+ cancel_recording: "Cancel recording"
24
+ recording: "Recording %{time}"
25
+ microphone_unsupported: "Audio recording is not supported in this browser."
26
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
27
+ microphone_error: "Could not start audio recording."
21
28
  remove_file: "Αφαίρεση αρχείου"
22
29
  attachment_error: "Ορισμένα αρχεία δεν ήταν δυνατό να σταλούν."
23
30
  expand: "Μεγέθυνση"
@@ -46,6 +53,13 @@ el:
46
53
  reply_placeholder: "Γράψτε την απάντησή σας…"
47
54
  send: "Αποστολή"
48
55
  attach: "Επισύναψη αρχείων"
56
+ record_audio: "Record audio"
57
+ stop_recording: "Stop recording"
58
+ cancel_recording: "Cancel recording"
59
+ recording: "Recording %{time}"
60
+ microphone_unsupported: "Audio recording is not supported in this browser."
61
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
62
+ microphone_error: "Could not start audio recording."
49
63
  newer: "Νεότερα"
50
64
  older: "Παλαιότερα"
51
65
  mail:
@@ -18,6 +18,13 @@ en:
18
18
  error_rate_limited: "Too many messages. Please wait a moment and try again."
19
19
  unread_aria: "unread messages"
20
20
  attach: "Attach files"
21
+ record_audio: "Record audio"
22
+ stop_recording: "Stop recording"
23
+ cancel_recording: "Cancel recording"
24
+ recording: "Recording %{time}"
25
+ microphone_unsupported: "Audio recording is not supported in this browser."
26
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
27
+ microphone_error: "Could not start audio recording."
21
28
  remove_file: "Remove file"
22
29
  attachment_error: "Some files could not be sent."
23
30
  expand: "Expand"
@@ -46,6 +53,13 @@ en:
46
53
  reply_placeholder: "Write your reply…"
47
54
  send: "Send"
48
55
  attach: "Attach files"
56
+ record_audio: "Record audio"
57
+ stop_recording: "Stop recording"
58
+ cancel_recording: "Cancel recording"
59
+ recording: "Recording %{time}"
60
+ microphone_unsupported: "Audio recording is not supported in this browser."
61
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
62
+ microphone_error: "Could not start audio recording."
49
63
  newer: "Newer"
50
64
  older: "Older"
51
65
  mail:
@@ -18,6 +18,13 @@ es:
18
18
  error_rate_limited: "Demasiados mensajes. Espera un momento e inténtalo de nuevo."
19
19
  unread_aria: "mensajes sin leer"
20
20
  attach: "Adjuntar archivos"
21
+ record_audio: "Record audio"
22
+ stop_recording: "Stop recording"
23
+ cancel_recording: "Cancel recording"
24
+ recording: "Recording %{time}"
25
+ microphone_unsupported: "Audio recording is not supported in this browser."
26
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
27
+ microphone_error: "Could not start audio recording."
21
28
  remove_file: "Quitar archivo"
22
29
  attachment_error: "No se pudieron enviar algunos archivos."
23
30
  expand: "Ampliar"
@@ -46,6 +53,13 @@ es:
46
53
  reply_placeholder: "Escribe tu respuesta…"
47
54
  send: "Enviar"
48
55
  attach: "Adjuntar archivos"
56
+ record_audio: "Record audio"
57
+ stop_recording: "Stop recording"
58
+ cancel_recording: "Cancel recording"
59
+ recording: "Recording %{time}"
60
+ microphone_unsupported: "Audio recording is not supported in this browser."
61
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
62
+ microphone_error: "Could not start audio recording."
49
63
  newer: "Más recientes"
50
64
  older: "Más antiguos"
51
65
  mail:
@@ -18,6 +18,13 @@ fr:
18
18
  error_rate_limited: "Trop de messages. Veuillez patienter un instant et réessayer."
19
19
  unread_aria: "messages non lus"
20
20
  attach: "Joindre des fichiers"
21
+ record_audio: "Record audio"
22
+ stop_recording: "Stop recording"
23
+ cancel_recording: "Cancel recording"
24
+ recording: "Recording %{time}"
25
+ microphone_unsupported: "Audio recording is not supported in this browser."
26
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
27
+ microphone_error: "Could not start audio recording."
21
28
  remove_file: "Retirer le fichier"
22
29
  attachment_error: "Certains fichiers n'ont pas pu être envoyés."
23
30
  expand: "Agrandir"
@@ -46,6 +53,13 @@ fr:
46
53
  reply_placeholder: "Écrivez votre réponse…"
47
54
  send: "Envoyer"
48
55
  attach: "Joindre des fichiers"
56
+ record_audio: "Record audio"
57
+ stop_recording: "Stop recording"
58
+ cancel_recording: "Cancel recording"
59
+ recording: "Recording %{time}"
60
+ microphone_unsupported: "Audio recording is not supported in this browser."
61
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
62
+ microphone_error: "Could not start audio recording."
49
63
  newer: "Plus récents"
50
64
  older: "Plus anciens"
51
65
  mail:
@@ -18,6 +18,13 @@ hi:
18
18
  error_rate_limited: "बहुत सारे संदेश। कृपया थोड़ी देर रुककर फिर से कोशिश करें।"
19
19
  unread_aria: "अपठित संदेश"
20
20
  attach: "फ़ाइलें संलग्न करें"
21
+ record_audio: "Record audio"
22
+ stop_recording: "Stop recording"
23
+ cancel_recording: "Cancel recording"
24
+ recording: "Recording %{time}"
25
+ microphone_unsupported: "Audio recording is not supported in this browser."
26
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
27
+ microphone_error: "Could not start audio recording."
21
28
  remove_file: "फ़ाइल हटाएं"
22
29
  attachment_error: "कुछ फ़ाइलें भेजी नहीं जा सकीं।"
23
30
  expand: "बड़ा करें"
@@ -46,6 +53,13 @@ hi:
46
53
  reply_placeholder: "अपना जवाब लिखें…"
47
54
  send: "भेजें"
48
55
  attach: "फ़ाइलें संलग्न करें"
56
+ record_audio: "Record audio"
57
+ stop_recording: "Stop recording"
58
+ cancel_recording: "Cancel recording"
59
+ recording: "Recording %{time}"
60
+ microphone_unsupported: "Audio recording is not supported in this browser."
61
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
62
+ microphone_error: "Could not start audio recording."
49
63
  newer: "नए"
50
64
  older: "पुराने"
51
65
  mail:
@@ -18,6 +18,13 @@ hr:
18
18
  error_rate_limited: "Previše poruka. Pričekajte trenutak i pokušajte ponovno."
19
19
  unread_aria: "nepročitane poruke"
20
20
  attach: "Priloži datoteke"
21
+ record_audio: "Record audio"
22
+ stop_recording: "Stop recording"
23
+ cancel_recording: "Cancel recording"
24
+ recording: "Recording %{time}"
25
+ microphone_unsupported: "Audio recording is not supported in this browser."
26
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
27
+ microphone_error: "Could not start audio recording."
21
28
  remove_file: "Ukloni datoteku"
22
29
  attachment_error: "Neke datoteke nije bilo moguće poslati."
23
30
  expand: "Povećaj"
@@ -46,6 +53,13 @@ hr:
46
53
  reply_placeholder: "Napišite svoj odgovor…"
47
54
  send: "Pošalji"
48
55
  attach: "Priloži datoteke"
56
+ record_audio: "Record audio"
57
+ stop_recording: "Stop recording"
58
+ cancel_recording: "Cancel recording"
59
+ recording: "Recording %{time}"
60
+ microphone_unsupported: "Audio recording is not supported in this browser."
61
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
62
+ microphone_error: "Could not start audio recording."
49
63
  newer: "Novije"
50
64
  older: "Starije"
51
65
  mail:
@@ -18,6 +18,13 @@ id:
18
18
  error_rate_limited: "Terlalu banyak pesan. Mohon tunggu sebentar dan coba lagi."
19
19
  unread_aria: "pesan belum dibaca"
20
20
  attach: "Lampirkan file"
21
+ record_audio: "Record audio"
22
+ stop_recording: "Stop recording"
23
+ cancel_recording: "Cancel recording"
24
+ recording: "Recording %{time}"
25
+ microphone_unsupported: "Audio recording is not supported in this browser."
26
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
27
+ microphone_error: "Could not start audio recording."
21
28
  remove_file: "Hapus file"
22
29
  attachment_error: "Beberapa file tidak dapat dikirim."
23
30
  expand: "Perbesar"
@@ -46,6 +53,13 @@ id:
46
53
  reply_placeholder: "Tulis balasan Anda…"
47
54
  send: "Kirim"
48
55
  attach: "Lampirkan file"
56
+ record_audio: "Record audio"
57
+ stop_recording: "Stop recording"
58
+ cancel_recording: "Cancel recording"
59
+ recording: "Recording %{time}"
60
+ microphone_unsupported: "Audio recording is not supported in this browser."
61
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
62
+ microphone_error: "Could not start audio recording."
49
63
  newer: "Lebih baru"
50
64
  older: "Lebih lama"
51
65
  mail:
@@ -18,6 +18,13 @@ it:
18
18
  error_rate_limited: "Troppi messaggi. Attendi un momento e riprova."
19
19
  unread_aria: "messaggi non letti"
20
20
  attach: "Allega file"
21
+ record_audio: "Record audio"
22
+ stop_recording: "Stop recording"
23
+ cancel_recording: "Cancel recording"
24
+ recording: "Recording %{time}"
25
+ microphone_unsupported: "Audio recording is not supported in this browser."
26
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
27
+ microphone_error: "Could not start audio recording."
21
28
  remove_file: "Rimuovi file"
22
29
  attachment_error: "Non è stato possibile inviare alcuni file."
23
30
  expand: "Ingrandisci"
@@ -46,6 +53,13 @@ it:
46
53
  reply_placeholder: "Scrivi la tua risposta…"
47
54
  send: "Invia"
48
55
  attach: "Allega file"
56
+ record_audio: "Record audio"
57
+ stop_recording: "Stop recording"
58
+ cancel_recording: "Cancel recording"
59
+ recording: "Recording %{time}"
60
+ microphone_unsupported: "Audio recording is not supported in this browser."
61
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
62
+ microphone_error: "Could not start audio recording."
49
63
  newer: "Più recenti"
50
64
  older: "Più vecchi"
51
65
  mail:
@@ -18,6 +18,13 @@ ja:
18
18
  error_rate_limited: "メッセージが多すぎます。少し待ってからもう一度お試しください。"
19
19
  unread_aria: "件の未読メッセージ"
20
20
  attach: "ファイルを添付"
21
+ record_audio: "Record audio"
22
+ stop_recording: "Stop recording"
23
+ cancel_recording: "Cancel recording"
24
+ recording: "Recording %{time}"
25
+ microphone_unsupported: "Audio recording is not supported in this browser."
26
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
27
+ microphone_error: "Could not start audio recording."
21
28
  remove_file: "ファイルを削除"
22
29
  attachment_error: "一部のファイルを送信できませんでした。"
23
30
  expand: "拡大"
@@ -46,6 +53,13 @@ ja:
46
53
  reply_placeholder: "返信を入力…"
47
54
  send: "送信"
48
55
  attach: "ファイルを添付"
56
+ record_audio: "Record audio"
57
+ stop_recording: "Stop recording"
58
+ cancel_recording: "Cancel recording"
59
+ recording: "Recording %{time}"
60
+ microphone_unsupported: "Audio recording is not supported in this browser."
61
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
62
+ microphone_error: "Could not start audio recording."
49
63
  newer: "新しい"
50
64
  older: "古い"
51
65
  mail:
@@ -18,6 +18,13 @@ ko:
18
18
  error_rate_limited: "메시지가 너무 많습니다. 잠시 후 다시 시도해 주세요."
19
19
  unread_aria: "읽지 않은 메시지"
20
20
  attach: "파일 첨부"
21
+ record_audio: "Record audio"
22
+ stop_recording: "Stop recording"
23
+ cancel_recording: "Cancel recording"
24
+ recording: "Recording %{time}"
25
+ microphone_unsupported: "Audio recording is not supported in this browser."
26
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
27
+ microphone_error: "Could not start audio recording."
21
28
  remove_file: "파일 제거"
22
29
  attachment_error: "일부 파일을 보내지 못했습니다."
23
30
  expand: "확대"
@@ -46,6 +53,13 @@ ko:
46
53
  reply_placeholder: "답장을 입력하세요…"
47
54
  send: "보내기"
48
55
  attach: "파일 첨부"
56
+ record_audio: "Record audio"
57
+ stop_recording: "Stop recording"
58
+ cancel_recording: "Cancel recording"
59
+ recording: "Recording %{time}"
60
+ microphone_unsupported: "Audio recording is not supported in this browser."
61
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
62
+ microphone_error: "Could not start audio recording."
49
63
  newer: "최신"
50
64
  older: "이전"
51
65
  mail:
@@ -18,6 +18,13 @@ lb:
18
18
  error_rate_limited: "Ze vill Noriichten. Waart w.e.g. e Moment a probéiert nach eng Kéier."
19
19
  unread_aria: "ongelies Noriichten"
20
20
  attach: "Dateien uschléissen"
21
+ record_audio: "Record audio"
22
+ stop_recording: "Stop recording"
23
+ cancel_recording: "Cancel recording"
24
+ recording: "Recording %{time}"
25
+ microphone_unsupported: "Audio recording is not supported in this browser."
26
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
27
+ microphone_error: "Could not start audio recording."
21
28
  remove_file: "Datei ewechhuelen"
22
29
  attachment_error: "E puer Dateie konnten net geschéckt ginn."
23
30
  expand: "Vergréisseren"
@@ -46,6 +53,13 @@ lb:
46
53
  reply_placeholder: "Schreift Är Äntwert…"
47
54
  send: "Schécken"
48
55
  attach: "Dateien uschléissen"
56
+ record_audio: "Record audio"
57
+ stop_recording: "Stop recording"
58
+ cancel_recording: "Cancel recording"
59
+ recording: "Recording %{time}"
60
+ microphone_unsupported: "Audio recording is not supported in this browser."
61
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
62
+ microphone_error: "Could not start audio recording."
49
63
  newer: "Méi nei"
50
64
  older: "Méi al"
51
65
  mail:
@@ -18,6 +18,13 @@ nl:
18
18
  error_rate_limited: "Te veel berichten. Wacht even en probeer het opnieuw."
19
19
  unread_aria: "ongelezen berichten"
20
20
  attach: "Bestanden bijvoegen"
21
+ record_audio: "Record audio"
22
+ stop_recording: "Stop recording"
23
+ cancel_recording: "Cancel recording"
24
+ recording: "Recording %{time}"
25
+ microphone_unsupported: "Audio recording is not supported in this browser."
26
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
27
+ microphone_error: "Could not start audio recording."
21
28
  remove_file: "Bestand verwijderen"
22
29
  attachment_error: "Sommige bestanden konden niet worden verzonden."
23
30
  expand: "Vergroten"
@@ -46,6 +53,13 @@ nl:
46
53
  reply_placeholder: "Schrijf je antwoord…"
47
54
  send: "Versturen"
48
55
  attach: "Bestanden bijvoegen"
56
+ record_audio: "Record audio"
57
+ stop_recording: "Stop recording"
58
+ cancel_recording: "Cancel recording"
59
+ recording: "Recording %{time}"
60
+ microphone_unsupported: "Audio recording is not supported in this browser."
61
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
62
+ microphone_error: "Could not start audio recording."
49
63
  newer: "Nieuwer"
50
64
  older: "Ouder"
51
65
  mail:
@@ -18,6 +18,13 @@ pl:
18
18
  error_rate_limited: "Zbyt wiele wiadomości. Poczekaj chwilę i spróbuj ponownie."
19
19
  unread_aria: "nieprzeczytane wiadomości"
20
20
  attach: "Załącz pliki"
21
+ record_audio: "Record audio"
22
+ stop_recording: "Stop recording"
23
+ cancel_recording: "Cancel recording"
24
+ recording: "Recording %{time}"
25
+ microphone_unsupported: "Audio recording is not supported in this browser."
26
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
27
+ microphone_error: "Could not start audio recording."
21
28
  remove_file: "Usuń plik"
22
29
  attachment_error: "Nie udało się wysłać niektórych plików."
23
30
  expand: "Powiększ"
@@ -46,6 +53,13 @@ pl:
46
53
  reply_placeholder: "Napisz odpowiedź…"
47
54
  send: "Wyślij"
48
55
  attach: "Załącz pliki"
56
+ record_audio: "Record audio"
57
+ stop_recording: "Stop recording"
58
+ cancel_recording: "Cancel recording"
59
+ recording: "Recording %{time}"
60
+ microphone_unsupported: "Audio recording is not supported in this browser."
61
+ microphone_denied: "Microphone access was blocked. Allow microphone access in your browser and try again."
62
+ microphone_error: "Could not start audio recording."
49
63
  newer: "Nowsze"
50
64
  older: "Starsze"
51
65
  mail: