commit
fa75324059
|
@ -66,7 +66,7 @@ export default class StatusPrepend extends React.PureComponent {
|
||||||
return (
|
return (
|
||||||
<FormattedMessage
|
<FormattedMessage
|
||||||
id='notification.poll'
|
id='notification.poll'
|
||||||
defaultMessage='Your poll has ended'
|
defaultMessage='A poll you have voted in has ended'
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,6 +90,17 @@ export default class ColumnSettings extends React.PureComponent {
|
||||||
<SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'reblog']} onChange={onChange} label={soundStr} />
|
<SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'reblog']} onChange={onChange} label={soundStr} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div role='group' aria-labelledby='notifications-poll'>
|
||||||
|
<span id='notifications-poll' className='column-settings__section'><FormattedMessage id='notifications.column_settings.poll' defaultMessage='Poll results:' /></span>
|
||||||
|
|
||||||
|
<div className='column-settings__row'>
|
||||||
|
<SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'poll']} onChange={onChange} label={alertStr} />
|
||||||
|
{showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'poll']} meta={pushMeta} onChange={this.onPushChange} label={pushStr} />}
|
||||||
|
<SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'poll']} onChange={onChange} label={showStr} />
|
||||||
|
<SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'poll']} onChange={onChange} label={soundStr} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ const tooltips = defineMessages({
|
||||||
mentions: { id: 'notifications.filter.mentions', defaultMessage: 'Mentions' },
|
mentions: { id: 'notifications.filter.mentions', defaultMessage: 'Mentions' },
|
||||||
favourites: { id: 'notifications.filter.favourites', defaultMessage: 'Favourites' },
|
favourites: { id: 'notifications.filter.favourites', defaultMessage: 'Favourites' },
|
||||||
boosts: { id: 'notifications.filter.boosts', defaultMessage: 'Boosts' },
|
boosts: { id: 'notifications.filter.boosts', defaultMessage: 'Boosts' },
|
||||||
|
polls: { id: 'notifications.filter.polls', defaultMessage: 'Poll results' },
|
||||||
follows: { id: 'notifications.filter.follows', defaultMessage: 'Follows' },
|
follows: { id: 'notifications.filter.follows', defaultMessage: 'Follows' },
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -78,6 +79,13 @@ class FilterBar extends React.PureComponent {
|
||||||
>
|
>
|
||||||
<i className='fa fa-fw fa-retweet' />
|
<i className='fa fa-fw fa-retweet' />
|
||||||
</button>
|
</button>
|
||||||
|
<button
|
||||||
|
className={selectedFilter === 'poll' ? 'active' : ''}
|
||||||
|
onClick={this.onClick('poll')}
|
||||||
|
title={intl.formatMessage(tooltips.polls)}
|
||||||
|
>
|
||||||
|
<i className='fa fa-fw fa-tasks' />
|
||||||
|
</button>
|
||||||
<button
|
<button
|
||||||
className={selectedFilter === 'follow' ? 'active' : ''}
|
className={selectedFilter === 'follow' ? 'active' : ''}
|
||||||
onClick={this.onClick('follow')}
|
onClick={this.onClick('follow')}
|
||||||
|
|
|
@ -9,6 +9,7 @@ const initialState = Immutable.Map({
|
||||||
favourite: false,
|
favourite: false,
|
||||||
reblog: false,
|
reblog: false,
|
||||||
mention: false,
|
mention: false,
|
||||||
|
poll: false,
|
||||||
}),
|
}),
|
||||||
isSubscribed: false,
|
isSubscribed: false,
|
||||||
browserSupport: false,
|
browserSupport: false,
|
||||||
|
|
|
@ -89,6 +89,17 @@ export default class ColumnSettings extends React.PureComponent {
|
||||||
<SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'reblog']} onChange={onChange} label={soundStr} />
|
<SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'reblog']} onChange={onChange} label={soundStr} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div role='group' aria-labelledby='notifications-poll'>
|
||||||
|
<span id='notifications-poll' className='column-settings__section'><FormattedMessage id='notifications.column_settings.poll' defaultMessage='Poll results:' /></span>
|
||||||
|
|
||||||
|
<div className='column-settings__row'>
|
||||||
|
<SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'poll']} onChange={onChange} label={alertStr} />
|
||||||
|
{showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'poll']} onChange={this.onPushChange} label={pushStr} />}
|
||||||
|
<SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'poll']} onChange={onChange} label={showStr} />
|
||||||
|
<SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'poll']} onChange={onChange} label={soundStr} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@ const tooltips = defineMessages({
|
||||||
mentions: { id: 'notifications.filter.mentions', defaultMessage: 'Mentions' },
|
mentions: { id: 'notifications.filter.mentions', defaultMessage: 'Mentions' },
|
||||||
favourites: { id: 'notifications.filter.favourites', defaultMessage: 'Favourites' },
|
favourites: { id: 'notifications.filter.favourites', defaultMessage: 'Favourites' },
|
||||||
boosts: { id: 'notifications.filter.boosts', defaultMessage: 'Boosts' },
|
boosts: { id: 'notifications.filter.boosts', defaultMessage: 'Boosts' },
|
||||||
|
polls: { id: 'notifications.filter.polls', defaultMessage: 'Poll results' },
|
||||||
follows: { id: 'notifications.filter.follows', defaultMessage: 'Follows' },
|
follows: { id: 'notifications.filter.follows', defaultMessage: 'Follows' },
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -79,6 +80,13 @@ class FilterBar extends React.PureComponent {
|
||||||
>
|
>
|
||||||
<Icon id='retweet' fixedWidth />
|
<Icon id='retweet' fixedWidth />
|
||||||
</button>
|
</button>
|
||||||
|
<button
|
||||||
|
className={selectedFilter === 'poll' ? 'active' : ''}
|
||||||
|
onClick={this.onClick('poll')}
|
||||||
|
title={intl.formatMessage(tooltips.polls)}
|
||||||
|
>
|
||||||
|
<Icon id='tasks' fixedWidth />
|
||||||
|
</button>
|
||||||
<button
|
<button
|
||||||
className={selectedFilter === 'follow' ? 'active' : ''}
|
className={selectedFilter === 'follow' ? 'active' : ''}
|
||||||
onClick={this.onClick('follow')}
|
onClick={this.onClick('follow')}
|
||||||
|
|
|
@ -210,14 +210,14 @@ class Notification extends ImmutablePureComponent {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<HotKeys handlers={this.getHandlers()}>
|
<HotKeys handlers={this.getHandlers()}>
|
||||||
<div className='notification notification-poll focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.poll', defaultMessage: 'Your poll has ended' }), notification.get('created_at'))}>
|
<div className='notification notification-poll focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.poll', defaultMessage: 'A poll you have voted in has ended' }), notification.get('created_at'))}>
|
||||||
<div className='notification__message'>
|
<div className='notification__message'>
|
||||||
<div className='notification__favourite-icon-wrapper'>
|
<div className='notification__favourite-icon-wrapper'>
|
||||||
<Icon id='tasks' fixedWidth />
|
<Icon id='tasks' fixedWidth />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span title={notification.get('created_at')}>
|
<span title={notification.get('created_at')}>
|
||||||
<FormattedMessage id='notification.poll' defaultMessage='Your poll has ended' />
|
<FormattedMessage id='notification.poll' defaultMessage='A poll you have voted in has ended' />
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,10 @@
|
||||||
{
|
{
|
||||||
"defaultMessage": "File upload limit exceeded.",
|
"defaultMessage": "File upload limit exceeded.",
|
||||||
"id": "upload_error.limit"
|
"id": "upload_error.limit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defaultMessage": "File upload not allowed with polls.",
|
||||||
|
"id": "upload_error.poll"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"path": "app/javascript/mastodon/actions/compose.json"
|
"path": "app/javascript/mastodon/actions/compose.json"
|
||||||
|
@ -907,6 +911,52 @@
|
||||||
],
|
],
|
||||||
"path": "app/javascript/mastodon/features/compose/components/navigation_bar.json"
|
"path": "app/javascript/mastodon/features/compose/components/navigation_bar.json"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"descriptors": [
|
||||||
|
{
|
||||||
|
"defaultMessage": "Add a poll",
|
||||||
|
"id": "poll_button.add_poll"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defaultMessage": "Remove poll",
|
||||||
|
"id": "poll_button.remove_poll"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"path": "app/javascript/mastodon/features/compose/components/poll_button.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"descriptors": [
|
||||||
|
{
|
||||||
|
"defaultMessage": "Choice {number}",
|
||||||
|
"id": "compose_form.poll.option_placeholder"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defaultMessage": "Add a choice",
|
||||||
|
"id": "compose_form.poll.add_option"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defaultMessage": "Remove this choice",
|
||||||
|
"id": "compose_form.poll.remove_option"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defaultMessage": "Poll duration",
|
||||||
|
"id": "compose_form.poll.duration"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defaultMessage": "{number, plural, one {# minute} other {# minutes}}",
|
||||||
|
"id": "intervals.full.minutes"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defaultMessage": "{number, plural, one {# hour} other {# hours}}",
|
||||||
|
"id": "intervals.full.hours"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defaultMessage": "{number, plural, one {# day} other {# days}}",
|
||||||
|
"id": "intervals.full.days"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"path": "app/javascript/mastodon/features/compose/components/poll_form.json"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"descriptors": [
|
"descriptors": [
|
||||||
{
|
{
|
||||||
|
@ -1853,6 +1903,10 @@
|
||||||
{
|
{
|
||||||
"defaultMessage": "{name} boosted your status",
|
"defaultMessage": "{name} boosted your status",
|
||||||
"id": "notification.reblog"
|
"id": "notification.reblog"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defaultMessage": "Your poll has ended",
|
||||||
|
"id": "notification.poll"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"path": "app/javascript/mastodon/features/notifications/components/notification.json"
|
"path": "app/javascript/mastodon/features/notifications/components/notification.json"
|
||||||
|
@ -1914,24 +1968,6 @@
|
||||||
],
|
],
|
||||||
"path": "app/javascript/mastodon/features/reblogs/index.json"
|
"path": "app/javascript/mastodon/features/reblogs/index.json"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"descriptors": [
|
|
||||||
{
|
|
||||||
"defaultMessage": "A look inside...",
|
|
||||||
"id": "standalone.public_title"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"path": "app/javascript/mastodon/features/standalone/community_timeline/index.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"descriptors": [
|
|
||||||
{
|
|
||||||
"defaultMessage": "A look inside...",
|
|
||||||
"id": "standalone.public_title"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"path": "app/javascript/mastodon/features/standalone/public_timeline/index.json"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"descriptors": [
|
"descriptors": [
|
||||||
{
|
{
|
||||||
|
|
|
@ -77,6 +77,10 @@
|
||||||
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
|
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
|
||||||
"compose_form.lock_disclaimer.lock": "locked",
|
"compose_form.lock_disclaimer.lock": "locked",
|
||||||
"compose_form.placeholder": "What's on your mind?",
|
"compose_form.placeholder": "What's on your mind?",
|
||||||
|
"compose_form.poll.add_option": "Add a choice",
|
||||||
|
"compose_form.poll.duration": "Poll duration",
|
||||||
|
"compose_form.poll.option_placeholder": "Choice {number}",
|
||||||
|
"compose_form.poll.remove_option": "Remove this choice",
|
||||||
"compose_form.publish": "Toot",
|
"compose_form.publish": "Toot",
|
||||||
"compose_form.publish_loud": "{publish}!",
|
"compose_form.publish_loud": "{publish}!",
|
||||||
"compose_form.sensitive.marked": "Media is marked as sensitive",
|
"compose_form.sensitive.marked": "Media is marked as sensitive",
|
||||||
|
@ -155,6 +159,9 @@
|
||||||
"home.column_settings.basic": "Basic",
|
"home.column_settings.basic": "Basic",
|
||||||
"home.column_settings.show_reblogs": "Show boosts",
|
"home.column_settings.show_reblogs": "Show boosts",
|
||||||
"home.column_settings.show_replies": "Show replies",
|
"home.column_settings.show_replies": "Show replies",
|
||||||
|
"intervals.full.days": "{number, plural, one {# day} other {# days}}",
|
||||||
|
"intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
|
||||||
|
"intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
|
||||||
"introduction.federation.action": "Next",
|
"introduction.federation.action": "Next",
|
||||||
"introduction.federation.federated.headline": "Federated",
|
"introduction.federation.federated.headline": "Federated",
|
||||||
"introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
|
"introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
|
||||||
|
@ -245,7 +252,7 @@
|
||||||
"notification.favourite": "{name} favourited your status",
|
"notification.favourite": "{name} favourited your status",
|
||||||
"notification.follow": "{name} followed you",
|
"notification.follow": "{name} followed you",
|
||||||
"notification.mention": "{name} mentioned you",
|
"notification.mention": "{name} mentioned you",
|
||||||
"notification.poll": "Your poll has ended",
|
"notification.poll": "A poll you have voted in has ended",
|
||||||
"notification.reblog": "{name} boosted your status",
|
"notification.reblog": "{name} boosted your status",
|
||||||
"notifications.clear": "Clear notifications",
|
"notifications.clear": "Clear notifications",
|
||||||
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
|
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
|
||||||
|
@ -270,6 +277,8 @@
|
||||||
"poll.refresh": "Refresh",
|
"poll.refresh": "Refresh",
|
||||||
"poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
|
"poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
|
||||||
"poll.vote": "Vote",
|
"poll.vote": "Vote",
|
||||||
|
"poll_button.add_poll": "Add a poll",
|
||||||
|
"poll_button.remove_poll": "Remove poll",
|
||||||
"privacy.change": "Adjust status privacy",
|
"privacy.change": "Adjust status privacy",
|
||||||
"privacy.direct.long": "Post to mentioned users only",
|
"privacy.direct.long": "Post to mentioned users only",
|
||||||
"privacy.direct.short": "Direct",
|
"privacy.direct.short": "Direct",
|
||||||
|
@ -304,7 +313,6 @@
|
||||||
"search_results.hashtags": "Hashtags",
|
"search_results.hashtags": "Hashtags",
|
||||||
"search_results.statuses": "Toots",
|
"search_results.statuses": "Toots",
|
||||||
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
|
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
|
||||||
"standalone.public_title": "A look inside...",
|
|
||||||
"status.admin_account": "Open moderation interface for @{name}",
|
"status.admin_account": "Open moderation interface for @{name}",
|
||||||
"status.admin_status": "Open this status in the moderation interface",
|
"status.admin_status": "Open this status in the moderation interface",
|
||||||
"status.block": "Block @{name}",
|
"status.block": "Block @{name}",
|
||||||
|
@ -362,6 +370,7 @@
|
||||||
"upload_area.title": "Drag & drop to upload",
|
"upload_area.title": "Drag & drop to upload",
|
||||||
"upload_button.label": "Add media (JPEG, PNG, GIF, WebM, MP4, MOV)",
|
"upload_button.label": "Add media (JPEG, PNG, GIF, WebM, MP4, MOV)",
|
||||||
"upload_error.limit": "File upload limit exceeded.",
|
"upload_error.limit": "File upload limit exceeded.",
|
||||||
|
"upload_error.poll": "File upload not allowed with polls.",
|
||||||
"upload_form.description": "Describe for the visually impaired",
|
"upload_form.description": "Describe for the visually impaired",
|
||||||
"upload_form.focus": "Change preview",
|
"upload_form.focus": "Change preview",
|
||||||
"upload_form.undo": "Delete",
|
"upload_form.undo": "Delete",
|
||||||
|
|
|
@ -77,6 +77,10 @@
|
||||||
"compose_form.lock_disclaimer": "あなたのアカウントは{locked}になっていません。誰でもあなたをフォローすることができ、フォロワー限定の投稿を見ることができます。",
|
"compose_form.lock_disclaimer": "あなたのアカウントは{locked}になっていません。誰でもあなたをフォローすることができ、フォロワー限定の投稿を見ることができます。",
|
||||||
"compose_form.lock_disclaimer.lock": "承認制",
|
"compose_form.lock_disclaimer.lock": "承認制",
|
||||||
"compose_form.placeholder": "今なにしてる?",
|
"compose_form.placeholder": "今なにしてる?",
|
||||||
|
"compose_form.poll.add_option": "Add a choice",
|
||||||
|
"compose_form.poll.duration": "Poll duration",
|
||||||
|
"compose_form.poll.option_placeholder": "Choice {number}",
|
||||||
|
"compose_form.poll.remove_option": "Remove this choice",
|
||||||
"compose_form.publish": "トゥート",
|
"compose_form.publish": "トゥート",
|
||||||
"compose_form.publish_loud": "{publish}!",
|
"compose_form.publish_loud": "{publish}!",
|
||||||
"compose_form.sensitive.marked": "メディアに閲覧注意が設定されています",
|
"compose_form.sensitive.marked": "メディアに閲覧注意が設定されています",
|
||||||
|
@ -155,6 +159,9 @@
|
||||||
"home.column_settings.basic": "基本設定",
|
"home.column_settings.basic": "基本設定",
|
||||||
"home.column_settings.show_reblogs": "ブースト表示",
|
"home.column_settings.show_reblogs": "ブースト表示",
|
||||||
"home.column_settings.show_replies": "返信表示",
|
"home.column_settings.show_replies": "返信表示",
|
||||||
|
"intervals.full.days": "{number, plural, one {# day} other {# days}}",
|
||||||
|
"intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
|
||||||
|
"intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
|
||||||
"introduction.federation.action": "次へ",
|
"introduction.federation.action": "次へ",
|
||||||
"introduction.federation.federated.headline": "連合タイムライン",
|
"introduction.federation.federated.headline": "連合タイムライン",
|
||||||
"introduction.federation.federated.text": "Fediverseの他のサーバーからの公開投稿は連合タイムラインに表示されます。",
|
"introduction.federation.federated.text": "Fediverseの他のサーバーからの公開投稿は連合タイムラインに表示されます。",
|
||||||
|
@ -245,6 +252,7 @@
|
||||||
"notification.favourite": "{name}さんがあなたのトゥートをお気に入りに登録しました",
|
"notification.favourite": "{name}さんがあなたのトゥートをお気に入りに登録しました",
|
||||||
"notification.follow": "{name}さんにフォローされました",
|
"notification.follow": "{name}さんにフォローされました",
|
||||||
"notification.mention": "{name}さんがあなたに返信しました",
|
"notification.mention": "{name}さんがあなたに返信しました",
|
||||||
|
"notification.poll": "Your poll has ended",
|
||||||
"notification.reblog": "{name}さんがあなたのトゥートをブーストしました",
|
"notification.reblog": "{name}さんがあなたのトゥートをブーストしました",
|
||||||
"notifications.clear": "通知を消去",
|
"notifications.clear": "通知を消去",
|
||||||
"notifications.clear_confirmation": "本当に通知を消去しますか?",
|
"notifications.clear_confirmation": "本当に通知を消去しますか?",
|
||||||
|
@ -269,6 +277,8 @@
|
||||||
"poll.refresh": "Refresh",
|
"poll.refresh": "Refresh",
|
||||||
"poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
|
"poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
|
||||||
"poll.vote": "Vote",
|
"poll.vote": "Vote",
|
||||||
|
"poll_button.add_poll": "Add a poll",
|
||||||
|
"poll_button.remove_poll": "Remove poll",
|
||||||
"privacy.change": "公開範囲を変更",
|
"privacy.change": "公開範囲を変更",
|
||||||
"privacy.direct.long": "メンションしたユーザーだけに公開",
|
"privacy.direct.long": "メンションしたユーザーだけに公開",
|
||||||
"privacy.direct.short": "ダイレクト",
|
"privacy.direct.short": "ダイレクト",
|
||||||
|
@ -303,7 +313,6 @@
|
||||||
"search_results.hashtags": "ハッシュタグ",
|
"search_results.hashtags": "ハッシュタグ",
|
||||||
"search_results.statuses": "トゥート",
|
"search_results.statuses": "トゥート",
|
||||||
"search_results.total": "{count, number}件の結果",
|
"search_results.total": "{count, number}件の結果",
|
||||||
"standalone.public_title": "今こんな話をしています...",
|
|
||||||
"status.admin_account": "@{name} のモデレーション画面を開く",
|
"status.admin_account": "@{name} のモデレーション画面を開く",
|
||||||
"status.admin_status": "このトゥートをモデレーション画面で開く",
|
"status.admin_status": "このトゥートをモデレーション画面で開く",
|
||||||
"status.block": "@{name}さんをブロック",
|
"status.block": "@{name}さんをブロック",
|
||||||
|
@ -361,6 +370,7 @@
|
||||||
"upload_area.title": "ドラッグ&ドロップでアップロード",
|
"upload_area.title": "ドラッグ&ドロップでアップロード",
|
||||||
"upload_button.label": "メディアを追加 (JPEG, PNG, GIF, WebM, MP4, MOV)",
|
"upload_button.label": "メディアを追加 (JPEG, PNG, GIF, WebM, MP4, MOV)",
|
||||||
"upload_error.limit": "アップロードできる上限を超えています。",
|
"upload_error.limit": "アップロードできる上限を超えています。",
|
||||||
|
"upload_error.poll": "File upload not allowed with polls.",
|
||||||
"upload_form.description": "視覚障害者のための説明",
|
"upload_form.description": "視覚障害者のための説明",
|
||||||
"upload_form.focus": "焦点",
|
"upload_form.focus": "焦点",
|
||||||
"upload_form.undo": "削除",
|
"upload_form.undo": "削除",
|
||||||
|
|
|
@ -9,6 +9,7 @@ const initialState = Immutable.Map({
|
||||||
favourite: false,
|
favourite: false,
|
||||||
reblog: false,
|
reblog: false,
|
||||||
mention: false,
|
mention: false,
|
||||||
|
poll: false,
|
||||||
}),
|
}),
|
||||||
isSubscribed: false,
|
isSubscribed: false,
|
||||||
browserSupport: false,
|
browserSupport: false,
|
||||||
|
|
|
@ -26,6 +26,8 @@ class Poll < ApplicationRecord
|
||||||
|
|
||||||
has_many :votes, class_name: 'PollVote', inverse_of: :poll, dependent: :destroy
|
has_many :votes, class_name: 'PollVote', inverse_of: :poll, dependent: :destroy
|
||||||
|
|
||||||
|
has_many :notifications, as: :activity, dependent: :destroy
|
||||||
|
|
||||||
validates :options, presence: true
|
validates :options, presence: true
|
||||||
validates :expires_at, presence: true, if: :local?
|
validates :expires_at, presence: true, if: :local?
|
||||||
validates_with PollValidator, on: :create, if: :local?
|
validates_with PollValidator, on: :create, if: :local?
|
||||||
|
|
|
@ -4,25 +4,36 @@ ja:
|
||||||
about_hashtag_html: ハッシュタグ <strong>#%{hashtag}</strong> の付いた公開トゥートです。どこでもいいので、連合に参加しているSNS上にアカウントを作れば会話に参加することができます。
|
about_hashtag_html: ハッシュタグ <strong>#%{hashtag}</strong> の付いた公開トゥートです。どこでもいいので、連合に参加しているSNS上にアカウントを作れば会話に参加することができます。
|
||||||
about_mastodon_html: Mastodon は、オープンなウェブプロトコルを採用した、自由でオープンソースなソーシャルネットワークです。電子メールのような分散型の仕組みを採っています。
|
about_mastodon_html: Mastodon は、オープンなウェブプロトコルを採用した、自由でオープンソースなソーシャルネットワークです。電子メールのような分散型の仕組みを採っています。
|
||||||
about_this: 詳細情報
|
about_this: 詳細情報
|
||||||
|
active_count_after: 人アクティブ
|
||||||
|
active_footnote: 月間アクティブユーザー数 (MAU)
|
||||||
administered_by: '管理者:'
|
administered_by: '管理者:'
|
||||||
api: API
|
api: API
|
||||||
apps: アプリ
|
apps: アプリ
|
||||||
|
apps_platforms: iOSやAndroid、その他プラットフォームから使用する
|
||||||
|
browse_directory: ディレクトリで関心を軸に見つける
|
||||||
|
browse_public_posts: Mastodonの公開ライブストリームを見てみる
|
||||||
contact: 連絡先
|
contact: 連絡先
|
||||||
contact_missing: 未設定
|
contact_missing: 未設定
|
||||||
contact_unavailable: N/A
|
contact_unavailable: N/A
|
||||||
|
discover_users: ユーザーを見つける
|
||||||
documentation: ドキュメント
|
documentation: ドキュメント
|
||||||
extended_description_html: |
|
extended_description_html: |
|
||||||
<h3>ルールを書くのに適した場所</h3>
|
<h3>ルールを書くのに適した場所</h3>
|
||||||
<p>詳細説明が設定されていません。</p>
|
<p>詳細説明が設定されていません。</p>
|
||||||
|
federation_hint_html: "%{instance} にアカウントを作ればどこのMastodonや互換性のあるサーバーのユーザーでもフォローできます。"
|
||||||
generic_description: "%{domain} は、Mastodon サーバーの一つです"
|
generic_description: "%{domain} は、Mastodon サーバーの一つです"
|
||||||
|
get_apps: モバイルアプリを試す
|
||||||
hosted_on: Mastodon hosted on %{domain}
|
hosted_on: Mastodon hosted on %{domain}
|
||||||
learn_more: もっと詳しく
|
learn_more: もっと詳しく
|
||||||
privacy_policy: プライバシーポリシー
|
privacy_policy: プライバシーポリシー
|
||||||
|
see_whats_happening: 何が起きているのか見てみる
|
||||||
|
server_stats: 'サーバー統計:'
|
||||||
source_code: ソースコード
|
source_code: ソースコード
|
||||||
status_count_after:
|
status_count_after:
|
||||||
one: トゥート
|
one: トゥート
|
||||||
other: トゥート
|
other: トゥート
|
||||||
status_count_before: トゥート数
|
status_count_before: トゥート数
|
||||||
|
tagline: Follow friends and discover new ones
|
||||||
terms: 利用規約
|
terms: 利用規約
|
||||||
user_count_after:
|
user_count_after:
|
||||||
one: 人
|
one: 人
|
||||||
|
@ -487,6 +498,7 @@ ja:
|
||||||
auth:
|
auth:
|
||||||
agreement_html: 登録するをクリックすると <a href="%{rules_path}">サーバーのルール</a> と <a href="%{terms_path}">プライバシーポリシー</a> に従うことに同意したことになります。
|
agreement_html: 登録するをクリックすると <a href="%{rules_path}">サーバーのルール</a> と <a href="%{terms_path}">プライバシーポリシー</a> に従うことに同意したことになります。
|
||||||
change_password: パスワード
|
change_password: パスワード
|
||||||
|
checkbox_agreement_html: <a href="%{rules_path}" target="_blank">サーバーのルール</a> と <a href="%{terms_path}" target="_blank">プライバシーポリシー</a> に同意します
|
||||||
confirm_email: メールアドレスの確認
|
confirm_email: メールアドレスの確認
|
||||||
delete_account: アカウントの削除
|
delete_account: アカウントの削除
|
||||||
delete_account_html: アカウントを削除したい場合、<a href="%{path}">こちら</a> から手続きが行えます。削除する前に、確認画面があります。
|
delete_account_html: アカウントを削除したい場合、<a href="%{path}">こちら</a> から手続きが行えます。削除する前に、確認画面があります。
|
||||||
|
@ -502,10 +514,12 @@ ja:
|
||||||
cas: CAS
|
cas: CAS
|
||||||
saml: SAML
|
saml: SAML
|
||||||
register: 登録する
|
register: 登録する
|
||||||
|
registration_closed: "%{instance} は現在新しいメンバーを受け入れていません"
|
||||||
resend_confirmation: 確認メールを再送する
|
resend_confirmation: 確認メールを再送する
|
||||||
reset_password: パスワードを再発行
|
reset_password: パスワードを再発行
|
||||||
security: セキュリティ
|
security: セキュリティ
|
||||||
set_new_password: 新しいパスワード
|
set_new_password: 新しいパスワード
|
||||||
|
trouble_logging_in: ログインできませんか?
|
||||||
authorize_follow:
|
authorize_follow:
|
||||||
already_following: あなたは既にこのアカウントをフォローしています
|
already_following: あなたは既にこのアカウントをフォローしています
|
||||||
error: 残念ながら、リモートアカウント情報の取得中にエラーが発生しました
|
error: 残念ながら、リモートアカウント情報の取得中にエラーが発生しました
|
||||||
|
@ -721,6 +735,16 @@ ja:
|
||||||
older: 以前のトゥート
|
older: 以前のトゥート
|
||||||
prev: 前
|
prev: 前
|
||||||
truncate: "…"
|
truncate: "…"
|
||||||
|
polls:
|
||||||
|
errors:
|
||||||
|
already_voted: You have already voted on this poll
|
||||||
|
duplicate_options: contain duplicate items
|
||||||
|
duration_too_long: is too far into the future
|
||||||
|
duration_too_short: is too soon
|
||||||
|
expired: The poll has already ended
|
||||||
|
over_character_limit: cannot be longer than %{max} characters each
|
||||||
|
too_few_options: must have more than one item
|
||||||
|
too_many_options: can't contain more than %{max} items
|
||||||
preferences:
|
preferences:
|
||||||
languages: 言語
|
languages: 言語
|
||||||
other: その他
|
other: その他
|
||||||
|
@ -831,6 +855,11 @@ ja:
|
||||||
ownership: 他人のトゥートを固定することはできません
|
ownership: 他人のトゥートを固定することはできません
|
||||||
private: 非公開のトゥートを固定することはできません
|
private: 非公開のトゥートを固定することはできません
|
||||||
reblog: ブーストされたトゥートを固定することはできません
|
reblog: ブーストされたトゥートを固定することはできません
|
||||||
|
poll:
|
||||||
|
total_votes:
|
||||||
|
one: "%{count} vote"
|
||||||
|
other: "%{count} votes"
|
||||||
|
vote: Vote
|
||||||
show_more: もっと見る
|
show_more: もっと見る
|
||||||
sign_in_to_participate: ログインして会話に参加
|
sign_in_to_participate: ログインして会話に参加
|
||||||
title: '%{name}: "%{quote}"'
|
title: '%{name}: "%{quote}"'
|
||||||
|
|
Loading…
Reference in New Issue