Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions client/apps/voicememos.lua
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ end)
---Server push: our upload was rejected (bad payload, too long, or the upstream upload
---failed); relays the reason to the app.
---@param message string human-readable failure reason from server/voicememos/init.lua
RegisterNetEvent('sd-phone:client:voice:uploadFailed', function(message)
SendNUIMessage({ action = 'sd-phone:voice:uploadFailed', data = { message = message } })
RegisterNetEvent('sd-phone:client:voice:uploadFailed', function(message, messageKey)
SendNUIMessage({ action = 'sd-phone:voice:uploadFailed', data = { message = message, messageKey = messageKey } })
end)

-- Direct upload. The event path above hands the whole recording to the server in one ordinary
Expand Down
31 changes: 31 additions & 0 deletions locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -1188,6 +1188,7 @@
"passwordsNoMatch": "Passwords do not match.",
"pleaseCheckField": "Please check this field",
"pleaseWait": "Please wait…",
"pluralSuffix": "s",
"poster": "poster",
"previous": "Previous",
"recoverAccount": "Forgot your password? Tap here to recover your account",
Expand Down Expand Up @@ -2145,6 +2146,7 @@
"noKeyHolders": "No one else has a key.",
"owned": "Owned",
"properties": "properties",
"propertiesFew": "properties",
"property": "property",
"remove": "Remove",
"removeKeyHolder": "Remove Key Holder?",
Expand Down Expand Up @@ -4085,6 +4087,8 @@
"appTitle": "Notes",
"attachPhoto": "Attach photo",
"attachmentAlt": "Attachment {n}",
"attachmentDrawing": "drawing",
"attachmentPhoto": "photo",
"badNoteId": "Bad note id",
"cancel": "Cancel",
"clearCanvas": "Clear canvas",
Expand Down Expand Up @@ -4539,6 +4543,7 @@
"storyRoomLeft": "Your story only has room for {n} more today",
"storySlide": "Slide {n}",
"storyTextEmpty": "Write something first",
"submitComment": "Post",
"tagPeople": "Tag people",
"tagSearchHint": "Search for anyone on Photogram to tag them.",
"tagline": "Sign up to see photos from your friends.",
Expand Down Expand Up @@ -6194,6 +6199,14 @@
"pasteYoutubeNotification": "Paste any YouTube link to use it as a notification tone.",
"pasteYoutubeRingtone": "Paste any YouTube link to use it as a ringtone.",
"phone": "Phone",
"phoneColorBlack": "Black",
"phoneColorBlue": "Blue",
"phoneColorGreen": "Green",
"phoneColorOrange": "Orange",
"phoneColorPink": "Pink",
"phoneColorPurple": "Purple",
"phoneColorRed": "Red",
"phoneColorYellow": "Yellow",
"phonePosition": "Phone Position",
"phonePositionHint": "Pick where the phone snaps to inside the game window. The phone scales toward this anchor so it stays pinned when you change the size above.",
"phoneScale": "Phone Scale",
Expand Down Expand Up @@ -6484,9 +6497,21 @@
},
"share": {
"acceptedYourShare": "{name} accepted your {kind}.",
"couldNotSaveSharedItem": "That {kind} could not be saved.",
"couldNotSaveYourShare": "{name} could not save your {kind}.",
"declinedYourShare": "{name} declined your {kind}.",
"invalidRecipient": "Invalid recipient",
"kindContact": "contact",
"kindDocument": "document",
"kindIdCard": "ID card",
"kindNote": "note",
"kindPhoto": "photo",
"kindPhotogramProfile": "Photogram profile",
"kindPin": "map pin",
"kindPlaylist": "playlist",
"kindSignatureRequest": "signature request",
"kindSong": "song",
"kindVoice": "voice memo",
"recipientHasTooManyPending": "Recipient has too many pending shares",
"recipientNoLongerNearby": "Recipient is no longer nearby",
"requestExpired": "Request expired",
Expand Down Expand Up @@ -7134,10 +7159,12 @@
"voicemailTitle": "Voicemail"
},
"voicememos": {
"badAudioPayload": "Bad audio payload",
"badMemoId": "Bad memo id",
"cancel": "Cancel",
"copied": "Copied!",
"copyLink": "Copy Link",
"couldNotSaveMemo": "Could not save memo",
"couldNotSendRequest": "Could not send request",
"delete": "Delete",
"deleteMessage": "“{name}” will be permanently deleted.",
Expand All @@ -7156,6 +7183,7 @@
"pause": "Pause",
"play": "Play",
"record": "Record",
"recordingTooLong": "Recording is too long",
"recordingUnsupported": "Recording is not supported here.",
"rename": "Rename",
"renameMessage": "Enter a new name for this recording.",
Expand All @@ -7169,7 +7197,10 @@
"title": "Voice Memos",
"today": "Today {time}",
"toneLimit": "You can save up to {n} custom tones. Remove one in Settings first.",
"uploadBusy": "Upload already in progress",
"uploadFailed": "Upload failed",
"uploadLimitReached": "Upload limit reached, try again later",
"uploadSlowDown": "Slow down a moment",
"useAsNotification": "Use as Notification Sound",
"useAsRingtone": "Use as Ringtone",
"yesterday": "Yesterday {time}"
Expand Down
85 changes: 58 additions & 27 deletions locales/ru.json
Original file line number Diff line number Diff line change
Expand Up @@ -1226,8 +1226,9 @@
"wantsYouToFollowHandle": "{name} хочет, чтобы вы подписались на @{handle} в Photogram",
"welcomeBack": "С возвращением",
"wiFiUnavailable": "Wi-Fi недоступен",
"wouldLikeToShare": "{name} хочет поделиться {kind}",
"yes": "Да"
"wouldLikeToShare": "{name} хочет отправить вам объект: {kind}",
"yes": "Да",
"pluralSuffix": ""
},
"compass": {
"dirE": "В",
Expand Down Expand Up @@ -2140,8 +2141,8 @@
"locked": "Заблокировано",
"noKeyHolders": "Больше ни у кого нет ключа.",
"owned": "В собственности",
"properties": "дома",
"property": "дом",
"properties": "объектов недвижимости",
"property": "объект недвижимости",
"remove": "Удалить",
"removeKeyHolder": "Удалить владельца ключа?",
"removeKeyMessage": "{name} больше не будет иметь ключа к {address}.",
Expand All @@ -2150,9 +2151,10 @@
"sourceId": "Идентификатор источника",
"title": "Дома",
"type": "Тип",
"unlock": "Разблокировать",
"unlocked": "Разблокировано",
"waypoint": "Путевая точка"
"unlock": "Отпереть",
"unlocked": "Не заперто",
"waypoint": "Путевая точка",
"propertiesFew": "объекта недвижимости"
},
"id": {
"copied": "Скопировано",
Expand Down Expand Up @@ -2306,7 +2308,7 @@
"moveToSpam": "Переместить в Спам",
"moveToSpamConfirm": "Переместить это письмо в папку «Спам»?",
"nameMustCharactersFewer": "Имя не длиннее {n} символов",
"nameMustLeastCharacters": "Имя должно быть не короче {n} символ{s}",
"nameMustLeastCharacters": "Минимальная длина имени: {n} симв.{s}",
"newMessage": "Новое сообщение",
"next": "Далее",
"noDocuments": "Никаких документов для прикрепления. Сначала создайте его в Файлах.",
Expand Down Expand Up @@ -4044,7 +4046,7 @@
"playPause": "Воспроизведение/Пауза",
"playlist": "Плейлист",
"playlistName": "Название плейлиста",
"playlistSongCount": "Плейлист · {count} песня{plural}",
"playlistSongCount": "Плейлист · Треков: {count}{plural}",
"playlists": "Плейлисты",
"previous": "Предыдущий",
"recentlyAdded": "Недавно добавлено",
Expand All @@ -4063,8 +4065,8 @@
"shareTitle": "Поделиться {title}",
"sharedArtist": "Отправлено",
"sharedPlaylist": "Общий плейлист",
"shuffle": "Перетасовать",
"songCount": "{count} песня{plural}",
"shuffle": "Перемешать",
"songCount": "Треков: {count}{plural}",
"songs": "Песни",
"sourceBlocked": "Эта ссылка не из разрешенного источника.",
"stop": "Стоп",
Expand Down Expand Up @@ -4131,7 +4133,9 @@
"strokeWidthAria": "Ширина штриха {w}",
"undoStroke": "Отменить последний штрих",
"viewDrawing": "Посмотреть рисунок {n}",
"viewPhoto": "Посмотреть фото {n}"
"viewPhoto": "Посмотреть фото {n}",
"attachmentDrawing": "рисунок",
"attachmentPhoto": "фото"
},
"pages": {
"alreadyPublished": "Этот пост уже опубликован",
Expand Down Expand Up @@ -4489,7 +4493,7 @@
"password": "Пароль",
"phone": "Телефон",
"photoLabel": "📷 Фото",
"post": "Сообщение",
"post": "Публикация",
"postLabel": "📷 Публикация",
"postNotFound": "Пост не найден",
"posts": "Сообщения",
Expand Down Expand Up @@ -4551,7 +4555,8 @@
"you": "ты",
"youAreTheHost": "Вы ведущий(-ая)",
"youColon": "Вы: {body}",
"yourStory": "Ваша история"
"yourStory": "Ваша история",
"submitComment": "Отправить"
},
"photos": {
"add": "Добавить",
Expand Down Expand Up @@ -5191,8 +5196,8 @@
"platePlaceholder": "например 12 АВС 34",
"rateYourDriver": "Оцените своего водителя",
"rating": "Рейтинг",
"ratingRider": "{rating} · Райдер",
"ratingsCount": "{n} рейтинг{plural}",
"ratingRider": "{rating} · Пассажир",
"ratingsCount": "Оценок: {n}{plural}",
"requestARide": "Запросить поездку?",
"requestRide": "Запросить поездку",
"requestRideMessage": "Ближайшему водителю будет предложено отвезти вас до {name}, а затем предложить приемлемый для вас тариф.",
Expand Down Expand Up @@ -5241,9 +5246,9 @@
"totalTrips": "Всего поездок",
"trips": "Поездки",
"tripsCount": "{n} поездок",
"tripsEarned": "{n} поездка{plural} · {amount} заработано",
"tripsEarned": "Поездок: {n}{plural} · Заработано: {amount}",
"tripsTaken": "Совершено поездок",
"tripsTodayCount": "{n} поездка{plural} сегодня",
"tripsTodayCount": "Поездок сегодня: {n}{plural}",
"unregister": "Отменить регистрацию",
"unregisterMessage": "{vehicle}{plate} будет удален. Ваш рейтинг и количество поездок сохраняются, и вы сразу можете зарегистрировать новый автомобиль.",
"unregisterTitle": "Отменить регистрацию автомобиля?",
Expand Down Expand Up @@ -6434,7 +6439,15 @@
"youtubeLink": "Ссылка YouTube",
"fromVoiceMemos": "Из Голосовых заметок",
"toneLimit": "Можно сохранить до {n} собственных мелодий. Сначала удалите одну выше.",
"voiceMemoToneHint": "Выбор записи переносит её в ваши мелодии выше."
"voiceMemoToneHint": "Выбор записи переносит её в ваши мелодии выше.",
"phoneColorBlack": "Чёрный",
"phoneColorBlue": "Синий",
"phoneColorGreen": "Зелёный",
"phoneColorOrange": "Оранжевый",
"phoneColorPink": "Розовый",
"phoneColorPurple": "Фиолетовый",
"phoneColorRed": "Красный",
"phoneColorYellow": "Жёлтый"
},
"setup": {
"allSet": "Все готово",
Expand Down Expand Up @@ -6485,9 +6498,21 @@
"recipientNoLongerNearby": "Получателя больше нет рядом",
"requestExpired": "Срок запроса истёк",
"slowDownMoment": "Не так быстро",
"tooLargeShare": "Это слишком большое, чтобы поделиться",
"tooManyPendingShares": "Слишком много ожидающих отправлений",
"unknownShareType": "Неизвестный тип отправления"
"tooLargeShare": "Объект слишком большой для передачи",
"tooManyPendingShares": "Слишком много запросов на передачу без ответа",
"unknownShareType": "Неизвестный тип передаваемого объекта",
"couldNotSaveSharedItem": "Не удалось сохранить: {kind}.",
"kindContact": "контакт",
"kindDocument": "документ",
"kindIdCard": "удостоверение",
"kindNote": "заметка",
"kindPhoto": "фото",
"kindPhotogramProfile": "профиль Photogram",
"kindPin": "метка на карте",
"kindPlaylist": "плейлист",
"kindSignatureRequest": "запрос подписи",
"kindSong": "песня",
"kindVoice": "голосовая заметка"
},
"shell": {
"airplaneMode": "Режим полета",
Expand Down Expand Up @@ -7166,7 +7191,13 @@
"ringtoneSet": "Рингтон установлен",
"toneLimit": "Можно сохранить до {n} собственных мелодий. Сначала удалите одну в Настройках.",
"useAsNotification": "Использовать как звук уведомления",
"useAsRingtone": "Использовать как рингтон"
"useAsRingtone": "Использовать как рингтон",
"badAudioPayload": "Некорректные аудиоданные",
"couldNotSaveMemo": "Не удалось сохранить запись",
"recordingTooLong": "Запись слишком длинная",
"uploadBusy": "Запись уже загружается",
"uploadLimitReached": "Достигнут лимит загрузок. Попробуйте позже.",
"uploadSlowDown": "Подождите немного перед повторной загрузкой"
},
"weather": {
"closeWeather": "Закрыть Погоду",
Expand Down Expand Up @@ -7280,9 +7311,9 @@
"standfirstPlaceholder": "Однострочное резюме, отображаемое под заголовком (необязательно).",
"stories": "Истории",
"storyHeadlinePlaceholder": "Заголовок материала",
"tapGearToPublish": "Нажмите на шестеренку, чтобы опубликовать первую историю.",
"tapNewPost": "Нажмите «Новая запись», чтобы опубликовать первую историю.",
"tickerSummary": "{count} заголовок{plural} · {first}",
"tapGearToPublish": "Нажмите на шестерёнку, чтобы опубликовать первый материал.",
"tapNewPost": "Нажмите «Новый пост», чтобы опубликовать первый материал.",
"tickerSummary": "Заголовков: {count}{plural} · {first}",
"timeAgo": "{time} назад",
"url": "URL-адрес",
"viewsMillions": "{n}M",
Expand Down Expand Up @@ -7385,4 +7416,4 @@
"noNumberToShare": "У вашего телефона нет номера, которым можно поделиться.",
"theyHaveNoPhone": "У этого человека нет телефона."
}
}
}
12 changes: 9 additions & 3 deletions server/share/core.lua
Original file line number Diff line number Diff line change
Expand Up @@ -204,10 +204,16 @@ function core.respond(src, id, accept)
-- just watch the prompt disappear: the recipient's client fires the respond callback and
-- drops the card without reading the result, and the sender was only ever told on success.
-- The recipient gets the handler's specific reason; the sender only needs to know it missed.
TriggerClientEvent('sd-phone:client:notify', src, {
local recipientNotice = {
app = 'phone', title = 'AirShare',
body = reason or ('That %s could not be saved.'):format(what),
})
bodyKey = 'share.couldNotSaveSharedItem', body = ('That %s could not be saved.'):format(what),
bodyVars = { kind = what },
}
-- Handler-provided reasons are custom content, not the generic kind template.
if reason then
recipientNotice.body, recipientNotice.bodyKey, recipientNotice.bodyVars = reason, nil, nil
end
TriggerClientEvent('sd-phone:client:notify', src, recipientNotice)
TriggerClientEvent('sd-phone:client:notify', req.fromSrc, {
app = 'phone', title = 'AirShare',
bodyKey = 'share.couldNotSaveYourShare', body = ('%s could not save your %s.'):format(who, what),
Expand Down
16 changes: 8 additions & 8 deletions server/voicememos/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -115,9 +115,9 @@ util.onCleanup(function(src) pendingDirect[src] = nil end)
---@param why string|nil 'cooldown'|'busy'|'identity'|'budget'|'server'
---@return string message
local function refusal(why)
if why == 'cooldown' then return 'Slow down a moment' end
if why == 'busy' then return 'Upload already in progress' end
return 'Upload limit reached, try again later'
if why == 'cooldown' then return 'Slow down a moment', 'voicememos.uploadSlowDown' end
if why == 'busy' then return 'Upload already in progress', 'voicememos.uploadBusy' end
return 'Upload limit reached, try again later', 'voicememos.uploadLimitReached'
end

---Takes a recorded memo as a base64 audio data-URL, pushes it to the media provider and saves it.
Expand All @@ -129,15 +129,15 @@ end
---@param prepaid boolean|nil true when an HTTP slot already holds the budget for it
local function ingest(src, audio, name, duration, prepaid)
if type(audio) ~= 'string' or not lib.string.startsWith(audio, 'data:audio/') then
TriggerClientEvent('sd-phone:client:voice:uploadFailed', src, 'Bad audio payload')
TriggerClientEvent('sd-phone:client:voice:uploadFailed', src, 'Bad audio payload', 'voicememos.badAudioPayload')
return
end
if #audio > VM.MaxAudioBytes then
TriggerClientEvent('sd-phone:client:voice:uploadFailed', src, 'Recording is too long')
TriggerClientEvent('sd-phone:client:voice:uploadFailed', src, 'Recording is too long', 'voicememos.recordingTooLong')
return
end
if uploading[src] then
TriggerClientEvent('sd-phone:client:voice:uploadFailed', src, 'Upload already in progress')
TriggerClientEvent('sd-phone:client:voice:uploadFailed', src, 'Upload already in progress', 'voicememos.uploadBusy')
return
end
if not prepaid then
Expand All @@ -159,14 +159,14 @@ local function ingest(src, audio, name, duration, prepaid)
uploading[src] = nil
if not url then
print(('^1[sd-phone:voice]^0 upload failed: %s'):format(tostring(err)))
TriggerClientEvent('sd-phone:client:voice:uploadFailed', src, err or 'Upload failed')
TriggerClientEvent('sd-phone:client:voice:uploadFailed', src, 'Upload failed', 'voicememos.uploadFailed')
return
end
local memo = actions.saveUploaded(src, url, name, duration)
if memo then
TriggerClientEvent('sd-phone:client:voice:added', src, memo)
else
TriggerClientEvent('sd-phone:client:voice:uploadFailed', src, 'Could not save memo')
TriggerClientEvent('sd-phone:client:voice:uploadFailed', src, 'Could not save memo', 'voicememos.couldNotSaveMemo')
end
end)
end
Expand Down
Loading
Loading