Merge pull request #1810 from ClearlyClaire/glitch-soc/merge-upstream

Merge upstream changes
rebase/4.0.0rc1
Claire 2022-07-22 20:49:54 +02:00 committed by GitHub
commit 85d0e34745
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
54 changed files with 1022 additions and 680 deletions

View File

@ -407,7 +407,7 @@ GEM
net-ssh (>= 2.6.5, < 7.0.0) net-ssh (>= 2.6.5, < 7.0.0)
net-ssh (6.1.0) net-ssh (6.1.0)
nio4r (2.5.8) nio4r (2.5.8)
nokogiri (1.13.6) nokogiri (1.13.7)
mini_portile2 (~> 2.8.0) mini_portile2 (~> 2.8.0)
racc (~> 1.4) racc (~> 1.4)
nsa (0.2.8) nsa (0.2.8)
@ -415,7 +415,7 @@ GEM
concurrent-ruby (~> 1.0, >= 1.0.2) concurrent-ruby (~> 1.0, >= 1.0.2)
sidekiq (>= 3.5) sidekiq (>= 3.5)
statsd-ruby (~> 1.4, >= 1.4.0) statsd-ruby (~> 1.4, >= 1.4.0)
oj (3.13.16) oj (3.13.17)
omniauth (1.9.1) omniauth (1.9.1)
hashie (>= 3.4.6) hashie (>= 3.4.6)
rack (>= 1.6.2, < 3) rack (>= 1.6.2, < 3)

View File

