diff --git a/Gemfile b/Gemfile index d10b88b191966176b8845f95577f0603fe2ec10a..d587db50e699bd2ca525dbe0b0245cad234b3e19 100644 --- a/Gemfile +++ b/Gemfile @@ -63,6 +63,8 @@ gem 'http_accept_language', '~> 2.1' gem 'httplog', '~> 1.4.3' gem 'idn-ruby', require: 'idn' gem 'kaminari', '~> 1.2' +gem 'kramdown', '~> 2.3' +gem 'kramdown-parser-gfm', '~> 1.1' gem 'link_header', '~> 0.0' gem 'mime-types', '~> 3.3.1', require: 'mime/types/columnar' gem 'nilsimsa', git: 'https://github.com/witgo/nilsimsa', ref: 'fd184883048b922b176939f851338d0a4971a532' diff --git a/Gemfile.lock b/Gemfile.lock index 3c23330d13e570a20465730b35f50c229540be57..a31c0ffce56c9266e7a90136ba33e008b5a22376 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -324,6 +324,10 @@ GEM activerecord kaminari-core (= 1.2.1) kaminari-core (1.2.1) + kramdown (2.3.0) + rexml + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) launchy (2.5.0) addressable (~> 2.7) letter_opener (1.7.0) @@ -760,6 +764,8 @@ DEPENDENCIES json-ld json-ld-preloaded (~> 3.1) kaminari (~> 1.2) + kramdown (~> 2.3) + kramdown-parser-gfm (~> 1.1) letter_opener (~> 1.7) letter_opener_web (~> 1.4) link_header (~> 0.0) diff --git a/app/controllers/api/v1/accounts/credentials_controller.rb b/app/controllers/api/v1/accounts/credentials_controller.rb index af4b6e68f9765225832ed27e858bdb73a3177dca..209c8958dedf3ff196d0633b190147e82b44fa09 100644 --- a/app/controllers/api/v1/accounts/credentials_controller.rb +++ b/app/controllers/api/v1/accounts/credentials_controller.rb @@ -34,6 +34,7 @@ class Api::V1::Accounts::CredentialsController < Api::BaseController 'setting_default_sensitive' => source_params.fetch(:sensitive, @account.user.setting_default_sensitive), 'setting_default_language' => source_params.fetch(:language, @account.user.setting_default_language), 'setting_default_federation' => source_params.fetch(:federation, @account.user.setting_default_federation), + 'setting_default_content_type' => source_params.fetch(:content_type, @account.user.setting_default_content_type), } end end diff --git a/app/controllers/api/v1/statuses_controller.rb b/app/controllers/api/v1/statuses_controller.rb index ec4a56c1972630ed58d9d8fd585d75e2b14dc15f..c97822691c05f942cacd2723e03d187a65a9db58 100644 --- a/app/controllers/api/v1/statuses_controller.rb +++ b/app/controllers/api/v1/statuses_controller.rb @@ -53,6 +53,7 @@ class Api::V1::StatusesController < Api::BaseController idempotency: request.headers['Idempotency-Key'], with_rate_limit: true, quote_id: status_params[:quote_id].presence, + content_type: status_params[:content_type], #'text/markdown' local_only: status_params[:local_only]) render json: @status, serializer: @status.is_a?(ScheduledStatus) ? REST::ScheduledStatusSerializer : REST::StatusSerializer @@ -102,6 +103,7 @@ class Api::V1::StatusesController < Api::BaseController :quote_id, :expires_at, :expires_action, + :content_type, :local_only, media_ids: [], poll: [ diff --git a/app/controllers/settings/preferences_controller.rb b/app/controllers/settings/preferences_controller.rb index 0b2fd4bba9c97fb3e26adcb1db2e4796a14bfb63..8c9c2aa3a11c7bf314fad3ff74c78b7557697de2 100644 --- a/app/controllers/settings/preferences_controller.rb +++ b/app/controllers/settings/preferences_controller.rb @@ -37,6 +37,7 @@ class Settings::PreferencesController < Settings::BaseController :setting_default_sensitive, :setting_default_language, :setting_default_federation, + :setting_default_content_type, :setting_unfollow_modal, :setting_unsubscribe_modal, :setting_boost_modal, diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js index 2dcb95baeed744e1e9420f4b45468bdd76af0c8f..db4d5801a657b0783b5af72a01382356d4c6a365 100644 --- a/app/javascript/mastodon/actions/compose.js +++ b/app/javascript/mastodon/actions/compose.js @@ -51,6 +51,7 @@ export const COMPOSE_SPOILER_TEXT_CHANGE = 'COMPOSE_SPOILER_TEXT_CHANGE'; export const COMPOSE_VISIBILITY_CHANGE = 'COMPOSE_VISIBILITY_CHANGE'; export const COMPOSE_CIRCLE_CHANGE = 'COMPOSE_CIRCLE_CHANGE'; export const COMPOSE_FEDERATION_CHANGE = 'COMPOSE_FEDERATION_CHANGE'; +export const COMPOSE_CONTENT_TYPE_CHANGE = 'COMPOSE_CONTENT_TYPE_CHANGE'; export const COMPOSE_LISTABILITY_CHANGE = 'COMPOSE_LISTABILITY_CHANGE'; export const COMPOSE_COMPOSING_CHANGE = 'COMPOSE_COMPOSING_CHANGE'; @@ -171,6 +172,7 @@ export function submitCompose(routerHistory) { poll: getState().getIn(['compose', 'poll'], null), quote_id: getState().getIn(['compose', 'quote_from'], null), local_only: !getState().getIn(['compose', 'federation']), + content_type: getState().getIn(['compose', 'content_type']), }, { headers: { 'Idempotency-Key': getState().getIn(['compose', 'idempotencyKey']), @@ -634,6 +636,13 @@ export function changeComposeFederation(value) { }; }; +export function changeComposeContentType(value) { + return { + type: COMPOSE_CONTENT_TYPE_CHANGE, + value, + }; +}; + export function insertEmojiCompose(position, emoji, needsSpace) { return { type: COMPOSE_EMOJI_INSERT, diff --git a/app/javascript/mastodon/features/compose/components/compose_form.js b/app/javascript/mastodon/features/compose/components/compose_form.js index dd243b9d657d7f35fa1c3a0ead0b92aea0ee3636..5eefc193acd9ecf491e85a359b72d9e28e5cc2f2 100644 --- a/app/javascript/mastodon/features/compose/components/compose_form.js +++ b/app/javascript/mastodon/features/compose/components/compose_form.js @@ -14,6 +14,7 @@ import SpoilerButtonContainer from '../containers/spoiler_button_container'; import PrivacyDropdownContainer from '../containers/privacy_dropdown_container'; import CircleDropdownContainer from '../containers/circle_dropdown_container'; import FederationDropdownContainer from '../containers/federation_dropdown_container'; +import ContentTypeDropdownContainer from '../containers/content_type_dropdown_container'; import EmojiPickerDropdown from '../containers/emoji_picker_dropdown_container'; import PollFormContainer from '../containers/poll_form_container'; import UploadFormContainer from '../containers/upload_form_container'; @@ -47,6 +48,7 @@ class ComposeForm extends ImmutablePureComponent { spoiler: PropTypes.bool, privacy: PropTypes.string, federation: PropTypes.bool, + contentType: PropTypes.string, spoilerText: PropTypes.string, focusDate: PropTypes.instanceOf(Date), caretPosition: PropTypes.number, @@ -246,6 +248,7 @@ class ComposeForm extends ImmutablePureComponent { <div className='compose-form__buttons'> <UploadButtonContainer /> <PollButtonContainer /> + <ContentTypeDropdownContainer/> <PrivacyDropdownContainer /> <SpoilerButtonContainer /> <FederationDropdownContainer /> diff --git a/app/javascript/mastodon/features/compose/components/content_type_dropdown.js b/app/javascript/mastodon/features/compose/components/content_type_dropdown.js new file mode 100644 index 0000000000000000000000000000000000000000..5ac32cf20c55f3edbcd8b4d9790ffa2581d1187e --- /dev/null +++ b/app/javascript/mastodon/features/compose/components/content_type_dropdown.js @@ -0,0 +1,272 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { injectIntl, defineMessages } from 'react-intl'; +import IconButton from '../../../components/icon_button'; +import Overlay from 'react-overlays/lib/Overlay'; +import Motion from '../../ui/util/optional_motion'; +import spring from 'react-motion/lib/spring'; +import detectPassiveEvents from 'detect-passive-events'; +import classNames from 'classnames'; +import Icon from 'mastodon/components/icon'; + +const messages = defineMessages({ + plain: { id: 'content_type.plain.short', defaultMessage: 'Plain Text' }, + markdown: { id: 'content_type.markdown.short', defaultMessage: 'Markdown' }, + change_content_type: { id: 'content_type.change', defaultMessage: 'Adjust status content type' }, +}); + +const listenerOptions = detectPassiveEvents.hasSupport ? { passive: true } : false; + +class ContentTypeDropdownMenu extends React.PureComponent { + + static propTypes = { + style: PropTypes.object, + items: PropTypes.array.isRequired, + value: PropTypes.string.isRequired, + placement: PropTypes.string.isRequired, + onClose: PropTypes.func.isRequired, + onChange: PropTypes.func.isRequired, + }; + + state = { + mounted: false, + }; + + handleDocumentClick = e => { + if (this.node && !this.node.contains(e.target)) { + this.props.onClose(); + } + } + + handleKeyDown = e => { + const { items } = this.props; + const value = e.currentTarget.getAttribute('data-index'); + const index = items.findIndex(item => { + return (item.value === value); + }); + let element = null; + + switch(e.key) { + case 'Escape': + this.props.onClose(); + break; + case 'Enter': + this.handleClick(e); + break; + case 'ArrowDown': + element = this.node.childNodes[index + 1] || this.node.firstChild; + break; + case 'ArrowUp': + element = this.node.childNodes[index - 1] || this.node.lastChild; + break; + case 'Tab': + if (e.shiftKey) { + element = this.node.childNodes[index - 1] || this.node.lastChild; + } else { + element = this.node.childNodes[index + 1] || this.node.firstChild; + } + break; + case 'Home': + element = this.node.firstChild; + break; + case 'End': + element = this.node.lastChild; + break; + } + + if (element) { + element.focus(); + this.props.onChange(element.getAttribute('data-index')); + e.preventDefault(); + e.stopPropagation(); + } + } + + handleClick = e => { + const value = e.currentTarget.getAttribute('data-index'); + + e.preventDefault(); + + this.props.onClose(); + this.props.onChange(value); + } + + componentDidMount () { + document.addEventListener('click', this.handleDocumentClick, false); + document.addEventListener('touchend', this.handleDocumentClick, listenerOptions); + if (this.focusedItem) this.focusedItem.focus({ preventScroll: true }); + this.setState({ mounted: true }); + } + + componentWillUnmount () { + document.removeEventListener('click', this.handleDocumentClick, false); + document.removeEventListener('touchend', this.handleDocumentClick, listenerOptions); + } + + setRef = c => { + this.node = c; + } + + setFocusRef = c => { + this.focusedItem = c; + } + + render () { + const { mounted } = this.state; + const { style, items, placement, value } = this.props; + + return ( + <Motion defaultStyle={{ opacity: 0, scaleX: 0.85, scaleY: 0.75 }} style={{ opacity: spring(1, { damping: 35, stiffness: 400 }), scaleX: spring(1, { damping: 35, stiffness: 400 }), scaleY: spring(1, { damping: 35, stiffness: 400 }) }}> + {({ opacity, scaleX, scaleY }) => ( + // It should not be transformed when mounting because the resulting + // size will be used to determine the coordinate of the menu by + // react-overlays + <div className={`privacy-dropdown__dropdown ${placement}`} style={{ ...style, opacity: opacity, transform: mounted ? `scale(${scaleX}, ${scaleY})` : null, zIndex: 2 }} role='listbox' ref={this.setRef}> + {items.map(item => ( + <div role='option' tabIndex='0' key={item.value} data-index={item.value} onKeyDown={this.handleKeyDown} onClick={this.handleClick} className={classNames('privacy-dropdown__option', { active: item.value === value })} aria-selected={item.value === value} ref={item.value === value ? this.setFocusRef : null}> + <div className='privacy-dropdown__option__icon'> + <Icon id={item.icon} fixedWidth /> + </div> + + <div className='privacy-dropdown__option__content'> + <strong>{item.text}</strong> + {item.meta} + </div> + </div> + ))} + </div> + )} + </Motion> + ); + } + +} + +export default @injectIntl +class ContentTypeDropdown extends React.PureComponent { + + static propTypes = { + isUserTouching: PropTypes.func, + isModalOpen: PropTypes.bool.isRequired, + onModalOpen: PropTypes.func, + onModalClose: PropTypes.func, + value: PropTypes.string.isRequired, + onChange: PropTypes.func.isRequired, + intl: PropTypes.object.isRequired, + }; + + state = { + open: false, + placement: 'bottom', + }; + + handleToggle = ({ target }) => { + if (this.props.isUserTouching()) { + if (this.state.open) { + this.props.onModalClose(); + } else { + this.props.onModalOpen({ + actions: this.options.map(option => ({ ...option, active: option.value === this.props.value })), + onClick: this.handleModalActionClick, + }); + } + } else { + const { top } = target.getBoundingClientRect(); + if (this.state.open && this.activeElement) { + this.activeElement.focus({ preventScroll: true }); + } + this.setState({ placement: top * 2 < innerHeight ? 'bottom' : 'top' }); + this.setState({ open: !this.state.open }); + } + } + + handleModalActionClick = (e) => { + e.preventDefault(); + + const { value } = this.options[e.currentTarget.getAttribute('data-index')]; + + this.props.onModalClose(); + this.props.onChange(value); + } + + handleKeyDown = e => { + switch(e.key) { + case 'Escape': + this.handleClose(); + break; + } + } + + handleMouseDown = () => { + if (!this.state.open) { + this.activeElement = document.activeElement; + } + } + + handleButtonKeyDown = (e) => { + switch(e.key) { + case ' ': + case 'Enter': + this.handleMouseDown(); + break; + } + } + + handleClose = () => { + if (this.state.open && this.activeElement) { + this.activeElement.focus({ preventScroll: true }); + } + this.setState({ open: false }); + } + + handleChange = value => { + this.props.onChange(value); + } + + componentWillMount () { + const { intl: { formatMessage } } = this.props; + + this.options = [ + { icon: 'file-text', value: 'text/plain', text: formatMessage(messages.plain), meta: null }, + { icon: 'arrow-circle-down', value: 'text/markdown', text: formatMessage(messages.markdown), meta: null }, + ]; + } + + render () { + const { value, intl } = this.props; + const { open, placement } = this.state; + + const valueOption = this.options.find(item => item.value === value); + + return ( + <div className={classNames('privacy-dropdown', placement, { active: open })} onKeyDown={this.handleKeyDown}> + <div className={classNames('privacy-dropdown__value', { active: this.options.indexOf(valueOption) === (placement === 'bottom' ? 0 : (this.options.length - 1)) })}> + <IconButton + className='privacy-dropdown__value-icon' + icon={valueOption.icon} + title={intl.formatMessage(messages.change_content_type)} + size={18} + expanded={open} + active={open} + inverted + onClick={this.handleToggle} + onMouseDown={this.handleMouseDown} + onKeyDown={this.handleButtonKeyDown} + style={{ height: null, lineHeight: '27px' }} + /> + </div> + + <Overlay show={open} placement={placement} target={this}> + <ContentTypeDropdownMenu + items={this.options} + value={value} + onClose={this.handleClose} + onChange={this.handleChange} + placement={placement} + /> + </Overlay> + </div> + ); + } + +} diff --git a/app/javascript/mastodon/features/compose/containers/compose_form_container.js b/app/javascript/mastodon/features/compose/containers/compose_form_container.js index d1af2a60724e5e06f181da1152544922befdf035..39b307f2ede09ef191009798fe6e410d714c3995 100644 --- a/app/javascript/mastodon/features/compose/containers/compose_form_container.js +++ b/app/javascript/mastodon/features/compose/containers/compose_form_container.js @@ -18,6 +18,7 @@ const mapStateToProps = state => ({ spoilerText: state.getIn(['compose', 'spoiler_text']), privacy: state.getIn(['compose', 'privacy']), federation: state.getIn(['compose', 'federation']), + contentType: state.getIn(['compose', 'content_type']), focusDate: state.getIn(['compose', 'focusDate']), caretPosition: state.getIn(['compose', 'caretPosition']), preselectDate: state.getIn(['compose', 'preselectDate']), diff --git a/app/javascript/mastodon/features/compose/containers/content_type_dropdown_container.js b/app/javascript/mastodon/features/compose/containers/content_type_dropdown_container.js new file mode 100644 index 0000000000000000000000000000000000000000..18107bce0ccb42848059652941be90f2c9b96c36 --- /dev/null +++ b/app/javascript/mastodon/features/compose/containers/content_type_dropdown_container.js @@ -0,0 +1,24 @@ +import { connect } from 'react-redux'; +import ContentTypeDropdown from '../components/content_type_dropdown'; +import { changeComposeContentType } from '../../../actions/compose'; +import { openModal, closeModal } from '../../../actions/modal'; +import { isUserTouching } from '../../../is_mobile'; + +const mapStateToProps = state => ({ + isModalOpen: state.get('modal').modalType === 'ACTIONS', + value: state.getIn(['compose', 'content_type']), +}); + +const mapDispatchToProps = dispatch => ({ + + onChange (value) { + dispatch(changeComposeContentType(value)); + }, + + isUserTouching, + onModalOpen: props => dispatch(openModal('ACTIONS', props)), + onModalClose: () => dispatch(closeModal()), + +}); + +export default connect(mapStateToProps, mapDispatchToProps)(ContentTypeDropdown); diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 876c6962c5d99839df8c19a7f0be3b0436473dcf..8af877910e7aa3688139be52d73cc708d83a6d90 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "الرد ÙÙŠ الØÙŠÙ† Ø³ÙˆÙ ÙŠÙØ¹ÙŠØ¯ كتابة الرسالة التي أنت بصدد كتابتها. متأكد من أنك تريد المواصلة؟", "confirmations.unfollow.confirm": "إلغاء المتابعة", "confirmations.unfollow.message": "متأكد من أنك تريد إلغاء متابعة {name} ØŸ", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Ø§ØØ°Ù Ø§Ù„Ù…ØØ§Ø¯Ø«Ø©", "conversation.mark_as_read": "اعتبرها كمقروءة", "conversation.open": "اعرض Ø§Ù„Ù…ØØ§Ø¯Ø«Ø©", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index 675fbbf8e5de5bc136f98e63b51859ac01646442..b1c13a686b6dcba8b5873ec14f67d26f9c36a61e 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Responder agora va sobrescribir el mensaxe que tas componiendo anguaño. ¿De xuru que quies siguir?", "confirmations.unfollow.confirm": "Dexar de siguir", "confirmations.unfollow.message": "¿De xuru que quies dexar de siguir a {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Delete conversation", "conversation.mark_as_read": "Mark as read", "conversation.open": "View conversation", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 9008de9ed8735fbe82b1bb318e384a359aa98a73..69fdba157c5a81344e939ce7bfb13e4acf299995 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Delete conversation", "conversation.mark_as_read": "Mark as read", "conversation.open": "View conversation", diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json index 7de1a10221b2470daabdfb69b116a5fac84d298b..6bea3fee2e2d8084aa5d5b603568df8f10726a7b 100644 --- a/app/javascript/mastodon/locales/bn.json +++ b/app/javascript/mastodon/locales/bn.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "à¦à¦–ন মতামত লিখতে গেলে আপনার à¦à¦–ন যেটা লিখছেন সেটা মà§à¦›à§‡ যাবে। আপনি নি নিশà§à¦šà¦¿à¦¤ à¦à¦Ÿà¦¾ করতে চান ?", "confirmations.unfollow.confirm": "অনà§à¦¸à¦°à¦£ করা বাতিল করতে", "confirmations.unfollow.message": "আপনি কি নিশà§à¦šà¦¿à¦¤ {name} কে আর অনà§à¦¸à¦°à¦£ করতে চান না ?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "কথোপকথন মà§à¦›à§‡ ফেলà§à¦¨", "conversation.mark_as_read": "পঠিত হিসেবে চিহà§à¦¨à¦¿à¦¤ করà§à¦¨", "conversation.open": "কথপোকথন দেখান", diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json index 72a6d0a0a0e52a2d3368a0bcf36e9dfb89528f6e..e88a451c0ed6a0dc91be418a8e103cda7aaa2cec 100644 --- a/app/javascript/mastodon/locales/br.json +++ b/app/javascript/mastodon/locales/br.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Respont bremañ a zilamo ar gemennadenn emaoc'h o skrivañ. Sur e oc'h e fell deoc'h kenderc'hel ganti?", "confirmations.unfollow.confirm": "Diheuliañ", "confirmations.unfollow.message": "Ha sur oc'h e fell deoc'h paouez da heuliañ {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Dilemel ar gaozeadenn", "conversation.mark_as_read": "Merkañ evel lennet", "conversation.open": "Gwelout ar gaozeadenn", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 2273407ac895f9c0fd6740b470b0c5cd7dd11e89..5c2b6b65556ba679e822f03adc8b400f856590be 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Responen ara es sobreescriurà el missatge que està s editant. Està s segur que vols continuar?", "confirmations.unfollow.confirm": "Deixa de seguir", "confirmations.unfollow.message": "Està s segur que vols deixar de seguir {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Elimina la conversa", "conversation.mark_as_read": "Marca com a llegida", "conversation.open": "Veure conversa", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index 34341ee8322ee915edea35e58eec2ddba1694b62..cd990718b70ce5b2b406eef5fcf07c208824d997 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Risponde avà sguasserà u missaghju chì scrivite. Site sicuru·a chì vulete cuntinuà ?", "confirmations.unfollow.confirm": "Disabbunassi", "confirmations.unfollow.message": "Site sicuru·a ch'ùn vulete più siguità @{name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Sguassà a cunversazione", "conversation.mark_as_read": "Marcà cum'è lettu", "conversation.open": "Vede a cunversazione", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index cd5cd968056012cf4f54d40ac5667e1d88e94b13..a1ecc950acd32be977865646e5f6d006d7c8efd6 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "OdpovÄ›Ä pÅ™epÃÅ¡e vaÅ¡i rozepsanou zprávu. Opravdu chcete pokraÄovat?", "confirmations.unfollow.confirm": "PÅ™estat sledovat", "confirmations.unfollow.message": "Opravdu chcete uživatele {name} pÅ™estat sledovat?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Smazat konverzaci", "conversation.mark_as_read": "OznaÄit jako pÅ™eÄtenou", "conversation.open": "Zobrazit konverzaci", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index ecd49c577a48d49240592abc431432329432d319..8ab0fd0e72b045739113a12471cc34137011fa2c 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Bydd ateb nawr yn cymryd lle y neges yr ydych yn cyfansoddi ar hyn o bryd. Ydych chi'n sicr yr ydych am barhau?", "confirmations.unfollow.confirm": "Dad-ddilynwch", "confirmations.unfollow.message": "Ydych chi'n sicr eich bod am ddad-ddilyn {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Dileu sgwrs", "conversation.mark_as_read": "Nodi fel wedi'i ddarllen", "conversation.open": "Gweld sgwrs", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index fd6ec26f4d90065c1bc368cacb6f6f94ab96f6da..58bbef812bc510a3f2de08ab84a0177d9d610105 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Hvis du svarer nu vil du overskrive den besked du er ved at skrive. Er du sikker pÃ¥, du vil fortsætte?", "confirmations.unfollow.confirm": "Følg ikke længere", "confirmations.unfollow.message": "Er du sikker pÃ¥, du ikke længere vil følge {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Slet samtale", "conversation.mark_as_read": "Marker som læst", "conversation.open": "Vis samtale", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 1a18bafc3cf1a6391ad337faca4ecb1a8fdde541..939aabf3655b1fd03a53652fa68b0bfea809d058 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Wenn du jetzt antwortest wird es die gesamte Nachricht verwerfen, die du gerade schreibst. Möchtest du wirklich fortfahren?", "confirmations.unfollow.confirm": "Entfolgen", "confirmations.unfollow.message": "Bist du dir sicher, dass du {name} entfolgen möchtest?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Unterhaltung löschen", "conversation.mark_as_read": "Als gelesen markieren", "conversation.open": "Unterhaltung anzeigen", diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index bf0809437880a78965883b33c8a98e995f21f12a..77d61f36ad97b78f33a8faa6135495841d6e6814 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -1072,6 +1072,23 @@ ], "path": "app/javascript/mastodon/features/compose/components/compose_form.json" }, + { + "descriptors": [ + { + "defaultMessage": "Plain Text", + "id": "content_type.plain.short" + }, + { + "defaultMessage": "Markdown", + "id": "content_type.markdown.short" + }, + { + "defaultMessage": "Adjust status content type", + "id": "content_type.change" + } + ], + "path": "app/javascript/mastodon/features/compose/components/content_type_dropdown.json" + }, { "descriptors": [ { diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 35adb204ed204bda9bed8ac8061b4a6b2a2081bf..e8b4374c729ab5d2c243f3345706cce79d22297b 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Απαντώντας τώÏα θα αντικαταστήσεις το κείμενο που ήδη γÏάφεις. ΣίγουÏα θÎλεις να συνεχίσεις;", "confirmations.unfollow.confirm": "Διακοπή παÏακολοÏθησης", "confirmations.unfollow.message": "ΣίγουÏα θες να πάψεις να ακολουθείς τον/την {name};", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "ΔιαγÏαφή συζήτησης", "conversation.mark_as_read": "Σήμανση ως αναγνωσμÎνο", "conversation.open": "Î Ïοβολή συνομιλίας", diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 49c4d99d2f9071572c22453a1bf223ed5a152f87..62c7d9d782dac4a1b95cca453d15fbd5c976e667 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -157,6 +157,9 @@ "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", "confirmations.unsubscribe.confirm": "Unsubscribe", "confirmations.unsubscribe.message": "Are you sure you want to unsubscribe {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Delete conversation", "conversation.mark_as_read": "Mark as read", "conversation.open": "View conversation", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index d6d6aa1b6d380869e718d76abe109a070cb780a9..44dbee9997fbc86e93e445ef74438fd7be975a0e 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Respondi nun anstataÅigos la mesaÄon, kiun vi nun skribas. Ĉu vi certas, ke vi volas daÅrigi?", "confirmations.unfollow.confirm": "Ne plu sekvi", "confirmations.unfollow.message": "Ĉu vi certas, ke vi volas ĉesi sekvi {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Forigi konversacion", "conversation.mark_as_read": "Marki legita", "conversation.open": "Vidi konversacion", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index fda38645541c06bf3f3e797c9d0ecdcd6e4c38f7..0e498054c1b68e4ffbdeb2faac0b5a1338270640 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Responder ahora sobreescribirá el mensaje que estás redactando actualmente. ¿Estás seguro que querés seguir?", "confirmations.unfollow.confirm": "Dejar de seguir", "confirmations.unfollow.message": "¿Estás seguro que querés dejar de seguir a {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Eliminar conversación", "conversation.mark_as_read": "Marcar como leÃdo", "conversation.open": "Ver conversación", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 88ec1f574a5c13e98510a75f34a8948460147c72..70a41dbfd44d7406b77602ad198bc1698c9523e9 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Responder sobrescribirá el mensaje que estás escribiendo. ¿Estás seguro de que deseas continuar?", "confirmations.unfollow.confirm": "Dejar de seguir", "confirmations.unfollow.message": "¿Estás seguro de que quieres dejar de seguir a {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Borrar conversación", "conversation.mark_as_read": "Marcar como leÃdo", "conversation.open": "Ver conversación", diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index 558fe38de259012796fcb3ad141c3840eac671ab..cebf52cad83484bc758972c09931cbe79b2662dc 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Praegu vastamine kirjutab üle sõnumi, mida hetkel koostate. Olete kindel, et soovite jätkata?", "confirmations.unfollow.confirm": "Ära jälgi", "confirmations.unfollow.message": "Olete kindel, et ei soovi rohkem jälgida kasutajat {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Kustuta vestlus", "conversation.mark_as_read": "Märgi loetuks", "conversation.open": "Vaata vestlust", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index 3d5ac92f8a6940c105acf5629d22afcefc43c9a3..40c2914c9ead1ea037f3fb59eac7b641339af653 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Orain erantzuteak idazten ari zaren mezua gainidatziko du. Ziur jarraitu nahi duzula?", "confirmations.unfollow.confirm": "Utzi jarraitzeari", "confirmations.unfollow.message": "Ziur {name} jarraitzeari utzi nahi diozula?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Ezabatu elkarrizketa", "conversation.mark_as_read": "Markatu irakurrita bezala", "conversation.open": "Ikusi elkarrizketa", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 6685b2ccb1ec1597257462f6aa2f465aacabcdbe..6a07accd4a254d28fb01cfc2b8b12c4a82628f1c 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "اگر الان پاسخ دهید، چیزی Ú©Ù‡ در ØØ§Ù„ نوشتنش بودید پاک خواهد شد. می‌خواهید ادامه دهید؟", "confirmations.unfollow.confirm": "پایان پیگیری", "confirmations.unfollow.message": "مطمئنید Ú©Ù‡ می‌خواهید به پیگیری از {name} پایان دهید؟", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "ØØ°Ù Ú¯ÙØªÚ¯Ùˆ", "conversation.mark_as_read": "علامت‌گذاری به عنوان خوانده شده", "conversation.open": "دیدن Ú¯ÙØªÚ¯Ùˆ", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 0f150769b3dc9637ecc1fd055a2160535500f9f2..8f3154bec7a5f3c831c3faedfafb3426e3bb4333 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Jos vastaat nyt, vastaus korvaa tällä hetkellä työstämäsi viestin. Oletko varma, että haluat jatkaa?", "confirmations.unfollow.confirm": "Lakkaa seuraamasta", "confirmations.unfollow.message": "Haluatko varmasti lakata seuraamasta käyttäjää {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Poista keskustelu", "conversation.mark_as_read": "Merkitse luetuksi", "conversation.open": "Näytä keskustelu", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 0c12719e25e8eaf15fb37cb4dad2238d31dfe5dd..a1fbd83d0c6b4409b19fc03d8ece52118a4b0745 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Répondre maintenant écrasera le message que vous rédigez actuellement. Voulez-vous vraiment continuer ?", "confirmations.unfollow.confirm": "Ne plus suivre", "confirmations.unfollow.message": "Voulez-vous vraiment arrêter de suivre {name} ?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Supprimer la conversation", "conversation.mark_as_read": "Marquer comme lu", "conversation.open": "Afficher la conversation", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 2b1546a578b714bad57a06d021238144746d38d9..23c87159943a7f195a9c9dc90f875f11d7a55c1f 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Delete conversation", "conversation.mark_as_read": "Mark as read", "conversation.open": "View conversation", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 44d8b4662d5df3642629673f01f53316234e13df..35d5db98b4850279f5c37241a4cd2ab6e6b3a66f 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Responder agora sobrescribirá a mensaxe que estás a compor. Tes a certeza de que queres continuar?", "confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.message": "Desexas deixar de seguir a {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Eliminar conversa", "conversation.mark_as_read": "Marcar como lido", "conversation.open": "Ver conversa", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index d43763d8b7e81ff0c6be4db81598b8cb5c312118..f3ee5be64527a45d1c0129a527936ee887f1b845 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "להפסיק מעקב", "confirmations.unfollow.message": "להפסיק מעקב ×חרי {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Delete conversation", "conversation.mark_as_read": "Mark as read", "conversation.open": "View conversation", diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json index 88591a5bba46f71945617091d721b421ac22aa16..2a0be72ff290e5410c964a42dc40e43dcc2c6d54 100644 --- a/app/javascript/mastodon/locales/hi.json +++ b/app/javascript/mastodon/locales/hi.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "अब उतà¥à¤¤à¤° देना उस संदेश को अधिलेखित कर देगा जो आप वरà¥à¤¤à¤®à¤¾à¤¨ में बना रहे हैं। कà¥à¤¯à¤¾ आप सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ रूप से आगे बढ़ना चाहते हैं?", "confirmations.unfollow.confirm": "अनफॉलो करें", "confirmations.unfollow.message": "कà¥à¤¯à¤¾ आप वाकई {name} को अनफॉलो करना चाहते हैं?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "वारà¥à¤¤à¤¾à¤²à¤¾à¤ª हटाà¤à¤", "conversation.mark_as_read": "पà¥à¤¾ गया के रूप में चिहà¥à¤¨à¤¿à¤¤ करें", "conversation.open": "वारà¥à¤¤à¤¾à¤²à¤¾à¤ª देखें", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index b1f80e29d5abe597d2a328ce41edb0486fffb109..8f37fe542b7edcc8feae22571c38b79cac0af27b 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Delete conversation", "conversation.mark_as_read": "Mark as read", "conversation.open": "View conversation", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 9570f587ad2152f5a90375546a23c6fa7cf66174..812d68a4ee7f964763d91680e3791995424368b5 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Ha most válaszolsz, ez felülÃrja a most szerkesztés alatt álló üzenetet. Mégis ezt szeretnéd?", "confirmations.unfollow.confirm": "Követés visszavonása", "confirmations.unfollow.message": "Biztos, hogy vissza szeretnéd vonni {name} követését?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Beszélgetés törlése", "conversation.mark_as_read": "Megjelölés olvasottként", "conversation.open": "Beszélgetés megtekintése", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index 8c6cb1de2adbfec440f7ea15866724a83fec7ed0..0dda905a629265696d07953c0caac0514ffc2d6a 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Ô±ÕµÕ½ ÕºÕ¡Õ°Õ«Õ¶ ÕºÕ¡Õ¿Õ¡Õ½ÕÕ¡Õ¶Õ¥Õ¬Õ¨ Õ¯Õ¨ Õ¹Õ¥Õ²Õ¡Ö€Õ¯Õ« Õ±Õ¥Ö€Õ Õ¡ÕµÕ½ ÕºÕ¡Õ°Õ«Õ¶ Õ¡Õ¶Õ¡Ö‚Õ¡Ö€Õ¿ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©Õ«Ö‚Õ¶Õ¨Ö‰ Õ€Õ¡Õ´Õ¸Õ¦Õ¸Ö‚Õ¡ÕžÕ® Õ§Ö„Ö‰", "confirmations.unfollow.confirm": "Ô±ÕºÕ¡Õ°Õ¥Õ¿Õ¥Ö‚Õ¥Õ¬", "confirmations.unfollow.message": "ÕŽÕ½Õ¿Õ¡ÕžÕ° Õ¥Õ½, Õ¸Ö€ Õ¸Ö‚Õ¦Õ¸Ö‚Õ´ Õ¥Õ½ Õ¡ÕµÕ¬Õ¥Ö‚Õ½ Õ¹Õ°Õ¥Õ¿Õ¥Ö‚Õ¥Õ¬ {name}ÖŠÕ«Õ¶Ö‰", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Õ‹Õ¶Õ»Õ¥Õ¬ ÕÖ…Õ½Õ¡Õ¯ÖÕ¸Ö‚Õ©Õ«Ö‚Õ¶Õ¨", "conversation.mark_as_read": "Õ†Õ·Õ¥Õ¬ Õ¸Ö€ÕºÕ§Õ½ Õ¨Õ¶Õ©Õ¥Ö€ÖÕ¸Ö‚Õ¡Õ®", "conversation.open": "Ô´Õ«Õ¿Õ¥Õ¬ ÕÖ…Õ½Õ¡Õ¯ÖÕ¸Ö‚Õ©Õ«Ö‚Õ¶Õ¨", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index 0b97bf1b2e9f488fb2983b5deb31f45cf0ac4128..67b0decf84b60ee4b16f659f0581f9b3a09555ce 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Membalas sekarang akan menimpa pesan yang sedang Anda buat. Anda yakin ingin melanjutkan?", "confirmations.unfollow.confirm": "Berhenti mengikuti", "confirmations.unfollow.message": "Apakah anda ingin berhenti mengikuti {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Hapus percakapan", "conversation.mark_as_read": "Tandai sudah dibaca", "conversation.open": "Lihat percakapan", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index 30d20a7e97160d996a85699658cbd050c78defe5..6e649e30dd924b4ca012f673dc335029821314c9 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Delete conversation", "conversation.mark_as_read": "Mark as read", "conversation.open": "View conversation", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index 72d8fefaf611980101691b057a1edf2c27b45747..fdad2d3363c32ba0bcc6eda55e9900632be38483 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Ef þú svarar núna verður skrifað yfir skilaboðin sem þú ert að semja núna. Ertu viss um að þú viljir halda áfram?", "confirmations.unfollow.confirm": "Hætta að fylgja", "confirmations.unfollow.message": "Ertu viss um að þú viljir hætta að fylgjast með {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Eyða samtali", "conversation.mark_as_read": "Merkja sem lesið", "conversation.open": "Skoða samtal", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 5be797a60c66271e8cd197d26bff78891ee85cc2..c0bca57b6486d48c6fbeb74aba38d0643f19216a 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Rispondere ora sovrascriverà il messaggio che stai correntemente componendo. Sei sicuro di voler procedere?", "confirmations.unfollow.confirm": "Smetti di seguire", "confirmations.unfollow.message": "Sei sicuro di non voler più seguire {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Elimina conversazione", "conversation.mark_as_read": "Segna come letto", "conversation.open": "Visualizza conversazione", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 7c0d164a50d16c221c7e3cf80527f96e3c508c12..a98d9f33f0b37a509c02ffdd3570bf7d351eae29 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -155,6 +155,9 @@ "confirmations.unfollow.message": "本当ã«{name}ã•ã‚“ã®ãƒ•ã‚©ãƒãƒ¼ã‚’解除ã—ã¾ã™ã‹ï¼Ÿ", "confirmations.unsubscribe.confirm": "è³¼èªè§£é™¤", "confirmations.unsubscribe.message": "本当ã«{name}ã•ã‚“ã®è³¼èªã‚’解除ã—ã¾ã™ã‹ï¼Ÿ", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "会話を削除", "conversation.mark_as_read": "æ—¢èªã«ã™ã‚‹", "conversation.open": "会話を表示", diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json index 140f2d004283ec5f58f67277d16ba1d1cbbda989..565d3be40d844b0e58bd3ba8981675416e98db64 100644 --- a/app/javascript/mastodon/locales/ka.json +++ b/app/javascript/mastodon/locales/ka.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "ნუღáƒáƒ მიჰყვები", "confirmations.unfollow.message": "დáƒáƒ წმუნებული ხáƒáƒ თ, áƒáƒ¦áƒáƒ გსურთ მიჰყვებáƒáƒ“ეთ {name}-ს?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Delete conversation", "conversation.mark_as_read": "Mark as read", "conversation.open": "View conversation", diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json index fde0375045bd51d20940230d411850b64e8e1bc4..33c73197accc09573782bb2dfc7ec70680b2514c 100644 --- a/app/javascript/mastodon/locales/kab.json +++ b/app/javascript/mastodon/locales/kab.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Tiririt akka tura ad k-degger izen-agi i tettaruá¸. TebÉ£iḠad tkemmleá¸?", "confirmations.unfollow.confirm": "Ur á¸á¸afaá¹› ara", "confirmations.unfollow.message": "TetḥeqqeḠbelli tebÉ£iḠur teá¹afaá¹›eḠara {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "SfeḠadiwenni", "conversation.mark_as_read": "CreḠyettwaɣṛa", "conversation.open": "Ssken adiwenni", diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json index 5e08d43a11f6c41264326146156c68820985f3a3..d3f7cc048d475171c6abd76870cd7be1bdc0445c 100644 --- a/app/javascript/mastodon/locales/kk.json +++ b/app/javascript/mastodon/locales/kk.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Жауабыңыз жазып жатқан жазбаңыздың Ò¯Ñтіне кетеді. ЖалғаÑтырамыз ба?", "confirmations.unfollow.confirm": "Оқымау", "confirmations.unfollow.message": "\"{name} атты қолданушыға енді жазылғыңыз келмей ме?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "ПікірталаÑты өшіру", "conversation.mark_as_read": "Оқылды деп белгіле", "conversation.open": "ПікірталаÑты қарау", diff --git a/app/javascript/mastodon/locales/kn.json b/app/javascript/mastodon/locales/kn.json index 8a0014e91684ed53a6ea192efabf9ff98ea0a325..b08da6d7e5d2c9e9e257f8973d97785f3e415794 100644 --- a/app/javascript/mastodon/locales/kn.json +++ b/app/javascript/mastodon/locales/kn.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Delete conversation", "conversation.mark_as_read": "Mark as read", "conversation.open": "View conversation", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 07b570777cbd9891cd388ae24ca1cc5197f83c69..058adb89c4513ea85aaca0a00eaa79d8e71c5438 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "ë‹µê¸€ì„ ë‹¬ê¸° 위해 현재 작성 ì¤‘ì¸ ë©”ì‹œì§€ê°€ ë®ì–´ 씌워집니다. ì§„í–‰í•˜ì‹œê² ìŠµë‹ˆê¹Œ?", "confirmations.unfollow.confirm": "언팔로우", "confirmations.unfollow.message": "ì •ë§ë¡œ {name}를 ì–¸íŒ”ë¡œìš°í•˜ì‹œê² ìŠµë‹ˆê¹Œ?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "대화 ì‚ì œ", "conversation.mark_as_read": "ì½ì€ ìƒíƒœë¡œ 표시", "conversation.open": "대화 보기", diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json index b3822ff084f06a35511a4bb9fed9182d36afdbd5..ef549d4f9fb7a891e25d4f62635016b20d900dbd 100644 --- a/app/javascript/mastodon/locales/ku.json +++ b/app/javascript/mastodon/locales/ku.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Delete conversation", "conversation.mark_as_read": "Mark as read", "conversation.open": "View conversation", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index 22fabd580e8f6db89ab1f965c96252fd43fa5bef..39ebf8cbee9bf3947e44ac927585e6296a20b38a 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Delete conversation", "conversation.mark_as_read": "Mark as read", "conversation.open": "View conversation", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index 59af93c98dabfc8320d61157544df48568b6bdd5..78999665f838a296185434858823de196af684d5 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Atbildot tagad tava ziņa ko Å¡obrÄ«d raksti tiks pÄrrakstÄ«ta. Vai tieÅ¡Äm vÄ“lies turpinÄt?", "confirmations.unfollow.confirm": "Nesekot", "confirmations.unfollow.message": "Vai tieÅ¡am vairs nevÄ“lies sekot lietotÄjam {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Delete conversation", "conversation.mark_as_read": "Mark as read", "conversation.open": "View conversation", diff --git a/app/javascript/mastodon/locales/mk.json b/app/javascript/mastodon/locales/mk.json index aeaf7355c70e6ba0bacb69be7e6556fc51add350..d44328d4e90f46e8059dfbdffaf9a60d9a9f2f7a 100644 --- a/app/javascript/mastodon/locales/mk.json +++ b/app/javascript/mastodon/locales/mk.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "ОдÑледи", "confirmations.unfollow.message": "Сигурни Ñте дека ќе го отÑледите {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Избриши разговор", "conversation.mark_as_read": "Означете како прочитано", "conversation.open": "Прегледај разговор", diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json index 0c5a84204234fbba46ba3281841c07b14c955d68..c95d83de7c6b90324cf01c8a22121cb3728ef7a8 100644 --- a/app/javascript/mastodon/locales/ml.json +++ b/app/javascript/mastodon/locales/ml.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "ഇപàµà´ªàµ‹àµ¾ മറàµà´ªà´Ÿà´¿ കൊടàµà´•àµà´•àµà´¨àµà´¨à´¤àµ നിങàµà´™àµ¾ à´Žà´´àµà´¤à´¿à´•àµà´•ൊണàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ സനàµà´¦àµ‡à´¶à´¤àµà´¤à´¿à´¨àµ à´®àµà´•ളിൽ à´Žà´´àµà´¤à´¾àµ» കാരണമാകàµà´‚. തീർചàµà´šà´¯à´¾à´¯àµà´‚ à´®àµàµ»à´ªàµ‹à´Ÿàµà´Ÿàµ പോകാൻ തീരàµà´®à´¾à´¨à´¿à´šàµà´šàµà´µàµ‹?", "confirmations.unfollow.confirm": "പിനàµà´¤àµà´Ÿà´°àµà´¨àµà´¨à´¤àµ നിരàµâ€à´¤àµà´¤àµà´•", "confirmations.unfollow.message": "നിങàµà´™àµ¾ {name} യെ പിനàµà´¤àµà´Ÿà´°àµà´¨àµà´¨à´¤àµ നിർതàµà´¤àµà´µà´¾àµ» തീർചàµà´šà´¯à´¾à´¯àµà´‚ തീരàµà´®à´¾à´¨à´¿à´šàµà´šàµà´µàµ‹?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "സംà´à´¾à´·à´£à´‚ മായികàµà´•àµà´•", "conversation.mark_as_read": "വായിചàµà´šà´¤à´¾à´¯à´¿ അടയാളപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´•", "conversation.open": "സംà´à´¾à´·à´£à´‚ കാണàµà´•", diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json index e07baddffb8ffbdf2f2382eaf934db1e5f98c2f2..1157575e0548c4189036aa187e6216d5d8828bdd 100644 --- a/app/javascript/mastodon/locales/mr.json +++ b/app/javascript/mastodon/locales/mr.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Delete conversation", "conversation.mark_as_read": "Mark as read", "conversation.open": "View conversation", diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json index 5144411bb7017c2775afb681e81fa60f366ed103..03c5c6b30c5d7b529b7cba32ff91924471311833 100644 --- a/app/javascript/mastodon/locales/ms.json +++ b/app/javascript/mastodon/locales/ms.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Delete conversation", "conversation.mark_as_read": "Mark as read", "conversation.open": "View conversation", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 9825fb3a0423f83019d8846a95f32cfb21969a09..13d9653481b5324c90ea1a8444db74e67f393c19 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Door nu te reageren overschrijf je de toot die je op dit moment aan het schrijven bent. Weet je zeker dat je verder wil gaan?", "confirmations.unfollow.confirm": "Ontvolgen", "confirmations.unfollow.message": "Weet je het zeker dat je {name} wilt ontvolgen?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Gesprek verwijderen", "conversation.mark_as_read": "Als gelezen markeren", "conversation.open": "Gesprek tonen", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index b567a35330d89d34132f767b3c5475e4a2b1c589..e28164ccc14f021c5a500550efb3c6a2690e8673 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Ã… svara no vil overskriva meldinga du skriv no. Er du sikker pÃ¥ at du vil halda fram?", "confirmations.unfollow.confirm": "Slutt Ã¥ fylgja", "confirmations.unfollow.message": "Er du sikker pÃ¥ at du vil slutta Ã¥ fylgja {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Slett samtale", "conversation.mark_as_read": "Merk som lese", "conversation.open": "SjÃ¥ samtale", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index af911c2be90b959a4e93fa5faf60f267c1d185ae..b17d81ef6e24a581e8a4efdb22ef7a59fef99e08 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Ã… svare nÃ¥ vil overskrive meldingen du skriver for øyeblikket. Er du sikker pÃ¥ at du vil fortsette?", "confirmations.unfollow.confirm": "Slutt Ã¥ følge", "confirmations.unfollow.message": "Er du sikker pÃ¥ at du vil slutte Ã¥ følge {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Slett samtalen", "conversation.mark_as_read": "Marker som lest", "conversation.open": "Vis samtale", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index 6e7518d57284066eca17693e4fd20396099322d0..184307428678c67da887714c04b8a60736ae5eef 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Respondre remplaçarà lo messatge que sètz a escriure. Volètz vertadièrament contunhar ?", "confirmations.unfollow.confirm": "Quitar de sègre", "confirmations.unfollow.message": "Volètz vertadièrament quitar de sègre {name} ?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Suprimir la conversacion", "conversation.mark_as_read": "Marcar coma legida", "conversation.open": "Veire la conversacion", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index a43d7fc850d4ff80cf3ceabeafd56be183155a43..72fa7f7fdcea968916a136a692ca14a603d48e9d 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "W ten sposób utracisz wpis który obecnie tworzysz. Czy na pewno chcesz to zrobić?", "confirmations.unfollow.confirm": "PrzestaÅ„ Å›ledzić", "confirmations.unfollow.message": "Czy na pewno zamierzasz przestać Å›ledzić {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "UsuÅ„ rozmowÄ™", "conversation.mark_as_read": "Oznacz jako przeczytane", "conversation.open": "Zobacz rozmowÄ™", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 016d98b933c72a248d450ff24d59fad8c4edf7ba..44f36ca4a3551a4b87327bb5c97d60c4d4fbc704 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Responder agora sobrescreverá o toot que você está compondo. Deseja continuar?", "confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.message": "Você tem certeza de que deseja deixar de seguir {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Excluir conversa", "conversation.mark_as_read": "Marcar como lida", "conversation.open": "Ver conversa", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index becce22e04ff27cb11689ec66de2bddc8d5fe7ff..821548dc24da948d04e5ebe84231ba3a3ed1fee8 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Responder agora irá reescrever a mensagem que está a compor actualmente. Tem a certeza que quer continuar?", "confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.message": "De certeza que queres deixar de seguir {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Eliminar conversa", "conversation.mark_as_read": "Marcar como lida", "conversation.open": "Ver conversa", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index 5470db028db02bb5af467265704b7c8b4acbbb89..3fe44cb660eeb952ab470f4ebf49a12ccaab54ef 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Răspunzând la asta acum, mesajul pe care îl compui în prezent se va È™terge. EÈ™ti sigur că vrei să continui?", "confirmations.unfollow.confirm": "Nu mai urmări", "confirmations.unfollow.message": "EÈ™ti sigur că nu mai vrei să urmăreÈ™ti pe {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "ȘtergeÈ›i conversaÈ›ia", "conversation.mark_as_read": "MarcaÈ›i ca citit", "conversation.open": "VizualizaÈ›i conversaÈ›ia", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index eb181e78e3108706404485475e4d72655bc800f5..467b2f4843a8127b505c66d5648e9e40a4ccfa30 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "При ответе, текÑÑ‚ набираемого поÑта будет очищен. Продолжить?", "confirmations.unfollow.confirm": "ОтпиÑатьÑÑ", "confirmations.unfollow.message": "Ð’Ñ‹ уверены, что хотите отпиÑатьÑÑ Ð¾Ñ‚ {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Удалить беÑеду", "conversation.mark_as_read": "Пометить прочитанным", "conversation.open": "ПроÑмотр беÑеды", diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json index 30a3e33745b1fff6f40a50827ef7c86932534cc7..0b4d6cfe310ae6b9c67b1e90ff6a0ef8cd629d28 100644 --- a/app/javascript/mastodon/locales/sc.json +++ b/app/javascript/mastodon/locales/sc.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Rispondende immoe as a subraiscrìere su messà giu chi ses iscriende. Seguru chi boles sighire?", "confirmations.unfollow.confirm": "Non sigas prus", "confirmations.unfollow.message": "Seguru chi non boles sighire prus {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Cantzella arresonada", "conversation.mark_as_read": "Signala comente lèghidu", "conversation.open": "Bide arresonada", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index e2fd8477e21cb23cfa49d8e084d8f48a84688adc..c69433f41b455a04a1b3452e933be397424ae436 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "OdpovedanÃm akurát teraz prepÃÅ¡eÅ¡ správu, ktorú máš práve rozpÃsanú. Si si istý/á, že chceÅ¡ pokraÄovaÅ¥?", "confirmations.unfollow.confirm": "Nesleduj", "confirmations.unfollow.message": "Naozaj chceÅ¡ prestaÅ¥ sledovaÅ¥ {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Vymaž konverzáciu", "conversation.mark_as_read": "OznaÄ za preÄÃtané", "conversation.open": "Ukáž konverzáciu", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index 726a2a33a2db1347399490d598a3fd624f4654c8..70f81004e5b8d7d32f4e9b9b18a23bc1bc8ddd51 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Odgovarjanje bo prepisalo sporoÄilo, ki ga trenutno sestavljate. Ali ste prepriÄani, da želite nadaljevati?", "confirmations.unfollow.confirm": "Prenehaj slediti", "confirmations.unfollow.message": "Ali ste prepriÄani, da ne želite veÄ slediti {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Delete conversation", "conversation.mark_as_read": "Mark as read", "conversation.open": "View conversation", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 6f8acbc21f1c3a123eb5d61b2d7d838d0975decf..c1f6f1265c360346516c4b7382a1492282ce0675 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Po të përgjigjeni tani, mesazhi që po hartoni, do të mbishkruhet. Jeni i sigurt se doni të vazhdohet më tej?", "confirmations.unfollow.confirm": "Resht së ndjekuri", "confirmations.unfollow.message": "Jeni i sigurt se doni të mos ndiqet më {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Fshije bisedën", "conversation.mark_as_read": "Vëri shenjë si të lexuar", "conversation.open": "Shfaq bisedën", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index a0f1dff9ca81f4591f0e28d7fa42aa0754784ad7..3742981482303a6b080d282e3bc6f5638a070338 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Otprati", "confirmations.unfollow.message": "Da li ste sigurni da želite da otpratite korisnika {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Delete conversation", "conversation.mark_as_read": "Mark as read", "conversation.open": "View conversation", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index c3aef8080e69e8b3ad91293409d4b7d58f059694..01abd873659c50a6760df7597ee7aa8fa774250f 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Одговарањем ћете обриÑати поруку коју ÑаÑтављате. ЈеÑте ли Ñигурни да желите да наÑтавите?", "confirmations.unfollow.confirm": "Отпрати", "confirmations.unfollow.message": "Да ли Ñте Ñигурни да желите да отпратите кориÑника {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Обриши препиÑку", "conversation.mark_as_read": "Означи као прочитано", "conversation.open": "Прикажи препиÑку", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index 1515443adf71a97f07d47b18ca3e622e94d27152..b35b9a982311015d691330b89c580a65bf3d64a0 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Om du svarar nu kommer det att ersätta meddelandet du hÃ¥ller pÃ¥ att skapa. Är du säker pÃ¥ att du vill fortsätta?", "confirmations.unfollow.confirm": "Avfölj", "confirmations.unfollow.message": "Är du säker pÃ¥ att du vill avfölja {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Radera konversation", "conversation.mark_as_read": "Markera som läst", "conversation.open": "Se konversation", diff --git a/app/javascript/mastodon/locales/szl.json b/app/javascript/mastodon/locales/szl.json index b3822ff084f06a35511a4bb9fed9182d36afdbd5..ef549d4f9fb7a891e25d4f62635016b20d900dbd 100644 --- a/app/javascript/mastodon/locales/szl.json +++ b/app/javascript/mastodon/locales/szl.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Delete conversation", "conversation.mark_as_read": "Mark as read", "conversation.open": "View conversation", diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json index ca8e1bb2c0712bd141ce55cba62c5911811ee158..49571f45821dae30750430d3f4b09eb85c7d8dfb 100644 --- a/app/javascript/mastodon/locales/ta.json +++ b/app/javascript/mastodon/locales/ta.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "à®à®±à¯à®•னவே ஒர௠பதிவ௠எழà¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®•à¯à®•ொணà¯à®Ÿà®¿à®°à¯à®•à¯à®•ிறதà¯. இபà¯à®ªà¯Šà®´à¯à®¤à¯ பதில௠எழà¯à®¤ à®®à¯à®©à¯ˆà®¨à¯à®¤à®¾à®²à¯ அத௠அழிகà¯à®•பà¯à®ªà®Ÿà¯à®®à¯. பரவாயிலà¯à®²à¯ˆà®¯à®¾?", "confirmations.unfollow.confirm": "விலகà¯", "confirmations.unfollow.message": "{name}-à®à®ªà¯ பினà¯à®¤à¯Šà®Ÿà®°à¯à®µà®¤à¯ˆ நிசà¯à®šà®¯à®®à®¾à®• நீஙà¯à®•ள௠நிறà¯à®¤à¯à®¤ விரà¯à®®à¯à®ªà¯à®•ிறீரà¯à®•ளா?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "உரையாடலை அழி", "conversation.mark_as_read": "படிகà¯à®•படà¯à®Ÿà®¤à®¾à®•க௠கà¯à®±à®¿", "conversation.open": "உரையாடலைக௠காடà¯à®Ÿà¯", diff --git a/app/javascript/mastodon/locales/tai.json b/app/javascript/mastodon/locales/tai.json index b3822ff084f06a35511a4bb9fed9182d36afdbd5..ef549d4f9fb7a891e25d4f62635016b20d900dbd 100644 --- a/app/javascript/mastodon/locales/tai.json +++ b/app/javascript/mastodon/locales/tai.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Delete conversation", "conversation.mark_as_read": "Mark as read", "conversation.open": "View conversation", diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json index fce6f32f24a00e6d6d3d6e7c27b34e3cc1cdcd3e..5a17119611e3806449de14fd87ec6f455217c3e3 100644 --- a/app/javascript/mastodon/locales/te.json +++ b/app/javascript/mastodon/locales/te.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "ఇపà±à°ªà±à°¡à±‡ à°ªà±à°°à°¤à±à°¯à±à°¤à±à°¤à°°à°‚ ఇసà±à°¤à±‡ మీరౠపà±à°°à°¸à±à°¤à±à°¤à°‚ à°µà±à°°à°¾à°¸à±à°¤à±à°¨à±à°¨ సందేశం తిరగరాయబడà±à°¤à±à°‚ది. మీరౠఖచà±à°šà°¿à°¤à°‚à°—à°¾ కొనసాగించాలనà±à°•à±à°‚à°Ÿà±à°¨à±à°¨à°¾à°°à°¾?", "confirmations.unfollow.confirm": "à°…à°¨à±à°¸à°°à°¿à°‚చవదà±à°¦à±", "confirmations.unfollow.message": "{name}నౠమీరౠఖచà±à°šà°¿à°¤à°‚à°—à°¾ à°…à°¨à±à°¸à°°à°¿à°‚చవదà±à°¦à°¨à±à°•à±à°‚à°Ÿà±à°¨à±à°¨à°¾à°°à°¾?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Delete conversation", "conversation.mark_as_read": "Mark as read", "conversation.open": "View conversation", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index b29a9eccdafccaf4f5ae956eb998be6b359b2800..182b91a94cf35b369f5477f17b951293002ef072 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "à¸à¸²à¸£à¸•à¸à¸šà¸à¸¥à¸±à¸šà¸•à¸à¸™à¸™à¸µà¹‰à¸ˆà¸°à¹€à¸‚ียนทับข้à¸à¸„วามที่คุณà¸à¸³à¸¥à¸±à¸‡à¹€à¸‚ียน คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸«à¸£à¸·à¸à¹„ม่ว่าต้à¸à¸‡à¸à¸²à¸£à¸”ำเนินà¸à¸²à¸£à¸•่à¸?", "confirmations.unfollow.confirm": "เลิà¸à¸•ิดตาม", "confirmations.unfollow.message": "คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸«à¸£à¸·à¸à¹„ม่ว่าต้à¸à¸‡à¸à¸²à¸£à¹€à¸¥à¸´à¸à¸•ิดตาม {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "ลบà¸à¸²à¸£à¸ªà¸™à¸—นา", "conversation.mark_as_read": "ทำเครื่à¸à¸‡à¸«à¸¡à¸²à¸¢à¸§à¹ˆà¸²à¸à¹ˆà¸²à¸™à¹à¸¥à¹‰à¸§", "conversation.open": "ดูà¸à¸²à¸£à¸ªà¸™à¸—นา", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 5c7d4b382ae7743d369bdef9cc1c9d5c57d69cd7..205d383800ace0afb714a1b1d71d8e9561a4b501 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Åžimdi yanıtlarken o an oluÅŸturduÄŸunuz mesajın üzerine yazılır. Devam etmek istediÄŸinize emin misiniz?", "confirmations.unfollow.confirm": "Takibi kaldır", "confirmations.unfollow.message": "{name}'yi takipten çıkarmak istediÄŸinizden emin misiniz?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "KonuÅŸmayı sil", "conversation.mark_as_read": "OkunmuÅŸ olarak iÅŸaretle", "conversation.open": "KonuÅŸmayı görüntüle", diff --git a/app/javascript/mastodon/locales/ug.json b/app/javascript/mastodon/locales/ug.json index b3822ff084f06a35511a4bb9fed9182d36afdbd5..ef549d4f9fb7a891e25d4f62635016b20d900dbd 100644 --- a/app/javascript/mastodon/locales/ug.json +++ b/app/javascript/mastodon/locales/ug.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Delete conversation", "conversation.mark_as_read": "Mark as read", "conversation.open": "View conversation", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 244f04a9e87f831c181e327bb3213a3559333d00..e19d906bab75beb13e85950371c04882b3d4fdce 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Поточна відповідь перезапише повідомленнÑ, Ñке ви зараз пишете. Ви впевнені, що хочете продовжити?", "confirmations.unfollow.confirm": "ВідпиÑатиÑÑ", "confirmations.unfollow.message": "Ви впевнені, що хочете відпиÑатиÑÑ Ð²Ñ–Ð´ {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Видалити цю беÑіду", "conversation.mark_as_read": "Позначити Ñк прочитане", "conversation.open": "ПереглÑнути беÑіду", diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json index ada675496afb52f3cc35237edc1eb996870b6f89..2b5547dfc8d083ebb01ee06fa1be9d808db1bee0 100644 --- a/app/javascript/mastodon/locales/ur.json +++ b/app/javascript/mastodon/locales/ur.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Delete conversation", "conversation.mark_as_read": "Mark as read", "conversation.open": "View conversation", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index aa0c0d5ffbbe464ae05cbf6fdc46f18489694ae5..83c8ed9c85117cf82cb006a8b70f0a3a70d56014 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "Ná»™i dung bạn Ä‘ang soạn thảo sẽ bị ghi đè, bạn có tiếp tục?", "confirmations.unfollow.confirm": "Ngưng theo dõi", "confirmations.unfollow.message": "Bạn có chắc chắn muốn ngưng theo dõi {name}?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "Xóa tin nhắn nà y", "conversation.mark_as_read": "Äánh dấu là đã Ä‘á»c", "conversation.open": "Xem toà n bá»™ tin nhắn", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 778c8c04e5b63b864fe30e50c0a866d46f0d1f02..b3d8fbfe18069ceb882416514888f69e49c8fd3c 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "å›žå¤æ¤æ¶ˆæ¯å°†ä¼šè¦†ç›–当剿£åœ¨ç¼–辑的信æ¯ã€‚确定继ç»å—?", "confirmations.unfollow.confirm": "å–æ¶ˆå…³æ³¨", "confirmations.unfollow.message": "ä½ ç¡®å®šè¦å–消关注 {name} å—?", + "content_type.change": "设置富文本类型", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "纯文本", "conversation.delete": "åˆ é™¤å¯¹è¯", "conversation.mark_as_read": "æ ‡è®°ä¸ºå·²è¯»", "conversation.open": "查看对è¯", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index a332db0114a969984db8109f3f7a028b859899b3..b65e6d9748c6058db83da296e051cdb32e92f371 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "ç¾åœ¨å›žè¦†å°‡è“‹æŽ‰æ‚¨ç›®å‰æ£åœ¨æ’°å¯«çš„訊æ¯ã€‚是å¦ä»è¦å›žè¦†ï¼Ÿ", "confirmations.unfollow.confirm": "å–æ¶ˆé—œæ³¨", "confirmations.unfollow.message": "真的ä¸è¦ç¹¼çºŒé—œæ³¨ {name} 了嗎?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "刪除å°è©±", "conversation.mark_as_read": "標為已讀", "conversation.open": "檢視å°è©±", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index da4cc777dab6818d1dde9eaa5fda1e4928e45494..7bde874a521c75317644f1a00af9c4141f8b7d00 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -123,6 +123,9 @@ "confirmations.reply.message": "ç¾åœ¨å›žè¦†å°‡è“‹æŽ‰æ‚¨ç›®å‰æ£åœ¨æ’°å¯«çš„訊æ¯ã€‚是å¦ä»è¦å›žè¦†ï¼Ÿ", "confirmations.unfollow.confirm": "å–æ¶ˆé—œæ³¨", "confirmations.unfollow.message": "真的è¦å–消關注 {name} 嗎?", + "content_type.change": "Adjust status content type", + "content_type.markdown.short": "Markdown", + "content_type.plain.short": "Plain Text", "conversation.delete": "刪除å°è©±", "conversation.mark_as_read": "標為已讀", "conversation.open": "檢視å°è©±", diff --git a/app/javascript/mastodon/reducers/compose.js b/app/javascript/mastodon/reducers/compose.js index ff3d38c3f045b5a954bd09933d66e3be9e76ad44..d7985d241d3897d8ede93f1cfac6f8d47d8a6db5 100644 --- a/app/javascript/mastodon/reducers/compose.js +++ b/app/javascript/mastodon/reducers/compose.js @@ -31,6 +31,7 @@ import { COMPOSE_VISIBILITY_CHANGE, COMPOSE_CIRCLE_CHANGE, COMPOSE_FEDERATION_CHANGE, + COMPOSE_CONTENT_TYPE_CHANGE, COMPOSE_COMPOSING_CHANGE, COMPOSE_EMOJI_INSERT, COMPOSE_UPLOAD_CHANGE_REQUEST, @@ -60,6 +61,7 @@ const initialState = ImmutableMap({ privacy: null, circle_id: null, federation: null, + content_type: null, text: '', focusDate: null, caretPosition: null, @@ -82,6 +84,7 @@ const initialState = ImmutableMap({ suggestions: ImmutableList(), default_privacy: 'public', default_federation: true, + default_content_type: 'text/plain', default_sensitive: false, resetFileKey: Math.floor((Math.random() * 0x10000)), idempotencyKey: null, @@ -131,6 +134,7 @@ const clearAll = state => { map.set('privacy', state.get('default_privacy')); map.set('circle_id', null); map.set('federation', state.get('default_federation')); + map.set('content_type', state.get('default_content_type')); map.set('sensitive', false); map.update('media_attachments', list => list.clear()); map.set('poll', null); @@ -322,6 +326,10 @@ export default function compose(state = initialState, action) { return state .set('federation', action.value) .set('idempotencyKey', uuid()); + case COMPOSE_CONTENT_TYPE_CHANGE: + return state + .set('content_type', action.value) + .set('idempotencyKey', uuid()); case COMPOSE_VISIBILITY_CHANGE: return state.withMutations(map => { map.set('text', statusToTextMentions(state.get('text'), action.value, state.get('reply_status'))); @@ -351,6 +359,7 @@ export default function compose(state = initialState, action) { map.set('privacy', privacy); map.set('circle_id', null); map.set('federation', !action.status.get('local_only')); + map.set('content_type', action.status.get('content_type')); // TODO MDpref map.set('focusDate', new Date()); map.set('caretPosition', null); map.set('preselectDate', new Date()); @@ -398,6 +407,7 @@ export default function compose(state = initialState, action) { map.set('circle_id', null); map.set('poll', null); map.set('federation', state.get('default_federation')); + map.set('content_type', state.get('default_content_type')); map.set('idempotencyKey', uuid()); }); case COMPOSE_SUBMIT_REQUEST: @@ -490,6 +500,7 @@ export default function compose(state = initialState, action) { map.set('privacy', action.status.get('visibility')); map.set('circle_id', action.status.get('circle_id')); map.set('federation', !action.status.get('local_only')); + map.set('content_type', action.status.get('content_type')); map.set('media_attachments', action.status.get('media_attachments')); map.set('focusDate', new Date()); map.set('caretPosition', null); diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb index d115f0ed6637d6e77ea21c8bc7a534dd94af3f60..71ad904cf6247f2028c329db8d0ec9e3646f2ebd 100644 --- a/app/lib/formatter.rb +++ b/app/lib/formatter.rb @@ -31,18 +31,40 @@ class Formatter return html.html_safe # rubocop:disable Rails/OutputSafety end - linkable_accounts = status.active_mentions.map(&:account) - linkable_accounts << status.account + formatter_options = { + input: :mastodon, + entity_output: :as_input, + linkable_accounts: status.active_mentions.map(&:account) + [status.account], + custom_emojis: options[:custom_emojify] ? status.emojis : nil, + autoplay: options[:autoplay], + syntax_highlighter: 'rouge', + syntax_highlighter_opts: { + guess_lang: true, + # line_numbers: true, # useless! + # inline_theme: 'base16.light' # do not use this! + } + } + + case status.content_type + when 'text/markdown' + raw_content = "RT @#{prepend_reblog} #{raw_content}" if prepend_reblog + html = Kramdown::Document.new(raw_content, formatter_options).to_mastodon + html = html.delete("\n").html_safe # rubocop:disable Rails/OutputSafety + #when 'text/plain' + else + linkable_accounts = status.active_mentions.map(&:account) + linkable_accounts << status.account - html = raw_content - html = "RT @#{prepend_reblog} #{html}" if prepend_reblog - html = encode_and_link_urls(html, linkable_accounts) - html = encode_custom_emojis(html, status.emojis, options[:autoplay]) if options[:custom_emojify] - html = simple_format(html, {}, sanitize: false) - html = quotify(html, status) if status.quote? && !options[:escape_quotify] - html = html.delete("\n") + html = raw_content + html = "RT @#{prepend_reblog} #{html}" if prepend_reblog + html = encode_and_link_urls(html, linkable_accounts) + html = encode_custom_emojis(html, status.emojis, options[:autoplay]) if options[:custom_emojify] + html = simple_format(html, {}, sanitize: false) + html = quotify(html, status) if status.quote? && !options[:escape_quotify] + html = html.delete("\n") - html.html_safe # rubocop:disable Rails/OutputSafety + html.html_safe # rubocop:disable Rails/OutputSafety + end end def format_in_quote(status, **options) diff --git a/app/lib/user_settings_decorator.rb b/app/lib/user_settings_decorator.rb index 6824b8b0cb5d96889ae54311f9763daeb6837437..de5c639feccf6dd65fe4d111776a0a489a30bf5d 100644 --- a/app/lib/user_settings_decorator.rb +++ b/app/lib/user_settings_decorator.rb @@ -21,6 +21,7 @@ class UserSettingsDecorator user.settings['default_sensitive'] = default_sensitive_preference if change?('setting_default_sensitive') user.settings['default_language'] = default_language_preference if change?('setting_default_language') user.settings['default_federation'] = default_federation_preference if change?('setting_default_federation') + user.settings['default_content_type']= default_content_type_preference if change?('setting_default_content_type') user.settings['unfollow_modal'] = unfollow_modal_preference if change?('setting_unfollow_modal') user.settings['unsubscribe_modal'] = unsubscribe_modal_preference if change?('setting_unsubscribe_modal') user.settings['boost_modal'] = boost_modal_preference if change?('setting_boost_modal') @@ -70,6 +71,10 @@ class UserSettingsDecorator def default_federation_preference boolean_cast_setting 'setting_default_federation' end + + def default_content_type_preference + settings['setting_default_content_type'] + end def unfollow_modal_preference boolean_cast_setting 'setting_unfollow_modal' diff --git a/app/models/status.rb b/app/models/status.rb index f8f3eebf86d7bca287f07bb84e08f36d252a3619..2e97f3584eb9b39b53bd3f802e9f56d764639cd1 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -27,6 +27,7 @@ # expires_at :datetime # expires_action :integer default("delete"), not null # local_only :boolean +# content_type :string # class Status < ApplicationRecord @@ -93,6 +94,7 @@ class Status < ApplicationRecord validates :visibility, exclusion: { in: %w(direct limited) }, if: :reblog? validates :quote_visibility, inclusion: { in: %w(public unlisted) }, if: :quote? validates_with ExpiresValidator, on: :create, if: :local? + validates :content_type, inclusion: { in: %w(text/plain text/markdown) }, allow_nil: true accepts_nested_attributes_for :poll @@ -353,6 +355,10 @@ class Status < ApplicationRecord visibilities.keys - %w(direct limited) end + def selectable_content_types + %w(text/plain text/markdown) + end + def favourites_map(status_ids, account_id) Favourite.select('status_id').where(status_id: status_ids).where(account_id: account_id).each_with_object({}) { |f, h| h[f.status_id] = true } end diff --git a/app/models/user.rb b/app/models/user.rb index 47c23f458eeddd9ef9e68545e1db151dadc74b5b..83a617f3c82d629e0fe726f9b6697df8a139b91d 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -116,7 +116,7 @@ class User < ApplicationRecord :reduce_motion, :system_font_ui, :noindex, :theme, :display_media, :hide_network, :expand_spoilers, :default_language, :aggregate_reblogs, :show_application, :advanced_layout, :use_blurhash, :use_pending_items, :trends, :crop_images, :default_federation, - :disable_swiping, + :disable_swiping, :default_content_type, :show_follow_button_on_timeline, :show_subscribe_button_on_timeline, :show_target, :show_follow_button_on_timeline, :show_subscribe_button_on_timeline, :show_followed_by, :show_target, :follow_button_to_list_adder, :show_navigation_panel, :show_quote_button, :show_bookmark_button, diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb index 4751a8bd9bbfd077446fa0af00c491edb6cfe90a..b6390c23234a958af82b8e04310b972aa3c89a15 100644 --- a/app/serializers/initial_state_serializer.rb +++ b/app/serializers/initial_state_serializer.rb @@ -72,6 +72,7 @@ class InitialStateSerializer < ActiveModel::Serializer store[:default_privacy] = object.visibility || object.current_account.user.setting_default_privacy store[:default_sensitive] = object.current_account.user.setting_default_sensitive store[:default_federation] = object.current_account.user.setting_default_federation + store[:default_content_type] = object.current_account.user.setting_default_content_type end store[:text] = object.text if object.text diff --git a/app/serializers/rest/credential_account_serializer.rb b/app/serializers/rest/credential_account_serializer.rb index fa8f900cc594170dc646a0fab0fee5643a6082b3..c91fe0adbd009d01688dc22c5d50c4957f3be7f2 100644 --- a/app/serializers/rest/credential_account_serializer.rb +++ b/app/serializers/rest/credential_account_serializer.rb @@ -11,6 +11,7 @@ class REST::CredentialAccountSerializer < REST::AccountSerializer sensitive: user.setting_default_sensitive, language: user.setting_default_language, federation: user.setting_default_federation, + content_type: user.setting_default_content_type, note: object.note, fields: object.fields.map(&:to_h), follow_requests_count: FollowRequest.where(target_account: object).limit(40).count, diff --git a/app/serializers/rest/status_serializer.rb b/app/serializers/rest/status_serializer.rb index e4c4991b4afe6d99138cc7ce5b5a629e2ea7efef..cc46277b87d27438c248c9e74598eb3aa4887b76 100644 --- a/app/serializers/rest/status_serializer.rb +++ b/app/serializers/rest/status_serializer.rb @@ -4,7 +4,7 @@ class REST::StatusSerializer < ActiveModel::Serializer attributes :id, :created_at, :in_reply_to_id, :in_reply_to_account_id, :sensitive, :spoiler_text, :visibility, :language, :uri, :url, :replies_count, :reblogs_count, - :favourites_count, :limited, :local_only + :favourites_count, :limited, :local_only, :content_type attribute :favourited, if: :current_user? attribute :reblogged, if: :current_user? diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index d3fc7c30736f98c125fcec8e458cf641f6cb36f2..4e94f9c15c3341657edf5616a04a36ae1f2a8336 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -128,6 +128,11 @@ class PostStatusService < BaseService local_only end + def content_type_option(content_type, content_type_setting) + return content_type_setting if content_type.nil? + content_type + end + def postprocess_status! LinkCrawlWorker.perform_async(@status.id) unless @status.spoiler_text? DistributionWorker.perform_async(@status.id) @@ -205,6 +210,7 @@ class PostStatusService < BaseService expires_at: @expires_at, expires_action: @expires_action, local_only: local_only_option(@options[:local_only], @in_reply_to, @account.user&.setting_default_federation), + content_type: content_type_option(@options[:content_type], @account.user&.setting_default_content_type), }.compact end diff --git a/app/views/settings/preferences/other/show.html.haml b/app/views/settings/preferences/other/show.html.haml index 6b9190b03328b635b35303d54e65e8eff021627e..91baca1b4068e0006e2129693240e475ea93eebc 100644 --- a/app/views/settings/preferences/other/show.html.haml +++ b/app/views/settings/preferences/other/show.html.haml @@ -25,6 +25,10 @@ .fields-group.fields-row__column.fields-row__column-6 = f.input :setting_default_language, collection: [nil] + filterable_languages.sort, wrapper: :with_label, label_method: lambda { |locale| locale.nil? ? I18n.t('statuses.language_detection') : human_locale(locale) }, required: false, include_blank: false, hint: false + .fields-row + .fields-group.fields-row__column.fields-row__column-6 + = f.input :setting_default_content_type, collection: Status.selectable_content_types, wrapper: :with_label, include_blank: false, label_method: lambda { |content_type| I18n.t("statuses.content_types.#{content_type}") }, required: false, hint: false + .fields-group = f.input :setting_default_sensitive, as: :boolean, wrapper: :with_label diff --git a/config/application.rb b/config/application.rb index ad6cf82d70f9710df3196214a06396d4a736dd5b..dbc02d1d7fde1cceba03ee00e685edded4bcf8a9 100644 --- a/config/application.rb +++ b/config/application.rb @@ -22,6 +22,8 @@ require_relative '../lib/mastodon/version' require_relative '../lib/devise/two_factor_ldap_authenticatable' require_relative '../lib/devise/two_factor_pam_authenticatable' require_relative '../lib/chewy/strategy/custom_sidekiq' +require_relative '../lib/kramdown/parser/mastodon' +require_relative '../lib/kramdown/converter/mastodon' Dotenv::Railtie.load diff --git a/config/locales/en.yml b/config/locales/en.yml index b480bf33a1b099ff79aa10e1644441e1fd45057f..b98283c1944e2a3fa6fb70ead648ddf0eb943dda 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1271,6 +1271,9 @@ en: one: "%{count} video" other: "%{count} videos" boosted_from_html: Boosted from %{acct_link} + content_types: + text/markdown: Markdown + text/plain: Plain text content_warning: 'Content warning: %{warning}' disallowed_hashtags: one: 'contained a disallowed hashtag: %{tags}' diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 70daf572a02206759fa011fa4b8ad77f6184a935..4bff199bc5ad4b9550cdc20a671e95707613943a 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -163,6 +163,7 @@ en: setting_auto_play_gif: Auto-play animated GIFs setting_boost_modal: Show confirmation dialog before boosting setting_crop_images: Crop images in non-expanded toots to 16x9 + setting_default_content_type: Default rich content type of toots setting_default_federation: Allow my toots to reach other instances by default setting_default_language: Posting language setting_default_privacy: Posting privacy diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index 6bb1053a8e11647bf93d9cf0cc27403f4ddd4250..5d190760666393ca63fc789d3a6779c1af76d5fe 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -131,6 +131,7 @@ zh-CN: setting_auto_play_gif: è‡ªåŠ¨æ’æ”¾ GIF 动画 setting_boost_modal: 在转嘟å‰è¯¢é—®æˆ‘ setting_crop_images: 把未展开嘟文ä¸çš„图片è£å‰ªåˆ° 16x9 + setting_default_content_type: é»˜è®¤çš„å˜Ÿæ–‡å¯Œæ–‡æœ¬æ ¼å¼ setting_default_language: å‘布è¯è¨€ setting_default_privacy: 嘟文默认å¯è§èŒƒå›´ setting_default_sensitive: 总是将我å‘é€çš„åª’ä½“æ–‡ä»¶æ ‡è®°ä¸ºæ•æ„Ÿå†…容 diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index a67cd01225461d7215b8eb4bf7b5ea2aa0068373..6172adcd2757f486adbabfa7bb40ace895079ccb 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -1114,6 +1114,9 @@ zh-CN: video: other: "%{count} 段视频" boosted_from_html: 转嘟自 %{acct_link} + content_types: + text/markdown: Markdown + text/plain: 纯文本 content_warning: 内容è¦å‘Šï¼š%{warning} disallowed_hashtags: other: 包å«äº†è¿™äº›ç¦æ¢çš„è¯é¢˜æ ‡ç¾ï¼š%{tags} diff --git a/config/settings.yml b/config/settings.yml index 57e3d84dacd931ad17d562c9052e9aad476f462b..a044caf06723b4b8053d32deab7a22d3f6060152 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -18,6 +18,7 @@ defaults: &defaults show_staff_badge: true default_sensitive: false default_federation: true + default_content_type: 'text/plain' hide_network: false unfollow_modal: false unsubscribe_modal: false diff --git a/db/migrate/20200926190114_add_content_type_to_statuses.rb b/db/migrate/20200926190114_add_content_type_to_statuses.rb new file mode 100644 index 0000000000000000000000000000000000000000..efbe2caa718784b0aa6d96900ae7b8384acb386c --- /dev/null +++ b/db/migrate/20200926190114_add_content_type_to_statuses.rb @@ -0,0 +1,5 @@ +class AddContentTypeToStatuses < ActiveRecord::Migration[5.2] + def change + add_column :statuses, :content_type, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 0fdc8cbfad2829d19916a202da3f77129d533f2c..6dbad1864e4ada22935d69622cf384acaae9f7a6 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_10_08_220312) do +ActiveRecord::Schema.define(version: 2020_10_08_220313) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -930,6 +930,7 @@ ActiveRecord::Schema.define(version: 2020_10_08_220312) do t.datetime "expires_at" t.integer "expires_action", default: 0, null: false t.boolean "local_only" + t.string "content_type" t.index ["account_id", "id", "visibility", "updated_at"], name: "index_statuses_20190820", order: { id: :desc }, where: "(deleted_at IS NULL)" t.index ["id", "account_id"], name: "index_statuses_local_20190824", order: { id: :desc }, where: "((local OR (uri IS NULL)) AND (deleted_at IS NULL) AND (visibility = 0) AND (reblog_of_id IS NULL) AND ((NOT reply) OR (in_reply_to_account_id = account_id)))" t.index ["id", "account_id"], name: "index_statuses_public_20200119", order: { id: :desc }, where: "((deleted_at IS NULL) AND (visibility = 0) AND (reblog_of_id IS NULL) AND ((NOT reply) OR (in_reply_to_account_id = account_id)))" diff --git a/lib/kramdown/converter/mastodon.rb b/lib/kramdown/converter/mastodon.rb new file mode 100644 index 0000000000000000000000000000000000000000..97aa67cd1cadfefef53e0baa359128351a94c95d --- /dev/null +++ b/lib/kramdown/converter/mastodon.rb @@ -0,0 +1,75 @@ +# frozen_string_literal: true + +require 'kramdown/converter' +require 'kramdown/utils' + +module Kramdown + module Converter + class Mastodon < Html + def convert_text(element, _indent) + html = Formatter.instance.send(:encode_and_link_urls, element.value, @options[:linkable_accounts]) + + if @options[:custom_emojis] + Formatter.instance.send(:encode_custom_emojis, html, @options[:custom_emojis], @options[:autoplay]) + else + html + end + end + + def host_to_url(str) + "http#{Rails.configuration.x.use_https ? 's' : ''}://#{str}" unless str.blank? + end + + def convert_img(el, _opts) + base_host = Rails.configuration.x.web_domain + + assets_host = Rails.configuration.action_controller.asset_host + assets_host ||= host_to_url(base_host) + + media_host = host_to_url(ENV['S3_ALIAS_HOST']) + media_host ||= host_to_url(ENV['S3_CLOUDFRONT_HOST']) + media_host ||= host_to_url(ENV['S3_HOSTNAME']) if ENV['S3_ENABLED'] == 'true' + media_host ||= assets_host + + src = el.attr['src'] + unless src.start_with?( media_host, ENV['IMAGE_PROXY_HOST'] || 'https://images.weserv.nl/') + src = "#{ENV['IMAGE_PROXY_PATH'] || 'https://images.weserv.nl/?n=-1&il&url='}#{src}" + end + el.attr['src'] = src + "<img#{html_attributes(el.attr)} />" + end + + def convert_codeblock(el, indent) + attr = el.attr.dup + lang = extract_code_language!(attr) + hl_opts = {} + highlighted_code = highlight_code(el.value, el.options[:lang] || lang, :block, hl_opts) + highlighted_code = highlighted_code == nil ? highlighted_code : highlighted_code.gsub(/[\r\n]/, '<br>') + + if highlighted_code + add_syntax_highlighter_to_class_attr(attr, lang || hl_opts[:default_lang]) + "#{' ' * indent}<div#{html_attributes(attr)}>#{highlighted_code}#{' ' * indent}</div>\n" + else + result = escape_html(el.value) + result.chomp! + if el.attr['class'].to_s =~ /\bshow-whitespaces\b/ + result.gsub!(/(?:(^[ \t]+)|([ \t]+$)|([ \t]+))/) do |m| + suffix = ($1 ? '-l' : ($2 ? '-r' : '')) + m.scan(/./).map do |c| + case c + when "\t" then "<span class=\"ws-tab#{suffix}\">\t</span>" + when " " then "<span class=\"ws-space#{suffix}\">⋅</span>" + end + end.join('') + end + end + code_attr = {} + code_attr['class'] = "language-#{lang}" if lang + "#{' ' * indent}<pre#{html_attributes(attr)}>" \ + "<code#{html_attributes(code_attr)}>#{result}\n</code></pre>\n" + end + end + + end + end +end \ No newline at end of file diff --git a/lib/kramdown/parser/mastodon.rb b/lib/kramdown/parser/mastodon.rb new file mode 100644 index 0000000000000000000000000000000000000000..1b35a1d6e839b9571ce94d7d3d430daccf91f333 --- /dev/null +++ b/lib/kramdown/parser/mastodon.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true + +require 'kramdown/parser' + +module Kramdown + module Parser + class Mastodon < GFM + def initialize(source, options) + super + + # @block_parsers = %i(blank_line paragraph) + # @span_parsers = %i(no_intra_emphasis codespan immediate_line_break escaped_chars) + end + + def parse_immediate_line_break + @tree.children << Element.new(:br, nil, nil, location: @src.current_line_number) + @src.pos += @src.matched_size + end + + define_parser(:immediate_line_break, /\n/, '\n') + + def parse_no_intra_emphasis + start_line_number = @src.current_line_number + saved_pos = @src.save_pos + + result = @src.scan(EMPHASIS_START) + element = (result.length == 2 ? :strong : :em) + type = result[0..0] + + if (@src.pre_match =~ /[[:alpha:]-]\z/) || @src.check(/\s/) || @tree.type == element || @stack.any? { |el, _| el.type == element } + add_text(result) + return + end + + sub_parse = lambda do |delim, elem| + el = Element.new(elem, nil, nil, location: start_line_number) + stop_re = /#{Regexp.escape(delim)}/ + + found = parse_spans(el, stop_re) do + (@src.pre_match[-1, 1] !~ /\s/) && + (elem != :em || !@src.match?(/#{Regexp.escape(delim * 2)}(?!#{Regexp.escape(delim)})/)) && + (type != '_' || !@src.match?(/#{Regexp.escape(delim)}[[:alnum:]]/)) && !el.children.empty? + end + + [found, el, stop_re] + end + + found, el, stop_re = sub_parse.call(result, element) + + if !found && element == :strong && @tree.type != :em + @src.revert_pos(saved_pos) + @src.pos += 1 + found, el, stop_re = sub_parse.call(type, :em) + end + + if found + @src.scan(stop_re) + @tree.children << el + else + @src.revert_pos(saved_pos) + @src.pos += result.length + add_text(result) + end + end + + define_parser(:no_intra_emphasis, EMPHASIS_START, '\*|_') + end + end +end \ No newline at end of file