Test camera button

This commit is contained in:
Lim Chee Aun 2025-03-07 21:38:57 +08:00
parent 4e8745e410
commit 3bd0a1d6fe
3 changed files with 172 additions and 95 deletions

View file

@ -178,4 +178,5 @@ export const ICONS = {
schedule: () => import('@iconify-icons/mingcute/calendar-time-add-line'), schedule: () => import('@iconify-icons/mingcute/calendar-time-add-line'),
month: () => import('@iconify-icons/mingcute/calendar-month-line'), month: () => import('@iconify-icons/mingcute/calendar-month-line'),
day: () => import('@iconify-icons/mingcute/calendar-day-line'), day: () => import('@iconify-icons/mingcute/calendar-day-line'),
camera: () => import('@iconify-icons/mingcute/camera-line'),
}; };

View file

@ -208,6 +208,8 @@ const LF = mem((locale) => new Intl.ListFormat(locale || undefined));
const CUSTOM_EMOJIS_COUNT = 100; const CUSTOM_EMOJIS_COUNT = 100;
const ADD_LABELS = { const ADD_LABELS = {
// camera: msg`Take photo or video`,
camera: 'Take photo or video',
media: msg`Add media`, media: msg`Add media`,
customEmoji: msg`Add custom emoji`, customEmoji: msg`Add custom emoji`,
gif: msg`Add GIF`, gif: msg`Add GIF`,
@ -260,6 +262,9 @@ function Compose({
minExpiration, minExpiration,
} = {}, } = {},
} = configuration || {}; } = configuration || {};
const supportedImagesVideosTypes = supportedMimeTypes?.filter((mimeType) =>
/^(image|video)/i.test(mimeType),
);
const textareaRef = useRef(); const textareaRef = useRef();
const spoilerTextRef = useRef(); const spoilerTextRef = useRef();
@ -1433,6 +1438,23 @@ function Compose({
</button> </button>
)} )}
> >
{supportsCameraCapture && (
<MenuItem className="compose-menu-add-media">
<label class="compose-menu-add-media-field">
<CameraCaptureInput
hidden
supportedMimeTypes={supportedImagesVideosTypes}
disabled={
uiState === 'loading' ||
mediaAttachments.length >= maxMediaAttachments ||
!!poll
}
setMediaAttachments={setMediaAttachments}
/>
</label>
<Icon icon="camera" /> <span>{_(ADD_LABELS.camera)}</span>
</MenuItem>
)}
<MenuItem className="compose-menu-add-media"> <MenuItem className="compose-menu-add-media">
<label class="compose-menu-add-media-field"> <label class="compose-menu-add-media-field">
<FilePickerInput <FilePickerInput
@ -1489,6 +1511,21 @@ function Compose({
</Menu2> </Menu2>
)} )}
<span class="add-sub-toolbar-button-group" ref={addSubToolbarRef}> <span class="add-sub-toolbar-button-group" ref={addSubToolbarRef}>
{supportsCameraCapture && (
<label class="toolbar-button">
<CameraCaptureInput
supportedMimeTypes={supportedImagesVideosTypes}
mediaAttachments={mediaAttachments}
disabled={
uiState === 'loading' ||
mediaAttachments.length >= maxMediaAttachments ||
!!poll
}
setMediaAttachments={setMediaAttachments}
/>
<Icon icon="camera" alt={_(ADD_LABELS.camera)} />
</label>
)}
<label class="toolbar-button"> <label class="toolbar-button">
<FilePickerInput <FilePickerInput
supportedMimeTypes={supportedMimeTypes} supportedMimeTypes={supportedMimeTypes}
@ -1789,6 +1826,45 @@ function Compose({
); );
} }
const supportsCameraCapture = (() => {
const input = document.createElement('input');
return 'capture' in input;
})();
function CameraCaptureInput({
hidden,
disabled = false,
supportedMimeTypes,
setMediaAttachments,
}) {
return (
<input
type="file"
hidden={hidden}
accept={supportedMimeTypes?.join(',')}
capture="environment"
disabled={disabled}
onChange={(e) => {
const files = e.target.files;
if (!files) return;
const mediaFile = Array.from(files)[0];
if (!mediaFile) return;
setMediaAttachments((attachments) => [
...attachments,
{
file: mediaFile,
type: mediaFile.type,
size: mediaFile.size,
url: URL.createObjectURL(mediaFile),
id: null, // indicate uploaded state
description: null,
},
]);
e.target.value = null;
}}
/>
);
}
function FilePickerInput({ function FilePickerInput({
hidden, hidden,
supportedMimeTypes, supportedMimeTypes,

190
src/locales/en.po generated
View file

@ -108,7 +108,7 @@ msgstr ""
#: src/components/account-info.jsx:430 #: src/components/account-info.jsx:430
#: src/components/account-info.jsx:1143 #: src/components/account-info.jsx:1143
#: src/components/compose.jsx:2697 #: src/components/compose.jsx:2773
#: src/components/media-alt-modal.jsx:46 #: src/components/media-alt-modal.jsx:46
#: src/components/media-modal.jsx:358 #: src/components/media-modal.jsx:358
#: src/components/status.jsx:1770 #: src/components/status.jsx:1770
@ -419,11 +419,11 @@ msgstr ""
#: src/components/account-info.jsx:2020 #: src/components/account-info.jsx:2020
#: src/components/account-info.jsx:2140 #: src/components/account-info.jsx:2140
#: src/components/account-sheet.jsx:38 #: src/components/account-sheet.jsx:38
#: src/components/compose.jsx:877 #: src/components/compose.jsx:882
#: src/components/compose.jsx:2653 #: src/components/compose.jsx:2729
#: src/components/compose.jsx:3127 #: src/components/compose.jsx:3203
#: src/components/compose.jsx:3336 #: src/components/compose.jsx:3412
#: src/components/compose.jsx:3566 #: src/components/compose.jsx:3642
#: src/components/drafts.jsx:59 #: src/components/drafts.jsx:59
#: src/components/embed-modal.jsx:13 #: src/components/embed-modal.jsx:13
#: src/components/generic-accounts.jsx:143 #: src/components/generic-accounts.jsx:143
@ -581,172 +581,172 @@ msgstr "Scheduled Posts"
msgid "Add to thread" msgid "Add to thread"
msgstr "Add to thread" msgstr "Add to thread"
#: src/components/compose.jsx:211 #: src/components/compose.jsx:213
msgid "Add media" msgid "Add media"
msgstr "Add media" msgstr "Add media"
#: src/components/compose.jsx:212 #: src/components/compose.jsx:214
msgid "Add custom emoji" msgid "Add custom emoji"
msgstr "" msgstr ""
#: src/components/compose.jsx:213 #: src/components/compose.jsx:215
msgid "Add GIF" msgid "Add GIF"
msgstr "Add GIF" msgstr "Add GIF"
#: src/components/compose.jsx:214 #: src/components/compose.jsx:216
msgid "Add poll" msgid "Add poll"
msgstr "" msgstr ""
#: src/components/compose.jsx:215 #: src/components/compose.jsx:217
msgid "Schedule post" msgid "Schedule post"
msgstr "Schedule post" msgstr "Schedule post"
#: src/components/compose.jsx:411 #: src/components/compose.jsx:416
msgid "You have unsaved changes. Discard this post?" msgid "You have unsaved changes. Discard this post?"
msgstr "You have unsaved changes. Discard this post?" msgstr "You have unsaved changes. Discard this post?"
#. placeholder {0}: unsupportedFiles.length #. placeholder {0}: unsupportedFiles.length
#. placeholder {1}: unsupportedFiles[0].name #. placeholder {1}: unsupportedFiles[0].name
#. placeholder {2}: lf.format( unsupportedFiles.map((f) => f.name), ) #. placeholder {2}: lf.format( unsupportedFiles.map((f) => f.name), )
#: src/components/compose.jsx:640 #: src/components/compose.jsx:645
msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" msgid "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}"
msgstr "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}" msgstr "{0, plural, one {File {1} is not supported.} other {Files {2} are not supported.}}"
#: src/components/compose.jsx:650 #: src/components/compose.jsx:655
#: src/components/compose.jsx:668 #: src/components/compose.jsx:673
#: src/components/compose.jsx:1741 #: src/components/compose.jsx:1778
#: src/components/compose.jsx:1827 #: src/components/compose.jsx:1903
msgid "{maxMediaAttachments, plural, one {You can only attach up to 1 file.} other {You can only attach up to # files.}}" msgid "{maxMediaAttachments, plural, one {You can only attach up to 1 file.} other {You can only attach up to # files.}}"
msgstr "" msgstr ""
#: src/components/compose.jsx:858 #: src/components/compose.jsx:863
msgid "Pop out" msgid "Pop out"
msgstr "Pop out" msgstr "Pop out"
#: src/components/compose.jsx:865 #: src/components/compose.jsx:870
msgid "Minimize" msgid "Minimize"
msgstr "Minimize" msgstr "Minimize"
#: src/components/compose.jsx:901 #: src/components/compose.jsx:906
msgid "Looks like you closed the parent window." msgid "Looks like you closed the parent window."
msgstr "Looks like you closed the parent window." msgstr "Looks like you closed the parent window."
#: src/components/compose.jsx:908 #: src/components/compose.jsx:913
msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." msgid "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later."
msgstr "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later." msgstr "Looks like you already have a compose field open in the parent window and currently publishing. Please wait for it to be done and try again later."
#: src/components/compose.jsx:913 #: src/components/compose.jsx:918
msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" msgid "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?"
msgstr "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?" msgstr "Looks like you already have a compose field open in the parent window. Popping in this window will discard the changes you made in the parent window. Continue?"
#: src/components/compose.jsx:956 #: src/components/compose.jsx:961
msgid "Pop in" msgid "Pop in"
msgstr "Pop in" msgstr "Pop in"
#. placeholder {0}: replyToStatus.account.acct || replyToStatus.account.username #. placeholder {0}: replyToStatus.account.acct || replyToStatus.account.username
#. placeholder {1}: rtf.format(-replyToStatusMonthsAgo, 'month') #. placeholder {1}: rtf.format(-replyToStatusMonthsAgo, 'month')
#: src/components/compose.jsx:966 #: src/components/compose.jsx:971
msgid "Replying to @{0}s post (<0>{1}</0>)" msgid "Replying to @{0}s post (<0>{1}</0>)"
msgstr "" msgstr ""
#. placeholder {0}: replyToStatus.account.acct || replyToStatus.account.username #. placeholder {0}: replyToStatus.account.acct || replyToStatus.account.username
#: src/components/compose.jsx:976 #: src/components/compose.jsx:981
msgid "Replying to @{0}s post" msgid "Replying to @{0}s post"
msgstr "" msgstr ""
#: src/components/compose.jsx:989 #: src/components/compose.jsx:994
msgid "Editing source post" msgid "Editing source post"
msgstr "" msgstr ""
#: src/components/compose.jsx:1042 #: src/components/compose.jsx:1047
msgid "Poll must have at least 2 options" msgid "Poll must have at least 2 options"
msgstr "Poll must have at least 2 options" msgstr "Poll must have at least 2 options"
#: src/components/compose.jsx:1046 #: src/components/compose.jsx:1051
msgid "Some poll choices are empty" msgid "Some poll choices are empty"
msgstr "Some poll choices are empty" msgstr "Some poll choices are empty"
#: src/components/compose.jsx:1059 #: src/components/compose.jsx:1064
msgid "Some media have no descriptions. Continue?" msgid "Some media have no descriptions. Continue?"
msgstr "Some media have no descriptions. Continue?" msgstr "Some media have no descriptions. Continue?"
#: src/components/compose.jsx:1111 #: src/components/compose.jsx:1116
msgid "Attachment #{i} failed" msgid "Attachment #{i} failed"
msgstr "Attachment #{i} failed" msgstr "Attachment #{i} failed"
#: src/components/compose.jsx:1207 #: src/components/compose.jsx:1212
#: src/components/status.jsx:2098 #: src/components/status.jsx:2098
#: src/components/timeline.jsx:989 #: src/components/timeline.jsx:989
msgid "Content warning" msgid "Content warning"
msgstr "" msgstr ""
#: src/components/compose.jsx:1223 #: src/components/compose.jsx:1228
msgid "Content warning or sensitive media" msgid "Content warning or sensitive media"
msgstr "Content warning or sensitive media" msgstr "Content warning or sensitive media"
#: src/components/compose.jsx:1259 #: src/components/compose.jsx:1264
#: src/components/status.jsx:94 #: src/components/status.jsx:94
#: src/pages/settings.jsx:306 #: src/pages/settings.jsx:306
msgid "Public" msgid "Public"
msgstr "" msgstr ""
#: src/components/compose.jsx:1264 #: src/components/compose.jsx:1269
#: src/components/nav-menu.jsx:344 #: src/components/nav-menu.jsx:344
#: src/components/shortcuts-settings.jsx:165 #: src/components/shortcuts-settings.jsx:165
#: src/components/status.jsx:95 #: src/components/status.jsx:95
msgid "Local" msgid "Local"
msgstr "" msgstr ""
#: src/components/compose.jsx:1268 #: src/components/compose.jsx:1273
#: src/components/status.jsx:96 #: src/components/status.jsx:96
#: src/pages/settings.jsx:309 #: src/pages/settings.jsx:309
msgid "Unlisted" msgid "Unlisted"
msgstr "" msgstr ""
#: src/components/compose.jsx:1271 #: src/components/compose.jsx:1276
#: src/components/status.jsx:97 #: src/components/status.jsx:97
#: src/pages/settings.jsx:312 #: src/pages/settings.jsx:312
msgid "Followers only" msgid "Followers only"
msgstr "" msgstr ""
#: src/components/compose.jsx:1274 #: src/components/compose.jsx:1279
#: src/components/status.jsx:98 #: src/components/status.jsx:98
#: src/components/status.jsx:1976 #: src/components/status.jsx:1976
msgid "Private mention" msgid "Private mention"
msgstr "" msgstr ""
#: src/components/compose.jsx:1283 #: src/components/compose.jsx:1288
msgid "Post your reply" msgid "Post your reply"
msgstr "Post your reply" msgstr "Post your reply"
#: src/components/compose.jsx:1285 #: src/components/compose.jsx:1290
msgid "Edit your post" msgid "Edit your post"
msgstr "Edit your post" msgstr "Edit your post"
#: src/components/compose.jsx:1286 #: src/components/compose.jsx:1291
msgid "What are you doing?" msgid "What are you doing?"
msgstr "What are you doing?" msgstr "What are you doing?"
#: src/components/compose.jsx:1364 #: src/components/compose.jsx:1369
msgid "Mark media as sensitive" msgid "Mark media as sensitive"
msgstr "" msgstr ""
#: src/components/compose.jsx:1401 #: src/components/compose.jsx:1406
msgid "Posting on <0/>" msgid "Posting on <0/>"
msgstr "Posting on <0/>" msgstr "Posting on <0/>"
#: src/components/compose.jsx:1432 #: src/components/compose.jsx:1437
#: src/components/compose.jsx:3185 #: src/components/compose.jsx:3261
#: src/components/shortcuts-settings.jsx:715 #: src/components/shortcuts-settings.jsx:715
#: src/pages/list.jsx:362 #: src/pages/list.jsx:362
msgid "Add" msgid "Add"
msgstr "" msgstr ""
#: src/components/compose.jsx:1626 #: src/components/compose.jsx:1663
msgid "Schedule" msgid "Schedule"
msgstr "Schedule" msgstr "Schedule"
#: src/components/compose.jsx:1628 #: src/components/compose.jsx:1665
#: src/components/keyboard-shortcuts-help.jsx:154 #: src/components/keyboard-shortcuts-help.jsx:154
#: src/components/status.jsx:984 #: src/components/status.jsx:984
#: src/components/status.jsx:1750 #: src/components/status.jsx:1750
@ -755,48 +755,48 @@ msgstr "Schedule"
msgid "Reply" msgid "Reply"
msgstr "" msgstr ""
#: src/components/compose.jsx:1630 #: src/components/compose.jsx:1667
msgid "Update" msgid "Update"
msgstr "Update" msgstr "Update"
#: src/components/compose.jsx:1631 #: src/components/compose.jsx:1668
msgctxt "Submit button in composer" msgctxt "Submit button in composer"
msgid "Post" msgid "Post"
msgstr "Post" msgstr "Post"
#: src/components/compose.jsx:1753 #: src/components/compose.jsx:1790
msgid "Downloading GIF…" msgid "Downloading GIF…"
msgstr "Downloading GIF…" msgstr "Downloading GIF…"
#: src/components/compose.jsx:1781 #: src/components/compose.jsx:1818
msgid "Failed to download GIF" msgid "Failed to download GIF"
msgstr "Failed to download GIF" msgstr "Failed to download GIF"
#: src/components/compose.jsx:1957 #: src/components/compose.jsx:2033
#: src/components/compose.jsx:2034 #: src/components/compose.jsx:2110
#: src/components/nav-menu.jsx:239 #: src/components/nav-menu.jsx:239
msgid "More…" msgid "More…"
msgstr "" msgstr ""
#: src/components/compose.jsx:2466 #: src/components/compose.jsx:2542
msgid "Uploaded" msgid "Uploaded"
msgstr "" msgstr ""
#: src/components/compose.jsx:2479 #: src/components/compose.jsx:2555
msgid "Image description" msgid "Image description"
msgstr "Image description" msgstr "Image description"
#: src/components/compose.jsx:2480 #: src/components/compose.jsx:2556
msgid "Video description" msgid "Video description"
msgstr "Video description" msgstr "Video description"
#: src/components/compose.jsx:2481 #: src/components/compose.jsx:2557
msgid "Audio description" msgid "Audio description"
msgstr "Audio description" msgstr "Audio description"
#. placeholder {0}: prettyBytes( imageSize, ) #. placeholder {0}: prettyBytes( imageSize, )
#. placeholder {1}: prettyBytes(imageSizeLimit) #. placeholder {1}: prettyBytes(imageSizeLimit)
#: src/components/compose.jsx:2517 #: src/components/compose.jsx:2593
msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower."
msgstr "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." msgstr "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower."
@ -804,13 +804,13 @@ msgstr "File size too large. Uploading might encounter issues. Try reduce the fi
#. placeholder {3}: i18n.number(height) #. placeholder {3}: i18n.number(height)
#. placeholder {4}: i18n.number(newWidth) #. placeholder {4}: i18n.number(newWidth)
#. placeholder {5}: i18n.number( newHeight, ) #. placeholder {5}: i18n.number( newHeight, )
#: src/components/compose.jsx:2529 #: src/components/compose.jsx:2605
msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {2}×{3}px to {4}×{5}px." msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {2}×{3}px to {4}×{5}px."
msgstr "Dimension too large. Uploading might encounter issues. Try reduce dimension from {2}×{3}px to {4}×{5}px." msgstr "Dimension too large. Uploading might encounter issues. Try reduce dimension from {2}×{3}px to {4}×{5}px."
#. placeholder {6}: prettyBytes( videoSize, ) #. placeholder {6}: prettyBytes( videoSize, )
#. placeholder {7}: prettyBytes(videoSizeLimit) #. placeholder {7}: prettyBytes(videoSizeLimit)
#: src/components/compose.jsx:2537 #: src/components/compose.jsx:2613
msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {6} to {7} or lower." msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {6} to {7} or lower."
msgstr "File size too large. Uploading might encounter issues. Try reduce the file size from {6} to {7} or lower." msgstr "File size too large. Uploading might encounter issues. Try reduce the file size from {6} to {7} or lower."
@ -818,149 +818,149 @@ msgstr "File size too large. Uploading might encounter issues. Try reduce the fi
#. placeholder {9}: i18n.number(height) #. placeholder {9}: i18n.number(height)
#. placeholder {10}: i18n.number(newWidth) #. placeholder {10}: i18n.number(newWidth)
#. placeholder {11}: i18n.number( newHeight, ) #. placeholder {11}: i18n.number( newHeight, )
#: src/components/compose.jsx:2549 #: src/components/compose.jsx:2625
msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {8}×{9}px to {10}×{11}px." msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {8}×{9}px to {10}×{11}px."
msgstr "Dimension too large. Uploading might encounter issues. Try reduce dimension from {8}×{9}px to {10}×{11}px." msgstr "Dimension too large. Uploading might encounter issues. Try reduce dimension from {8}×{9}px to {10}×{11}px."
#: src/components/compose.jsx:2557 #: src/components/compose.jsx:2633
msgid "Frame rate too high. Uploading might encounter issues." msgid "Frame rate too high. Uploading might encounter issues."
msgstr "Frame rate too high. Uploading might encounter issues." msgstr "Frame rate too high. Uploading might encounter issues."
#: src/components/compose.jsx:2617 #: src/components/compose.jsx:2693
#: src/components/compose.jsx:2867 #: src/components/compose.jsx:2943
#: src/components/shortcuts-settings.jsx:726 #: src/components/shortcuts-settings.jsx:726
#: src/pages/catchup.jsx:1074 #: src/pages/catchup.jsx:1074
#: src/pages/filters.jsx:412 #: src/pages/filters.jsx:412
msgid "Remove" msgid "Remove"
msgstr "" msgstr ""
#: src/components/compose.jsx:2634 #: src/components/compose.jsx:2710
#: src/compose.jsx:84 #: src/compose.jsx:84
msgid "Error" msgid "Error"
msgstr "" msgstr ""
#: src/components/compose.jsx:2659 #: src/components/compose.jsx:2735
msgid "Edit image description" msgid "Edit image description"
msgstr "Edit image description" msgstr "Edit image description"
#: src/components/compose.jsx:2660 #: src/components/compose.jsx:2736
msgid "Edit video description" msgid "Edit video description"
msgstr "Edit video description" msgstr "Edit video description"
#: src/components/compose.jsx:2661 #: src/components/compose.jsx:2737
msgid "Edit audio description" msgid "Edit audio description"
msgstr "Edit audio description" msgstr "Edit audio description"
#: src/components/compose.jsx:2706 #: src/components/compose.jsx:2782
#: src/components/compose.jsx:2755 #: src/components/compose.jsx:2831
msgid "Generating description. Please wait…" msgid "Generating description. Please wait…"
msgstr "Generating description. Please wait…" msgstr "Generating description. Please wait…"
#. placeholder {12}: e.message #. placeholder {12}: e.message
#: src/components/compose.jsx:2726 #: src/components/compose.jsx:2802
msgid "Failed to generate description: {12}" msgid "Failed to generate description: {12}"
msgstr "Failed to generate description: {12}" msgstr "Failed to generate description: {12}"
#: src/components/compose.jsx:2727 #: src/components/compose.jsx:2803
msgid "Failed to generate description" msgid "Failed to generate description"
msgstr "Failed to generate description" msgstr "Failed to generate description"
#: src/components/compose.jsx:2739 #: src/components/compose.jsx:2815
#: src/components/compose.jsx:2745 #: src/components/compose.jsx:2821
#: src/components/compose.jsx:2791 #: src/components/compose.jsx:2867
msgid "Generate description…" msgid "Generate description…"
msgstr "" msgstr ""
#. placeholder {13}: e?.message ? `: ${e.message}` : '' #. placeholder {13}: e?.message ? `: ${e.message}` : ''
#: src/components/compose.jsx:2778 #: src/components/compose.jsx:2854
msgid "Failed to generate description{13}" msgid "Failed to generate description{13}"
msgstr "Failed to generate description{13}" msgstr "Failed to generate description{13}"
#. placeholder {0}: localeCode2Text(lang) #. placeholder {0}: localeCode2Text(lang)
#: src/components/compose.jsx:2793 #: src/components/compose.jsx:2869
msgid "({0}) <0>— experimental</0>" msgid "({0}) <0>— experimental</0>"
msgstr "" msgstr ""
#: src/components/compose.jsx:2812 #: src/components/compose.jsx:2888
msgid "Done" msgid "Done"
msgstr "" msgstr ""
#. placeholder {0}: i + 1 #. placeholder {0}: i + 1
#: src/components/compose.jsx:2848 #: src/components/compose.jsx:2924
msgid "Choice {0}" msgid "Choice {0}"
msgstr "Choice {0}" msgstr "Choice {0}"
#: src/components/compose.jsx:2895 #: src/components/compose.jsx:2971
msgid "Multiple choices" msgid "Multiple choices"
msgstr "" msgstr ""
#: src/components/compose.jsx:2898 #: src/components/compose.jsx:2974
msgid "Duration" msgid "Duration"
msgstr "" msgstr ""
#: src/components/compose.jsx:2929 #: src/components/compose.jsx:3005
msgid "Remove poll" msgid "Remove poll"
msgstr "" msgstr ""
#: src/components/compose.jsx:3144 #: src/components/compose.jsx:3220
msgid "Search accounts" msgid "Search accounts"
msgstr "Search accounts" msgstr "Search accounts"
#: src/components/compose.jsx:3198 #: src/components/compose.jsx:3274
#: src/components/generic-accounts.jsx:228 #: src/components/generic-accounts.jsx:228
msgid "Error loading accounts" msgid "Error loading accounts"
msgstr "" msgstr ""
#: src/components/compose.jsx:3342 #: src/components/compose.jsx:3418
msgid "Custom emojis" msgid "Custom emojis"
msgstr "" msgstr ""
#: src/components/compose.jsx:3362 #: src/components/compose.jsx:3438
msgid "Search emoji" msgid "Search emoji"
msgstr "Search emoji" msgstr "Search emoji"
#: src/components/compose.jsx:3393 #: src/components/compose.jsx:3469
msgid "Error loading custom emojis" msgid "Error loading custom emojis"
msgstr "" msgstr ""
#: src/components/compose.jsx:3404 #: src/components/compose.jsx:3480
msgid "Recently used" msgid "Recently used"
msgstr "Recently used" msgstr "Recently used"
#: src/components/compose.jsx:3405 #: src/components/compose.jsx:3481
msgid "Others" msgid "Others"
msgstr "Others" msgstr "Others"
#. placeholder {0}: i18n.number(emojis.length - max) #. placeholder {0}: i18n.number(emojis.length - max)
#: src/components/compose.jsx:3443 #: src/components/compose.jsx:3519
msgid "{0} more…" msgid "{0} more…"
msgstr "" msgstr ""
#: src/components/compose.jsx:3581 #: src/components/compose.jsx:3657
msgid "Search GIFs" msgid "Search GIFs"
msgstr "Search GIFs" msgstr "Search GIFs"
#: src/components/compose.jsx:3596 #: src/components/compose.jsx:3672
msgid "Powered by GIPHY" msgid "Powered by GIPHY"
msgstr "Powered by GIPHY" msgstr "Powered by GIPHY"
#: src/components/compose.jsx:3604 #: src/components/compose.jsx:3680
msgid "Type to search GIFs" msgid "Type to search GIFs"
msgstr "" msgstr ""
#: src/components/compose.jsx:3702 #: src/components/compose.jsx:3778
#: src/components/media-modal.jsx:464 #: src/components/media-modal.jsx:464
#: src/components/timeline.jsx:893 #: src/components/timeline.jsx:893
msgid "Previous" msgid "Previous"
msgstr "" msgstr ""
#: src/components/compose.jsx:3720 #: src/components/compose.jsx:3796
#: src/components/media-modal.jsx:483 #: src/components/media-modal.jsx:483
#: src/components/timeline.jsx:910 #: src/components/timeline.jsx:910
msgid "Next" msgid "Next"
msgstr "" msgstr ""
#: src/components/compose.jsx:3737 #: src/components/compose.jsx:3813
msgid "Error loading GIFs" msgid "Error loading GIFs"
msgstr "" msgstr ""