@ -24,6 +24,7 @@ class Api::V1::TagsController < Api::BaseController
private private
def set_or_create_tag def set_or_create_tag
return not_found unless /\A(#{Tag::HASHTAG_NAME_RE})\z/.match?(params[:id])
@tag = Tag.find_normalized(params[:id]) || Tag.new(name: Tag.normalize(params[:id]), display_name: params[:id]) @tag = Tag.find_normalized(params[:id]) || Tag.new(name: Tag.normalize(params[:id]), display_name: params[:id])
end end
end end

View File

@ -1,7 +1,7 @@
// @ts-check // @ts-check
import React from 'react'; import React from 'react';
import { Sparklines, SparklinesCurve } from 'react-sparklines'; import { Sparklines, SparklinesCurve } from 'react-sparklines';
import { FormattedMessage } from 'react-intl'; import { FormattedMessage, injectIntl, defineMessages } from 'react-intl';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePropTypes from 'react-immutable-proptypes';
import Permalink from './permalink'; import Permalink from './permalink';
@ -9,6 +9,10 @@ import ShortNumber from 'flavours/glitch/components/short_number';
import Skeleton from 'flavours/glitch/components/skeleton'; import Skeleton from 'flavours/glitch/components/skeleton';
import classNames from 'classnames'; import classNames from 'classnames';
const messages = defineMessages({
totalVolume: { id: 'hashtag.total_volume', defaultMessage: 'Total volume in the last {days, plural, one {day} other {{days} days}}' },
});
class SilentErrorBoundary extends React.Component { class SilentErrorBoundary extends React.Component {
static propTypes = { static propTypes = {
@ -41,10 +45,11 @@ class SilentErrorBoundary extends React.Component {
const accountsCountRenderer = (displayNumber, pluralReady) => ( const accountsCountRenderer = (displayNumber, pluralReady) => (
<FormattedMessage <FormattedMessage
id='trends.counter_by_accounts' id='trends.counter_by_accounts'
defaultMessage='{count, plural, one {{counter} person} other {{counter} people}} talking' defaultMessage='{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {{days} days}}'
values={{ values={{
count: pluralReady, count: pluralReady,
counter: <strong>{displayNumber}</strong>, counter: <strong>{displayNumber}</strong>,
days: 2,
}} }}
/> />
); );
@ -64,7 +69,7 @@ ImmutableHashtag.propTypes = {
hashtag: ImmutablePropTypes.map.isRequired, hashtag: ImmutablePropTypes.map.isRequired,
}; };
const Hashtag = ({ name, href, to, people, uses, history, className }) => ( const Hashtag = injectIntl(({ name, href, to, people, uses, history, className, intl }) => (
<div className={classNames('trends__item', className)}> <div className={classNames('trends__item', className)}>
<div className='trends__item__name'> <div className='trends__item__name'>
<Permalink href={href} to={to}> <Permalink href={href} to={to}>
@ -74,9 +79,10 @@ const Hashtag = ({ name, href, to, people, uses, history, className }) => (
{typeof people !== 'undefined' ? <ShortNumber value={people} renderer={accountsCountRenderer} /> : <Skeleton width={100} />} {typeof people !== 'undefined' ? <ShortNumber value={people} renderer={accountsCountRenderer} /> : <Skeleton width={100} />}
</div> </div>
<div className='trends__item__current'> <abbr className='trends__item__current' title={intl.formatMessage(messages.totalVolume, { days: 2 })}>
{typeof uses !== 'undefined' ? <ShortNumber value={uses} /> : <Skeleton width={42} height={36} />} {typeof uses !== 'undefined' ? <ShortNumber value={uses} /> : <Skeleton width={42} height={36} />}
</div> <span className='trends__item__current__asterisk'>*</span>
</abbr>
<div className='trends__item__sparkline'> <div className='trends__item__sparkline'>
<SilentErrorBoundary> <SilentErrorBoundary>
@ -86,7 +92,7 @@ const Hashtag = ({ name, href, to, people, uses, history, className }) => (
</SilentErrorBoundary> </SilentErrorBoundary>
</div> </div>
</div> </div>
); ));
Hashtag.propTypes = { Hashtag.propTypes = {
name: PropTypes.string, name: PropTypes.string,

View File

@ -1,10 +1,10 @@
import React from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames'; import classNames from 'classnames';
import PropTypes from 'prop-types';
import React, { PureComponent } from 'react';
import { LoadingBar } from 'react-redux-loading-bar'; import { LoadingBar } from 'react-redux-loading-bar';
import ZoomableImage from './zoomable_image'; import ZoomableImage from './zoomable_image';
export default class ImageLoader extends React.PureComponent { export default class ImageLoader extends PureComponent {
static propTypes = { static propTypes = {
alt: PropTypes.string, alt: PropTypes.string,
@ -43,7 +43,7 @@ export default class ImageLoader extends React.PureComponent {
this.loadImage(this.props); this.loadImage(this.props);
} }
componentWillReceiveProps (nextProps) { UNSAFE_componentWillReceiveProps (nextProps) {
if (this.props.src !== nextProps.src) { if (this.props.src !== nextProps.src) {
this.loadImage(nextProps); this.loadImage(nextProps);
} }
@ -139,14 +139,18 @@ export default class ImageLoader extends React.PureComponent {
return ( return (
<div className={className}> <div className={className}>
<LoadingBar loading={loading ? 1 : 0} className='loading-bar' style={{ width: this.state.width || width }} />
{loading ? ( {loading ? (
<canvas <>
className='image-loader__preview-canvas' <div className='loading-bar__container' style={{ width: this.state.width || width }}>
ref={this.setCanvasRef} <LoadingBar className='loading-bar' loading={1} />
width={width} </div>
height={height} <canvas
/> className='image-loader__preview-canvas'
ref={this.setCanvasRef}
width={width}
height={height}
/>
</>
) : ( ) : (
<ZoomableImage <ZoomableImage
alt={alt} alt={alt}

View File

@ -442,10 +442,14 @@
object-fit: contain; object-fit: contain;
} }
.loading-bar { .loading-bar__container {
position: relative; position: relative;
} }
.loading-bar {
position: absolute;
}
&.image-loader--amorphous .image-loader__preview-canvas { &.image-loader--amorphous .image-loader__preview-canvas {
display: none; display: none;
} }

View File

@ -176,6 +176,13 @@
padding-right: 15px; padding-right: 15px;
margin-left: 5px; margin-left: 5px;
color: $secondary-text-color; color: $secondary-text-color;
text-decoration: none;
&__asterisk {
color: $darker-text-color;
font-size: 18px;
vertical-align: super;
}
} }
&__sparkline { &__sparkline {

View File

@ -1,7 +1,7 @@
// @ts-check // @ts-check
import React from 'react'; import React from 'react';
import { Sparklines, SparklinesCurve } from 'react-sparklines'; import { Sparklines, SparklinesCurve } from 'react-sparklines';
import { FormattedMessage } from 'react-intl'; import { FormattedMessage, injectIntl, defineMessages } from 'react-intl';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePropTypes from 'react-immutable-proptypes';
import Permalink from './permalink'; import Permalink from './permalink';
@ -9,6 +9,10 @@ import ShortNumber from 'mastodon/components/short_number';
import Skeleton from 'mastodon/components/skeleton'; import Skeleton from 'mastodon/components/skeleton';
import classNames from 'classnames'; import classNames from 'classnames';
const messages = defineMessages({
totalVolume: { id: 'hashtag.total_volume', defaultMessage: 'Total volume in the last {days, plural, one {day} other {{days} days}}' },
});
class SilentErrorBoundary extends React.Component { class SilentErrorBoundary extends React.Component {
static propTypes = { static propTypes = {
@ -41,10 +45,11 @@ class SilentErrorBoundary extends React.Component {
export const accountsCountRenderer = (displayNumber, pluralReady) => ( export const accountsCountRenderer = (displayNumber, pluralReady) => (
<FormattedMessage <FormattedMessage
id='trends.counter_by_accounts' id='trends.counter_by_accounts'
defaultMessage='{count, plural, one {{counter} person} other {{counter} people}} talking' defaultMessage='{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {{days} days}}'
values={{ values={{
count: pluralReady, count: pluralReady,
counter: <strong>{displayNumber}</strong>, counter: <strong>{displayNumber}</strong>,
days: 2,
}} }}
/> />
); );
@ -64,7 +69,7 @@ ImmutableHashtag.propTypes = {
hashtag: ImmutablePropTypes.map.isRequired, hashtag: ImmutablePropTypes.map.isRequired,
}; };
const Hashtag = ({ name, href, to, people, uses, history, className }) => ( const Hashtag = injectIntl(({ name, href, to, people, uses, history, className, intl }) => (
<div className={classNames('trends__item', className)}> <div className={classNames('trends__item', className)}>
<div className='trends__item__name'> <div className='trends__item__name'>
<Permalink href={href} to={to}> <Permalink href={href} to={to}>
@ -74,9 +79,10 @@ const Hashtag = ({ name, href, to, people, uses, history, className }) => (
{typeof people !== 'undefined' ? <ShortNumber value={people} renderer={accountsCountRenderer} /> : <Skeleton width={100} />} {typeof people !== 'undefined' ? <ShortNumber value={people} renderer={accountsCountRenderer} /> : <Skeleton width={100} />}
</div> </div>
<div className='trends__item__current'> <abbr className='trends__item__current' title={intl.formatMessage(messages.totalVolume, { days: 2 })}>
{typeof uses !== 'undefined' ? <ShortNumber value={uses} /> : <Skeleton width={42} height={36} />} {typeof uses !== 'undefined' ? <ShortNumber value={uses} /> : <Skeleton width={42} height={36} />}
</div> <span className='trends__item__current__asterisk'>*</span>
</abbr>
<div className='trends__item__sparkline'> <div className='trends__item__sparkline'>
<SilentErrorBoundary> <SilentErrorBoundary>
@ -86,7 +92,7 @@ const Hashtag = ({ name, href, to, people, uses, history, className }) => (
</SilentErrorBoundary> </SilentErrorBoundary>
</div> </div>
</div> </div>
); ));
Hashtag.propTypes = { Hashtag.propTypes = {
name: PropTypes.string, name: PropTypes.string,

View File

@ -1,10 +1,10 @@
import React from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames'; import classNames from 'classnames';
import PropTypes from 'prop-types';
import React, { PureComponent } from 'react';
import { LoadingBar } from 'react-redux-loading-bar'; import { LoadingBar } from 'react-redux-loading-bar';
import ZoomableImage from './zoomable_image'; import ZoomableImage from './zoomable_image';
export default class ImageLoader extends React.PureComponent { export default class ImageLoader extends PureComponent {
static propTypes = { static propTypes = {
alt: PropTypes.string, alt: PropTypes.string,
@ -43,7 +43,7 @@ export default class ImageLoader extends React.PureComponent {
this.loadImage(this.props); this.loadImage(this.props);
} }
componentWillReceiveProps (nextProps) { UNSAFE_componentWillReceiveProps (nextProps) {
if (this.props.src !== nextProps.src) { if (this.props.src !== nextProps.src) {
this.loadImage(nextProps); this.loadImage(nextProps);
} }
@ -139,14 +139,18 @@ export default class ImageLoader extends React.PureComponent {
return ( return (
<div className={className}> <div className={className}>
<LoadingBar loading={loading ? 1 : 0} className='loading-bar' style={{ width: this.state.width || width }} />
{loading ? ( {loading ? (
<canvas <>
className='image-loader__preview-canvas' <div className='loading-bar__container' style={{ width: this.state.width || width }}>
ref={this.setCanvasRef} <LoadingBar className='loading-bar' loading={1} />
width={width} </div>
height={height} <canvas
/> className='image-loader__preview-canvas'
ref={this.setCanvasRef}
width={width}
height={height}
/>
</>
) : ( ) : (
<ZoomableImage <ZoomableImage
alt={alt} alt={alt}

View File

@ -290,7 +290,11 @@
{ {
"descriptors": [ "descriptors": [
{ {
"defaultMessage": "{count, plural, one {{counter} person} other {{counter} people}} talking", "defaultMessage": "Total volume in the last {days, plural, one {day} other {{days} days}}",
"id": "hashtag.total_volume"
},
{
"defaultMessage": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {{days} days}}",
"id": "trends.counter_by_accounts" "id": "trends.counter_by_accounts"
} }
], ],
@ -3765,4 +3769,4 @@
], ],
"path": "app/javascript/mastodon/features/video/index.json" "path": "app/javascript/mastodon/features/video/index.json"
} }
] ]

View File

@ -224,6 +224,7 @@
"hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.any": "Any of these",
"hashtag.column_settings.tag_mode.none": "None of these", "hashtag.column_settings.tag_mode.none": "None of these",
"hashtag.column_settings.tag_toggle": "Include additional tags for this column", "hashtag.column_settings.tag_toggle": "Include additional tags for this column",
"hashtag.total_volume": "Total volume in the last {days, plural, one {day} other {{days} days}}",
"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",
@ -522,7 +523,7 @@
"timeline_hint.resources.followers": "Followers", "timeline_hint.resources.followers": "Followers",
"timeline_hint.resources.follows": "Follows", "timeline_hint.resources.follows": "Follows",
"timeline_hint.resources.statuses": "Older posts", "timeline_hint.resources.statuses": "Older posts",
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking", "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {{days} days}}",
"trends.trending_now": "Trending now", "trends.trending_now": "Trending now",
"ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
"units.short.billion": "{count}B", "units.short.billion": "{count}B",

View File

@ -198,7 +198,7 @@
"explore.trending_tags": "แฮชแท็ก", "explore.trending_tags": "แฮชแท็ก",
"follow_recommendations.done": "เสร็จสิ้น", "follow_recommendations.done": "เสร็จสิ้น",
"follow_recommendations.heading": "ติดตามผู้คนที่คุณต้องการเห็นโพสต์! นี่คือข้อเสนอแนะบางส่วน", "follow_recommendations.heading": "ติดตามผู้คนที่คุณต้องการเห็นโพสต์! นี่คือข้อเสนอแนะบางส่วน",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!", "follow_recommendations.lead": "โพสต์จากคนที่คุณติดตามจะแสดงตามลำดับเวลาบนฟีดหลักของคุณ อย่ากลัวที่จะทำผิดพลาด คุณสามารถเลิกติดตามผู้คนได้ง่ายๆ ทุกเมื่อ!",
"follow_request.authorize": "อนุญาต", "follow_request.authorize": "อนุญาต",
"follow_request.reject": "ปฏิเสธ", "follow_request.reject": "ปฏิเสธ",
"follow_requests.unlocked_explanation": "แม้ว่าไม่มีการล็อคบัญชีของคุณ พนักงานของ {domain} คิดว่าคุณอาจต้องการตรวจทานคำขอติดตามจากบัญชีเหล่านี้ด้วยตนเอง", "follow_requests.unlocked_explanation": "แม้ว่าไม่มีการล็อคบัญชีของคุณ พนักงานของ {domain} คิดว่าคุณอาจต้องการตรวจทานคำขอติดตามจากบัญชีเหล่านี้ด้วยตนเอง",
@ -268,7 +268,7 @@
"lightbox.next": "ถัดไป", "lightbox.next": "ถัดไป",
"lightbox.previous": "ก่อนหน้า", "lightbox.previous": "ก่อนหน้า",
"limited_account_hint.action": "แสดงโปรไฟล์ต่อไป", "limited_account_hint.action": "แสดงโปรไฟล์ต่อไป",
"limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "limited_account_hint.title": "โปรไฟล์นี้ถูกซ่อนไว้โดยโมเดอเรเตอร์ของเซิร์ฟเวอร์ของคุณ",
"lists.account.add": "เพิ่มไปยังรายการ", "lists.account.add": "เพิ่มไปยังรายการ",
"lists.account.remove": "เอาออกจากรายการ", "lists.account.remove": "เอาออกจากรายการ",
"lists.delete": "ลบรายการ", "lists.delete": "ลบรายการ",
@ -360,7 +360,7 @@
"notifications.permission_denied_alert": "ไม่สามารถเปิดใช้งานการแจ้งเตือนบนเดสก์ท็อป เนื่องจากมีการปฏิเสธสิทธิอนุญาตเบราว์เซอร์ก่อนหน้านี้", "notifications.permission_denied_alert": "ไม่สามารถเปิดใช้งานการแจ้งเตือนบนเดสก์ท็อป เนื่องจากมีการปฏิเสธสิทธิอนุญาตเบราว์เซอร์ก่อนหน้านี้",
"notifications.permission_required": "การแจ้งเตือนบนเดสก์ท็อปไม่พร้อมใช้งานเนื่องจากไม่ได้ให้สิทธิอนุญาตที่จำเป็น", "notifications.permission_required": "การแจ้งเตือนบนเดสก์ท็อปไม่พร้อมใช้งานเนื่องจากไม่ได้ให้สิทธิอนุญาตที่จำเป็น",
"notifications_permission_banner.enable": "เปิดใช้งานการแจ้งเตือนบนเดสก์ท็อป", "notifications_permission_banner.enable": "เปิดใช้งานการแจ้งเตือนบนเดสก์ท็อป",
"notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.how_to_control": "หากต้องการรับการแจ้งเตือนเมื่อไม่ได้เปิด Mastodon ให้เปิดใช้การแจ้งเตือนบนเดสก์ท็อป คุณสามารถควบคุมได้ตามความต้องการด้วยการโต้ตอบประเภทที่สร้างการแจ้งเตือนบนเดสก์ท็อปผ่านปุ่ม {icon} ด้านบนเมื่อเปิดใช้งาน",
"notifications_permission_banner.title": "ไม่พลาดสิ่งใด", "notifications_permission_banner.title": "ไม่พลาดสิ่งใด",
"picture_in_picture.restore": "นำกลับมา", "picture_in_picture.restore": "นำกลับมา",
"poll.closed": "ปิดแล้ว", "poll.closed": "ปิดแล้ว",

View File

@ -314,7 +314,7 @@
"navigation_bar.preferences": "首选项", "navigation_bar.preferences": "首选项",
"navigation_bar.public_timeline": "跨站公共时间轴", "navigation_bar.public_timeline": "跨站公共时间轴",
"navigation_bar.security": "安全", "navigation_bar.security": "安全",
"notification.admin.report": "{name} reported {target}", "notification.admin.report": "{name} 已报告 {target}",
"notification.admin.sign_up": "{name} 注册了", "notification.admin.sign_up": "{name} 注册了",
"notification.favourite": "{name} 喜欢了你的嘟文", "notification.favourite": "{name} 喜欢了你的嘟文",
"notification.follow": "{name} 开始关注你", "notification.follow": "{name} 开始关注你",
@ -327,7 +327,7 @@
"notification.update": "{name} 编辑了嘟文", "notification.update": "{name} 编辑了嘟文",
"notifications.clear": "清空通知列表", "notifications.clear": "清空通知列表",
"notifications.clear_confirmation": "你确定要永久清空通知列表吗?", "notifications.clear_confirmation": "你确定要永久清空通知列表吗?",
"notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.report": "新报告",
"notifications.column_settings.admin.sign_up": "新注册:", "notifications.column_settings.admin.sign_up": "新注册:",
"notifications.column_settings.alert": "桌面通知", "notifications.column_settings.alert": "桌面通知",
"notifications.column_settings.favourite": "喜欢:", "notifications.column_settings.favourite": "喜欢:",
@ -433,7 +433,7 @@
"report.thanks.title_actionable": "感谢提交举报,我们将会进行处理。", "report.thanks.title_actionable": "感谢提交举报,我们将会进行处理。",
"report.unfollow": "取消关注 @{name}", "report.unfollow": "取消关注 @{name}",
"report.unfollow_explanation": "你正在关注此账户。如果要想在你的主页上不再看到他们的帖子,取消对他们的关注即可。", "report.unfollow_explanation": "你正在关注此账户。如果要想在你的主页上不再看到他们的帖子,取消对他们的关注即可。",
"report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", "report_notification.attached_statuses": "{count, plural, one {{count} 嘟文} other {{count} 嘟文}} 附件",
"report_notification.categories.other": "其他", "report_notification.categories.other": "其他",
"report_notification.categories.spam": "骚扰", "report_notification.categories.spam": "骚扰",
"report_notification.categories.violation": "违反规则", "report_notification.categories.violation": "违反规则",
@ -468,7 +468,7 @@
"status.embed": "嵌入", "status.embed": "嵌入",
"status.favourite": "喜欢", "status.favourite": "喜欢",
"status.filtered": "已过滤", "status.filtered": "已过滤",
"status.hide": "Hide toot", "status.hide": "屏蔽嘟文",
"status.history.created": "{name} 创建于 {date}", "status.history.created": "{name} 创建于 {date}",
"status.history.edited": "{name} 编辑于 {date}", "status.history.edited": "{name} 编辑于 {date}",
"status.load_more": "加载更多", "status.load_more": "加载更多",
@ -492,7 +492,7 @@
"status.report": "举报 @{name}", "status.report": "举报 @{name}",
"status.sensitive_warning": "敏感内容", "status.sensitive_warning": "敏感内容",
"status.share": "分享", "status.share": "分享",
"status.show_filter_reason": "Show anyway", "status.show_filter_reason": "继续显示",
"status.show_less": "隐藏内容", "status.show_less": "隐藏内容",
"status.show_less_all": "隐藏全部内容", "status.show_less_all": "隐藏全部内容",
"status.show_more": "显示更多", "status.show_more": "显示更多",

View File

@ -1783,10 +1783,14 @@ a.account__display-name {
object-fit: contain; object-fit: contain;
} }
.loading-bar { .loading-bar__container {
position: relative; position: relative;
} }
.loading-bar {
position: absolute;
}
&.image-loader--amorphous .image-loader__preview-canvas { &.image-loader--amorphous .image-loader__preview-canvas {
display: none; display: none;
} }
@ -7239,6 +7243,13 @@ noscript {
padding-right: 15px; padding-right: 15px;
margin-left: 5px; margin-left: 5px;
color: $secondary-text-color; color: $secondary-text-color;
text-decoration: none;
&__asterisk {
color: $darker-text-color;
font-size: 18px;
vertical-align: super;
}
} }
&__sparkline { &__sparkline {

View File

@ -62,7 +62,7 @@ class Account < ApplicationRecord
) )
USERNAME_RE = /[a-z0-9_]+([a-z0-9_\.-]+[a-z0-9_]+)?/i USERNAME_RE = /[a-z0-9_]+([a-z0-9_\.-]+[a-z0-9_]+)?/i
MENTION_RE = /(?<=^|[^\/[:word:]])@((#{USERNAME_RE})(?:@[[:alnum:]\.\-]+[[:alnum:]]+)?)/i MENTION_RE = /(?<=^|[^\/[:word:]])@((#{USERNAME_RE})(?:@[[:word:]\.\-]+[[:word:]]+)?)/i
URL_PREFIX_RE = /\Ahttp(s?):\/\/[^\/]+/ URL_PREFIX_RE = /\Ahttp(s?):\/\/[^\/]+/
include Attachmentable include Attachmentable

View File

@ -27,7 +27,7 @@ class Tag < ApplicationRecord
has_many :followers, through: :passive_relationships, source: :account has_many :followers, through: :passive_relationships, source: :account
HASHTAG_SEPARATORS = "_\u00B7\u200c" HASHTAG_SEPARATORS = "_\u00B7\u200c"
HASHTAG_NAME_RE = "([[:alnum:]_][[:alnum:]#{HASHTAG_SEPARATORS}]*[[:alpha:]#{HASHTAG_SEPARATORS}][[:alnum:]#{HASHTAG_SEPARATORS}]*[[:alnum:]_])|([[:alnum:]_]*[[:alpha:]][[:alnum:]_]*)" HASHTAG_NAME_RE = "([[:word:]_][[:word:]#{HASHTAG_SEPARATORS}]*[[:alpha:]#{HASHTAG_SEPARATORS}][[:word:]#{HASHTAG_SEPARATORS}]*[[:word:]_])|([[:word:]_]*[[:alpha:]][[:word:]_]*)"
HASHTAG_RE = /(?:^|[^\/\)\w])#(#{HASHTAG_NAME_RE})/i HASHTAG_RE = /(?:^|[^\/\)\w])#(#{HASHTAG_NAME_RE})/i
validates :name, presence: true, format: { with: /\A(#{HASHTAG_NAME_RE})\z/i } validates :name, presence: true, format: { with: /\A(#{HASHTAG_NAME_RE})\z/i }

View File

@ -38,3 +38,9 @@ af:
email: email:
blocked: maak gebruik van 'n e-pos verskaffer wat nie toegelaat word nie blocked: maak gebruik van 'n e-pos verskaffer wat nie toegelaat word nie
unreachable: blyk nie te bestaan nie unreachable: blyk nie te bestaan nie
user_role:
attributes:
permissions_as_keys:
own_role: kan nie verander word met jou huidige rol nie
position:
own_role: kan nie verander word met jou huidige rol nie

View File

@ -45,5 +45,7 @@ ca:
permissions_as_keys: permissions_as_keys:
dangerous: inclou permisos que no són segurs per al rol base dangerous: inclou permisos que no són segurs per al rol base
elevated: no pot incloure permisos que el teu rol actual no té elevated: no pot incloure permisos que el teu rol actual no té
own_role: no es pot canviar amb el teu rol actual
position: position:
elevated: no pot ser superior al teu rol actual elevated: no pot ser superior al teu rol actual
own_role: no pot ser canviat amb el teu rol actual

View File

@ -45,5 +45,6 @@ da:
permissions_as_keys: permissions_as_keys:
dangerous: omfat tilladelser, som ikke er sikre for basisrollen dangerous: omfat tilladelser, som ikke er sikre for basisrollen
elevated: kan ikke omfatte tilladelser, din aktuelle rolle ikke besidder elevated: kan ikke omfatte tilladelser, din aktuelle rolle ikke besidder
own_role: kan ikke ændres med din aktuelle rolle
position: position:
elevated: kan ikke være højere end din aktuelle rolle elevated: kan ikke være højere end din aktuelle rolle

View File

@ -30,3 +30,9 @@ el:
email: email:
blocked: χρησιμοποιεί μη επιτρεπόμενο πάροχο e-mail blocked: χρησιμοποιεί μη επιτρεπόμενο πάροχο e-mail
unreachable: δεν φαίνεται να υπάρχει unreachable: δεν φαίνεται να υπάρχει
user_role:
attributes:
permissions_as_keys:
own_role: δεν μπορεί να αλλάξει με τον τρέχοντα ρόλο σας
position:
own_role: δεν μπορεί να αλλάξει με τον τρέχοντα ρόλο σας

View File

@ -45,5 +45,7 @@ es-AR:
permissions_as_keys: permissions_as_keys:
dangerous: incluir permisos que no son seguros para el rol base dangerous: incluir permisos que no son seguros para el rol base
elevated: no se pueden incluir permisos que tu rol actual no posea elevated: no se pueden incluir permisos que tu rol actual no posea
own_role: no se puede cambiar con tu rol actual
position: position:
elevated: no puede ser mayor que tu rol actual elevated: no puede ser mayor que tu rol actual
own_role: no se puede cambiar con tu rol actual

View File

@ -38,3 +38,12 @@ es-MX:
email: email:
blocked: utiliza un proveedor de correo no autorizado blocked: utiliza un proveedor de correo no autorizado
unreachable: no parece existir unreachable: no parece existir
role_id:
elevated: no puede ser mayor que tu rol actual
user_role:
attributes:
permissions_as_keys:
dangerous: incluir permisos que no son seguros para el rol base
elevated: no se pueden incluir permisos que tu rol actual no posea
position:
elevated: no puede ser mayor que tu rol actual

View File

@ -45,5 +45,7 @@ es:
permissions_as_keys: permissions_as_keys:
dangerous: incluir permisos que no son seguros para el rol base dangerous: incluir permisos que no son seguros para el rol base
elevated: no se pueden incluir permisos que tu rol actual no posea elevated: no se pueden incluir permisos que tu rol actual no posea
own_role: no se puede cambiar con tu rol actual
position: position:
elevated: no puede ser mayor que tu rol actual elevated: no puede ser mayor que tu rol actual
own_role: no se puede cambiar con tu rol actual

View File

@ -45,5 +45,7 @@ gl:
permissions_as_keys: permissions_as_keys:
dangerous: inclúe permisos que non son seguros para o rol básico dangerous: inclúe permisos que non son seguros para o rol básico
elevated: non pode incluir permisos que o teu rol actual non posúe elevated: non pode incluir permisos que o teu rol actual non posúe
own_role: non pode ser modificado co teu rol actual
position: position:
elevated: non pode superar ao teu rol actual elevated: non pode superar ao teu rol actual
own_role: non pode ser modificado co teu rol actual

View File

@ -45,5 +45,7 @@ hu:
permissions_as_keys: permissions_as_keys:
dangerous: tartalmaz olyan engedélyeket is, melyek az alap szerephez nem biztonságosak dangerous: tartalmaz olyan engedélyeket is, melyek az alap szerephez nem biztonságosak
elevated: nem tartalmazhat olyan engedélyeket, melyek nincsenek benne a jelenlegi szerepedben elevated: nem tartalmazhat olyan engedélyeket, melyek nincsenek benne a jelenlegi szerepedben
own_role: nem megváltoztatható a jelenlegi szerepköröddel
position: position:
elevated: nem lehet magasabb, mint a jelenlegi szereped elevated: nem lehet magasabb, mint a jelenlegi szereped
own_role: nem megváltoztatható a jelenlegi szerepköröddel

View File

@ -45,5 +45,7 @@ io:
permissions_as_keys: permissions_as_keys:
dangerous: inkluzas permisi quo ne esas segura por bazrolo dangerous: inkluzas permisi quo ne esas segura por bazrolo
elevated: ne povas inkluzar permisi quon vua nuna rolo ne havas elevated: ne povas inkluzar permisi quon vua nuna rolo ne havas
own_role: ne povas divenesar kun vua nuna rolo
position: position:
elevated: ne povas divenar plu alta kam vua nuna rolo elevated: ne povas divenar plu alta kam vua nuna rolo
own_role: ne povas divenesar kun vua nuna rolo

View File

@ -45,5 +45,7 @@ is:
permissions_as_keys: permissions_as_keys:
dangerous: hefur heimildir sem ekki eru öruggar fyrir grunnhlutverk dangerous: hefur heimildir sem ekki eru öruggar fyrir grunnhlutverk
elevated: getur ekki haft heimildir sem núverandi hlutverk þitt er ekki með elevated: getur ekki haft heimildir sem núverandi hlutverk þitt er ekki með
own_role: er ekki hægt að breyta með þinu hlutverki
position: position:
elevated: getur ekki verið veigameiri en núverandi hlutverk þitt elevated: getur ekki verið veigameiri en núverandi hlutverk þitt
own_role: er ekki hægt að breyta með þinu hlutverki

View File

@ -45,5 +45,7 @@ it:
permissions_as_keys: permissions_as_keys:
dangerous: include i permessi non sicuri per il ruolo di base dangerous: include i permessi non sicuri per il ruolo di base
elevated: non è possibile includere i permessi che il tuo ruolo attuale non possiede elevated: non è possibile includere i permessi che il tuo ruolo attuale non possiede
own_role: non può essere modificato con il tuo ruolo attuale
position: position:
elevated: non può essere superiore al tuo ruolo attuale elevated: non può essere superiore al tuo ruolo attuale
own_role: non può essere modificato con il tuo ruolo attuale

View File

@ -45,5 +45,7 @@ ko:
permissions_as_keys: permissions_as_keys:
dangerous: 기본 역할로 사용하기에 안전하지 않은 권한을 포함하고 있습니다 dangerous: 기본 역할로 사용하기에 안전하지 않은 권한을 포함하고 있습니다
elevated: 당신의 현재 역할이 가지고 있지 않은 권한은 포함할 수 없습니다 elevated: 당신의 현재 역할이 가지고 있지 않은 권한은 포함할 수 없습니다
own_role: 당신의 현재 역할을 변경할 수 없습니다
position: position:
elevated: 당신의 현재 역할보다 높을 수 없습니다 elevated: 당신의 현재 역할보다 높을 수 없습니다
own_role: 당신의 현재 역할을 변경할 수 없습니다

View File

@ -45,5 +45,7 @@ lv:
permissions_as_keys: permissions_as_keys:
dangerous: ietver atļaujas, kas nav drošas pamata lomai dangerous: ietver atļaujas, kas nav drošas pamata lomai
elevated: nevar ietvert atļaujas, kas nepieder tavai pašreizējai lomai elevated: nevar ietvert atļaujas, kas nepieder tavai pašreizējai lomai
own_role: nevar mainīt pert tavu pašreizējo lomu
position: position:
elevated: nevar būt augstāka par tavu pašreizējo lomu elevated: nevar būt augstāka par tavu pašreizējo lomu
own_role: nevar mainīt pert tavu pašreizējo lomu

View File

@ -38,3 +38,12 @@ pl:
email: email:
blocked: używa niedozwolonego dostawcy poczty elektronicznej blocked: używa niedozwolonego dostawcy poczty elektronicznej
unreachable: wydaje się nie istnieć unreachable: wydaje się nie istnieć
role_id:
elevated: nie może być wyższa niż twoja bieżąca rola
user_role:
attributes:
permissions_as_keys:
own_role: nie można zmienić z aktualną rolą
position:
elevated: nie może być wyższa niż twoja bieżąca rola
own_role: nie można zmienić z aktualną rolą

View File

@ -45,5 +45,7 @@ pt-PT:
permissions_as_keys: permissions_as_keys:
dangerous: incluir permissões que não são seguras para a função base dangerous: incluir permissões que não são seguras para a função base
elevated: não pode incluir permissões que a sua função atual não possui elevated: não pode incluir permissões que a sua função atual não possui
own_role: não pode ser alterado com a sua função atual
position: position:
elevated: não pode ser maior que o da sua função atual elevated: não pode ser maior que o da sua função atual
own_role: não pode ser alterado com a sua função atual

View File

@ -44,3 +44,4 @@ ru:
attributes: attributes:
permissions_as_keys: permissions_as_keys:
dangerous: включить разрешения, небезопасные для базовой роли dangerous: включить разрешения, небезопасные для базовой роли
own_role: невозможно изменить с вашей текущей ролью

View File

@ -45,5 +45,7 @@ sl:
permissions_as_keys: permissions_as_keys:
dangerous: vključi pravice, ki niso varne za osnovno vlogo dangerous: vključi pravice, ki niso varne za osnovno vlogo
elevated: ni mogoče vključiti pravic, ki jih vaša trenutna vloga ne vsebuje elevated: ni mogoče vključiti pravic, ki jih vaša trenutna vloga ne vsebuje
own_role: ni mogoče spremeniti z vašo trenutno vlogo
position: position:
elevated: ne more biti višje od vaše trenutne vloge elevated: ne more biti višje od vaše trenutne vloge
own_role: ni mogoče spremeniti z vašo trenutno vlogo

View File

@ -45,5 +45,7 @@ sq:
permissions_as_keys: permissions_as_keys:
dangerous: përfshi leje që sjanë të parrezik për rolin bazë dangerous: përfshi leje që sjanë të parrezik për rolin bazë
elevated: smund të përfshijë leje të cilat roli juaj i tanishëm si përfshin elevated: smund të përfshijë leje të cilat roli juaj i tanishëm si përfshin
own_role: smund të ndryshohet me rolin tuaj të tanishëm
position: position:
elevated: smund të jetë më i lartë sesa roli juaj i tanishëm elevated: smund të jetë më i lartë sesa roli juaj i tanishëm
own_role: smund të ndryshohet me rolin tuaj të tanishëm

View File

@ -38,3 +38,12 @@ th:
email: email:
blocked: ใช้ผู้ให้บริการอีเมลที่ไม่ได้รับอนุญาต blocked: ใช้ผู้ให้บริการอีเมลที่ไม่ได้รับอนุญาต
unreachable: ดูเหมือนว่าจะไม่มีอยู่ unreachable: ดูเหมือนว่าจะไม่มีอยู่
role_id:
elevated: ไม่สามารถสูงกว่าบทบาทปัจจุบันของคุณ
user_role:
attributes:
permissions_as_keys:
dangerous: รวมสิทธิ์ที่ไม่ปลอดภัยสำหรับบทบาทพื้นฐาน
elevated: ไม่สามารถรวบรวมสิทธิ์ในบทบาทปัจจุบันของคุณไม่ได้
position:
elevated: ไม่สามารถสูงกว่าบทบาทปัจจุบันของคุณ

View File

@ -45,5 +45,7 @@ uk:
permissions_as_keys: permissions_as_keys:
dangerous: включити небезпечні для базової ролі дозволи dangerous: включити небезпечні для базової ролі дозволи
elevated: не можна включити права, якими не володіє ваша поточна роль elevated: не можна включити права, якими не володіє ваша поточна роль
own_role: не можна змінити у вашій поточній ролі
position: position:
elevated: не може бути вищою за поточну роль elevated: не може бути вищою за поточну роль
own_role: не можна змінити у вашій поточній ролі

View File

@ -25,6 +25,10 @@ zh-CN:
attributes: attributes:
url: url:
invalid: 不是有效的 URL。 invalid: 不是有效的 URL。
doorkeeper/application:
attributes:
website:
invalid: 网址无效
status: status:
attributes: attributes:
reblog: reblog:
@ -34,3 +38,13 @@ zh-CN:
email: email:
blocked: 使用了被封禁的电子邮件提供商 blocked: 使用了被封禁的电子邮件提供商
unreachable: 似乎不存在 unreachable: 似乎不存在
role_id:
elevated: 不能高于您当前的角色
user_role:
attributes:
permissions_as_keys:
dangerous: 包含对基本角色不安全的权限
elevated: 不能包含您当前角色不拥有的权限
own_role: 无法以您当前的身份更改
position:
elevated: 不能高于您当前的角色

View File

@ -45,5 +45,7 @@ zh-TW:
permissions_as_keys: permissions_as_keys:
dangerous: 包含對基本角色不安全的權限 dangerous: 包含對基本角色不安全的權限
elevated: 不能包含您目前角色不具備的權限 elevated: 不能包含您目前角色不具備的權限
own_role: 無法被您目前的角色更改
position: position:
elevated: 不能高於您目前的角色 elevated: 不能高於您目前的角色
own_role: 無法被您目前的角色更改

View File

@ -7,7 +7,7 @@ ko:
send_paranoid_instructions: 당신의 이메일이 우리의 DB에 있을 경우 몇 분 이내로 확인 메일이 발송 됩니다. 이메일을 받지 못 한 경우, 스팸 폴더를 확인하세요. send_paranoid_instructions: 당신의 이메일이 우리의 DB에 있을 경우 몇 분 이내로 확인 메일이 발송 됩니다. 이메일을 받지 못 한 경우, 스팸 폴더를 확인하세요.
failure: failure:
already_authenticated: 이미 로그인 된 상태입니다. already_authenticated: 이미 로그인 된 상태입니다.
inactive: 계정이 활성화 되지 않았습니다. inactive: 계정이 아직 활성화 되지 않았습니다.
invalid: 올바르지 않은 %{authentication_keys} 혹은 패스워드입니다. invalid: 올바르지 않은 %{authentication_keys} 혹은 패스워드입니다.
last_attempt: 계정이 잠기기까지 한 번의 시도가 남았습니다. last_attempt: 계정이 잠기기까지 한 번의 시도가 남았습니다.
locked: 계정이 잠겼습니다. locked: 계정이 잠겼습니다.

View File

@ -81,16 +81,25 @@ th:
errors: errors:
messages: messages:
access_denied: เจ้าของทรัพยากรหรือเซิร์ฟเวอร์การอนุญาตปฏิเสธคำขอ access_denied: เจ้าของทรัพยากรหรือเซิร์ฟเวอร์การอนุญาตปฏิเสธคำขอ
credential_flow_not_configured: การไหลของข้อมูลรับรองรหัสผ่านเจ้าของทรัพยากรล้มเหลวเนื่องจาก Doorkeeper.configure.resource_owner_from_credentials ไม่ได้ถูกกำหนดค่า
invalid_client: การตรวจสอบสิทธิ์ไคลเอ็นต์ล้มเหลวเนื่องจากไคลเอ็นต์ที่ไม่รู้จัก ไม่รวมการตรวจสอบไคลเอ็นต์ หรือวิธีการตรวจสอบสิทธิ์ที่ไม่รองรับ
invalid_grant: การให้สิทธิ์ที่ระบุไม่ถูกต้อง หมดอายุ เพิกถอน ไม่ตรงกับ URI การเปลี่ยนเส้นทางที่ใช้ในคำขอการให้สิทธิ์ หรือออกให้ไคลเอ็นต์อื่น
invalid_redirect_uri: URI การเปลี่ยนเส้นทางที่รวมอยู่ไม่ถูกต้อง invalid_redirect_uri: URI การเปลี่ยนเส้นทางที่รวมอยู่ไม่ถูกต้อง
invalid_request: invalid_request:
missing_param: 'พารามิเตอร์ที่จำเป็นขาดหายไป: %{value}' missing_param: 'พารามิเตอร์ที่จำเป็นขาดหายไป: %{value}'
request_not_authorized: คำขอต้องได้รับอนุญาต พารามิเตอร์ที่จำเป็นสำหรับการให้สิทธิ์คำขอขาดหายไปหรือไม่ถูกต้อง
unknown: คำขอไม่มีพารามิเตอร์ที่จำเป็น มีค่าพารามิเตอร์ที่ไม่รองรับ หรืออยู่ในรูปแบบที่ไม่ถูกต้อง
invalid_resource_owner: ข้อมูลรับรองเจ้าของทรัพยากรที่ระบุไม่ถูกต้อง หรือไม่พบเจ้าของทรัพยากร
invalid_scope: ขอบเขตที่ขอไม่ถูกต้อง ไม่รู้จัก หรือผิดรูปแบบ invalid_scope: ขอบเขตที่ขอไม่ถูกต้อง ไม่รู้จัก หรือผิดรูปแบบ
invalid_token: invalid_token:
expired: โทเคนการเข้าถึงหมดอายุแล้ว expired: โทเคนการเข้าถึงหมดอายุแล้ว
revoked: เพิกถอนโทเคนการเข้าถึงแล้ว revoked: เพิกถอนโทเคนการเข้าถึงแล้ว
unknown: โทเคนการเข้าถึงไม่ถูกต้อง unknown: โทเคนการเข้าถึงไม่ถูกต้อง
resource_owner_authenticator_not_configured: การค้นหาเจ้าของทรัพยากรล้มเหลวเนื่องจากไม่ได้กำหนดค่า Doorkeeper.configure.resource_owner_authenticator resource_owner_authenticator_not_configured: การค้นหาเจ้าของทรัพยากรล้มเหลวเนื่องจากไม่ได้กำหนดค่า Doorkeeper.configure.resource_owner_authenticator
server_error: เซิร์ฟเวอร์การให้สิทธิ์พบสภาวะที่ไม่คาดคิดซึ่งทำให้ไม่สามารถดำเนินการตามคำขอได้
temporarily_unavailable: ขณะนี้เซิร์ฟเวอร์การให้สิทธิ์ไม่สามารถจัดการตามคำขอได้ เนื่องจากการโอเวอร์โหลดหรือมีการบำรุงรักษาเซิร์ฟเวอร์ชั่วคราว
unauthorized_client: ไคลเอ็นต์ไม่ได้รับอนุญาตให้ทำคำขอนี้โดยใช้วิธีการนี้ unauthorized_client: ไคลเอ็นต์ไม่ได้รับอนุญาตให้ทำคำขอนี้โดยใช้วิธีการนี้
unsupported_grant_type: ประเภทการให้สิทธิ์ไม่ได้รับการสนับสนุนโดยเซิร์ฟเวอร์การให้สิทธิ์นะ
unsupported_response_type: เซิร์ฟเวอร์การอนุญาตไม่รองรับชนิดการตอบสนองนี้ unsupported_response_type: เซิร์ฟเวอร์การอนุญาตไม่รองรับชนิดการตอบสนองนี้
flash: flash:
applications: applications:

View File

@ -2,15 +2,15 @@
eo: eo:
about: about:
about_hashtag_html: Ĉi tiuj estas la publikaj mesaĝoj markitaj per <strong>#%{hashtag}</strong>. Vi povas interagi kun ili se vi havas konton ie ajn en la fediverse. about_hashtag_html: Ĉi tiuj estas la publikaj mesaĝoj markitaj per <strong>#%{hashtag}</strong>. Vi povas interagi kun ili se vi havas konton ie ajn en la fediverse.
about_mastodon_html: Mastodon estas socia reto bazita sur malfermitaj retaj protokoloj kaj sur libera malfermitkoda programo. Ĝi estas sencentra kiel retmesaĝoj. about_mastodon_html: 'Mastodon estas socia retejo de la estonteco: sen reklamo, sen kompania gvato, etika dezajno kaj malcentraligo! Vi regu viajn datumojn kun Mastodon!'
about_this: Pri about_this: Pri
active_count_after: aktiva active_count_after: aktivaj
active_footnote: Monate Aktivaj Uzantoj (MAU) active_footnote: Monate Aktivaj Uzantoj (MAU)
administered_by: 'Administrata de:' administered_by: 'Administrata de:'
api: API api: API
apps: Poŝtelefonaj aplikaĵoj apps: Poŝtelefonaj aplikaĵoj
apps_platforms: Uzu Mastodon ĉe iOS, Android kaj aliajn platformojn apps_platforms: Uzu Mastodon de iOS, Android, kaj aliaj substratoj
browse_directory: Esplori profilujo kaj filtri per interesoj browse_directory: Esplori la profilujon kaj filtri en interesoj
browse_local_posts: Vidi vivantan fluon de publikaj mesaĝoj al Mastodon browse_local_posts: Vidi vivantan fluon de publikaj mesaĝoj al Mastodon
browse_public_posts: Vidi vivantan fluon de publikaj mesaĝoj al Mastodon browse_public_posts: Vidi vivantan fluon de publikaj mesaĝoj al Mastodon
contact: Kontakto contact: Kontakto
@ -40,11 +40,12 @@ eo:
unavailable_content: Moderigitaj serviloj unavailable_content: Moderigitaj serviloj
unavailable_content_description: unavailable_content_description:
domain: Servilo domain: Servilo
reason: 'Kialo:' reason: Motivo
rejecting_media: 'La aŭdovidaj dosieroj de ĉi tiuj serviloj ne estos prilaboritaj aŭ stokitaj, kaj neniu bildeto estos montrita, do necesas klaki permane por vidi la originalan afiŝon:' rejecting_media: 'La aŭdovidaj dosieroj de ĉi tiuj serviloj ne estos prilaboritaj aŭ stokitaj, kaj neniu bildeto estos montrita, do necesas klaki permane por vidi la originalan afiŝon:'
rejecting_media_title: Filtritaj aŭdovidaĵoj rejecting_media_title: Filtritaj aŭdovidaĵoj
silenced: 'La mesaĝoj de tiuj serviloj estos kaŝitaj de publikaj templinio kaj konversacioj, kaj la interagoj de la uzantoj donas neniun sciigon, ĝis vi sekvos ilin:' silenced: 'La mesaĝoj de tiuj serviloj estos kaŝitaj de publikaj templinio kaj konversacioj, kaj la interagoj de la uzantoj donas neniun sciigon, ĝis vi sekvos ilin:'
silenced_title: Silentigitaj serviloj silenced_title: Limigitaj serviloj
suspended: 'Neniu datumo de ĉi tiuj serviloj estos prilaboritaj, stokitaj, aŭ interŝanĝitaj, neeble fari interagon aŭ komunikon kun la uzantoj de ĉi tiuj serviloj:'
suspended_title: Suspenditaj serviloj suspended_title: Suspenditaj serviloj
user_count_after: user_count_after:
one: uzanto one: uzanto
@ -154,8 +155,9 @@ eo:
push_subscription_expires: Eksvalidiĝo de la abono al PuSH push_subscription_expires: Eksvalidiĝo de la abono al PuSH
redownload: Aktualigi profilon redownload: Aktualigi profilon
reject: Malakcepti reject: Malakcepti
remove_avatar: Forigi la rolfigron remove_avatar: Forigi la rolfiguron
remove_header: Forigi kapan bildon remove_header: Forigi kapan bildon
removed_avatar_msg: La bildo de la rolfiguro de %{username} estas sukcese forigita
resend_confirmation: resend_confirmation:
already_confirmed: Ĉi tiu uzanto jam estas konfirmita already_confirmed: Ĉi tiu uzanto jam estas konfirmita
send: Resendi konfirman retmesaĝon send: Resendi konfirman retmesaĝon
@ -227,7 +229,7 @@ eo:
memorialize_account: Memorigu Konton memorialize_account: Memorigu Konton
promote_user: Promocii Uzanton promote_user: Promocii Uzanton
reject_user: Malakcepti Uzanton reject_user: Malakcepti Uzanton
remove_avatar_user: Forigi la rolfigron remove_avatar_user: Forigi la rolfiguron
reopen_report: Remalfermi signalon reopen_report: Remalfermi signalon
reset_password_user: Restarigi pasvorton reset_password_user: Restarigi pasvorton
resolve_report: Solvitaj reporto resolve_report: Solvitaj reporto
@ -518,6 +520,8 @@ eo:
view_profile: Vidi profilon view_profile: Vidi profilon
roles: roles:
everyone: Implicitaj permesoj everyone: Implicitaj permesoj
privileges:
delete_user_data: Forviŝi la datumojn de la uzanto
rules: rules:
add_new: Aldoni regulon add_new: Aldoni regulon
delete: Forigi delete: Forigi
@ -1117,7 +1121,7 @@ eo:
ios: iOS ios: iOS
linux: Linux linux: Linux
mac: Mac mac: Mac
other: nekonata platformo other: nekonata substrato
windows: Windows windows: Windows
windows_mobile: Windows Mobile windows_mobile: Windows Mobile
windows_phone: Windows Phone windows_phone: Windows Phone
@ -1262,7 +1266,7 @@ eo:
suspend: Konto suspendita suspend: Konto suspendita
welcome: welcome:
edit_profile_action: Agordi profilon edit_profile_action: Agordi profilon
edit_profile_step: Vi povas proprigi vian profilon per alŝuto de profilbildo, fonbildo, ŝanĝo de via afiŝita nomo kaj pli. Se vi ŝatus kontroli novajn sekvantojn antaŭ ol ili rajtas sekvi vin, vi povas ŝlosi vian konton. edit_profile_step: Vi povas personecigi vian profilon en alŝuto de rolfiguro, paĝokapa bildo, en ŝanĝo de via vidiga nomo kaj pli. Se vi volas ekzameni novajn sekvantojn antaŭ ol permesi al ili aboni vin, vi povas agordi vian konton kiel privata.
explanation: Jen kelkaj konsiloj por helpi vin komenci explanation: Jen kelkaj konsiloj por helpi vin komenci
final_action: Ekmesaĝi final_action: Ekmesaĝi
final_step: 'Ekmesaĝu! Eĉ sen sekvantoj, viaj publikaj mesaĝoj povas esti vidataj de aliaj, ekzemple en la loka templinio kaj en la kradvortoj. Eble vi ŝatus prezenti vin per la kradvorto #introductions.' final_step: 'Ekmesaĝu! Eĉ sen sekvantoj, viaj publikaj mesaĝoj povas esti vidataj de aliaj, ekzemple en la loka templinio kaj en la kradvortoj. Eble vi ŝatus prezenti vin per la kradvorto #introductions.'

View File

@ -538,7 +538,7 @@ is:
public_comment: Opinber athugasemd public_comment: Opinber athugasemd
purge: Henda purge: Henda
purge_description_html: Ef þú heldur að þetta lén sé farið endanlega af netinu, geturðu eytt öllum færslum aðganga og tengdum gögnum frá þessu léni úr gagnageymslum þínum. Þetta gæti tekið þó nokkra stund. purge_description_html: Ef þú heldur að þetta lén sé farið endanlega af netinu, geturðu eytt öllum færslum aðganga og tengdum gögnum frá þessu léni úr gagnageymslum þínum. Þetta gæti tekið þó nokkra stund.
title: Samband title: Netþjónasambönd
total_blocked_by_us: Útilokað af okkur total_blocked_by_us: Útilokað af okkur
total_followed_by_them: Fylgt af þeim total_followed_by_them: Fylgt af þeim
total_followed_by_us: Fylgt af okkur total_followed_by_us: Fylgt af okkur
@ -681,10 +681,30 @@ is:
manage_appeals_description: Leyfir notendum að yfirfara áfrýjanir vegna aðgerða umsjónarfólks manage_appeals_description: Leyfir notendum að yfirfara áfrýjanir vegna aðgerða umsjónarfólks
manage_blocks: Sýsla með útilokanir manage_blocks: Sýsla með útilokanir
manage_blocks_description: Leyfir notendum að loka á tölvupóstþjónustur og IP-vistföng manage_blocks_description: Leyfir notendum að loka á tölvupóstþjónustur og IP-vistföng
manage_custom_emojis: Sýsla með sérsniðin tjáningartákn
manage_custom_emojis_description: Leyfir notendum að sýsla með sérsniðin tjáningartákn á netþjóninum
manage_federation: Sýsla með netþjónasambönd
manage_federation_description: Leyfir notendum að loka á eða leyfa samþættingu við önnur lén (federation) og stýra afhendingu skilaboða
manage_invites: Sýsla með boðsgesti
manage_invites_description: Leyfir notendum að vafra um og gera boðstengla óvirka
manage_reports: Sýsla með kærur
manage_reports_description: Leyfir notendum að yfirfara kærur og framkvæma umsýsluaðgerðir sem byggjast á þeim
manage_roles: Sýsla með hlutverk
manage_roles_description: Leyfir notendum að sýsla með hlutverk og úthluta hlutverkum sem eru réttminni en þeirra eigið
manage_rules: Sýsla með reglur manage_rules: Sýsla með reglur
manage_rules_description: Leyfir notendum að breyta reglum á netþjóninum manage_rules_description: Leyfir notendum að breyta reglum á netþjóninum
manage_settings: Sýsla með stillingar manage_settings: Sýsla með stillingar
manage_settings_description: Leyfir notendum að breyta stillingum vefsvæðisins manage_settings_description: Leyfir notendum að breyta stillingum vefsvæðisins
manage_taxonomies: Sýsla með vægi efnis
manage_taxonomies_description: Leyfir notendum að yfirfara vinsælt efni og uppfæra stillingar myllumerkja
manage_user_access: Sýsla með notendaaðgang
manage_user_access_description: Leyfir notendum að gera tveggja-þátta auðkenningu annarra notenda óvirka, breyta tölvupóstfangi þeirra og endurstilla lykilorð
manage_users: Sýsla með notendur
manage_users_description: Leyfir notendum að sýsla með nánari upplýsingar um aðra notendur og framkvæma umsýsluaðgerðir gagnvart þeim
manage_webhooks: Sýsla með Webhook-vefkrækjur
manage_webhooks_description: Leyfir notendum að setja upp webhook-vefkrækjur vagna stjórnunartengdra atburða
view_audit_log: Skoða atvikaskráningu
view_audit_log_description: Leyfir notendum að skoða feril stjórnunaraðgerða á netþjóninum
view_dashboard: Skoða stjórnborð view_dashboard: Skoða stjórnborð
view_dashboard_description: Leyfir notendum að skoða stjórnborðið og sjá ýmsar mælingar view_dashboard_description: Leyfir notendum að skoða stjórnborðið og sjá ýmsar mælingar
view_devops: Kerfisstjórar view_devops: Kerfisstjórar

View File

@ -648,8 +648,10 @@ ko:
moderation: 중재 moderation: 중재
special: 특수 special: 특수
delete: 삭제 delete: 삭제
description_html: "<strong>사용자 역할</strong>을 통해, 사용자들이 마스토돈의 어떤 기능과 영역에 접근할 수 있을지 설정할 수 있습니다."
edit: "%{name} 역할 수정" edit: "%{name} 역할 수정"
everyone: 기본 권한 everyone: 기본 권한
everyone_full_description_html: 이것은 <strong>모든 사용자</strong>에게 적용될 <strong>기본 역할</strong>이며, 역할을 지정하지 않아도 적용됩니다. 다른 모든 역할들은 여기에서 권한을 상속합니다.
permissions_count: permissions_count:
other: "%{count} 개의 권한" other: "%{count} 개의 권한"
privileges: privileges:

View File

@ -725,6 +725,14 @@ pl:
manage_taxonomies: Zarządzaj taksonomiami manage_taxonomies: Zarządzaj taksonomiami
manage_taxonomies_description: Pozwala użytkownikom przeglądać najpopularniejsze treści i aktualizować ustawienia hasztagów manage_taxonomies_description: Pozwala użytkownikom przeglądać najpopularniejsze treści i aktualizować ustawienia hasztagów
manage_user_access: Zarządzaj dostępem użytkownika manage_user_access: Zarządzaj dostępem użytkownika
manage_users: Zarządzanie użytkownikami
manage_webhooks: Zarządzanie webhookami
view_audit_log: Wyświetl dziennik zdarzeń
view_audit_log_description: Pozwala użytkownikom zobaczyć historię działań administracyjnych na serwerze
view_dashboard: Wyświetl panel
view_devops: Devops
view_devops_description: Pozwala użytkownikom na dostęp do paneli Sidekiq i pgHero
title: Role
rules: rules:
add_new: Dodaj zasadę add_new: Dodaj zasadę
delete: Usuń delete: Usuń

View File

@ -98,9 +98,11 @@ is:
chosen_languages: Þegar merkt er við þetta, birtast einungis færslur á völdum tungumálum á opinberum tímalínum chosen_languages: Þegar merkt er við þetta, birtast einungis færslur á völdum tungumálum á opinberum tímalínum
role: Hlutverk stýrir hvaða heimildir notandinn hefur role: Hlutverk stýrir hvaða heimildir notandinn hefur
user_role: user_role:
color: Litur sem notaður er fyrir hlutverkið allsstaðar í viðmótinu, sem RGB-gildi á hex-sniði
highlighted: Þetta gerir hlutverk sýnilegt opinberlega highlighted: Þetta gerir hlutverk sýnilegt opinberlega
name: Opinbert heiti hlutverks, ef birta á hlutverk sem merki name: Opinbert heiti hlutverks, ef birta á hlutverk sem merki
permissions_as_keys: Notendur með þetta hlutverk munu hafa aðgang að... permissions_as_keys: Notendur með þetta hlutverk munu hafa aðgang að...
position: Rétthærra hlutverk ákvarðar lausn árekstra í ákveðnum tilfellum. Sumar aðgerðir er aðeins hægt að framkvæma á hlutverk með lægri forgangi
webhook: webhook:
events: Veldu atburði sem á að senda events: Veldu atburði sem á að senda
url: Hvert atburðir verða sendir url: Hvert atburðir verða sendir

View File

@ -102,6 +102,7 @@ ko:
highlighted: 이 역할이 공개적으로 보이도록 설정합니다 highlighted: 이 역할이 공개적으로 보이도록 설정합니다
name: 역할이 배지로 표시될 경우, 그 역할에 대한 공개적인 이름입니다 name: 역할이 배지로 표시될 경우, 그 역할에 대한 공개적인 이름입니다
permissions_as_keys: 이 역할을 가진 사용자는 다음에 접근할 수 있게 됩니다... permissions_as_keys: 이 역할을 가진 사용자는 다음에 접근할 수 있게 됩니다...
position: 특정 상황에서 충돌이 발생할 경우 더 높은 역할이 충돌을 해결합니다. 특정 작업은 우선순위가 낮은 역할에 대해서만 수행될 수 있습니다
webhook: webhook:
events: 전송할 이벤트를 선택하세요 events: 전송할 이벤트를 선택하세요
url: 이벤트가 어디로 전송될 지 url: 이벤트가 어디로 전송될 지

View File

@ -234,6 +234,14 @@ pl:
name: Hashtag name: Hashtag
trendable: Pozwól na wyświetlanie tego hashtagu w „Na czasie” trendable: Pozwól na wyświetlanie tego hashtagu w „Na czasie”
usable: Pozwól na umieszczanie tego hashtagu we wpisach usable: Pozwól na umieszczanie tego hashtagu we wpisach
user:
role: Rola
user_role:
color: Kolor odznaki
highlighted: Wyświetl rolę jako odznakę na profilach użytkowników
name: Nazwa
permissions_as_keys: Uprawnienia
position: Priorytet
webhook: webhook:
events: Włączone zdarzenia events: Włączone zdarzenia
url: Endpoint URL url: Endpoint URL

View File

@ -64,9 +64,15 @@ th:
domain_allow: domain_allow:
domain: โดเมนนี้จะสามารถดึงข้อมูลจากเซิร์ฟเวอร์นี้และจะประมวลผลและจัดเก็บข้อมูลขาเข้าจากโดเมน domain: โดเมนนี้จะสามารถดึงข้อมูลจากเซิร์ฟเวอร์นี้และจะประมวลผลและจัดเก็บข้อมูลขาเข้าจากโดเมน
email_domain_block: email_domain_block:
domain: อาจเป็นชื่อโดเมนที่แสดงในที่อยู่อีเมลหรือทะเบียน MX ที่ใช้อยู่ พวกเขาอาจจะได้รับการตรวจสอบเมื่อมีการสมัคร
with_dns_records: จะทำการพยายามแปลงที่อยู่ระเบียน DNS ของโดเมนที่กำหนดและจะปิดกั้นผลลัพธ์เช่นกัน with_dns_records: จะทำการพยายามแปลงที่อยู่ระเบียน DNS ของโดเมนที่กำหนดและจะปิดกั้นผลลัพธ์เช่นกัน
featured_tag: featured_tag:
name: 'คุณอาจต้องการใช้หนึ่งในนี้:' name: 'คุณอาจต้องการใช้หนึ่งในนี้:'
filters:
action: เลือกการดำเนินการเมื่อโพสต์ตรงกับตัวกรอง
actions:
hide: ซ่อนเนื้อหาที่ถูกกรองโดยสิ้นเชิง ทำตัวราวกับว่าไม่มีอยู่จริง
warn: ซ่อนเนื้อหาที่ถูกกรองไว้ด้านหลังคำเตือนที่กล่าวถึงชื่อตัวกรอง
form_challenge: form_challenge:
current_password: คุณกำลังเข้าสู่พื้นที่ปลอดภัย current_password: คุณกำลังเข้าสู่พื้นที่ปลอดภัย
imports: imports:
@ -75,6 +81,7 @@ th:
text: นี่จะช่วยให้เราตรวจทานใบสมัครของคุณ text: นี่จะช่วยให้เราตรวจทานใบสมัครของคุณ
ip_block: ip_block:
comment: ไม่จำเป็น จดจำเหตุผลที่คุณเพิ่มกฎนี้ comment: ไม่จำเป็น จดจำเหตุผลที่คุณเพิ่มกฎนี้
expires_in: ที่อยู่ IP เป็นทรัพยากร บางครั้งมีการแบ่งปันและมักเปลี่ยนมือ ด้วยเหตุผลนี้ จึงไม่แนะนำให้บล็อก IP
ip: ป้อนที่อยู่ IPv4 หรือ IPv6 คุณสามารถปิดกั้นทั้งช่วงได้โดยใช้ไวยากรณ์ CIDR ระวังอย่าล็อคตัวคุณเองออก! ip: ป้อนที่อยู่ IPv4 หรือ IPv6 คุณสามารถปิดกั้นทั้งช่วงได้โดยใช้ไวยากรณ์ CIDR ระวังอย่าล็อคตัวคุณเองออก!
severities: severities:
no_access: ปิดกั้นการเข้าถึงทรัพยากรทั้งหมด no_access: ปิดกั้นการเข้าถึงทรัพยากรทั้งหมด
@ -84,12 +91,21 @@ th:
text: อธิบายกฎหรือข้อกำหนดสำหรับผู้ใช้ในเซิร์ฟเวอร์นี้ พยายามทำให้กฎหรือข้อกำหนดสั้นและเรียบง่าย text: อธิบายกฎหรือข้อกำหนดสำหรับผู้ใช้ในเซิร์ฟเวอร์นี้ พยายามทำให้กฎหรือข้อกำหนดสั้นและเรียบง่าย
sessions: sessions:
otp: 'ป้อนรหัสสองปัจจัยที่สร้างโดยแอปในโทรศัพท์ของคุณหรือใช้หนึ่งในรหัสกู้คืนของคุณ:' otp: 'ป้อนรหัสสองปัจจัยที่สร้างโดยแอปในโทรศัพท์ของคุณหรือใช้หนึ่งในรหัสกู้คืนของคุณ:'
webauthn: หากเป็นคีย์ USB อย่าลืมเสียบไว้ และหากจำเป็น ให้แตะคีย์นั้นไว้นะ
tag: tag:
name: คุณสามารถเปลี่ยนได้เฉพาะตัวพิมพ์ใหญ่เล็กของตัวอักษรเท่านั้น ตัวอย่างเช่น เพื่อทำให้ตัวอักษรอ่านได้ง่ายขึ้น name: คุณสามารถเปลี่ยนได้เฉพาะตัวพิมพ์ใหญ่เล็กของตัวอักษรเท่านั้น ตัวอย่างเช่น เพื่อทำให้ตัวอักษรอ่านได้ง่ายขึ้น
user: user:
chosen_languages: เมื่อกาเครื่องหมาย จะแสดงเฉพาะโพสต์ในภาษาที่เลือกในเส้นเวลาสาธารณะเท่านั้น chosen_languages: เมื่อกาเครื่องหมาย จะแสดงเฉพาะโพสต์ในภาษาที่เลือกในเส้นเวลาสาธารณะเท่านั้น
role: ควบคุมบทบาท ว่าผู้ใช้มีสิทธิใดบ้าง
user_role:
color: สีที่จะใช้สำหรับบทบาทตลอดทั้ง UI เป็น RGB ในรูปแบบฐานสิบหก
highlighted: ทำให้บทบาทนี้ปรากฏต่อสู่สาธารณะ
name: ชื่อสาธารณะของบทบาท หากกำหนดบทบาทให้แสดงเป็นตราสัญลักษณ์
permissions_as_keys: ผู้ใช้ที่มีบทบาทนี้จะมีสิทธิ์เข้าถึง...
position: บทบาทที่สูงขึ้นอาจจะตัดสินใจแก้ไขข้อขัดแย้งในบางสถานการณ์ การดำเนินการบางอย่างสามารถทำได้เฉพาะกับบทบาทที่มีลำดับความสำคัญต่ำกว่า
webhook: webhook:
events: เลือกเหตุการณ์ที่จะส่ง events: เลือกเหตุการณ์ที่จะส่ง
url: กิจกรรมจะถูกส่งไปที่
labels: labels:
account: account:
fields: fields:
@ -120,6 +136,8 @@ th:
scheduled_at: จัดกำหนดการเผยแพร่ scheduled_at: จัดกำหนดการเผยแพร่
starts_at: การเริ่มต้นเหตุการณ์ starts_at: การเริ่มต้นเหตุการณ์
text: ประกาศ text: ประกาศ
appeal:
text: อธิบายว่าเหตุใดจึงควรกลับคำตัดสินนี้
defaults: defaults:
autofollow: เชิญให้ติดตามบัญชีของคุณ autofollow: เชิญให้ติดตามบัญชีของคุณ
avatar: ภาพประจำตัว avatar: ภาพประจำตัว
@ -184,6 +202,10 @@ th:
with_dns_records: รวมระเบียน MX และ IP ของโดเมน with_dns_records: รวมระเบียน MX และ IP ของโดเมน
featured_tag: featured_tag:
name: แฮชแท็ก name: แฮชแท็ก
filters:
actions:
hide: ซ่อนอย่างสมบูรณ์
warn: ซ่อนพร้อมคำเตือน
interactions: interactions:
must_be_follower: ปิดกั้นการแจ้งเตือนจากผู้ที่ไม่ใช่ผู้ติดตาม must_be_follower: ปิดกั้นการแจ้งเตือนจากผู้ที่ไม่ใช่ผู้ติดตาม
must_be_following: ปิดกั้นการแจ้งเตือนจากผู้คนที่คุณไม่ได้ติดตาม must_be_following: ปิดกั้นการแจ้งเตือนจากผู้คนที่คุณไม่ได้ติดตาม
@ -220,9 +242,13 @@ th:
user: user:
role: บทบาท role: บทบาท
user_role: user_role:
color: สีของตรา
highlighted: แสดงบทบาทเป็นเครื่องหมายบนโปรไฟล์ผู้ใช้
name: ชื่อ name: ชื่อ
permissions_as_keys: สิทธิอนุญาต permissions_as_keys: สิทธิอนุญาต
position: ระดับความสำคัญ
webhook: webhook:
events: เปิดใช้งานอีเว้น
url: URL ปลายทาง url: URL ปลายทาง
'no': ไม่ 'no': ไม่
recommended: แนะนำ recommended: แนะนำ

View File

@ -68,6 +68,11 @@ zh-CN:
with_dns_records: Mastodon 会尝试解析所给域名的 DNS 记录,然后把解析结果一并封禁 with_dns_records: Mastodon 会尝试解析所给域名的 DNS 记录,然后把解析结果一并封禁
featured_tag: featured_tag:
name: 你可能想要使用以下之一: name: 你可能想要使用以下之一:
filters:
action: 选择在帖子匹配过滤器时要执行的操作
actions:
hide: 彻底屏蔽过滤内容,犹如它不曾存在过一般
warn: 在警告中提及过滤器标题后,隐藏过滤内容
form_challenge: form_challenge:
current_password: 你正在进入安全区域 current_password: 你正在进入安全区域
imports: imports:
@ -91,6 +96,16 @@ zh-CN:
name: 你只能改变字母的大小写,让它更易读 name: 你只能改变字母的大小写,让它更易读
user: user:
chosen_languages: 仅选中语言的嘟文会出现在公共时间轴上(全不选则显示所有语言的嘟文) chosen_languages: 仅选中语言的嘟文会出现在公共时间轴上(全不选则显示所有语言的嘟文)
role: 角色决定该用户拥有的权限
user_role:
color: 整个用户界面中该角色使用的颜色以RGB 十六进制格式
highlighted: 这使角色公开可见
name: 角色的公开名称,如果角色设置为展示的徽章
permissions_as_keys: 具有此角色的用户将有权访问...
position: 较高的角色决定在某些情况下解决冲突。某些行动只能对优先级较低的角色执行
webhook:
events: 选择要发送的事件
url: 事件将发送到哪个地点
labels: labels:
account: account:
fields: fields:
@ -178,6 +193,7 @@ zh-CN:
setting_use_pending_items: 慢速模式 setting_use_pending_items: 慢速模式
severity: 级别 severity: 级别
sign_in_token_attempt: 安全码 sign_in_token_attempt: 安全码
title: 标题
type: 导入数据类型 type: 导入数据类型
username: 用户名 username: 用户名
username_or_email: 用户名或电子邮件地址 username_or_email: 用户名或电子邮件地址
@ -186,6 +202,10 @@ zh-CN:
with_dns_records: 包括该域名的 MX 记录和 IP 地址 with_dns_records: 包括该域名的 MX 记录和 IP 地址
featured_tag: featured_tag:
name: 话题标签 name: 话题标签
filters:
actions:
hide: 完全隐藏
warn: 隐藏时显示警告信息
interactions: interactions:
must_be_follower: 屏蔽来自未关注我的用户的通知 must_be_follower: 屏蔽来自未关注我的用户的通知
must_be_following: 屏蔽来自我未关注的用户的通知 must_be_following: 屏蔽来自我未关注的用户的通知
@ -219,6 +239,17 @@ zh-CN:
name: 话题标签 name: 话题标签
trendable: 允许在热门下显示此话题 trendable: 允许在热门下显示此话题
usable: 允许嘟文使用此话题标签 usable: 允许嘟文使用此话题标签
user:
role: 角色
user_role:
color: 徽章颜色
highlighted: 用户配置中以徽章显示角色
name: 名称
permissions_as_keys: 权限设置
position: 优先权
webhook:
events: 已启用事件
url: 端点网址
'no': 'no':
recommended: 推荐 recommended: 推荐
required: required:

View File

@ -22,6 +22,9 @@ th:
federation_hint_html: ด้วยบัญชีที่ %{instance} คุณจะสามารถติดตามผู้คนในเซิร์ฟเวอร์ Mastodon และอื่น ๆ federation_hint_html: ด้วยบัญชีที่ %{instance} คุณจะสามารถติดตามผู้คนในเซิร์ฟเวอร์ Mastodon และอื่น ๆ
get_apps: ลองแอปมือถือ get_apps: ลองแอปมือถือ
hosted_on: Mastodon ที่โฮสต์ที่ %{domain} hosted_on: Mastodon ที่โฮสต์ที่ %{domain}
instance_actor_flash: 'บัญชีนี้เป็นนักแสดงเสมือนที่ใช้เพื่อเป็นตัวแทนของเซิร์ฟเวอร์เอง ไม่ใช่ผู้ใช้รายบุคคล แต่มันก็ถูกใช้เพื่อวัตถุประสงค์ในการรวมกลุ่มและไม่ควรถูกบล็อก เว้นแต่คุณต้องการบล็อกทั้งอินสแตนซ์นั้น ซึ่งในกรณีนี้คุณควรใช้บล็อกโดเมนนะ
'
learn_more: เรียนรู้เพิ่มเติม learn_more: เรียนรู้เพิ่มเติม
logged_in_as_html: คุณกำลังเข้าสู่ระบบเป็น %{username} ในปัจจุบัน logged_in_as_html: คุณกำลังเข้าสู่ระบบเป็น %{username} ในปัจจุบัน
logout_before_registering: คุณได้เข้าสู่ระบบอยู่แล้ว logout_before_registering: คุณได้เข้าสู่ระบบอยู่แล้ว
@ -46,6 +49,7 @@ th:
silenced_title: เซิร์ฟเวอร์ที่จำกัดอยู่ silenced_title: เซิร์ฟเวอร์ที่จำกัดอยู่
suspended: 'จะไม่ประมวลผล จัดเก็บ หรือแลกเปลี่ยนข้อมูลจากเซิร์ฟเวอร์เหล่านี้ ทำให้การโต้ตอบหรือการสื่อสารใด ๆ กับผู้ใช้จากเซิร์ฟเวอร์เหล่านี้เป็นไปไม่ได้:' suspended: 'จะไม่ประมวลผล จัดเก็บ หรือแลกเปลี่ยนข้อมูลจากเซิร์ฟเวอร์เหล่านี้ ทำให้การโต้ตอบหรือการสื่อสารใด ๆ กับผู้ใช้จากเซิร์ฟเวอร์เหล่านี้เป็นไปไม่ได้:'
suspended_title: เซิร์ฟเวอร์ที่ระงับอยู่ suspended_title: เซิร์ฟเวอร์ที่ระงับอยู่
unavailable_content_html: โดยทั่วไปแล้ว Mastodon อนุญาตให้คุณดูเนื้อหาและโต้ตอบกับผู้ใช้งานจากเซิร์ฟเวอร์อื่นใน fediverse เหล่านี้เป็นข้อยกเว้นที่เกิดขึ้นบนเซิร์ฟเวอร์นี้โดยเฉพาะ
user_count_after: user_count_after:
other: ผู้ใช้ other: ผู้ใช้
user_count_before: บ้านของ user_count_before: บ้านของ
@ -58,6 +62,7 @@ th:
followers: followers:
other: ผู้ติดตาม other: ผู้ติดตาม
following: กำลังติดตาม following: กำลังติดตาม
instance_actor_flash: บัญชีนี้เป็นนักแสดงเสมือนที่ใช้เพื่อเป็นตัวแทนของเซิร์ฟเวอร์เอง แต่ก็ไม่ใช่ผู้ใช้รายบุคคล แต่มันถูกใช้เพื่อวัตถุประสงค์ของการรวมกลุ่มและไม่ควรถูกระงับ
joined: เข้าร่วมเมื่อ %{date} joined: เข้าร่วมเมื่อ %{date}
last_active: ใช้งานล่าสุด last_active: ใช้งานล่าสุด
link_verified_on: ตรวจสอบความเป็นเจ้าของของลิงก์นี้เมื่อ %{date} link_verified_on: ตรวจสอบความเป็นเจ้าของของลิงก์นี้เมื่อ %{date}
@ -156,6 +161,7 @@ th:
most_recent_ip: IP ล่าสุด most_recent_ip: IP ล่าสุด
no_account_selected: ไม่มีการเปลี่ยนแปลงบัญชีเนื่องจากไม่มีการเลือก no_account_selected: ไม่มีการเปลี่ยนแปลงบัญชีเนื่องจากไม่มีการเลือก
no_limits_imposed: ไม่มีการกำหนดขีดจำกัด no_limits_imposed: ไม่มีการกำหนดขีดจำกัด
no_role_assigned: ไม่มีการกำหนดบทบาท
not_subscribed: ไม่ได้บอกรับ not_subscribed: ไม่ได้บอกรับ
pending: การตรวจทานที่รอดำเนินการ pending: การตรวจทานที่รอดำเนินการ
perform_full_suspension: ระงับ perform_full_suspension: ระงับ
@ -201,6 +207,8 @@ th:
subscribe: บอกรับ subscribe: บอกรับ
suspend: ระงับ suspend: ระงับ
suspended: ระงับอยู่ suspended: ระงับอยู่
suspension_irreversible: ข้อมูลของบัญชีนี้ถูกลบไม่สามารถย้อนกลับได้ คุณสามารถระงับบัญชีเพื่อให้ใช้งานได้ แต่จะไม่กู้คืนข้อมูลใดๆทั้งสิ้น ที่เคยมีอยู่ก่อนหน้านี้
suspension_reversible_hint_html: บัญชีถูกระงับ และข้อมูลจะถูกลบออกอย่างสมบูรณ์ในวันที่ %{date} ก่อนหน้านั้น บัญชีสามารถกู้คืนได้โดยไม่มีผลร้ายใดๆทั้งสิ้น ถ้าหากคุณต้องการลบข้อมูลของบัญชีทั้งหมดในทันที คุณสามารถทำได้ด้านล่างนี้
title: บัญชี title: บัญชี
unblock_email: เลิกปิดกั้นที่อยู่อีเมล unblock_email: เลิกปิดกั้นที่อยู่อีเมล
unblocked_email_msg: เลิกปิดกั้นที่อยู่อีเมลของ %{username} สำเร็จ unblocked_email_msg: เลิกปิดกั้นที่อยู่อีเมลของ %{username} สำเร็จ
@ -291,6 +299,7 @@ th:
destroy_instance_html: "%{name} ได้ล้างข้อมูลโดเมน %{target}" destroy_instance_html: "%{name} ได้ล้างข้อมูลโดเมน %{target}"
destroy_ip_block_html: "%{name} ได้ลบกฎสำหรับ IP %{target}" destroy_ip_block_html: "%{name} ได้ลบกฎสำหรับ IP %{target}"
destroy_status_html: "%{name} ได้เอาโพสต์โดย %{target} ออก" destroy_status_html: "%{name} ได้เอาโพสต์โดย %{target} ออก"
destroy_unavailable_domain_html: "%{name} ได้พักการจัดส่งไปยังโดเมน %{target}"
disable_2fa_user_html: "%{name} ได้ปิดใช้งานความต้องการสองปัจจัยสำหรับผู้ใช้ %{target}" disable_2fa_user_html: "%{name} ได้ปิดใช้งานความต้องการสองปัจจัยสำหรับผู้ใช้ %{target}"
disable_custom_emoji_html: "%{name} ได้ปิดใช้งานอีโมจิ %{target}" disable_custom_emoji_html: "%{name} ได้ปิดใช้งานอีโมจิ %{target}"
disable_sign_in_token_auth_user_html: "%{name} ได้ปิดใช้งานการรับรองความถูกต้องด้วยโทเคนอีเมลสำหรับ %{target}" disable_sign_in_token_auth_user_html: "%{name} ได้ปิดใช้งานการรับรองความถูกต้องด้วยโทเคนอีเมลสำหรับ %{target}"
@ -410,6 +419,8 @@ th:
destroyed_msg: เลิกทำการปิดกั้นโดเมนแล้ว destroyed_msg: เลิกทำการปิดกั้นโดเมนแล้ว
domain: โดเมน domain: โดเมน
edit: แก้ไขการปิดกั้นโดเมน edit: แก้ไขการปิดกั้นโดเมน
existing_domain_block: คุณได้กำหนดขีดจำกัดที่เข้มงวดขึ้นแล้วบน %{name}
existing_domain_block_html: คุณได้กำหนดขีดจำกัดที่เข้มงวดขึ้นใน %{name} แล้วคุณต้อง <a href="%{unblock_url}">unblock</a> ก่อน
new: new:
create: สร้างการปิดกั้น create: สร้างการปิดกั้น
hint: การปิดกั้นโดเมนจะไม่ป้องกันการสร้างรายการบัญชีในฐานข้อมูล แต่จะใช้วิธีการควบคุมที่เฉพาะเจาะจงกับบัญชีเหล่านั้นย้อนหลังและโดยอัตโนมัติ hint: การปิดกั้นโดเมนจะไม่ป้องกันการสร้างรายการบัญชีในฐานข้อมูล แต่จะใช้วิธีการควบคุมที่เฉพาะเจาะจงกับบัญชีเหล่านั้นย้อนหลังและโดยอัตโนมัติ
@ -420,8 +431,11 @@ th:
suspend: ระงับ suspend: ระงับ
title: การปิดกั้นโดเมนใหม่ title: การปิดกั้นโดเมนใหม่
obfuscate: ทำให้ชื่อโดเมนคลุมเครือ obfuscate: ทำให้ชื่อโดเมนคลุมเครือ
obfuscate_hint: อาจมีผลทำให้ชื่อโดเมนสับสนบางส่วนในรายการหากเปิดใช้งานการโฆษณารายการข้อจำกัดของโดเมน
private_comment: ความคิดเห็นส่วนตัว private_comment: ความคิดเห็นส่วนตัว
private_comment_hint: แสดงความคิดเห็นเกี่ยวกับข้อจำกัดของโดเมนนี้สำหรับการใช้งานภายในโดยผู้ดูแล
public_comment: ความคิดเห็นสาธารณะ public_comment: ความคิดเห็นสาธารณะ
public_comment_hint: แสดงความคิดเห็นเกี่ยวกับข้อจำกัดโดเมนนี้สำหรับบุคคลทั่วไป หากต้องการโฆษณารายการข้อจำกัดโดเมนเปิดใช้งานอยู่
reject_media: ปฏิเสธไฟล์สื่อ reject_media: ปฏิเสธไฟล์สื่อ
reject_media_hint: เอาไฟล์สื่อที่จัดเก็บไว้ในเซิร์ฟเวอร์ออกและปฏิเสธที่จะดาวน์โหลดไฟล์ใด ๆ ในอนาคต ไม่เกี่ยวข้องกับการระงับ reject_media_hint: เอาไฟล์สื่อที่จัดเก็บไว้ในเซิร์ฟเวอร์ออกและปฏิเสธที่จะดาวน์โหลดไฟล์ใด ๆ ในอนาคต ไม่เกี่ยวข้องกับการระงับ
reject_reports: ปฏิเสธรายงาน reject_reports: ปฏิเสธรายงาน

View File

@ -99,11 +99,17 @@ zh-CN:
avatar: 头像 avatar: 头像
by_domain: 域名 by_domain: 域名
change_email: change_email:
changed_msg: 已成功更改电子邮件地址!
current_email: 当前的电子邮箱 current_email: 当前的电子邮箱
label: 更改电子邮箱 label: 更改电子邮箱
new_email: 新的电子邮箱 new_email: 新的电子邮箱
submit: 更改电子邮件地址 submit: 更改电子邮件地址
title: 为 %{username} 更改电子邮箱 title: 为 %{username} 更改电子邮箱
change_role:
changed_msg: 已成功更改角色!
label: 更改角色
no_role: 未设置角色
title: 为 %{username} 更改角色
confirm: 确认 confirm: 确认
confirmed: 已确认 confirmed: 已确认
confirming: 等待确认 confirming: 等待确认
@ -147,6 +153,7 @@ zh-CN:
active: 活跃 active: 活跃
all: 全部 all: 全部
pending: 待审核 pending: 待审核
silenced: 受限
suspended: 已封禁 suspended: 已封禁
title: 管理 title: 管理
moderation_notes: 管理员备注 moderation_notes: 管理员备注
@ -154,6 +161,7 @@ zh-CN:
most_recent_ip: 最后一次活跃的 IP 地址 most_recent_ip: 最后一次活跃的 IP 地址
no_account_selected: 因为没有选中任何账号,所以没有更改 no_account_selected: 因为没有选中任何账号,所以没有更改
no_limits_imposed: 无限制 no_limits_imposed: 无限制
no_role_assigned: 未定角色
not_subscribed: 未订阅 not_subscribed: 未订阅
pending: 待审核 pending: 待审核
perform_full_suspension: 封禁 perform_full_suspension: 封禁
@ -179,6 +187,7 @@ zh-CN:
reset: 重置 reset: 重置
reset_password: 重置密码 reset_password: 重置密码
resubscribe: 重新订阅 resubscribe: 重新订阅
role: 角色
search: 搜索 search: 搜索
search_same_email_domain: 其他具有相同电子邮箱域名的用户 search_same_email_domain: 其他具有相同电子邮箱域名的用户
search_same_ip: 具有相同IP的其他用户 search_same_ip: 具有相同IP的其他用户
@ -626,6 +635,57 @@ zh-CN:
unresolved: 未处理 unresolved: 未处理
updated_at: 更新时间 updated_at: 更新时间
view_profile: 查看资料 view_profile: 查看资料
roles:
add_new: 添加角色
assigned_users:
other: "%{count} 用户"
categories:
administration: 管理
devops: 开发运维
invites: 邀请
moderation: 监察
special: 特殊
delete: 刪除
description_html: 使用 <strong>用户角色</strong>,您可以自定义您的用户可以访问的功能和区域。
edit: 编辑 '%{name}' 角色
everyone: 默认权限
everyone_full_description_html: 这是影响到 <strong>所有用户</strong>的<strong>基础角色</strong>,包括未指定角色的用户。 其他所有的角色都继承着它的权限。
permissions_count:
other: "%{count} 权限"
privileges:
administrator: 管理员
administrator_description: 拥有此权限的用户将绕过每个权限
delete_user_data: 删除用户数据
delete_user_data_description: 允许用户立即删除其他用户的数据
invite_users: 邀请用户
invite_users_description: 允许用户邀请新人加入服务器
manage_announcements: 管理公告
manage_announcements_description: 允许用户管理服务器上的通知
manage_appeals: 管理申诉
manage_appeals_description: 允许用户审查对适度动作的上诉
manage_blocks: 管理版块
manage_blocks_description: 允许用户屏蔽电子邮件提供商和IP地址
manage_custom_emojis: 管理自定义表情
manage_custom_emojis_description: 允许用户管理服务器上的自定义表情
manage_federation: 管理联邦
manage_invites: 管理邀请
manage_invites_description: 允许用户浏览和停用邀请链接
manage_reports: 管理报告
manage_reports_description: 允许用户查看报告并对其执行审核操作
manage_roles: 管理角色
manage_roles_description: 允许用户管理和分配比他们权限低的角色
manage_rules: 管理规则
manage_rules_description: 允许用户更改服务器规则
manage_settings: 管理设置
manage_settings_description: 允许用户更改站点设置
manage_users: 管理用户
manage_users_description: 允许用户查看其他用户信息并对他们执行审核操作
manage_webhooks: 管理网钩
manage_webhooks_description: 允许用户为管理事件设置网钩
view_audit_log: 查看审核日志
view_audit_log_description: 允许用户在服务器上查看管理操作历史
view_dashboard: 查看仪表板
view_dashboard_description: 允许用户访问仪表盘和各种指标
rules: rules:
add_new: 添加规则 add_new: 添加规则
delete: 删除 delete: 删除
@ -823,7 +883,11 @@ zh-CN:
webhooks: webhooks:
delete: 删除 delete: 删除
disable: 禁用 disable: 禁用
disabled: 已禁用
enable: 启用 enable: 启用
status: 状态
title: 网钩
webhook: 网钩
admin_mailer: admin_mailer:
new_appeal: new_appeal:
actions: actions:
@ -1084,8 +1148,11 @@ zh-CN:
index: index:
delete: 删除 delete: 删除
empty: 你没有过滤器。 empty: 你没有过滤器。
keywords:
other: "%{count} 关键词"
title: 过滤器 title: 过滤器
new: new:
save: 保存新过滤器
title: 添加新的过滤器 title: 添加新的过滤器
footer: footer:
developers: 开发者 developers: 开发者
@ -1202,6 +1269,8 @@ zh-CN:
copy_account_note_text: 这个用户迁移自 %{acct},你曾为其添加备注: copy_account_note_text: 这个用户迁移自 %{acct},你曾为其添加备注:
notification_mailer: notification_mailer:
admin: admin:
report:
subject: "%{name} 提交了报告"
sign_up: sign_up:
subject: "%{name} 注册了" subject: "%{name} 注册了"
digest: digest:

View File

@ -554,7 +554,7 @@ Rails.application.routes.draw do
resource :note, only: :create, controller: 'accounts/notes' resource :note, only: :create, controller: 'accounts/notes'
end end
resources :tags, only: [:show], constraints: { id: /#{Tag::HASHTAG_NAME_RE}/ } do resources :tags, only: [:show] do
member do member do
post :follow post :follow
post :unfollow post :unfollow

View File

@ -24,13 +24,13 @@
}, },
"private": true, "private": true,
"dependencies": { "dependencies": {
"@babel/core": "^7.18.6", "@babel/core": "^7.18.9",
"@babel/plugin-proposal-decorators": "^7.18.6", "@babel/plugin-proposal-decorators": "^7.18.9",
"@babel/plugin-transform-react-inline-elements": "^7.18.6", "@babel/plugin-transform-react-inline-elements": "^7.18.6",
"@babel/plugin-transform-runtime": "^7.18.6", "@babel/plugin-transform-runtime": "^7.18.9",
"@babel/preset-env": "^7.18.6", "@babel/preset-env": "^7.18.9",
"@babel/preset-react": "^7.18.6", "@babel/preset-react": "^7.18.6",
"@babel/runtime": "^7.18.6", "@babel/runtime": "^7.18.9",
"@gamestdio/websocket": "^0.3.2", "@gamestdio/websocket": "^0.3.2",
"@github/webauthn-json": "^0.5.7", "@github/webauthn-json": "^0.5.7",
"@rails/ujs": "^6.1.6", "@rails/ujs": "^6.1.6",
@ -104,14 +104,14 @@
"react-notification": "^6.8.5", "react-notification": "^6.8.5",
"react-overlays": "^0.9.3", "react-overlays": "^0.9.3",
"react-redux": "^7.2.8", "react-redux": "^7.2.8",
"react-redux-loading-bar": "^4.0.8", "react-redux-loading-bar": "^5.0.4",
"react-router-dom": "^4.1.1", "react-router-dom": "^4.1.1",
"react-router-scroll-4": "^1.0.0-beta.1", "react-router-scroll-4": "^1.0.0-beta.1",
"react-select": "^5.4.0", "react-select": "^5.4.0",
"react-sparklines": "^1.7.0", "react-sparklines": "^1.7.0",
"react-swipeable-views": "^0.14.0", "react-swipeable-views": "^0.14.0",
"react-textarea-autosize": "^8.3.4", "react-textarea-autosize": "^8.3.4",
"react-toggle": "^4.1.2", "react-toggle": "^4.1.3",
"redis": "^4.0.6 <4.1.0", "redis": "^4.0.6 <4.1.0",
"redux": "^4.2.0", "redux": "^4.2.0",
"redux-immutable": "^4.0.0", "redux-immutable": "^4.0.0",
@ -138,20 +138,20 @@
"webpack-cli": "^3.3.12", "webpack-cli": "^3.3.12",
"webpack-merge": "^5.8.0", "webpack-merge": "^5.8.0",
"wicg-inert": "^3.1.2", "wicg-inert": "^3.1.2",
"ws": "^8.8.0" "ws": "^8.8.1"
}, },
"devDependencies": { "devDependencies": {
"@babel/eslint-parser": "^7.18.2", "@babel/eslint-parser": "^7.18.9",
"@testing-library/jest-dom": "^5.16.4", "@testing-library/jest-dom": "^5.16.4",
"@testing-library/react": "^12.1.5", "@testing-library/react": "^12.1.5",
"babel-jest": "^28.1.2", "babel-jest": "^28.1.3",
"eslint": "^7.32.0", "eslint": "^7.32.0",
"eslint-plugin-import": "~2.26.0", "eslint-plugin-import": "~2.26.0",
"eslint-plugin-jsx-a11y": "~6.6.0", "eslint-plugin-jsx-a11y": "~6.6.0",
"eslint-plugin-promise": "~6.0.0", "eslint-plugin-promise": "~6.0.0",
"eslint-plugin-react": "~7.30.1", "eslint-plugin-react": "~7.30.1",
"jest": "^28.1.2", "jest": "^28.1.3",
"jest-environment-jsdom": "^28.1.2", "jest-environment-jsdom": "^28.1.3",
"postcss-scss": "^4.0.4", "postcss-scss": "^4.0.4",
"prettier": "^2.7.1", "prettier": "^2.7.1",
"raf": "^3.4.1", "raf": "^3.4.1",

1223
yarn.lock

File diff suppressed because it is too large Load Diff