diff --git a/Aptfile b/Aptfile index 3af0956e32b..f89f74bd4eb 100644 --- a/Aptfile +++ b/Aptfile @@ -4,3 +4,4 @@ ffmpeg libxdamage1 libxfixes3 libicu-dev +libidn11-dev diff --git a/app.json b/app.json index 049f63a9e59..a935b8232b8 100644 --- a/app.json +++ b/app.json @@ -2,7 +2,7 @@ "name": "Mastodon", "description": "A GNU Social-compatible microblogging server", "repository": "https://github.com/tootsuite/mastodon", - "logo": "https://github.com/tootsuite/mastodon/raw/master/app/assets/images/logo.png", + "logo": "https://github.com/tootsuite/mastodon/raw/master/app/javascript/images/logo.svg", "env": { "HEROKU": { "description": "Leave this as true", diff --git a/app/controllers/api/v1/favourites_controller.rb b/app/controllers/api/v1/favourites_controller.rb index 92c0a62a980..9d73bb3379b 100644 --- a/app/controllers/api/v1/favourites_controller.rb +++ b/app/controllers/api/v1/favourites_controller.rb @@ -20,9 +20,7 @@ class Api::V1::FavouritesController < Api::BaseController def cached_favourites cache_collection( - Status.where( - id: results.map(&:status_id) - ), + Status.reorder(nil).joins(:favourites).merge(results), Status ) end diff --git a/app/controllers/api/web/push_subscriptions_controller.rb b/app/controllers/api/web/push_subscriptions_controller.rb index 8425db7b45e..d66237feb58 100644 --- a/app/controllers/api/web/push_subscriptions_controller.rb +++ b/app/controllers/api/web/push_subscriptions_controller.rb @@ -6,8 +6,8 @@ class Api::Web::PushSubscriptionsController < Api::BaseController before_action :require_user! def create - params.require(:data).require(:endpoint) - params.require(:data).require(:keys).require([:auth, :p256dh]) + params.require(:subscription).require(:endpoint) + params.require(:subscription).require(:keys).require([:auth, :p256dh]) active_session = current_session @@ -16,10 +16,23 @@ class Api::Web::PushSubscriptionsController < Api::BaseController active_session.update!(web_push_subscription: nil) end + # Mobile devices do not support regular notifications, so we enable push notifications by default + alerts_enabled = active_session.detection.device.mobile? || active_session.detection.device.tablet? + + data = { + alerts: { + follow: alerts_enabled, + favourite: alerts_enabled, + reblog: alerts_enabled, + mention: alerts_enabled, + }, + } + web_subscription = ::Web::PushSubscription.create!( - endpoint: params[:data][:endpoint], - key_p256dh: params[:data][:keys][:p256dh], - key_auth: params[:data][:keys][:auth] + endpoint: params[:subscription][:endpoint], + key_p256dh: params[:subscription][:keys][:p256dh], + key_auth: params[:subscription][:keys][:auth], + data: data ) active_session.update!(web_push_subscription: web_subscription) diff --git a/app/javascript/images/background-photo.jpg b/app/javascript/images/background-photo.jpg deleted file mode 100644 index 03341b8ec5b..00000000000 Binary files a/app/javascript/images/background-photo.jpg and /dev/null differ diff --git a/app/javascript/images/boost_sprite.png b/app/javascript/images/boost_sprite.png deleted file mode 100644 index 564bf26463b..00000000000 Binary files a/app/javascript/images/boost_sprite.png and /dev/null differ diff --git a/app/javascript/images/fluffy-elephant-friend.png b/app/javascript/images/fluffy-elephant-friend.png deleted file mode 100644 index f0df2992788..00000000000 Binary files a/app/javascript/images/fluffy-elephant-friend.png and /dev/null differ diff --git a/app/javascript/images/logo.png b/app/javascript/images/logo.png deleted file mode 100644 index f0c1c46c390..00000000000 Binary files a/app/javascript/images/logo.png and /dev/null differ diff --git a/app/javascript/images/logo.svg b/app/javascript/images/logo.svg index 16cb3a94407..4b72b3ac8bf 100644 --- a/app/javascript/images/logo.svg +++ b/app/javascript/images/logo.svg @@ -1 +1 @@ - + diff --git a/app/javascript/images/logo_alt.svg b/app/javascript/images/logo_alt.svg new file mode 100644 index 00000000000..e88ca741851 --- /dev/null +++ b/app/javascript/images/logo_alt.svg @@ -0,0 +1 @@ + diff --git a/app/javascript/images/logo_full.svg b/app/javascript/images/logo_full.svg new file mode 100644 index 00000000000..8b1328e8c8d --- /dev/null +++ b/app/javascript/images/logo_full.svg @@ -0,0 +1 @@ + diff --git a/app/javascript/images/mastodon.jpg b/app/javascript/images/mastodon.jpg deleted file mode 100644 index 2dfeb879f97..00000000000 Binary files a/app/javascript/images/mastodon.jpg and /dev/null differ diff --git a/app/javascript/mastodon/components/column.js b/app/javascript/mastodon/components/column.js index 0dd31e13740..93f1d6260b3 100644 --- a/app/javascript/mastodon/components/column.js +++ b/app/javascript/mastodon/components/column.js @@ -1,5 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; +import detectPassiveEvents from 'detect-passive-events'; import scrollTop from '../scroll'; export default class Column extends React.PureComponent { @@ -30,16 +31,19 @@ export default class Column extends React.PureComponent { this.node = c; } + componentDidMount () { + this.node.addEventListener('wheel', this.handleWheel, detectPassiveEvents ? { passive: true } : false); + } + + componentWillUnmount () { + this.node.removeEventListener('wheel', this.handleWheel); + } + render () { const { children } = this.props; return ( -
+
{children}
); diff --git a/app/javascript/mastodon/components/loading_indicator.js b/app/javascript/mastodon/components/loading_indicator.js index c09244834ec..d6a5adb6fe7 100644 --- a/app/javascript/mastodon/components/loading_indicator.js +++ b/app/javascript/mastodon/components/loading_indicator.js @@ -3,6 +3,7 @@ import { FormattedMessage } from 'react-intl'; const LoadingIndicator = () => (
+
); diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js index 2fad0fa5a44..3e947b4c5ba 100644 --- a/app/javascript/mastodon/components/status_action_bar.js +++ b/app/javascript/mastodon/components/status_action_bar.js @@ -15,6 +15,7 @@ const messages = defineMessages({ mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' }, block: { id: 'account.block', defaultMessage: 'Block @{name}' }, reply: { id: 'status.reply', defaultMessage: 'Reply' }, + share: { id: 'status.share', defaultMessage: 'Share' }, replyAll: { id: 'status.replyAll', defaultMessage: 'Reply to thread' }, reblog: { id: 'status.reblog', defaultMessage: 'Boost' }, cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' }, @@ -60,6 +61,13 @@ export default class StatusActionBar extends ImmutablePureComponent { this.props.onReply(this.props.status, this.context.router.history); } + handleShareClick = () => { + navigator.share({ + text: this.props.status.get('search_index'), + url: this.props.status.get('url'), + }); + } + handleFavouriteClick = () => { this.props.onFavourite(this.props.status); } @@ -139,11 +147,16 @@ export default class StatusActionBar extends ImmutablePureComponent { replyTitle = intl.formatMessage(messages.replyAll); } + const shareButton = ('share' in navigator) && status.get('visibility') === 'public' && ( + + ); + return (
+ {shareButton}
diff --git a/app/javascript/mastodon/components/status_list.js b/app/javascript/mastodon/components/status_list.js index 59f7929200e..3dd207dbc07 100644 --- a/app/javascript/mastodon/components/status_list.js +++ b/app/javascript/mastodon/components/status_list.js @@ -31,16 +31,18 @@ export default class StatusList extends ImmutablePureComponent { intersectionObserverWrapper = new IntersectionObserverWrapper(); handleScroll = debounce(() => { - const { scrollTop, scrollHeight, clientHeight } = this.node; - const offset = scrollHeight - scrollTop - clientHeight; - this._oldScrollPosition = scrollHeight - scrollTop; + if (this.node) { + const { scrollTop, scrollHeight, clientHeight } = this.node; + const offset = scrollHeight - scrollTop - clientHeight; + this._oldScrollPosition = scrollHeight - scrollTop; - if (250 > offset && this.props.onScrollToBottom && !this.props.isLoading) { - this.props.onScrollToBottom(); - } else if (scrollTop < 100 && this.props.onScrollToTop) { - this.props.onScrollToTop(); - } else if (this.props.onScroll) { - this.props.onScroll(); + if (250 > offset && this.props.onScrollToBottom && !this.props.isLoading) { + this.props.onScrollToBottom(); + } else if (scrollTop < 100 && this.props.onScrollToTop) { + this.props.onScrollToTop(); + } else if (this.props.onScroll) { + this.props.onScroll(); + } } }, 200, { trailing: true, diff --git a/app/javascript/mastodon/features/account/components/action_bar.js b/app/javascript/mastodon/features/account/components/action_bar.js index 374da103eab..b8df724c673 100644 --- a/app/javascript/mastodon/features/account/components/action_bar.js +++ b/app/javascript/mastodon/features/account/components/action_bar.js @@ -16,7 +16,6 @@ const messages = defineMessages({ follow: { id: 'account.follow', defaultMessage: 'Follow' }, report: { id: 'account.report', defaultMessage: 'Report @{name}' }, media: { id: 'account.media', defaultMessage: 'Media' }, - disclaimer: { id: 'account.disclaimer', defaultMessage: 'This user is from another instance. This number may be larger.' }, blockDomain: { id: 'account.block_domain', defaultMessage: 'Hide everything from {domain}' }, unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unhide {domain}' }, }); @@ -68,7 +67,19 @@ export default class ActionBar extends React.PureComponent { if (account.get('acct') !== account.get('username')) { const domain = account.get('acct').split('@')[1]; - extraInfo = *; + + extraInfo = ( +
+ + {' '} + + + +
+ ); menu.push(null); @@ -80,26 +91,30 @@ export default class ActionBar extends React.PureComponent { } return ( -
-
- -
+
+ {extraInfo} -
- - - {extraInfo} - +
+
+ +
- - - {extraInfo} - +
+ + + + - - - {extraInfo} - + + + + + + + + + +
); diff --git a/app/javascript/mastodon/features/compose/components/compose_form.js b/app/javascript/mastodon/features/compose/components/compose_form.js index 837bf8fcb38..70897848153 100644 --- a/app/javascript/mastodon/features/compose/components/compose_form.js +++ b/app/javascript/mastodon/features/compose/components/compose_form.js @@ -16,13 +16,14 @@ import SensitiveButtonContainer from '../containers/sensitive_button_container'; import EmojiPickerDropdown from './emoji_picker_dropdown'; import UploadFormContainer from '../containers/upload_form_container'; import WarningContainer from '../containers/warning_container'; +import { isMobile } from '../../../is_mobile'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { length } from 'stringz'; import { isMobile } from '../../../is_mobile'; const messages = defineMessages({ placeholder: { id: 'compose_form.placeholder', defaultMessage: 'What is on your mind?' }, - spoiler_placeholder: { id: 'compose_form.spoiler_placeholder', defaultMessage: 'Content warning' }, + spoiler_placeholder: { id: 'compose_form.spoiler_placeholder', defaultMessage: 'Write your warning here' }, publish: { id: 'compose_form.publish', defaultMessage: 'Toot' }, publishLoud: { id: 'compose_form.publish_loud', defaultMessage: '{publish}!' }, }); diff --git a/app/javascript/mastodon/features/ui/components/bundle.js b/app/javascript/mastodon/features/ui/components/bundle.js index 72798f69061..fc88e0c70f1 100644 --- a/app/javascript/mastodon/features/ui/components/bundle.js +++ b/app/javascript/mastodon/features/ui/components/bundle.js @@ -52,14 +52,8 @@ class Bundle extends React.Component { load = (props) => { const { fetchComponent, onFetch, onFetchSuccess, onFetchFail, renderDelay } = props || this.props; - this.setState({ mod: undefined }); onFetch(); - if (renderDelay !== 0) { - this.timestamp = new Date(); - this.timeout = setTimeout(() => this.setState({ forceRender: true }), renderDelay); - } - if (Bundle.cache[fetchComponent.name]) { const mod = Bundle.cache[fetchComponent.name]; @@ -68,6 +62,13 @@ class Bundle extends React.Component { return Promise.resolve(); } + this.setState({ mod: undefined }); + + if (renderDelay !== 0) { + this.timestamp = new Date(); + this.timeout = setTimeout(() => this.setState({ forceRender: true }), renderDelay); + } + return fetchComponent() .then((mod) => { Bundle.cache[fetchComponent.name] = mod; diff --git a/app/javascript/mastodon/features/ui/components/columns_area.js b/app/javascript/mastodon/features/ui/components/columns_area.js index 515c377b9d4..7de66ce3f9d 100644 --- a/app/javascript/mastodon/features/ui/components/columns_area.js +++ b/app/javascript/mastodon/features/ui/components/columns_area.js @@ -1,5 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; +import { injectIntl } from 'react-intl'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; @@ -21,6 +22,7 @@ const componentMap = { 'FAVOURITES': FavouritedStatuses, }; +@injectIntl export default class ColumnsArea extends ImmutablePureComponent { static contextTypes = { @@ -28,6 +30,7 @@ export default class ColumnsArea extends ImmutablePureComponent { }; static propTypes = { + intl: PropTypes.object.isRequired, columns: ImmutablePropTypes.list.isRequired, singleColumn: PropTypes.bool, children: PropTypes.node, @@ -64,8 +67,8 @@ export default class ColumnsArea extends ImmutablePureComponent { renderView = (link, index) => { const columnIndex = getIndex(this.context.router.history.location.pathname); - const title = link.props.children[1] && React.cloneElement(link.props.children[1]); - const icon = (link.props.children[0] || link.props.children).props.className.split(' ')[2].split('-')[1]; + const title = this.props.intl.formatMessage({ id: link.props['data-preview-title-id'] }); + const icon = link.props['data-preview-icon']; const view = (index === columnIndex) ? React.cloneElement(this.props.children) : diff --git a/app/javascript/mastodon/features/ui/components/tabs_bar.js b/app/javascript/mastodon/features/ui/components/tabs_bar.js index b4153ff459c..baec86d0d52 100644 --- a/app/javascript/mastodon/features/ui/components/tabs_bar.js +++ b/app/javascript/mastodon/features/ui/components/tabs_bar.js @@ -3,14 +3,14 @@ import NavLink from 'react-router-dom/NavLink'; import { FormattedMessage } from 'react-intl'; export const links = [ - , - , - , + , + , + , - , - , + , + , - , + , ]; export function getIndex (path) { diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 89ddb2d154e..7f27d78cd3b 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -1,7 +1,7 @@ { "account.block": "حظر @{name}", "account.block_domain": "Hide everything from {domain}", - "account.disclaimer": "هذا المستخدم من مثيل خادم آخر. قد يكون هذا الرقم أكبر.", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "تعديل الملف الشخصي", "account.follow": "تابِع", "account.followers": "المتابعون", @@ -17,6 +17,7 @@ "account.unblock_domain": "Unhide {domain}", "account.unfollow": "إلغاء المتابعة", "account.unmute": "إلغاء الكتم عن @{name}", + "account.view_full_profile": "View full profile", "boost_modal.combo": "يمكنك ضغط {combo} لتخطّي هذه في المرّة القادمة", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 3dba91b822b..68aaf56b0e8 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -1,7 +1,7 @@ { "account.block": "Блокирай", "account.block_domain": "Hide everything from {domain}", - "account.disclaimer": "This user is from another instance. This number may be larger.", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "Редактирай профила си", "account.follow": "Последвай", "account.followers": "Последователи", @@ -17,6 +17,7 @@ "account.unblock_domain": "Unhide {domain}", "account.unfollow": "Не следвай", "account.unmute": "Unmute @{name}", + "account.view_full_profile": "View full profile", "boost_modal.combo": "You can press {combo} to skip this next time", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 54f2e5e221c..6fdcde4b44c 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -1,7 +1,7 @@ { "account.block": "Bloquejar @{name}", "account.block_domain": "Amagar tot de {domain}", - "account.disclaimer": "Aquest usuari és d'un altra instància. Aquest número podria ser més gran.", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "Editar perfil", "account.follow": "Seguir", "account.followers": "Seguidors", @@ -17,6 +17,7 @@ "account.unblock_domain": "Mostra {domain}", "account.unfollow": "Deixar de seguir", "account.unmute": "Treure silenci de @{name}", + "account.view_full_profile": "View full profile", "boost_modal.combo": "Pots premer {combo} per saltar-te això el proper cop", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index a041e665509..f911c7b75e7 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -1,7 +1,7 @@ { "account.block": "@{name} blocken", "account.block_domain": "Hide everything from {domain}", - "account.disclaimer": "Dieser Benutzer ist von einer anderen Instanz. Diese Zahl könnte größer sein.", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "Profil bearbeiten", "account.follow": "Folgen", "account.followers": "Folgende", @@ -17,6 +17,7 @@ "account.unblock_domain": "Unhide {domain}", "account.unfollow": "Entfolgen", "account.unmute": "@{name} nicht mehr stummschalten", + "account.view_full_profile": "View full profile", "boost_modal.combo": "Du kannst {combo} drücken, um dies beim nächsten Mal zu überspringen", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index 956878f57eb..a7b8f01d0c9 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -358,10 +358,6 @@ "defaultMessage": "Media", "id": "account.media" }, - { - "defaultMessage": "This user is from another instance. This number may be larger.", - "id": "account.disclaimer" - }, { "defaultMessage": "Hide everything from {domain}", "id": "account.block_domain" @@ -370,6 +366,14 @@ "defaultMessage": "Unhide {domain}", "id": "account.unblock_domain" }, + { + "defaultMessage": "Information below may reflect the user's profile incompletely.", + "id": "account.disclaimer_full" + }, + { + "defaultMessage": "View full profile", + "id": "account.view_full_profile" + }, { "defaultMessage": "Posts", "id": "account.posts" @@ -452,7 +456,7 @@ "id": "compose_form.placeholder" }, { - "defaultMessage": "Content warning", + "defaultMessage": "Write your warning here", "id": "compose_form.spoiler_placeholder" }, { diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index fe2bd4cb4dc..3a201b9c111 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -1,7 +1,7 @@ { "account.block": "Block @{name}", "account.block_domain": "Hide everything from {domain}", - "account.disclaimer": "This user is from another instance. This number may be larger.", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "Edit profile", "account.follow": "Follow", "account.followers": "Followers", @@ -17,6 +17,7 @@ "account.unblock_domain": "Unhide {domain}", "account.unfollow": "Unfollow", "account.unmute": "Unmute @{name}", + "account.view_full_profile": "View full profile", "boost_modal.combo": "You can press {combo} to skip this next time", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", @@ -45,7 +46,7 @@ "compose_form.publish_loud": "{publish}!", "compose_form.sensitive": "Mark media as sensitive", "compose_form.spoiler": "Hide text behind warning", - "compose_form.spoiler_placeholder": "Content warning", + "compose_form.spoiler_placeholder": "Write your warning here", "confirmation_modal.cancel": "Cancel", "confirmations.block.confirm": "Block", "confirmations.block.message": "Are you sure you want to block {name}?", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 029cef883df..0bb5159c8cd 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -1,7 +1,7 @@ { "account.block": "Bloki @{name}", "account.block_domain": "Hide everything from {domain}", - "account.disclaimer": "This user is from another instance. This number may be larger.", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "Redakti la profilon", "account.follow": "Sekvi", "account.followers": "Sekvantoj", @@ -17,6 +17,7 @@ "account.unblock_domain": "Unhide {domain}", "account.unfollow": "Malsekvi", "account.unmute": "Unmute @{name}", + "account.view_full_profile": "View full profile", "boost_modal.combo": "You can press {combo} to skip this next time", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 36ad66aceba..a39b608c697 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -1,7 +1,7 @@ { "account.block": "Bloquear", "account.block_domain": "Hide everything from {domain}", - "account.disclaimer": "This user is from another instance. This number may be larger.", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "Editar perfil", "account.follow": "Seguir", "account.followers": "Seguidores", @@ -17,6 +17,7 @@ "account.unblock_domain": "Unhide {domain}", "account.unfollow": "Dejar de seguir", "account.unmute": "Unmute @{name}", + "account.view_full_profile": "View full profile", "boost_modal.combo": "You can press {combo} to skip this next time", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 113daef77b7..6842558d990 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -1,7 +1,7 @@ { "account.block": "مسدودسازی @{name}", "account.block_domain": "پنهان‌سازی همه چیز از سرور {domain}", - "account.disclaimer": "این کاربر عضو سرور متفاوتی است. شاید عدد واقعی بیشتر از این باشد.", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "ویرایش نمایه", "account.follow": "پی بگیرید", "account.followers": "پیگیران", @@ -17,6 +17,7 @@ "account.unblock_domain": "رفع پنهان‌سازی از {domain}", "account.unfollow": "پایان پیگیری", "account.unmute": "باصدا کردن @{name}", + "account.view_full_profile": "View full profile", "boost_modal.combo": "دکمهٔ {combo} را بزنید تا دیگر این را نبینید", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index da9e5d0f28e..efc9b1053ac 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -1,7 +1,7 @@ { "account.block": "Estä @{name}", "account.block_domain": "Hide everything from {domain}", - "account.disclaimer": "This user is from another instance. This number may be larger.", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "Muokkaa", "account.follow": "Seuraa", "account.followers": "Seuraajia", @@ -17,6 +17,7 @@ "account.unblock_domain": "Unhide {domain}", "account.unfollow": "Lopeta seuraaminen", "account.unmute": "Unmute @{name}", + "account.view_full_profile": "View full profile", "boost_modal.combo": "You can press {combo} to skip this next time", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index fc33052b1d6..3cc1f152aa9 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -1,7 +1,7 @@ { "account.block": "Bloquer", "account.block_domain": "Tout masquer de {domain}", - "account.disclaimer": "Ce compte est situé sur une autre instance. Les nombres peuvent être plus grands.", + "account.disclaimer_full": "Les données ci-dessous peuvent ne pas refléter ce profil dans sa totalité.", "account.edit_profile": "Modifier le profil", "account.follow": "Suivre", "account.followers": "Abonné⋅e⋅s", @@ -17,6 +17,7 @@ "account.unblock_domain": "Ne plus masquer {domain}", "account.unfollow": "Ne plus suivre", "account.unmute": "Ne plus masquer", +"account.view_full_profile": "Afficher le profil complet", "boost_modal.combo": "Vous pouvez appuyer sur {combo} pour pouvoir passer ceci, la prochaine fois", "bundle_column_error.body": "Une erreur s'est produite lors du chargement de ce composant.", "bundle_column_error.retry": "Réessayer", @@ -41,11 +42,11 @@ "compose_form.lock_disclaimer.lock": "verrouillé", "compose_form.placeholder": "Qu’avez-vous en tête ?", "compose_form.privacy_disclaimer": "Votre statut privé va être transmis aux personnes mentionnées sur {domains}. Avez-vous confiance en {domainsCount, plural, one {ce serveur} other {ces serveurs}} pour ne pas divulguer votre statut ? Les statuts privés ne fonctionnent que sur les instances de Mastodon. Si {domains} {domainsCount, plural, one {n’est pas une instance de Mastodon} other {ne sont pas des instances de Mastodon}}, il n’y aura aucune indication que votre statut est privé, et il pourrait être partagé ou rendu visible d’une autre manière à d’autres personnes imprévues.", - "compose_form.publish": "Pouet ", + "compose_form.publish": "Pouet ", "compose_form.publish_loud": "{publish}!", - "compose_form.sensitive": "Marquer le média comme délicat", + "compose_form.sensitive": "Marquer le média comme sensible", "compose_form.spoiler": "Masquer le texte derrière un avertissement", - "compose_form.spoiler_placeholder": "Avertissement", + "compose_form.spoiler_placeholder": "Écrivez ici votre avertissement", "confirmation_modal.cancel": "Annuler", "confirmations.block.confirm": "Bloquer", "confirmations.block.message": "Confirmez vous le blocage de {name} ?", @@ -68,13 +69,13 @@ "emoji_button.symbols": "Symboles", "emoji_button.travel": "Lieux et voyages", "empty_column.community": "Le fil public local est vide. Écrivez-donc quelque chose pour le remplir !", - "empty_column.hashtag": "Il n’y a encore aucun contenu relatif à ce hashtag", + "empty_column.hashtag": "Il n’y a encore aucun contenu associé à ce hashtag", "empty_column.home": "Vous ne suivez encore personne. Visitez {public} ou bien utilisez la recherche pour vous connecter à d’autres utilisateur⋅ice⋅s.", "empty_column.home.inactivity": "Votre accueil est vide. Si vous ne vous êtes pas connecté⋅e depuis un moment, il se remplira automatiquement très bientôt.", "empty_column.home.public_timeline": "le fil public", "empty_column.notifications": "Vous n’avez pas encore de notification. Interagissez avec d’autres utilisateur⋅ice⋅s pour débuter la conversation.", "empty_column.public": "Il n’y a rien ici ! Écrivez quelque chose publiquement, ou bien suivez manuellement des utilisateur⋅ice⋅s d’autres instances pour remplir le fil public.", - "follow_request.authorize": "Autoriser", + "follow_request.authorize": "Accepter", "follow_request.reject": "Rejeter", "getting_started.appsshort": "Applications", "getting_started.faq": "FAQ", @@ -126,8 +127,8 @@ "onboarding.page_one.welcome": "Bienvenue sur Mastodon !", "onboarding.page_six.admin": "L’administrateur⋅trice de votre instance est {admin}", "onboarding.page_six.almost_done": "Nous y sommes presque…", - "onboarding.page_six.appetoot": "Bon Appetoot!", - "onboarding.page_six.apps_available": "De nombreuses {apps} sont disponibles pour iOS, Android et autres. Et maintenant… Bon Appetoot!", + "onboarding.page_six.appetoot": "Bon Appétoot!", + "onboarding.page_six.apps_available": "De nombreuses {apps} sont disponibles pour iOS, Android et autres. Et maintenant… Bon Appétoot!", "onboarding.page_six.github": "Mastodon est un logiciel libre, gratuit et open-source. Vous pouvez rapporter des bogues, suggérer des fonctionnalités, ou contribuer à son développement sur {github}.", "onboarding.page_six.guidelines": "règles de la communauté", "onboarding.page_six.read_guidelines": "S’il vous plaît, n’oubliez pas de lire les {guidelines} !", @@ -151,7 +152,7 @@ "report.target": "Signalement", "search.placeholder": "Rechercher", "search_results.total": "{count, number} {count, plural, one {résultat} other {résultats}}", - "standalone.public_title": "Coup d'oeil", + "standalone.public_title": "Coup d'œil", "status.cannot_reblog": "Cette publication ne peut être boostée", "status.delete": "Effacer", "status.favourite": "Ajouter aux favoris", @@ -165,8 +166,8 @@ "status.reply": "Répondre", "status.replyAll": "Répondre au fil", "status.report": "Signaler @{name}", - "status.sensitive_toggle": "Cliquer pour dévoiler", - "status.sensitive_warning": "Contenu délicat", + "status.sensitive_toggle": "Cliquer pour afficher", + "status.sensitive_warning": "Contenu sensible", "status.show_less": "Replier", "status.show_more": "Déplier", "status.unmute_conversation": "Ne plus masquer la conversation", @@ -180,7 +181,7 @@ "upload_form.undo": "Annuler", "upload_progress.label": "Envoi en cours…", "video_player.expand": "Agrandir la vidéo", - "video_player.toggle_sound": "Mettre/Couper le son", + "video_player.toggle_sound": "Activer/Désactiver le son", "video_player.toggle_visible": "Afficher/Cacher la vidéo", "video_player.video_error": "Erreur lors de la lecture de la vidéo" } diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index c8dc4fe8dbd..36be0842be6 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -1,7 +1,7 @@ { "account.block": "חסימת @{name}", "account.block_domain": "להסתיר הכל מהקהילה {domain}", - "account.disclaimer": "משתמש זה מגיע מקהילה אחרת. המספר הזה עשוי להיות גדול יותר.", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "עריכת פרופיל", "account.follow": "מעקב", "account.followers": "עוקבים", @@ -17,6 +17,7 @@ "account.unblock_domain": "הסר חסימה מקהילת {domain}", "account.unfollow": "הפסקת מעקב", "account.unmute": "הפסקת השתקת @{name}", + "account.view_full_profile": "View full profile", "boost_modal.combo": "ניתן להקיש {combo} כדי לדלג בפעם הבאה", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index fd669b2b27a..363c4c490e1 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -1,7 +1,7 @@ { "account.block": "Blokiraj @{name}", "account.block_domain": "Sakrij sve sa {domain}", - "account.disclaimer": "Ovaj korisnik je sa druge instance. Ovaj broj bi mogao biti veći.", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "Uredi profil", "account.follow": "Slijedi", "account.followers": "Sljedbenici", @@ -17,6 +17,7 @@ "account.unblock_domain": "Otkrij {domain}", "account.unfollow": "Prestani slijediti", "account.unmute": "Poništi utišavanje @{name}", + "account.view_full_profile": "View full profile", "boost_modal.combo": "Možeš pritisnuti {combo} kako bi ovo preskočio sljedeći put", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index b3672cb7a40..d43570f0d31 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -1,7 +1,7 @@ { "account.block": "Blokkolás", "account.block_domain": "Hide everything from {domain}", - "account.disclaimer": "This user is from another instance. This number may be larger.", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "Profil szerkesztése", "account.follow": "Követés", "account.followers": "Követők", @@ -17,6 +17,7 @@ "account.unblock_domain": "Unhide {domain}", "account.unfollow": "Követés abbahagyása", "account.unmute": "Unmute @{name}", + "account.view_full_profile": "View full profile", "boost_modal.combo": "You can press {combo} to skip this next time", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index 8a17262fe80..916f313bb0e 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -1,7 +1,7 @@ { "account.block": "Blokir @{name}", "account.block_domain": "Hide everything from {domain}", - "account.disclaimer": "Pengguna ini berasal dari server lain. Angka berikut mungkin lebih besar.", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "Ubah profil", "account.follow": "Ikuti", "account.followers": "Pengikut", @@ -17,6 +17,7 @@ "account.unblock_domain": "Unhide {domain}", "account.unfollow": "Berhenti mengikuti", "account.unmute": "Berhenti membisukan @{name}", + "account.view_full_profile": "View full profile", "boost_modal.combo": "Anda dapat menekan {combo} untuk melewati ini", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index 154ca66ceea..a87cc932861 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -1,7 +1,7 @@ { "account.block": "Blokusar @{name}", "account.block_domain": "Hide everything from {domain}", - "account.disclaimer": "Ca uzero esas de altra instaluro. Ca nombro forsan esas plu granda.", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "Modifikar profilo", "account.follow": "Sequar", "account.followers": "Sequanti", @@ -17,6 +17,7 @@ "account.unblock_domain": "Unhide {domain}", "account.unfollow": "Ne plus sequar", "account.unmute": "Ne plus celar @{name}", + "account.view_full_profile": "View full profile", "boost_modal.combo": "Tu povas presar sur {combo} por omisar co en la venonta foyo", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 6cb274bae9c..243ed7344af 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -1,7 +1,7 @@ { "account.block": "Blocca @{name}", "account.block_domain": "Hide everything from {domain}", - "account.disclaimer": "Questo utente si trova su un altro server. Questo numero potrebbe essere maggiore.", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "Modifica profilo", "account.follow": "Segui", "account.followers": "Seguaci", @@ -17,6 +17,7 @@ "account.unblock_domain": "Unhide {domain}", "account.unfollow": "Non seguire", "account.unmute": "Non silenziare @{name}", + "account.view_full_profile": "View full profile", "boost_modal.combo": "Puoi premere {combo} per saltare questo passaggio la prossima volta", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 7fe27a092cf..ca36122f7f9 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -1,7 +1,7 @@ { "account.block": "ブロック", "account.block_domain": "{domain}全体を非表示", - "account.disclaimer": "このユーザーは他のインスタンスに所属しているため、数字が正確で無い場合があります。", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "プロフィールを編集", "account.follow": "フォロー", "account.followers": "フォロワー", @@ -17,6 +17,7 @@ "account.unblock_domain": "{domain}を表示", "account.unfollow": "フォロー解除", "account.unmute": "ミュート解除", + "account.view_full_profile": "View full profile", "boost_modal.combo": "次からは{combo}を押せば、これをスキップできます。", "bundle_column_error.body": "コンポーネントの読み込み中に問題が発生しました。", "bundle_column_error.retry": "再試行", @@ -45,7 +46,7 @@ "compose_form.publish_loud": "{publish}!", "compose_form.sensitive": "メディアを閲覧注意としてマークする", "compose_form.spoiler": "テキストを隠す", - "compose_form.spoiler_placeholder": "警告", + "compose_form.spoiler_placeholder": "ここに警告を書いてください", "confirmation_modal.cancel": "キャンセル", "confirmations.block.confirm": "ブロック", "confirmations.block.message": "本当に{name}をブロックしますか?", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index fbd0098d756..768efa37d36 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -1,7 +1,7 @@ { "account.block": "차단", "account.block_domain": "{domain} 전체를 숨김", - "account.disclaimer": "이 사용자는 다른 인스턴스에 소속되어 있으므로, 수치가 정확하지 않을 수도 있습니다.", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "프로필 편집", "account.follow": "팔로우", "account.followers": "팔로워", @@ -17,6 +17,7 @@ "account.unblock_domain": "{domain} 숨김 해제", "account.unfollow": "팔로우 해제", "account.unmute": "뮤트 해제", + "account.view_full_profile": "View full profile", "boost_modal.combo": "다음부터 {combo}를 누르면 이 과정을 건너뛸 수 있습니다.", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index f7b0bbf68ae..fbfabc5d145 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -1,7 +1,7 @@ { "account.block": "Blokkeer @{name}", "account.block_domain": "Negeer alles van {domain}", - "account.disclaimer": "Deze gebruiker zit op een andere server. Dit getal kan hoger zijn.", + "account.disclaimer_full": "De informatie hieronder kan mogelijk een incompleet beeld geven van dit gebruikersprofiel.", "account.edit_profile": "Profiel bewerken", "account.follow": "Volgen", "account.followers": "Volgers", @@ -17,13 +17,14 @@ "account.unblock_domain": "{domain} niet meer negeren", "account.unfollow": "Ontvolgen", "account.unmute": "@{name} niet meer negeren", + "account.view_full_profile": "Volledig profiel tonen", "boost_modal.combo": "Je kunt {combo} klikken om dit de volgende keer over te slaan", - "bundle_column_error.body": "Something went wrong while loading this component.", - "bundle_column_error.retry": "Try again", - "bundle_column_error.title": "Network error", - "bundle_modal_error.close": "Close", - "bundle_modal_error.message": "Something went wrong while loading this component.", - "bundle_modal_error.retry": "Try again", + "bundle_column_error.body": "Tijdens het laden van dit onderdeel is er iets fout gegaan.", + "bundle_column_error.retry": "Opnieuw proberen", + "bundle_column_error.title": "Netwerkfout", + "bundle_modal_error.close": "Sluiten", + "bundle_modal_error.message": "Tijdens het laden van dit onderdeel is er iets fout gegaan.", + "bundle_modal_error.retry": "Opnieuw proberen", "column.blocks": "Geblokkeerde gebruikers", "column.community": "Lokale tijdlijn", "column.favourites": "Favorieten", @@ -43,20 +44,20 @@ "compose_form.privacy_disclaimer": "Jouw privétoot wordt afgeleverd aan de vermelde gebruikers op {domains}. Vertrouw jij {domainsCount, plural, one {die server} other {die servers}}? Het privé plaatsen van toots werkt alleen op Mastodon-servers. Wanneer {domains} {domainsCount, plural, one {geen Mastodon-server is} other {geen Mastodon-servers zijn}}, dan wordt er niet aangegeven dat de toot privé is, waardoor het kan worden geboost of op een andere manier zichtbaar wordt gemaakt voor mensen waarvoor het niet was bedoeld.", "compose_form.publish": "Toot", "compose_form.publish_loud": "{publish}!", - "compose_form.sensitive": "Media als gevoelig markeren", + "compose_form.sensitive": "Media als gevoelig markeren (nsfw)", "compose_form.spoiler": "Tekst achter waarschuwing verbergen", "compose_form.spoiler_placeholder": "Waarschuwingstekst", "confirmation_modal.cancel": "Annuleren", "confirmations.block.confirm": "Blokkeren", - "confirmations.block.message": "Weet je zeker dat je {name} wilt blokkeren?", + "confirmations.block.message": "Weet je het zeker dat je {name} wilt blokkeren?", "confirmations.delete.confirm": "Verwijderen", - "confirmations.delete.message": "Weet je zeker dat je deze toot wilt verwijderen?", + "confirmations.delete.message": "Weet je het zeker dat je deze toot wilt verwijderen?", "confirmations.domain_block.confirm": "Negeer alles van deze server", "confirmations.domain_block.message": "Weet je het echt, echt zeker dat je alles van {domain} wil negeren? In de meeste gevallen is het blokkeren of negeren van een paar specifieke personen voldoende en gewenst.", "confirmations.mute.confirm": "Negeren", - "confirmations.mute.message": "Weet je zeker dat je {name} wilt negeren?", - "confirmations.unfollow.confirm": "Unfollow", - "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "confirmations.mute.message": "Weet je het zeker dat je {name} wilt negeren?", + "confirmations.unfollow.confirm": "Ontvolgen", + "confirmations.unfollow.message": "Weet je het zeker dat je {name} wilt ontvolgen?", "emoji_button.activity": "Activiteiten", "emoji_button.flags": "Vlaggen", "emoji_button.food": "Eten en drinken", @@ -67,7 +68,7 @@ "emoji_button.search": "Zoeken...", "emoji_button.symbols": "Symbolen", "emoji_button.travel": "Reizen en plekken", - "empty_column.community": "De lokale tijdlijn is leeg. Toot iets in het openbaar om de bal aan het rollen te krijgen!", + "empty_column.community": "De lokale tijdlijn is nog leeg. Toot iets in het openbaar om de bal aan het rollen te krijgen!", "empty_column.hashtag": "Er is nog niks te vinden onder deze hashtag.", "empty_column.home": "Jij volgt nog niemand. Bezoek {public} of gebruik het zoekvenster om andere mensen te ontmoeten.", "empty_column.home.inactivity": "Deze tijdlijn is leeg. Wanneer je een tijdje inactief bent geweest wordt deze snel opnieuw aangemaakt.", @@ -106,13 +107,13 @@ "notification.mention": "{name} vermeldde jou", "notification.reblog": "{name} boostte jouw toot", "notifications.clear": "Meldingen verwijderen", - "notifications.clear_confirmation": "Weet je zeker dat je al jouw meldingen wilt verwijderen?", + "notifications.clear_confirmation": "Weet je het zeker dat je al jouw meldingen wilt verwijderen?", "notifications.column_settings.alert": "Desktopmeldingen", "notifications.column_settings.favourite": "Favorieten:", "notifications.column_settings.follow": "Nieuwe volgers:", "notifications.column_settings.mention": "Vermeldingen:", - "notifications.column_settings.push": "Push notifications", - "notifications.column_settings.push_meta": "This device", + "notifications.column_settings.push": "Pushmeldingen", + "notifications.column_settings.push_meta": "Dit apparaat", "notifications.column_settings.reblog": "Boosts:", "notifications.column_settings.show": "In kolom tonen", "notifications.column_settings.sound": "Geluid afspelen", @@ -146,12 +147,12 @@ "privacy.unlisted.long": "Niet op openbare tijdlijnen tonen", "privacy.unlisted.short": "Minder openbaar", "reply_indicator.cancel": "Annuleren", + "report.heading": "Rapporteren", "report.placeholder": "Extra opmerkingen", "report.submit": "Verzenden", "report.target": "Rapporteren van", "search.placeholder": "Zoeken", "search_results.total": "{count, number} {count, plural, one {resultaat} other {resultaten}}", - "standalone.public_title": "A look inside...", "status.cannot_reblog": "Deze toot kan niet geboost worden", "status.delete": "Verwijderen", "status.favourite": "Favoriet", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index 98f59f7740a..8727f61471c 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -1,7 +1,7 @@ { "account.block": "Blokkér @{name}", "account.block_domain": "Skjul alt fra {domain}", - "account.disclaimer": "Denne brukeren er fra en annen instans. Dette tallet kan være høyere.", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "Rediger profil", "account.follow": "Følg", "account.followers": "Følgere", @@ -17,6 +17,7 @@ "account.unblock_domain": "Vis {domain}", "account.unfollow": "Avfølg", "account.unmute": "Avdemp @{name}", + "account.view_full_profile": "View full profile", "boost_modal.combo": "You kan trykke {combo} for å hoppe over dette neste gang", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index ca094c18ad6..c39d5733321 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -1,7 +1,7 @@ { "account.block": "Blocar @{name}", "account.block_domain": "Tot amagar del domeni {domain}", - "account.disclaimer": "Aqueste compte es sus una autra instància. Los nombres pòdon èsser mai grandes.", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "Modificar lo perfil", "account.follow": "Sègre", "account.followers": "Seguidors", @@ -17,19 +17,20 @@ "account.unblock_domain": "Desblocar {domain}", "account.unfollow": "Quitar de sègre", "account.unmute": "Quitar de rescondre @{name}", + "account.view_full_profile": "View full profile", "boost_modal.combo": "Podètz botar {combo} per passar aquò lo còp que ven", - "bundle_column_error.body": "Something went wrong while loading this component.", - "bundle_column_error.retry": "Try again", - "bundle_column_error.title": "Network error", - "bundle_modal_error.close": "Close", - "bundle_modal_error.message": "Something went wrong while loading this component.", - "bundle_modal_error.retry": "Try again", + "bundle_column_error.body": "Quicòm a fach meuca pendent lo cargament d’aqueste compausant.", + "bundle_column_error.retry": "Tornar ensejar", + "bundle_column_error.title": "Error de ret", + "bundle_modal_error.close": "Tampar", + "bundle_modal_error.message": "Quicòm a fach meuca pendent lo cargament d’aqueste compausant.", + "bundle_modal_error.retry": "Tornar ensejar", "column.blocks": "Personas blocadas", - "column.community": "Flux d’actualitat public local", + "column.community": "Flux public local", "column.favourites": "Favorits", "column.follow_requests": "Demandas d’abonament", "column.home": "Acuèlh", - "column.mutes": "Personas mesas en silenci", + "column.mutes": "Personas en silenci", "column.notifications": "Notificacions", "column.public": "Flux public global", "column_back_button.label": "Tornar", @@ -55,8 +56,8 @@ "confirmations.domain_block.message": "Sètz segur segur de voler blocar complètament {domain} ? De còps cal pas que blocar o rescondre unas personas solament.", "confirmations.mute.confirm": "Metre en silenci", "confirmations.mute.message": "Sètz segur de voler metre en silenci {name} ?", - "confirmations.unfollow.confirm": "Unfollow", - "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "confirmations.unfollow.confirm": "Quitar de sègre", + "confirmations.unfollow.message": "Volètz vertadièrament quitar de sègre {name} ?", "emoji_button.activity": "Activitat", "emoji_button.flags": "Drapèus", "emoji_button.food": "Beure e manjar", @@ -69,7 +70,7 @@ "emoji_button.travel": "Viatges & lòcs", "empty_column.community": "Lo flux public local es void. Escribètz quicòm per lo garnir !", "empty_column.hashtag": "I a pas encara de contengut ligat a aqueste hashtag", - "empty_column.home": "Pel moment segètz pas segun. Visitatz {public} o utilizatz la recèrca per vos connectar a d’autras personas.", + "empty_column.home": "Pel moment segètz pas degun. Visitatz {public} o utilizatz la recèrca per vos connectar a d’autras personas.", "empty_column.home.inactivity": "Vòstra pagina d’acuèlh es voida. Se sètz estat inactiu per un moment, serà tornada generar per vos dins una estona.", "empty_column.home.public_timeline": "lo flux public", "empty_column.notifications": "Avètz pas encara de notificacions. Respondètz a qualqu’un per començar una conversacion.", @@ -111,8 +112,8 @@ "notifications.column_settings.favourite": "Favorits :", "notifications.column_settings.follow": "Nòus seguidors :", "notifications.column_settings.mention": "Mencions :", - "notifications.column_settings.push": "Push notifications", - "notifications.column_settings.push_meta": "This device", + "notifications.column_settings.push": "Notificacions", + "notifications.column_settings.push_meta": "Aqueste periferic", "notifications.column_settings.reblog": "Partatges :", "notifications.column_settings.show": "Mostrar dins la colomna", "notifications.column_settings.sound": "Emetre un son", @@ -125,7 +126,7 @@ "onboarding.page_one.handle": "Sètz sus {domain}, doncas vòstre identificant complet es {handle}", "onboarding.page_one.welcome": "Benvengut a Mastodon !", "onboarding.page_six.admin": "Vòstre administrator d’instància es {admin}.", - "onboarding.page_six.almost_done": "Gaireben acabat...", + "onboarding.page_six.almost_done": "Gaireben acabat…", "onboarding.page_six.appetoot": "Bon Appetoot!", "onboarding.page_six.apps_available": "I a d’aplicacions per mobil per iOS, Android e mai.", "onboarding.page_six.github": "Mastodon es un logicial liure e open-source. Podètz senhalar de bugs, demandar de foncionalitats e contribuir al còdi sus {github}.", @@ -151,14 +152,14 @@ "report.target": "Senhalar {target}", "search.placeholder": "Recercar", "search_results.total": "{count, number} {count, plural, one {resultat} other {resultats}}", - "standalone.public_title": "A look inside...", + "standalone.public_title": "Una ulhada dedins…", "status.cannot_reblog": "Aqueste estatut pòt pas èsser partejat", "status.delete": "Escafar", "status.favourite": "Apondre als favorits", "status.load_more": "Cargar mai", "status.media_hidden": "Mèdia rescondut", "status.mention": "Mencionar", - "status.mute_conversation": "Mute conversation", + "status.mute_conversation": "Rescondre la conversacion", "status.open": "Desplegar aqueste estatut", "status.reblog": "Partejar", "status.reblogged_by": "{name} a partejat :", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 3489846483d..af069b6d720 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -1,7 +1,7 @@ { "account.block": "Blokuj @{name}", "account.block_domain": "Blokuj wszystko z {domain}", - "account.disclaimer": "Ten użytkownik pochodzi z innej instancji. Ta liczba może być większa.", + "account.disclaimer_full": "Poniższe informacje mogą nie odwzorowywać bezbłędnie profilu użytkownika.", "account.edit_profile": "Edytuj profil", "account.follow": "Śledź", "account.followers": "Śledzący", @@ -17,6 +17,7 @@ "account.unblock_domain": "Odblokuj domenę {domain}", "account.unfollow": "Przestań śledzić", "account.unmute": "Cofnij wyciszenie @{name}", + "account.view_full_profile": "Wyświetl pełny profil", "boost_modal.combo": "Naciśnij {combo}, aby pominąć to następnym razem", "bundle_column_error.body": "Coś poszło nie tak podczas ładowania tego składnika.", "bundle_column_error.retry": "Spróbuj ponownie", @@ -45,7 +46,7 @@ "compose_form.publish_loud": "{publish}!", "compose_form.sensitive": "Oznacz treści jako wrażliwe", "compose_form.spoiler": "Ukryj tekst za ostrzeżeniem", - "compose_form.spoiler_placeholder": "Ostrzeżenie o zawartości", + "compose_form.spoiler_placeholder": "Wprowadź swoje ostrzeżenie o zawartości", "confirmation_modal.cancel": "Anuluj", "confirmations.block.confirm": "Zablokuj", "confirmations.block.message": "Czy na pewno chcesz zablokować {name}?", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 3944e33e9ce..86da7c4e676 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -1,7 +1,7 @@ { "account.block": "Bloquear @{name}", "account.block_domain": "Hide everything from {domain}", - "account.disclaimer": "Essa conta está localizado em outra instância. Os nomes podem ser maiores.", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "Editar perfil", "account.follow": "Seguir", "account.followers": "Seguidores", @@ -17,6 +17,7 @@ "account.unblock_domain": "Unhide {domain}", "account.unfollow": "Deixar de seguir", "account.unmute": "Não silenciar @{name}", + "account.view_full_profile": "View full profile", "boost_modal.combo": "Pode clicar {combo} para não voltar a ver", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", diff --git a/app/javascript/mastodon/locales/pt.json b/app/javascript/mastodon/locales/pt.json index 3944e33e9ce..86da7c4e676 100644 --- a/app/javascript/mastodon/locales/pt.json +++ b/app/javascript/mastodon/locales/pt.json @@ -1,7 +1,7 @@ { "account.block": "Bloquear @{name}", "account.block_domain": "Hide everything from {domain}", - "account.disclaimer": "Essa conta está localizado em outra instância. Os nomes podem ser maiores.", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "Editar perfil", "account.follow": "Seguir", "account.followers": "Seguidores", @@ -17,6 +17,7 @@ "account.unblock_domain": "Unhide {domain}", "account.unfollow": "Deixar de seguir", "account.unmute": "Não silenciar @{name}", + "account.view_full_profile": "View full profile", "boost_modal.combo": "Pode clicar {combo} para não voltar a ver", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index cffc285f456..16af3fe7e7a 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -1,7 +1,7 @@ { "account.block": "Блокировать", "account.block_domain": "Блокировать все с {domain}", - "account.disclaimer": "Это пользователь с другого узла. Число может быть больше.", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "Изменить профиль", "account.follow": "Подписаться", "account.followers": "Подписаны", @@ -17,6 +17,7 @@ "account.unblock_domain": "Разблокировать {domain}", "account.unfollow": "Отписаться", "account.unmute": "Снять глушение", + "account.view_full_profile": "View full profile", "boost_modal.combo": "Нажмите {combo}, чтобы пропустить это в следующий раз", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", @@ -45,7 +46,7 @@ "compose_form.publish_loud": "{publish}!", "compose_form.sensitive": "Отметить как чувствительный контент", "compose_form.spoiler": "Скрыть текст за предупреждением", - "compose_form.spoiler_placeholder": "Предупреждение о скрытом тексте", + "compose_form.spoiler_placeholder": "Напишите свое предупреждение здесь", "confirmation_modal.cancel": "Отмена", "confirmations.block.confirm": "Заблокировать", "confirmations.block.message": "Вы уверены, что хотите заблокировать {name}?", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 63bed6d8c1f..be5c0815df8 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -1,7 +1,7 @@ { "account.block": "Block @{name}", "account.block_domain": "Hide everything from {domain}", - "account.disclaimer": "This user is from another instance. This number may be larger.", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "Edit profile", "account.follow": "Follow", "account.followers": "Followers", @@ -17,6 +17,7 @@ "account.unblock_domain": "Unhide {domain}", "account.unfollow": "Unfollow", "account.unmute": "Unmute @{name}", + "account.view_full_profile": "View full profile", "boost_modal.combo": "You can press {combo} to skip this next time", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 5bd308e9524..9d4d5fa17ea 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -1,7 +1,7 @@ { "account.block": "Engelle @{name}", "account.block_domain": "Hide everything from {domain}", - "account.disclaimer": "Bu kullanıcının hesabı farklı sunucuda bulunduğu için bu sayı daha fazla olabilir.", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "Profili düzenle", "account.follow": "Takip et", "account.followers": "Takipçiler", @@ -17,6 +17,7 @@ "account.unblock_domain": "Unhide {domain}", "account.unfollow": "Takipten vazgeç", "account.unmute": "Sesi aç @{name}", + "account.view_full_profile": "View full profile", "boost_modal.combo": "Bir dahaki sefere {combo} tuşuna basabilirsiniz", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index e1611505dec..60a551bb622 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -1,7 +1,7 @@ { "account.block": "Заблокувати", "account.block_domain": "Заглушити {domain}", - "account.disclaimer": "Це користувач з іншої інстанції. Число може бути більше.", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "Налаштування профілю", "account.follow": "Підписатися", "account.followers": "Підписники", @@ -17,6 +17,7 @@ "account.unblock_domain": "Розблокувати {domain}", "account.unfollow": "Відписатися", "account.unmute": "Зняти глушення", + "account.view_full_profile": "View full profile", "boost_modal.combo": "Ви можете натиснути {combo}, щоб пропустити це наступного разу", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 18bf872e593..97f1f5e2758 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -1,7 +1,7 @@ { "account.block": "屏蔽 @{name}", "account.block_domain": "Hide everything from {domain}", - "account.disclaimer": "由于这个账户处于另一个服务器实例上,实际数字会比这个更多。", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "修改个人资料", "account.follow": "关注", "account.followers": "关注者", @@ -17,6 +17,7 @@ "account.unblock_domain": "Unhide {domain}", "account.unfollow": "取消关注", "account.unmute": "取消 @{name} 的静音", + "account.view_full_profile": "View full profile", "boost_modal.combo": "如你想在下次路过时显示,请按{combo},", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index a461085c7f8..c65c3d45ccf 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -1,7 +1,7 @@ { "account.block": "封鎖 @{name}", "account.block_domain": "Hide everything from {domain}", - "account.disclaimer": "由於這個用戶在另一個服務站,實際數字會比這個更多。", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "修改個人資料", "account.follow": "關注", "account.followers": "關注的人", @@ -17,6 +17,7 @@ "account.unblock_domain": "Unhide {domain}", "account.unfollow": "取消關注", "account.unmute": "取消 @{name} 的靜音", + "account.view_full_profile": "View full profile", "boost_modal.combo": "如你想在下次路過這顯示,請按{combo},", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index d766fb3943c..12e840b1697 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -1,7 +1,7 @@ { "account.block": "封鎖 @{name}", "account.block_domain": "隱藏來自 {domain} 的一切", - "account.disclaimer": "這使用者來自其他副本,實際數字可能更大。", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.edit_profile": "編輯用戶資訊", "account.follow": "關注", "account.followers": "專注者", @@ -17,6 +17,7 @@ "account.unblock_domain": "不再隱藏 {domain}", "account.unfollow": "取消關注", "account.unmute": "不再消音 @{name}", + "account.view_full_profile": "View full profile", "boost_modal.combo": "下次你可以按 {combo} 來跳過", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", diff --git a/app/javascript/mastodon/web_push_subscription.js b/app/javascript/mastodon/web_push_subscription.js index 391d3bcec46..96ac63b52fa 100644 --- a/app/javascript/mastodon/web_push_subscription.js +++ b/app/javascript/mastodon/web_push_subscription.js @@ -37,7 +37,7 @@ const unsubscribe = ({ registration, subscription }) => const sendSubscriptionToBackend = (subscription) => axios.post('/api/web/push_subscriptions', { - data: subscription, + subscription, }).then(response => response.data); // Last one checks for payload support: https://web-push-book.gauntface.com/chapter-06/01-non-standards-browsers/#no-payload diff --git a/app/javascript/styles/about.scss b/app/javascript/styles/about.scss index 687c12fac89..af1d45a0933 100644 --- a/app/javascript/styles/about.scss +++ b/app/javascript/styles/about.scss @@ -120,18 +120,55 @@ } .information-board { - margin: 20px 0; - display: flex; - justify-content: space-between; - border-top: 1px solid lighten($ui-base-color, 10%); - border-bottom: 1px solid lighten($ui-base-color, 10%); - padding-right: 14px; + background: darken($ui-base-color, 4%); + padding: 40px 0; + + .panel { + position: absolute; + width: 280px; + box-sizing: border-box; + background: darken($ui-base-color, 8%); + padding: 20px; + padding-top: 10px; + border-radius: 4px 4px 0 0; + right: 0; + bottom: -40px; + + .panel-header { + font-family: 'mastodon-font-display', sans-serif; + font-size: 14px; + line-height: 24px; + font-weight: 500; + color: $ui-base-lighter-color; + padding-bottom: 5px; + margin-bottom: 15px; + border-bottom: 1px solid lighten($ui-base-color, 4%); + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + + span { + font-weight: 400; + color: lighten($ui-base-color, 34%); + } + } + } + + .container { + position: relative; + padding-right: 280px + 15px; + } + + .information-board-sections { + display: flex; + justify-content: space-between; + } .section { flex: 1 0 0; - padding: 14px; - text-align: right; font: 16px/28px 'mastodon-font-sans-serif', sans-serif; + text-align: right; + padding: 0 15px; span, strong { @@ -143,7 +180,6 @@ &:last-child { color: $ui-secondary-color; - font-size: 14px; } } @@ -201,100 +237,6 @@ } } -.contact-email { - text-align: center; - margin: 40px 0; - - strong { - display: block; - color: $primary-text-color; - word-break: break-word; - } -} - -.sidebar-layout { - display: flex; - - .main { - flex: 1 1 auto; - padding: 14px 0; - - .panel { - padding-right: 14px; - } - } - - .sidebar { - border-left: 1px solid lighten($ui-base-color, 10%); - width: 200px; - flex: 0 0 auto; - } - - .panel { - .panel-header { - background: lighten($ui-base-color, 10%); - padding: 7px 14px; - text-transform: uppercase; - font-size: 12px; - font-weight: 500; - } - - .panel-body { - padding: 14px; - } - - .panel-list { - ul { - list-style: none; - margin: 0; - - li { - margin: 0; - font-family: inherit; - font-size: 13px; - line-height: 18px; - - a { - display: block; - padding: 7px 14px; - color: rgba($primary-text-color, 0.7); - text-decoration: none; - transition: all 200ms linear; - - i.fa { - margin-right: 5px; - } - - &:hover { - color: $primary-text-color; - background-color: darken($ui-base-color, 5%); - transition: all 100ms linear; - } - - &.selected { - color: $primary-text-color; - background-color: $ui-highlight-color; - - &:hover { - background-color: lighten($ui-highlight-color, 5%); - } - } - } - } - } - } - } - - @media screen and (max-width: 625px) { - flex-direction: column; - - .sidebar { - border: 1px solid lighten($ui-base-color, 10%); - width: auto; - } - } -} - .features-list__row { display: flex; padding: 10px 0; @@ -320,7 +262,7 @@ .text { font-size: 16px; line-height: 30px; - color: lighten($ui-base-color, 26%); + color: $ui-base-lighter-color; h6 { font-weight: 500; @@ -336,6 +278,15 @@ background: linear-gradient(150deg, lighten($ui-base-color, 8%), $ui-base-color); position: relative; + &.compact { + background: $ui-base-color; + padding-bottom: 15px; + + .hero .heading { + padding-bottom: 30px; + } + } + .mascot-container { max-width: 800px; margin: 0 auto; @@ -388,10 +339,9 @@ position: absolute; transition: all 0.1s linear; animation-name: floating; - animation-duration: 1.7s; animation-iteration-count: infinite; animation-direction: alternate; - animation-timing-function: linear; + animation-timing-function: ease-in-out; z-index: 2; } @@ -400,7 +350,8 @@ height: 170px; right: -120px; bottom: 0; - background-image: url('data:image/svg+xml;utf8,'); + animation-duration: 3s; + background-image: url('data:image/svg+xml;utf8,'); } .float-2 { @@ -408,8 +359,9 @@ height: 100px; right: 210px; bottom: 0; + animation-duration: 3.5s; animation-delay: 0.2s; - background-image: url('data:image/svg+xml;utf8,'); + background-image: url('data:image/svg+xml;utf8,'); } .float-3 { @@ -417,8 +369,9 @@ height: 140px; right: 110px; top: -30px; - animation-delay: 0.1s; - background-image: url('data:image/svg+xml;utf8,'); + animation-duration: 4s; + animation-delay: 0.5s; + background-image: url('data:image/svg+xml;utf8,'); } } @@ -500,13 +453,15 @@ .brand { a { padding-left: 0; + padding-right: 0; color: $white; } img { - width: 32px; height: 32px; - margin-right: 10px; + position: relative; + top: 4px; + left: -10px; } } } @@ -530,6 +485,42 @@ padding: 50px 0; } + .extended-description { + padding: 50px 0; + + ul, + ol { + list-style: inherit; + margin-left: 20px; + + &[type='a'] { + list-style-type: lower-alpha; + } + + &[type='i'] { + list-style-type: lower-roman; + } + } + + li > ol, + li > ul { + margin-top: 20px; + } + + p, + li { + font: 16px/28px 'mastodon-font-sans-serif', sans-serif; + font-weight: 400; + margin-bottom: 12px; + color: $ui-base-lighter-color; + + a { + color: $ui-highlight-color; + text-decoration: underline; + } + } + } + h3 { font-family: 'mastodon-font-display', sans-serif; font-size: 16px; @@ -542,7 +533,7 @@ p { font-size: 16px; line-height: 30px; - color: lighten($ui-base-color, 26%); + color: $ui-base-lighter-color; } .features { @@ -584,6 +575,11 @@ line-height: inherit; font-weight: inherit; color: $primary-text-color; + margin-bottom: 20px; + + &:last-child { + margin-bottom: 0; + } a { color: $ui-secondary-color; @@ -629,14 +625,14 @@ display: block; font-size: 18px; font-weight: 400; - color: lighten($ui-base-color, 26%); + color: $ui-base-lighter-color; } } .footer-links { padding-bottom: 50px; text-align: right; - color: lighten($ui-base-color, 26%); + color: $ui-base-lighter-color; p { font-size: 14px; @@ -653,6 +649,29 @@ padding: 0 20px; } + .information-board { + padding-bottom: 20px; + } + + .information-board .container { + padding-right: 20px; + + .panel { + position: static; + margin-top: 30px; + width: 100%; + border-radius: 4px; + + .panel-header { + text-align: center; + } + } + } + + .information-board .section { + text-align: center; + } + .header-wrapper .mascot { left: 20px; } @@ -700,10 +719,25 @@ text-align: center; } + .nav { + display: flex; + flex-flow: row wrap; + justify-content: space-around; + } + + .links a { + padding: 12px 8px; + } + .heading h1 { padding: 30px 0; } + .links .brand img { + left: 0; + top: 0; + } + .hero { .simple_form, .closed-registrations-message { diff --git a/app/javascript/styles/boost.scss b/app/javascript/styles/boost.scss index e44df2ea45c..bcd97359aff 100644 --- a/app/javascript/styles/boost.scss +++ b/app/javascript/styles/boost.scss @@ -6,7 +6,7 @@ } button.icon-button i.fa-retweet { - background-image: url("data:image/svg+xml;utf8,"); + background-image: url("data:image/svg+xml;utf8,"); &:hover { background-image: url("data:image/svg+xml;utf8,"); diff --git a/app/javascript/styles/components.scss b/app/javascript/styles/components.scss index 43df263d5ea..9e5d34f539c 100644 --- a/app/javascript/styles/components.scss +++ b/app/javascript/styles/components.scss @@ -107,7 +107,7 @@ .icon-button { display: inline-block; padding: 0; - color: lighten($ui-base-color, 26%); + color: $ui-base-lighter-color; border: none; background: transparent; cursor: pointer; @@ -145,7 +145,7 @@ &:hover, &:active, &:focus { - color: lighten($ui-base-color, 26%); + color: $ui-base-lighter-color; } &.active { @@ -185,7 +185,7 @@ &:hover, &:active, &:focus { - color: lighten($ui-base-color, 26%); + color: $ui-base-lighter-color; transition: color 200ms ease-out; } @@ -807,7 +807,7 @@ margin-left: auto; padding-left: 18px; width: 120px; - color: lighten($ui-base-color, 26%); + color: $ui-base-lighter-color; font-size: 14px; text-align: right; white-space: nowrap; @@ -816,7 +816,7 @@ } .status__display-name { - color: lighten($ui-base-color, 26%); + color: $ui-base-lighter-color; } .status__info .status__display-name { @@ -865,13 +865,13 @@ .status__prepend { margin: -10px 0 10px; - color: lighten($ui-base-color, 26%); + color: $ui-base-lighter-color; padding: 8px 0 2px; font-size: 14px; position: relative; .status__display-name strong { - color: lighten($ui-base-color, 26%); + color: $ui-base-lighter-color; } } @@ -963,7 +963,7 @@ .detailed-status__meta { margin-top: 15px; - color: lighten($ui-base-color, 26%); + color: $ui-base-lighter-color; font-size: 14px; line-height: 18px; } @@ -1096,6 +1096,28 @@ } } +.account__disclaimer { + padding: 10px; + border-top: 1px solid lighten($ui-base-color, 8%); + color: $ui-base-lighter-color; + + strong { + font-weight: 500; + } + + a { + font-weight: 500; + color: inherit; + text-decoration: underline; + + &:hover, + &:focus, + &:active { + text-decoration: none; + } + } +} + .account__header__content { color: $ui-primary-color; font-size: 14px; @@ -1238,7 +1260,7 @@ } abbr { - color: lighten($ui-base-color, 26%); + color: $ui-base-lighter-color; } } @@ -1332,11 +1354,11 @@ .muted { .status__content p, .status__content a { - color: lighten($ui-base-color, 26%); + color: $ui-base-lighter-color; } .status__display-name strong { - color: lighten($ui-base-color, 26%); + color: $ui-base-lighter-color; } .status__avatar, .emojione { @@ -1344,7 +1366,7 @@ } a.status__content__spoiler-link { - background: lighten($ui-base-color, 26%); + background: $ui-base-lighter-color; color: lighten($ui-base-color, 4%); &:hover { @@ -1560,7 +1582,7 @@ .static-content { padding: 10px; padding-top: 20px; - color: lighten($ui-base-color, 26%); + color: $ui-base-lighter-color; h1 { font-size: 16px; @@ -2041,7 +2063,7 @@ .column-subheading { background: $ui-base-color; - color: lighten($ui-base-color, 26%); + color: $ui-base-lighter-color; padding: 8px 20px; font-size: 12px; font-weight: 500; @@ -2161,7 +2183,7 @@ .getting-started__wrapper { position: relative; - flex: 0 0 auto; + overflow-y: auto; } .getting-started__footer { @@ -2180,7 +2202,7 @@ } a { - color: lighten($ui-base-color, 26%); + color: $ui-base-lighter-color; } } @@ -2244,7 +2266,7 @@ button.icon-button.active i.fa-retweet { font-size: 14px; border: 1px solid lighten($ui-base-color, 8%); border-radius: 4px; - color: lighten($ui-base-color, 26%); + color: $ui-base-lighter-color; margin-top: 14px; text-decoration: none; overflow: hidden; @@ -2339,7 +2361,7 @@ button.icon-button.active i.fa-retweet { .load-more { display: block; - color: lighten($ui-base-color, 26%); + color: $ui-base-lighter-color; background-color: transparent; border: 0; font-size: inherit; @@ -2529,11 +2551,72 @@ button.icon-button.active i.fa-retweet { } .loading-indicator { - color: $ui-secondary-color; - font-size: 16px; - font-weight: 500; - padding-top: 120px; - text-align: center; + color: lighten($ui-base-color, 26%); + font-size: 12px; + font-weight: 400; + text-transform: uppercase; + overflow: visible; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + + span { + display: block; + float: left; + margin-left: 50%; + transform: translateX(-50%); + margin: 82px 0 0 50%; + white-space: nowrap; + animation: loader-label 1.15s infinite cubic-bezier(0.215, 0.610, 0.355, 1.000); + } +} + +.loading-indicator__figure { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 0; + height: 0; + box-sizing: border-box; + border: 0 solid lighten($ui-base-color, 26%); + border-radius: 50%; + animation: loader-figure 1.15s infinite cubic-bezier(0.215, 0.610, 0.355, 1.000); +} + +@keyframes loader-figure { + 0% { + width: 0; + height: 0; + background-color: lighten($ui-base-color, 26%); + } + + 29% { + background-color: lighten($ui-base-color, 26%); + } + + 30% { + width: 42px; + height: 42px; + background-color: transparent; + border-width: 21px; + opacity: 1; + } + + 100% { + width: 42px; + height: 42px; + border-width: 0; + opacity: 0; + background-color: transparent; + } +} + +@keyframes loader-label { + 0% { opacity: 0.25; } + 30% { opacity: 1; } + 100% { opacity: 0.25; } } .video-error-cover { @@ -2987,13 +3070,13 @@ button.icon-button.active i.fa-retweet { color: $ui-secondary-color; font-size: 18px; font-weight: 500; - border: 2px dashed lighten($ui-base-color, 26%); + border: 2px dashed $ui-base-lighter-color; border-radius: 4px; } .upload-progress { padding: 10px; - color: lighten($ui-base-color, 26%); + color: $ui-base-lighter-color; overflow: hidden; display: flex; @@ -3018,7 +3101,7 @@ button.icon-button.active i.fa-retweet { width: 100%; height: 6px; border-radius: 6px; - background: lighten($ui-base-color, 26%); + background: $ui-base-lighter-color; position: relative; margin-top: 5px; } @@ -3303,7 +3386,7 @@ button.icon-button.active i.fa-retweet { } .search-results__header { - color: lighten($ui-base-color, 26%); + color: $ui-base-lighter-color; background: lighten($ui-base-color, 2%); border-bottom: 1px solid darken($ui-base-color, 4%); padding: 15px 10px; @@ -3399,6 +3482,10 @@ button.icon-button.active i.fa-retweet { } } +.media-modal__content { + background: $base-overlay-background; +} + .media-modal__close { position: absolute; right: 4px; @@ -3897,7 +3984,7 @@ button.icon-button.active i.fa-retweet { .attachment-list__icon { flex: 0 0 auto; - color: lighten($ui-base-color, 26%); + color: $ui-base-lighter-color; padding: 8px 18px; cursor: default; border-right: 1px solid lighten($ui-base-color, 8%); @@ -3927,7 +4014,7 @@ button.icon-button.active i.fa-retweet { a { text-decoration: none; - color: lighten($ui-base-color, 26%); + color: $ui-base-lighter-color; font-weight: 500; &:hover { @@ -4124,7 +4211,7 @@ button.icon-button.active i.fa-retweet { } .account-section-headline { - color: lighten($ui-base-color, 26%); + color: $ui-base-lighter-color; background: lighten($ui-base-color, 2%); border-bottom: 1px solid lighten($ui-base-color, 4%); padding: 15px 10px; @@ -4160,10 +4247,24 @@ button.icon-button.active i.fa-retweet { noscript { text-align: center; - div { - font-size: 20px; - margin: 20px 0; + img { + width: 200px; + opacity: 0.5; + animation: flicker 4s infinite; } + + div { + font-size: 14px; + margin: 30px auto; + color: $ui-secondary-color; + max-width: 400px; + } +} + +@keyframes flicker { + 0% { opacity: 1; } + 30% { opacity: 0.75; } + 100% { opacity: 1; } } @media screen and (max-width: 1024px) and (max-height: 400px) { diff --git a/app/javascript/styles/containers.scss b/app/javascript/styles/containers.scss index 44d4c11187c..7dcf2c0062d 100644 --- a/app/javascript/styles/containers.scss +++ b/app/javascript/styles/containers.scss @@ -23,8 +23,7 @@ align-items: center; img { - width: 32px; - height: 32px; + height: 42px; margin-right: 10px; } diff --git a/app/javascript/styles/forms.scss b/app/javascript/styles/forms.scss index c467aa7db33..cffb6f19727 100644 --- a/app/javascript/styles/forms.scss +++ b/app/javascript/styles/forms.scss @@ -32,7 +32,7 @@ code { line-height: 18px; margin-top: 15px; margin-bottom: 0; - color: lighten($ui-base-color, 26%); + color: $ui-base-lighter-color; a { color: $ui-primary-color; @@ -308,7 +308,7 @@ code { padding: 7px 4px; padding-bottom: 9px; font-size: 16px; - color: lighten($ui-base-color, 26%); + color: $ui-base-lighter-color; font-family: inherit; pointer-events: none; cursor: default; diff --git a/app/javascript/styles/stream_entries.scss b/app/javascript/styles/stream_entries.scss index a9111d7c9bb..baacb491303 100644 --- a/app/javascript/styles/stream_entries.scss +++ b/app/javascript/styles/stream_entries.scss @@ -36,6 +36,18 @@ } } + &.with-header { + .entry { + &:first-child { + &, + .detailed-status.light, + .status.light { + border-radius: 0; + } + } + } + } + .status.light { padding: 14px 14px 14px (48px + 14px * 2); position: relative; @@ -247,7 +259,9 @@ border: medium none; display: block; flex: 1 1 auto; + width: 100%; height: 100%; + overflow: hidden; margin-right: 2px; &:last-child { diff --git a/app/javascript/styles/variables.scss b/app/javascript/styles/variables.scss index bf8c12bc048..090706ff54c 100644 --- a/app/javascript/styles/variables.scss +++ b/app/javascript/styles/variables.scss @@ -22,10 +22,11 @@ $valid-value-color: $success-green !default; $error-value-color: $error-red !default; // Tell UI to use selected colors -$ui-base-color: $classic-base-color !default; // Darkest -$ui-primary-color: $classic-primary-color !default; // Lighter -$ui-secondary-color: $classic-secondary-color !default; // Lightest -$ui-highlight-color: $classic-highlight-color !default; // Vibrant +$ui-base-color: $classic-base-color !default; // Darkest +$ui-base-lighter-color: lighten($ui-base-color, 26%) !default; // Lighter darkest +$ui-primary-color: $classic-primary-color !default; // Lighter +$ui-secondary-color: $classic-secondary-color !default; // Lightest +$ui-highlight-color: $classic-highlight-color !default; // Vibrant // Avatar border size (8% default, 100% for rounded avatars) $ui-avatar-border-size: 8%; diff --git a/app/models/domain_block.rb b/app/models/domain_block.rb index f26e8183ffc..aea8919af83 100644 --- a/app/models/domain_block.rb +++ b/app/models/domain_block.rb @@ -12,7 +12,7 @@ # class DomainBlock < ApplicationRecord - enum severity: [:silence, :suspend] + enum severity: [:silence, :suspend, :noop] attr_accessor :retroactive diff --git a/app/models/user.rb b/app/models/user.rb index 25dc2586434..96a2d09b778 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -53,6 +53,7 @@ class User < ApplicationRecord scope :admins, -> { where(admin: true) } scope :confirmed, -> { where.not(confirmed_at: nil) } scope :inactive, -> { where(arel_table[:current_sign_in_at].lt(ACTIVE_DURATION.ago)) } + scope :active, -> { confirmed.where(arel_table[:current_sign_in_at].gteq(ACTIVE_DURATION.ago)).joins(:account).where(accounts: { suspended: false }) } scope :matches_email, ->(value) { where(arel_table[:email].matches("#{value}%")) } scope :with_recent_ip_address, ->(value) { where(arel_table[:current_sign_in_ip].eq(value).or(arel_table[:last_sign_in_ip].eq(value))) } diff --git a/app/services/block_domain_service.rb b/app/services/block_domain_service.rb index e8b3a870d37..a6b3c4cdbfc 100644 --- a/app/services/block_domain_service.rb +++ b/app/services/block_domain_service.rb @@ -11,16 +11,16 @@ class BlockDomainService < BaseService private def process_domain_block + clear_media! if domain_block.reject_media? if domain_block.silence? silence_accounts! - else + elsif domain_block.suspend? suspend_accounts! end end def silence_accounts! blocked_domain_accounts.in_batches.update_all(silenced: true) - clear_media! if domain_block.reject_media? end def clear_media! diff --git a/app/services/unblock_domain_service.rb b/app/services/unblock_domain_service.rb index 169d2f78190..946b6d465c3 100644 --- a/app/services/unblock_domain_service.rb +++ b/app/services/unblock_domain_service.rb @@ -10,7 +10,7 @@ class UnblockDomainService < BaseService end def process_retroactive_updates - blocked_accounts.in_batches.update_all(update_options) + blocked_accounts.in_batches.update_all(update_options) unless domain_block.noop? end def blocked_accounts diff --git a/app/views/about/_contact.html.haml b/app/views/about/_contact.html.haml index 292a58575ae..82263996222 100644 --- a/app/views/about/_contact.html.haml +++ b/app/views/about/_contact.html.haml @@ -1,5 +1,8 @@ .panel - .panel-header= t 'about.contact' + .panel-header + = succeed ':' do + = t 'about.contact' + %span{ title: contact.site_contact_email.presence }= contact.site_contact_email.presence .panel-body - if contact.contact_account .owner @@ -8,8 +11,9 @@ = link_to TagManager.instance.url_for(contact.contact_account) do %span.display_name.emojify= display_name(contact.contact_account) %span.username @#{contact.contact_account.acct} - - - unless contact.site_contact_email.blank? - .contact-email - = t 'about.business_email' - %strong= contact.site_contact_email + - else + .owner + .avatar= image_tag full_asset_url('avatars/original/missing.png', skip_pipeline: true) + .name + %span.display_name= t 'about.contact_missing' + %span.username= t 'about.contact_unavailable' diff --git a/app/views/about/_links.html.haml b/app/views/about/_links.html.haml deleted file mode 100644 index d7fe317e61d..00000000000 --- a/app/views/about/_links.html.haml +++ /dev/null @@ -1,12 +0,0 @@ -.panel - .panel-header= t 'about.links' - .panel-list - %ul - - if user_signed_in? - %li= link_to t('about.get_started'), root_path - - else - - if instance.open_registrations - %li= link_to t('about.get_started'), new_user_registration_path - %li= link_to t('auth.login'), new_user_session_path - %li= link_to t('about.terms'), terms_path - %li= link_to t('about.source_code'), 'https://github.com/chronister/mastodon' diff --git a/app/views/about/_version.html.haml b/app/views/about/_version.html.haml deleted file mode 100644 index 3ed35da51da..00000000000 --- a/app/views/about/_version.html.haml +++ /dev/null @@ -1,9 +0,0 @@ -.panel - .panel-header= t 'about.version' - .panel-body - - if @instance_presenter.commit_hash == "" - %strong= version.version_number - - else - %strong= version.version_number - %strong= "#{@instance_presenter.commit_hash}" - diff --git a/app/views/about/more.html.haml b/app/views/about/more.html.haml index cce74956101..11315fefaa9 100644 --- a/app/views/about/more.html.haml +++ b/app/views/about/more.html.haml @@ -1,16 +1,44 @@ - content_for :page_title do = site_hostname -.wrapper.thicc - .sidebar-layout - .main - .panel - %h2= site_hostname +- content_for :header_tags do + = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous' - - unless @instance_presenter.site_description.blank? - %p!= @instance_presenter.site_description + %meta{ property: 'og:site_name', content: site_title }/ + %meta{ property: 'og:url', content: about_url }/ + %meta{ property: 'og:type', content: 'website' }/ + %meta{ property: 'og:title', content: site_hostname }/ + %meta{ property: 'og:description', content: strip_tags(@instance_presenter.site_description.presence || t('about.about_mastodon_html')) }/ + %meta{ property: 'og:image', content: asset_pack_path('mastodon_small.jpg', protocol: :request) }/ + %meta{ property: 'og:image:width', content: '400' }/ + %meta{ property: 'og:image:height', content: '400' }/ + %meta{ property: 'twitter:card', content: 'summary' }/ - .information-board +.landing-page + .header-wrapper.compact + .header + .container.links + .brand + = link_to root_url do + = image_tag asset_pack_path('logo_full.svg'), alt: 'Mastodon' + + %ul.nav + %li + - if user_signed_in? + = link_to t('settings.back'), root_url, class: 'webapp-btn' + - else + = link_to t('auth.login'), new_user_session_path, class: 'webapp-btn' + %li= link_to t('about.about_this'), about_more_path + %li= link_to t('about.other_instances'), 'https://joinmastodon.org/' + + .container.hero + .heading + %h3= t('about.description_headline', domain: site_hostname) + %p= @instance_presenter.site_description.html_safe.presence || t('about.generic_description', domain: site_hostname) + + .information-board + .container + .information-board-sections .section %span= t 'about.user_count_before' %strong= number_with_delimiter @instance_presenter.user_count @@ -23,11 +51,14 @@ %span= t 'about.domain_count_before' %strong= number_with_delimiter @instance_presenter.domain_count %span= t 'about.domain_count_after' - - - unless @instance_presenter.site_extended_description.blank? - .panel!= @instance_presenter.site_extended_description - - .sidebar = render 'contact', contact: @instance_presenter - = render 'links', instance: @instance_presenter - = render 'version', version: @instance_presenter + + .extended-description + .container + = @instance_presenter.site_extended_description.html_safe.presence || t('about.extended_description_html') + + .footer-links + .container + %p + = link_to t('about.source_code'), 'https://github.com/tootsuite/mastodon' + = " (#{@instance_presenter.version_number})" diff --git a/app/views/about/show.html.haml b/app/views/about/show.html.haml index 999d1e37b66..a3c8e4a84a2 100644 --- a/app/views/about/show.html.haml +++ b/app/views/about/show.html.haml @@ -24,8 +24,7 @@ .container.links .brand = link_to root_url do - = image_tag asset_pack_path('logo.svg'), alt: '', role: 'presentation' - Mastodon + = image_tag asset_pack_path('logo_full.svg'), alt: 'Mastodon' %ul.nav %li diff --git a/app/views/about/terms.html.haml b/app/views/about/terms.html.haml index 58064f0bed9..7004cb0b13f 100644 --- a/app/views/about/terms.html.haml +++ b/app/views/about/terms.html.haml @@ -1,8 +1,23 @@ - content_for :page_title do = t('terms.title', instance: site_hostname) -.wrapper - - if @instance_presenter.site_terms.present? - = raw @instance_presenter.site_terms - - else - = t('terms.body_html') +.landing-page + .header-wrapper.compact + .header + .container.links + .brand + = link_to root_url do + = image_tag asset_pack_path('logo_full.svg'), alt: 'Mastodon' + + %ul.nav + %li + - if user_signed_in? + = link_to t('settings.back'), root_url, class: 'webapp-btn' + - else + = link_to t('auth.login'), new_user_session_path, class: 'webapp-btn' + %li= link_to t('about.about_this'), about_more_path + %li= link_to t('about.other_instances'), 'https://joinmastodon.org/' + + .extended-description + .container + = @instance_presenter.site_terms.html_safe.presence || t('terms.body_html') diff --git a/app/views/accounts/show.html.haml b/app/views/accounts/show.html.haml index 7ed634e5d28..150c1479116 100644 --- a/app/views/accounts/show.html.haml +++ b/app/views/accounts/show.html.haml @@ -23,9 +23,9 @@ .accounts-grid = render 'nothing_here' - else - .activity-stream + .activity-stream.with-header = render partial: 'stream_entries/status', collection: @statuses, as: :status - .pagination - - if @statuses.size == 20 + - if @statuses.size == 20 + .pagination = link_to safe_join([t('pagination.next'), fa_icon('chevron-right')], ' '), short_account_url(@account, max_id: @statuses.last.id), class: 'next', rel: 'next' diff --git a/app/views/admin/domain_blocks/show.html.haml b/app/views/admin/domain_blocks/show.html.haml index 70dfef9b2d5..ea1929d44f7 100644 --- a/app/views/admin/domain_blocks/show.html.haml +++ b/app/views/admin/domain_blocks/show.html.haml @@ -3,13 +3,18 @@ = simple_form_for @domain_block, url: admin_domain_block_path(@domain_block), method: :delete do |f| - = f.input :retroactive, - as: :boolean, - wrapper: :with_label, - label: t(".retroactive.#{@domain_block.severity}"), - hint: t(:affected_accounts, - scope: [:admin, :domain_blocks, :show], - count: @domain_block.accounts_count) + - if (@domain_block.noop?) + = f.input :retroactive, + as: :hidden, + input_html: { :value => "0" } + - else + = f.input :retroactive, + as: :boolean, + wrapper: :with_label, + label: t(".retroactive.#{@domain_block.severity}"), + hint: t(:affected_accounts, + scope: [:admin, :domain_blocks, :show], + count: @domain_block.accounts_count) .actions = f.button :button, t('.undo'), type: :submit diff --git a/app/views/home/index.html.haml b/app/views/home/index.html.haml index f0f7bd619cc..1ed5c1ae063 100644 --- a/app/views/home/index.html.haml +++ b/app/views/home/index.html.haml @@ -7,6 +7,7 @@ .app-holder#mastodon{ data: { props: Oj.dump(default_props) } } %noscript - = image_tag asset_pack_path('logo.png') + = image_tag asset_pack_path('logo.svg'), alt: 'Mastodon' + %div = t('errors.noscript') diff --git a/app/views/layouts/admin.html.haml b/app/views/layouts/admin.html.haml index 59d95a0c684..c98d85f7bfe 100644 --- a/app/views/layouts/admin.html.haml +++ b/app/views/layouts/admin.html.haml @@ -6,7 +6,7 @@ .sidebar-wrapper .sidebar = link_to root_path do - = image_tag asset_pack_path('logo.png'), class: 'logo' + = image_tag asset_pack_path('logo.svg'), class: 'logo', alt: 'Mastodon' = render_navigation .content-wrapper diff --git a/app/views/layouts/auth.html.haml b/app/views/layouts/auth.html.haml index b4f1bd0f35a..d8ac733f913 100644 --- a/app/views/layouts/auth.html.haml +++ b/app/views/layouts/auth.html.haml @@ -6,8 +6,7 @@ .logo-container %h1 = link_to root_path do - = image_tag asset_pack_path('logo.svg') - Mastodon + = image_tag asset_pack_path('logo_full.svg'), alt: 'Mastodon' .form-container = render 'flashes' diff --git a/app/views/manifests/show.json.rabl b/app/views/manifests/show.json.rabl index 0aa1728e76c..ee0a703249a 100644 --- a/app/views/manifests/show.json.rabl +++ b/app/views/manifests/show.json.rabl @@ -2,7 +2,7 @@ object false node(:name) { Setting.site_title } node(:short_name) { Setting.site_title } -node(:description) { strip_tags(Setting.site_description.presence || I18n.t('about.about_mastodon')) } +node(:description) { strip_tags(Setting.site_description.presence || I18n.t('about.about_mastodon_html')) } node(:icons) { [{ src: '/android-chrome-192x192.png', sizes: '192x192', type: 'image/png' }] } node(:theme_color) { '#282c37' } node(:background_color) { '#d9e1e8' } diff --git a/app/views/well_known/webfinger/show.json.rabl b/app/views/well_known/webfinger/show.json.rabl index af11cd20700..762d1860d73 100644 --- a/app/views/well_known/webfinger/show.json.rabl +++ b/app/views/well_known/webfinger/show.json.rabl @@ -8,7 +8,7 @@ end node(:links) do [ - { rel: 'http://webfinger.net/rel/profile-page', type: 'text/html', href: account_url(@account) }, + { rel: 'http://webfinger.net/rel/profile-page', type: 'text/html', href: short_account_url(@account) }, { rel: 'http://schemas.google.com/g/2010#updates-from', type: 'application/atom+xml', href: account_url(@account, format: 'atom') }, { rel: 'self', type: 'application/activity+json', href: account_url(@account) }, { rel: 'salmon', href: api_salmon_url(@account.id) }, diff --git a/app/views/well_known/webfinger/show.xml.ruby b/app/views/well_known/webfinger/show.xml.ruby index 844742d68a0..b0158b8bd1d 100644 --- a/app/views/well_known/webfinger/show.xml.ruby +++ b/app/views/well_known/webfinger/show.xml.ruby @@ -3,7 +3,7 @@ Nokogiri::XML::Builder.new do |xml| xml.Subject @canonical_account_uri xml.Alias short_account_url(@account) xml.Alias account_url(@account) - xml.Link(rel: 'http://webfinger.net/rel/profile-page', type: 'text/html', href: TagManager.instance.url_for(@account)) + xml.Link(rel: 'http://webfinger.net/rel/profile-page', type: 'text/html', href: short_account_url(@account)) xml.Link(rel: 'http://schemas.google.com/g/2010#updates-from', type: 'application/atom+xml', href: account_url(@account, format: 'atom')) xml.Link(rel: 'self', type: 'application/activity+json', href: account_url(@account)) xml.Link(rel: 'salmon', href: api_salmon_url(@account.id)) diff --git a/app/workers/scheduler/user_cleanup_scheduler.rb b/app/workers/scheduler/user_cleanup_scheduler.rb new file mode 100644 index 00000000000..a8f8fbd83df --- /dev/null +++ b/app/workers/scheduler/user_cleanup_scheduler.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true +require 'sidekiq-scheduler' + +class Scheduler::UserCleanupScheduler + include Sidekiq::Worker + + def perform + User.where('confirmed_at is NULL AND confirmation_sent_at <= ?', 2.days.ago).find_in_batches do |batch| + Account.where(id: batch.map(&:account_id)).delete_all + User.where(id: batch.map(&:id)).delete_all + end + end +end diff --git a/config/deploy.rb b/config/deploy.rb index 0f35114858c..33b88b109cb 100644 --- a/config/deploy.rb +++ b/config/deploy.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -lock '3.8.1' +lock '3.8.2' set :repo_url, ENV.fetch('REPO', 'https://github.com/tootsuite/mastodon.git') set :branch, ENV.fetch('BRANCH', 'master') diff --git a/config/locales/activerecord.nl.yml b/config/locales/activerecord.nl.yml new file mode 100644 index 00000000000..b39c8cd780b --- /dev/null +++ b/config/locales/activerecord.nl.yml @@ -0,0 +1,12 @@ +nl: + activerecord: + errors: + models: + account: + attributes: + username: + invalid: alleen letters, nummers en underscores + status: + attributes: + reblog: + taken: van toot bestaat al diff --git a/config/locales/ar.yml b/config/locales/ar.yml index d395dc9c371..ec051591aba 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -1,21 +1,17 @@ --- ar: about: - about_mastodon: ماستدون شبكة إجتماعية حرة و مفتوحة المصدر. هو بديل لامركزي لمنصات تجارية ، يمكنك من تجنب احتكار شركة واحدة للإتصالات الخاصة بك. يمكنك اختيار أي خادم تثق فيه. أيهما تختار، يمكنك التفاعل مع أي شخص آخر على الشبكة. يمكن لأي شخص تنصيب و تشغيل خادم ماستدون خاص به والمشاركة في الشبكات الاجتماعية بكل شفافية. + about_mastodon_html: ماستدون شبكة إجتماعية حرة و مفتوحة المصدر. هو بديل لامركزي لمنصات تجارية ، يمكنك من تجنب احتكار شركة واحدة للإتصالات الخاصة بك. يمكنك اختيار أي خادم تثق فيه. أيهما تختار، يمكنك التفاعل مع أي شخص آخر على الشبكة. يمكن لأي شخص تنصيب و تشغيل خادم ماستدون خاص به والمشاركة في الشبكات الاجتماعية بكل شفافية. about_this: عن مثيل الخادوم هذا - business_email: 'البريد الإلكتروني المهني :' closed_registrations: التسجيلات في مثيل الخادوم هذا مُغلقة حاليًا. contact: للتواصل معنا description_headline: ما هو %{domain}? domain_count_after: خوادم أخرى domain_count_before: متصل بـ - get_started: إبدأ الآن - links: الروابط other_instances: خوادم أخرى source_code: الشفرة المصدرية status_count_after: منشورا status_count_before: نشروا - terms: شروط الاستعمال user_count_after: مستخدم user_count_before: يستضيف accounts: diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 042d609b033..65ff5c02515 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -1,21 +1,17 @@ --- bg: about: - about_mastodon: Mastodon е безплатен сървър с отворен код за социални мрежи. Като децентрализирана алтернатива на комерсиалните платформи, той позволява избягването на риска от монополизация на твоята комуникация от единични компании. Изберете си сървър, на който се доверявате, и ще можете да контактувате с всички останали. Всеки може да пусне Mastodon и лесно да вземе участие в социалната мрежа. + about_mastodon_html: Mastodon е безплатен сървър с отворен код за социални мрежи. Като децентрализирана алтернатива на комерсиалните платформи, той позволява избягването на риска от монополизация на твоята комуникация от единични компании. Изберете си сървър, на който се доверявате, и ще можете да контактувате с всички останали. Всеки може да пусне Mastodon и лесно да вземе участие в социалната мрежа. about_this: За тази инстанция - business_email: 'Служебен e-mail:' closed_registrations: В момента регистрациите за тази инстанция са затворени. contact: За контакти description_headline: Какво е %{domain}? domain_count_after: други инстанции domain_count_before: Свързани към - get_started: Първи стъпки - links: Връзки other_instances: Други инстанции source_code: Програмен код status_count_after: публикации status_count_before: Написали - terms: Условия user_count_after: потребители user_count_before: Дом на accounts: diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 0ba893a122a..ce4831ac2b4 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -1,24 +1,19 @@ --- ca: about: - about_mastodon: Mastodon és un servidor de xarxa social lliure i de codi obert. Una alternativa descentralitzada a plataformes comercials, que evita el risc que una única companyia monopolitzi la teva comunicació. Qualsevol pot executar Mastodon i participar sense problemes en la xarxa social. + about_mastodon_html: Mastodon és un servidor de xarxa social lliure i de codi obert. Una alternativa descentralitzada a plataformes comercials, que evita el risc que una única companyia monopolitzi la teva comunicació. Qualsevol pot executar Mastodon i participar sense problemes en la xarxa social. about_this: Sobre aquesta instància - business_email: 'Adreça de contacte:' closed_registrations: Els registres estan actualment tancats en aquesta instància. contact: Contacte description_headline: Què es %{domain}? domain_count_after: altres instàncies domain_count_before: Connectat a - get_started: Començar - links: Vincles other_instances: Altres instàncies source_code: Codi font status_count_after: estats status_count_before: Que han escrit - terms: Termes user_count_after: usuaris registrats user_count_before: Tenim - version: Versió accounts: follow: Seguir followers: Seguidors diff --git a/config/locales/de.yml b/config/locales/de.yml index b084aca3159..04d3fd0b899 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1,24 +1,19 @@ --- de: about: - about_mastodon: Mastodon ist ein freier, quelloffener sozialer Netzwerkserver. Als dezentralisierte Alternative zu kommerziellen Plattformen verhindert es die Risiken, die entstehen, wenn eine einzelne Firma deine Kommunikation monopolisiert. Jeder kann Mastodon verwenden und ganz einfach am sozialen Netzwerk teilnehmen. + about_mastodon_html: Mastodon ist ein freier, quelloffener sozialer Netzwerkserver. Als dezentralisierte Alternative zu kommerziellen Plattformen verhindert es die Risiken, die entstehen, wenn eine einzelne Firma deine Kommunikation monopolisiert. Jeder kann Mastodon verwenden und ganz einfach am sozialen Netzwerk teilnehmen. about_this: Über diese Instanz - business_email: 'Geschäftliche E-Mail:' closed_registrations: Die Registrierung ist auf dieser Instanz momentan geschlossen. contact: Kontakt description_headline: Was ist %{domain}? domain_count_after: andere Instanzen domain_count_before: Verbunden mit - get_started: Erste Schritte - links: Links other_instances: Andere Instanzen source_code: Quellcode status_count_after: Beiträge verfassten status_count_before: die - terms: AGB user_count_after: Benutzer user_count_before: Heimat für - version: Version accounts: follow: Folgen followers: Folgende diff --git a/config/locales/devise.nl.yml b/config/locales/devise.nl.yml index 1739feacd29..f8f59e6608d 100644 --- a/config/locales/devise.nl.yml +++ b/config/locales/devise.nl.yml @@ -2,7 +2,7 @@ nl: devise: confirmations: - confirmed: Je account is bevestigd. + confirmed: Jouw account is bevestigd. send_instructions: Je ontvangt via e-mail instructies hoe je jouw account kunt bevestigen. Kijk tussen je spam wanneer niks werd ontvangen. send_paranoid_instructions: Als jouw e-mailadres in de database staat, ontvang je via e-mail instructies hoe je jouw account kunt bevestigen. Kijk tussen je spam wanneer niks werd ontvangen. failure: @@ -10,8 +10,8 @@ nl: inactive: Jouw account is nog niet geactiveerd. invalid: Ongeldig e-mailadres of wachtwoord. invalid_token: Ongeldige bevestigingscode. - last_attempt: Je hebt nog één poging over voordat jouw account geblokkeerd wordt. - locked: Jouw account is geblokkeerd. + last_attempt: Je hebt nog één poging over voordat jouw account wordt opgeschort. + locked: Jouw account is opgeschort. not_found_in_database: Ongeldig e-mailadres of wachtwoord. timeout: Jouw sessie is verlopen, log opnieuw in. unauthenticated: Je dient in te loggen of te registreren. @@ -24,21 +24,21 @@ nl: reset_password_instructions: subject: 'Mastodon: Wachtwoord opnieuw instellen' unlock_instructions: - subject: 'Mastodon: Instructies om account te deblokkeren' + subject: 'Mastodon: Instructies om opschorten account ongedaan te maken' omniauth_callbacks: failure: Kon je niet aanmelden met jouw %{kind} account, omdat "%{reason}". success: Successvol aangemeld met jouw %{kind} account. passwords: no_token: Je kunt deze pagina niet benaderen zonder dat je een e-mail om je wachtwoord opnieuw in te stellen hebt ontvangen. send_instructions: Je ontvangt via e-mail instructies hoe je jouw wachtwoord opnieuw moet instellen. Kijk tussen je spam wanneer niks werd ontvangen. - send_paranoid_instructions: Als jouw e-mailadres in de database staat, ontvang je via e-mail instructies hoe je jouw wachtwoord opnieuw moet instellen. Kijk tussen je spam wanneer niks werd ontvangen. + send_paranoid_instructions: Als jouw e-mailadres in de database staat, ontvang je via e-mail instructies hoe je jouw wachtwoord opnieuw kunt instellen. Kijk tussen je spam wanneer niks werd ontvangen. updated: Jouw wachtwoord is gewijzigd. Je bent nu ingelogd. updated_not_active: Jouw wachtwoord is gewijzigd. registrations: destroyed: Jouw account is verwijderd. Wellicht tot ziens! signed_up: Je bent geregistreerd. signed_up_but_inactive: Je bent geregistreerd. Je kon alleen niet automatisch ingelogd worden omdat jouw account nog niet geactiveerd is. - signed_up_but_locked: Je bent ingeschreven. Je kon alleen niet automatisch ingelogd worden omdat jouw account geblokkeerd is. + signed_up_but_locked: Je bent ingeschreven. Je kon alleen niet automatisch ingelogd worden omdat jouw account is opgeschort. signed_up_but_unconfirmed: Je ontvangt via e-mail instructies hoe je jouw account kunt activeren. Kijk tussen je spam wanneer niks werd ontvangen. update_needs_confirmation: Je hebt je e-mailadres succesvol gewijzigd, maar we moeten je nieuwe mailadres nog bevestigen. Controleer jouw e-mail en klik op de link in de mail om jouw e-mailadres te bevestigen. Kijk tussen je spam wanneer niks werd ontvangen. updated: Jouw accountgegevens zijn opgeslagen. @@ -46,16 +46,16 @@ nl: signed_in: Je bent succesvol ingelogd. signed_out: Je bent succesvol uitgelogd. unlocks: - send_instructions: Je ontvangt via e-mail instructies hoe je jouw account kunt deblokkeren. Kijk tussen je spam wanneer niks werd ontvangen. - send_paranoid_instructions: Als jouw e-mailadres in de database staat, ontvang je via e-mail instructies hoe je jouw account kunt deblokkeren. Kijk tussen je spam wanneer niks werd ontvangen. - unlocked: Jouw account is gedeblokkeerd. Je kunt nu weer inloggen. + send_instructions: Je ontvangt via e-mail instructies hoe je het opschorten van jouw account ongedaan kunt maken. Kijk tussen je spam wanneer niks werd ontvangen. + send_paranoid_instructions: Als jouw e-mailadres in de database staat, ontvang je via e-mail instructies hoe je het opschorten van jouw account ongedaan kunt maken. Kijk tussen je spam wanneer niks werd ontvangen. + unlocked: Jouw account is niet meer opgeschort. Je kunt nu weer inloggen. errors: messages: already_confirmed: is reeds bevestigd confirmation_period_expired: moet worden bevestigd binnen %{period}, probeer het nog een keer expired: is verlopen, vraag een nieuwe aan not_found: niet gevonden - not_locked: is niet geblokkeerd + not_locked: is niet opgeschort not_saved: one: '1 fout verhinderde het opslaan van deze %{resource}:' other: "%{count} fouten verhinderden het opslaan van deze %{resource}:" diff --git a/config/locales/doorkeeper.nl.yml b/config/locales/doorkeeper.nl.yml index 9edbb8c9f1f..77cf2503b41 100644 --- a/config/locales/doorkeeper.nl.yml +++ b/config/locales/doorkeeper.nl.yml @@ -109,6 +109,6 @@ nl: application: title: OAuth-autorisatie vereist scopes: - follow: volg, blokkeer, deblokkeer en stop het volgen van accounts - read: lees jouw accountgegevens - write: namens jou plaatsen + follow: accounts te volgen, te negeren en te blokkeren. + read: jouw accountgegevens te lezen + write: namens jou berichten te plaatsen diff --git a/config/locales/en.yml b/config/locales/en.yml index 47f276ca13a..8fa1ac0e38e 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -3,12 +3,16 @@ en: about: about_mastodon_html: Mastodon is a social network based on open web protocols and free, open-source software. It is decentralized like e-mail. about_this: About - business_email: 'Business e-mail:' closed_registrations: Registrations are currently closed on this instance. However! You can find a different instance to make an account on and get access to the very same network from there. contact: Contact + contact_missing: Not set + contact_unavailable: N/A description_headline: What is %{domain}? domain_count_after: other instances domain_count_before: Connected to + extended_description_html: | +

A good place for rules

+

The extended description has not been set up yet.

features: humane_approach_body: Learning from failures of other networks, Mastodon aims to make ethical design choices to combat the misuse of social media. humane_approach_title: A more humane approach @@ -20,18 +24,14 @@ en: within_reach_title: Always within reach find_another_instance: Find another instance generic_description: "%{domain} is one server in the network" - get_started: Get started hosted_on: Mastodon hosted on %{domain} learn_more: Learn more - links: Links other_instances: Instance list source_code: Source code status_count_after: statuses status_count_before: Who authored - terms: Terms user_count_after: users user_count_before: Home to - version: Version what_is_mastodon: What is Mastodon? accounts: follow: Follow @@ -108,13 +108,15 @@ en: create: Create block hint: The domain block will not prevent creation of account entries in the database, but will retroactively and automatically apply specific moderation methods on those accounts. severity: - desc_html: "Silence will make the account's posts invisible to anyone who isn't following them. Suspend will remove all of the account's content, media, and profile data." + desc_html: "Silence will make the account's posts invisible to anyone who isn't following them. Suspend will remove all of the account's content, media, and profile data. Use None if you just want to reject media files." + noop: None silence: Silence suspend: Suspend title: New domain block reject_media: Reject media files reject_media_hint: Removes locally stored media files and refuses to download any in the future. Irrelevant for suspensions severities: + noop: None silence: Silence suspend: Suspend severity: Severity @@ -198,8 +200,8 @@ en: show: Show media title: Media no_media: No media - with_media: With media title: Account statuses + with_media: With media subscriptions: callback_url: Callback URL confirmed: Confirmed @@ -272,7 +274,7 @@ en: content: Security verification failed. Are you blocking cookies? title: Security verification failed '429': Throttled - noscript: To use Mastodon, please enable JavaScript. + noscript: To use the Mastodon web application, please enable JavaScript. Alternatively, find a native app for Mastodon for your platform. exports: blocks: You block csv: CSV @@ -347,15 +349,15 @@ en: follow: title: "%{name} is now following you" mention: - action_boost: 'Boost' - action_expand: 'Show more' - action_favourite: 'Favourite' + action_boost: Boost + action_expand: Show more + action_favourite: Favourite title: "%{name} mentioned you" reblog: title: "%{name} boosted your status" subscribed: - body: "You can now receive push notifications." - title: "Subscription registered!" + body: You can now receive push notifications. + title: Subscription registered! remote_follow: acct: Enter your username@domain you want to follow from missing_resource: Could not find the required redirect URL for your account diff --git a/config/locales/eo.yml b/config/locales/eo.yml index d47a5db0edf..6673b6516ac 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -1,20 +1,16 @@ --- eo: about: - about_mastodon: Mastodon estas senpaga, malfermitkoda socia reto. Ĝi estas sencentra alia eblo al komercaj servoj. Ĝi evitigas, ke unusola firmao regu vian tutan komunikadon. Elektu servilon, kiun vi fidas. Kiu ajn estas via elekto, vi povas interagi kun ĉiuj aliaj uzantoj. Iu ajn povas krei sian propran aperaĵon de Mastodon en sia servilo, kaj partopreni en la socia reto tute glate. + about_mastodon_html: Mastodon estas senpaga, malfermitkoda socia reto. Ĝi estas sencentra alia eblo al komercaj servoj. Ĝi evitigas, ke unusola firmao regu vian tutan komunikadon. Elektu servilon, kiun vi fidas. Kiu ajn estas via elekto, vi povas interagi kun ĉiuj aliaj uzantoj. Iu ajn povas krei sian propran aperaĵon de Mastodon en sia servilo, kaj partopreni en la socia reto tute glate. about_this: Pri tiu aperaĵo - business_email: 'Profesia retpoŝt-adreso:' contact: Kontakti description_headline: Kio estas %{domain}? domain_count_after: aliaj aperaĵoj domain_count_before: Konektita al - get_started: Komenci - links: Ligiloj other_instances: Aliaj aperaĵoj source_code: Fontkodo status_count_after: mesaĝoj status_count_before: Kiu publikigis - terms: Terms user_count_after: uzantoj user_count_before: Hejmo de accounts: diff --git a/config/locales/es.yml b/config/locales/es.yml index c051c9a08d3..89e2828d0be 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -1,21 +1,17 @@ --- es: about: - about_mastodon: Mastodon es un servidor de red social libre y de código abierto. Una alternativa descentralizada a plataformas comerciales, que evita el riesgo de que una única compañía monopolice tu comunicación. Cualquiera puede ejecutar Mastodon y participar sin problemas en la red social. + about_mastodon_html: Mastodon es un servidor de red social libre y de código abierto. Una alternativa descentralizada a plataformas comerciales, que evita el riesgo de que una única compañía monopolice tu comunicación. Cualquiera puede ejecutar Mastodon y participar sin problemas en la red social. about_this: Acerca de esta instancia - business_email: 'Correo de negocios:' closed_registrations: Los registros están actualmente cerrados en esta instancia. contact: Contacto description_headline: "¿Qué es %{domain}?" domain_count_after: otras instancias domain_count_before: Conectado a - get_started: Comenzar - links: Enlaces other_instances: Otras instancias source_code: Código fuente status_count_after: estados status_count_before: Que han escrito - terms: Términos user_count_after: usuarios registrados user_count_before: Tenemos accounts: diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 218d859bb44..c42016eb3e8 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -1,24 +1,19 @@ --- fa: about: - about_mastodon: ماستدون (Mastodon) یک شبکهٔ اجتماعی آزاد و کدباز است. یک جایگزین غیرمتمرکز برای شبکه‌های تجاری، که نمی‌گذارد ارتباط‌های شما را یک شرکت در انحصار خود بگیرد. یک سرور مورد اعتماد را انتخاب کنید — هر سروری که باشد، همچنان می‌توانید با سرورهای دیگر ارتباط داشته باشید. هر کسی می‌تواند سرور ماستدون خود را راه بیندازد و در شبکهٔ اجتماعی سهیم شود. + about_mastodon_html: ماستدون (Mastodon) یک شبکهٔ اجتماعی آزاد و کدباز است. یک جایگزین غیرمتمرکز برای شبکه‌های تجاری، که نمی‌گذارد ارتباط‌های شما را یک شرکت در انحصار خود بگیرد. یک سرور مورد اعتماد را انتخاب کنید — هر سروری که باشد، همچنان می‌توانید با سرورهای دیگر ارتباط داشته باشید. هر کسی می‌تواند سرور ماستدون خود را راه بیندازد و در شبکهٔ اجتماعی سهیم شود. about_this: دربارهٔ این سرور - business_email: 'ایمیل کاری:' closed_registrations: امکان ثبت نام روی این سرور هم‌اینک فعال نیست. contact: تماس description_headline: "%{domain} چیست؟" domain_count_after: سرور دیگر domain_count_before: متصل به - get_started: آغاز کنید - links: پیوندها other_instances: سرورهای دیگر source_code: کدهای منبع status_count_after: چیز نوشته‌اند status_count_before: که جمعاً - terms: شرایط استفاده user_count_after: کاربر user_count_before: دارای - version: نسخه accounts: follow: پی بگیرید followers: پیگیران diff --git a/config/locales/fi.yml b/config/locales/fi.yml index a2488530fec..23c844741c8 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -1,20 +1,16 @@ --- fi: about: - about_mastodon: Mastodon on ilmainen, avoimeen lähdekoodiin perustuva sosiaalinen verkosto. Hajautettu vaihtoehto kaupallisille alustoille, se välttää eiskit yhden yrityksen monopolisoinnin sinun viestinnässäsi. Valitse palvelin mihin luotat — minkä tahansa valitset, voit vuorovaikuttaa muiden kanssa. Kuka tahansa voi luoda Mastodon palvelimen ja ottaa osaa sosiaaliseen verkkoon saumattomasti. + about_mastodon_html: Mastodon on ilmainen, avoimeen lähdekoodiin perustuva sosiaalinen verkosto. Hajautettu vaihtoehto kaupallisille alustoille, se välttää eiskit yhden yrityksen monopolisoinnin sinun viestinnässäsi. Valitse palvelin mihin luotat — minkä tahansa valitset, voit vuorovaikuttaa muiden kanssa. Kuka tahansa voi luoda Mastodon palvelimen ja ottaa osaa sosiaaliseen verkkoon saumattomasti. about_this: Tietoja tästä palvelimesta - business_email: 'Business e-mail:' contact: Ota yhteyttä description_headline: Mikä on %{domain}? domain_count_after: muuhun palvelimeen domain_count_before: Yhdistyneenä - get_started: Aloita käyttö - links: Linkit other_instances: Muut palvelimet source_code: Lähdekoodi status_count_after: statusta status_count_before: Ovat luoneet - terms: Ehdot user_count_after: käyttäjälle user_count_before: Koti accounts: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 7ba9e2525e3..13514bfc3e9 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -3,7 +3,6 @@ fr: about: about_mastodon_html: Mastodon est un réseau social utilisant des formats ouverts et des logiciels libres. Comme le courriel, il est décentralisé. about_this: À propos - business_email: Courriel professionnel closed_registrations: Les inscriptions sont actuellement fermées sur cette instance. Cependant, vous pouvez trouver une autre instance sur laquelle vous créer un compte et à partir de laquelle vous pourrez accéder au même réseau. contact: Contact description_headline: Qu’est-ce que %{domain} ? @@ -20,18 +19,14 @@ fr: within_reach_title: Toujours à portée de main find_another_instance: Trouver une autre instance generic_description: "%{domain} est seulement un serveur du réseau" - get_started: Rejoindre le réseau hosted_on: Instance Mastodon hébergée par %{domain} learn_more: En savoir plus - links: Liens other_instances: Liste des instances source_code: Code source status_count_after: posts status_count_before: Ayant publié - terms: Conditions d’utilisation user_count_after: utilisateur⋅ice⋅s user_count_before: Abrite - version: Version what_is_mastodon: Qu’est-ce que Mastodon ? accounts: follow: Suivre @@ -432,70 +427,7 @@ fr: reblogged: partagé sensitive_content: Contenu sensible terms: - body_html: | -

Politique de confidentialité

- -

Quelles données collectons-nous?

- -

Nous collectons des données lorsque vous vous enregistrez sur notre site et les récoltons lorsque vous participez dans le forum en lisant, écrivant, et évaluant le contenu partagé ici.

- -

Lors de l'enregistrement sur notre site, il peut vous être demandé de renseigner votre nom et adresse e-mail. Vous pouvez, cependant, visiter notre site sans inscription. Votre adresse e-mail devra être vérifiée grâce à un e-mail contenant un lien unique. Si ce lien est visité, nous savons que vous contrôlez cette adresse e-mail.

- -

Lors de l'inscription et de la publication de statuts, nous enregistrons l'adresse IP de laquelle le(s) status viennent. Nous pouvons également conserver des historiques serveurs qui contiendront l'adresse IP de chaque requête adressée à notre serveur.

- -

Que faisons-nous avec vos données?

- -

Toute information que nous collectons pourra être utilisée d'une des manières suivantes :

- -
    -
  • Pour personnaliser votre expérience — vos données nous aident à mieux répondre à vos besoins individuels.
  • -
  • Pour améliorer notre site — nous faisons tout notre possible pour améliorer notre site en fonction des données, retours et suggestions que nous recevons.
  • -
  • Afin d'améliorer le support client — vos données nous aident à mieux répondre à vos requêtes et demandes de support.
  • -
  • Afin d'envoyer des e-mails à intervalles réguliers — l'adresse e-mail que vous renseignez peut être utilisée pour vous envoyer des données et notifications concernant des changements ou en réponse à votre nom d'utilisateur⋅trice, en réponse à vos demandes et/ou autres requêtes ou questions
  • -
- -

Comment protégeons-nous vos données?

- -

Nous appliquons une multitude de mesures afin de maintenir la sécurité de vos données personnelles lorsque vous entrez, soumettez, ou accédez à ces dernières.

- -

Quelle est notre politique de conservation des données?

- -

Nous nous efforçons de:

- -
    -
  • Ne pas garder les historiques serveurs contenant l'adresse IP de chaque requête adressée à ce serveur plus de 90 jours.
  • -
  • Ne pas conserver les adresses IP associées aux utilisateur⋅trices et leur contenu plus de 5 ans.
  • -
- -

Utilisons nous des "cookies"?

- -

Oui. Les cookies sont de petits fichiers qu'un site ou prestataires de services transfèrent sur le disque dur de votre ordinateur par le biais de votre navigateur Web (si ce dernier le permet). Ces cookies permettent au site de reconnaître votre navigateur et, si vous disposez d'un compte, l'associer à votre compte.

- -

Nous utilisons les cookies pour enregistrer vos préférences pour de futures visites, compiler des données agrégées à propos du trafic et des interactions effectuées sur le site afin de proposer une meilleure expérience dans le futur. Nous pouvons contracter les services d'acteurs tiers afin de nous aider à mieux comprendre les visiteurs de notre site. Ces acteurs ont l'autorisation d'utiliser ces données seulement à des fins d'améliorations.

- -

Divulguons-nous des données à des acteurs tiers ?

- -

Nous n'échangeons pas, ne vendons pas ni effectuons de quelconques transferts avec des acteurs tiers d'informations permettant de vous identifier personnellement. Cela n'inclut pas les acteurs de confiance qui nous aident à gérer notre entreprise et à vous servir tant que ces acteurs s'accordent à garder lesdites informations confidentielles. Nous pouvons être amenés à délivrer vos informations lorsque jugé adéquat afin de respecter la loi, d'appliquer la politique de notre site, ou afin de protéger nos droits, ceux des autres, notre propriété ou sécurité. Cependant, aucune information permettant l'identification de nos visiteurs ne sera divulguée à des fins publicitaires, commerciales ou tout autre usage.

- -

Liens vers des acteurs tiers

- -

Nous pouvons être amenés à inclure ou offrir les services ou produits d'acteurs tiers sur notre site. Ces acteurs tiers possèdent leur propre politique de confidentialité. Nous ne sommes donc pas responsables du contenu ou activités desdits acteurs. Néanmoins, nous cherchons à protéger l'intégrité de notre site et sommes ouverts à toute remarque concernant ces acteurs.

- -

Children's Online Privacy Protection Act

- -

Notre site, nos produits et services sont tous dirigés à l'usage de personnes étant âgés de 13 ans ou plus. Si ce serveur est hébergé aux États-Unis et que vous êtes âgé⋅e de moins de 13 ans, au vu du COPPA (Children's Online Privacy Protection Act) n'utilisez pas ce site.

- - - -

En utilisant notre site, vous consentez à la politique de confiedentialité de notre site Web.

- -

Changements de notre politique de confidentialité

- -

Si nous décidons d'apporter des changements à notre politique de confidentialité, nous les mettrons à disposition sur cette page.

- -

Ce document est distribué sous licence CC-BY-SA. Il a été mis à jour pour la dernière fois le 31 Mai 2013. Il a été traduit en français en Juillet 2017.

- -

Originellement adapté à partir de la politique de confidentialité de Discourse

. + body_html: "

Politique de confidentialité

\n\n

Quelles données collectons-nous?

\n\n

Nous collectons des données lorsque vous vous enregistrez sur notre site et les récoltons lorsque vous participez dans le forum en lisant, écrivant, et évaluant le contenu partagé ici.

\n\n

Lors de l'enregistrement sur notre site, il peut vous être demandé de renseigner votre nom et adresse e-mail. Vous pouvez, cependant, visiter notre site sans inscription. Votre adresse e-mail devra être vérifiée grâce à un e-mail contenant un lien unique. Si ce lien est visité, nous savons que vous contrôlez cette adresse e-mail.

\n\n

Lors de l'inscription et de la publication de statuts, nous enregistrons l'adresse IP de laquelle le(s) status viennent. Nous pouvons également conserver des historiques serveurs qui contiendront l'adresse IP de chaque requête adressée à notre serveur.

\n\n

Que faisons-nous avec vos données?

\n\n

Toute information que nous collectons pourra être utilisée d'une des manières suivantes :

\n\n
    \n
  • Pour personnaliser votre expérience — vos données nous aident à mieux répondre à vos besoins individuels.
  • \n
  • Pour améliorer notre site — nous faisons tout notre possible pour améliorer notre site en fonction des données, retours et suggestions que nous recevons.
  • \n
  • Afin d'améliorer le support client — vos données nous aident à mieux répondre à vos requêtes et demandes de support.
  • \n
  • Afin d'envoyer des e-mails à intervalles réguliers — l'adresse e-mail que vous renseignez peut être utilisée pour vous envoyer des données et notifications concernant des changements ou en réponse à votre nom d'utilisateur⋅trice, en réponse à vos demandes et/ou autres requêtes ou questions
  • \n
\n\n

Comment protégeons-nous vos données?

\n \n

Nous appliquons une multitude de mesures afin de maintenir la sécurité de vos données personnelles lorsque vous entrez, soumettez, ou accédez à ces dernières.

\n\n

Quelle est notre politique de conservation des données?

\n\n

Nous nous efforçons de:

\n\n
    \n
  • Ne pas garder les historiques serveurs contenant l'adresse IP de chaque requête adressée à ce serveur plus de 90 jours.
  • \n
  • Ne pas conserver les adresses IP associées aux utilisateur⋅trices et leur contenu plus de 5 ans.
  • \n
\n\n

Utilisons nous des \"cookies\"?

\n\n

Oui. Les cookies sont de petits fichiers qu'un site ou prestataires de services transfèrent sur le disque dur de votre ordinateur par le biais de votre navigateur Web (si ce dernier le permet). Ces cookies permettent au site de reconnaître votre navigateur et, si vous disposez d'un compte, l'associer à votre compte.

\n\n

Nous utilisons les cookies pour enregistrer vos préférences pour de futures visites, compiler des données agrégées à propos du trafic et des interactions effectuées sur le site afin de proposer une meilleure expérience dans le futur. Nous pouvons contracter les services d'acteurs tiers afin de nous aider à mieux comprendre les visiteurs de notre site. Ces acteurs ont l'autorisation d'utiliser ces données seulement à des fins d'améliorations.

\n\n

Divulguons-nous des données à des acteurs tiers ?

\n\n

Nous n'échangeons pas, ne vendons pas ni effectuons de quelconques transferts avec des acteurs tiers d'informations permettant de vous identifier personnellement. Cela n'inclut pas les acteurs de confiance qui nous aident à gérer notre entreprise et à vous servir tant que ces acteurs s'accordent à garder lesdites informations confidentielles. Nous pouvons être amenés à délivrer vos informations lorsque jugé adéquat afin de respecter la loi, d'appliquer la politique de notre site, ou afin de protéger nos droits, ceux des autres, notre propriété ou sécurité. Cependant, aucune information permettant l'identification de nos visiteurs ne sera divulguée à des fins publicitaires, commerciales ou tout autre usage.

\n\n

Liens vers des acteurs tiers

\n\n

Nous pouvons être amenés à inclure ou offrir les services ou produits d'acteurs tiers sur notre site. Ces acteurs tiers possèdent leur propre politique de confidentialité. Nous ne sommes donc pas responsables du contenu ou activités desdits acteurs. Néanmoins, nous cherchons à protéger l'intégrité de notre site et sommes ouverts à toute remarque concernant ces acteurs.

\n\n

Children's Online Privacy Protection Act

\n\n

Notre site, nos produits et services sont tous dirigés à l'usage de personnes étant âgés de 13 ans ou plus. Si ce serveur est hébergé aux États-Unis et que vous êtes âgé⋅e de moins de 13 ans, au vu du COPPA (Children's Online Privacy Protection Act) n'utilisez pas ce site.

\n\n

Votre consentement

\n\n

En utilisant notre site, vous consentez à la politique de confiedentialité de notre site Web.

\n\n

Changements de notre politique de confidentialité

\n\n

Si nous décidons d'apporter des changements à notre politique de confidentialité, nous les mettrons à disposition sur cette page.

\n\n

Ce document est distribué sous licence CC-BY-SA. Il a été mis à jour pour la dernière fois le 31 Mai 2013. Il a été traduit en français en Juillet 2017.

\n\n

Originellement adapté à partir de la politique de confidentialité de Discourse

.\n" title: "%{instance} Conditions d'utilisations et Politique de confidentialité" time: formats: diff --git a/config/locales/he.yml b/config/locales/he.yml index 251b6914e5c..dc6caf87ac2 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -1,24 +1,19 @@ --- he: about: - about_mastodon: מסטודון היא רשת חברתית חופשית, מבוססת תוכנה חופשית ("קוד פתוח"). כאלטרנטיבה בלתי ריכוזית לפלטפרומות המסחריות, מסטודון מאפשרת להמנע מהסיכונים הנלווים להפקדת התקשורת שלך בידי חברה יחידה. שמת את מבטחך בשרת אחד — לא משנה במי בחרת, תמיד אפשר לדבר עם כל שאר המשתמשים. לכל מי שרוצה יש את האפשרות להקים שרת מסטודון עצמאי, ולהשתתף ברשת החברתית באופן חלק. + about_mastodon_html: מסטודון היא רשת חברתית חופשית, מבוססת תוכנה חופשית ("קוד פתוח"). כאלטרנטיבה בלתי ריכוזית לפלטפרומות המסחריות, מסטודון מאפשרת להמנע מהסיכונים הנלווים להפקדת התקשורת שלך בידי חברה יחידה. שמת את מבטחך בשרת אחד — לא משנה במי בחרת, תמיד אפשר לדבר עם כל שאר המשתמשים. לכל מי שרוצה יש את האפשרות להקים שרת מסטודון עצמאי, ולהשתתף ברשת החברתית באופן חלק. about_this: אודות שרת זה - business_email: 'דוא"ל עסקי:' closed_registrations: הרשמות סגורות לשרת זה לעת עתה. contact: צור קשר description_headline: מהו %{domain}? domain_count_after: שרתים אחרים domain_count_before: מחובר אל - get_started: בואו נתחיל - links: קישורים other_instances: שרתים אחרים source_code: קוד מקור status_count_after: הודעות status_count_before: שכתבו - terms: תנאים user_count_after: משתמשים user_count_before: ביתם של - version: גרסה accounts: follow: לעקוב followers: עוקבים diff --git a/config/locales/hr.yml b/config/locales/hr.yml index 8297ca6296f..2d43fcad816 100644 --- a/config/locales/hr.yml +++ b/config/locales/hr.yml @@ -1,21 +1,17 @@ --- hr: about: - about_mastodon: Mastodon je besplatna, open-source socijalna mreža. Decentralizirana alternativa komercijalnim platformama, izbjegava rizik toga da jedna tvrtka monopolizira vašu komunikaciju. Izaberite server kojem ćete vjerovati — koji god odabrali, moći ćete komunicirati sa svima ostalima. Bilo tko može imati svoju vlastitu Mastodon instancu i sudjelovati u socijalnoj mreži bez problema. + about_mastodon_html: Mastodon je besplatna, open-source socijalna mreža. Decentralizirana alternativa komercijalnim platformama, izbjegava rizik toga da jedna tvrtka monopolizira vašu komunikaciju. Izaberite server kojem ćete vjerovati — koji god odabrali, moći ćete komunicirati sa svima ostalima. Bilo tko može imati svoju vlastitu Mastodon instancu i sudjelovati u socijalnoj mreži bez problema. about_this: O ovoj instanci - business_email: 'Poslovni e-mail:' closed_registrations: Registracije na ovoj instanci su trenutno zatvorene. contact: Kontakt description_headline: Što je %{domain}? domain_count_after: druge instance domain_count_before: Spojen na - get_started: Započni - links: Linkovi other_instances: Druge instance source_code: Izvorni kod status_count_after: statusi status_count_before: Tko je autor - terms: Uvjeti user_count_after: korisnici user_count_before: Home to accounts: diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 24996e39d26..53319a673e7 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -1,10 +1,8 @@ --- hu: about: - about_mastodon: Mastodon egy szabad, nyílt forráskódú szociális hálózati kiszolgálo. Egy központosítatlan alternatíva a kereskedelmi platformokra, elkerüli a kommunikációd monopolizációját veszélyét. Bárki futtathatja a Mastodon-t és részt vehet a szociális hálózatban. - get_started: Első lépések + about_mastodon_html: Mastodon egy szabad, nyílt forráskódú szociális hálózati kiszolgálo. Egy központosítatlan alternatíva a kereskedelmi platformokra, elkerüli a kommunikációd monopolizációját veszélyét. Bárki futtathatja a Mastodon-t és részt vehet a szociális hálózatban. source_code: Forráskód - terms: Feltételek accounts: follow: Követés followers: Követők @@ -32,7 +30,7 @@ hu: validation_errors: one: Valami nincs rendjén! Kérlek tekintsd meg a hibát alant other: Valami nincs rendjén! Kérlek tekintsd meg a %{count} darab hibát alant. - landing_strip_html: %{name} is a user on %{link_to_root_path}. You can follow them or interact with them if you have an account anywhere in the fediverse. + landing_strip_html: "%{name} is a user on %{link_to_root_path}. You can follow them or interact with them if you have an account anywhere in the fediverse." landing_strip_signup_html: If you don't, you can sign up here. notification_mailer: favourite: diff --git a/config/locales/id.yml b/config/locales/id.yml index 7bda52c789a..e0e82d378e7 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -1,24 +1,19 @@ --- id: about: - about_mastodon: Mastodon adalah sebuah jejaring sosial terbuka, open-sourcedesentralisasi dari platform komersial, menjauhkan anda resiko dari sebuah perusahaan yang memonopoli komunikasi anda. Pilih server yang anda percayai — apapun yang anda pilih, anda tetap dapat berinteraksi dengan semua orang. Semua orang dapat menjalankan server Mastodon sendiri dan berpartisipasi dalam jejaring sosial dengan mudah. + about_mastodon_html: Mastodon adalah sebuah jejaring sosial terbuka, open-sourcedesentralisasi dari platform komersial, menjauhkan anda resiko dari sebuah perusahaan yang memonopoli komunikasi anda. Pilih server yang anda percayai — apapun yang anda pilih, anda tetap dapat berinteraksi dengan semua orang. Semua orang dapat menjalankan server Mastodon sendiri dan berpartisipasi dalam jejaring sosial dengan mudah. about_this: Tentang server ini - business_email: 'E-mail bisnis:' closed_registrations: Pendaftaran untuk server ini sedang ditutup. contact: Kontak description_headline: Apa itu %{domain}? domain_count_after: server lain domain_count_before: Terhubung dengan - get_started: Mulai - links: Link other_instances: Server lain source_code: Kode sumber status_count_after: status status_count_before: Yang telah menulis - terms: Ketentuan user_count_after: pengguna user_count_before: Tempat bernaung bagi - version: Versi accounts: follow: Ikuti followers: Pengikut diff --git a/config/locales/io.yml b/config/locales/io.yml index b587d4bc63d..4f7323a6f29 100644 --- a/config/locales/io.yml +++ b/config/locales/io.yml @@ -1,21 +1,17 @@ --- io: about: - about_mastodon: Mastodon esas gratuita, apertitkodexa sociala reto. Ol esas sencentra altra alternativo a komercala servadi. Ol evitigas, ke sola firmo guvernez tua tota komunikadol. Selektez servero, quan tu fidas. Irge qua esas tua selekto, tu povas komunikar kun omna altra uzeri. Irgu povas krear sua propra instaluro di Mastodon en sua servero, e partoprenar en la sociala reto tote glate. + about_mastodon_html: Mastodon esas gratuita, apertitkodexa sociala reto. Ol esas sencentra altra alternativo a komercala servadi. Ol evitigas, ke sola firmo guvernez tua tota komunikadol. Selektez servero, quan tu fidas. Irge qua esas tua selekto, tu povas komunikar kun omna altra uzeri. Irgu povas krear sua propra instaluro di Mastodon en sua servero, e partoprenar en la sociala reto tote glate. about_this: Pri ta instaluro - business_email: 'Profesionala retpost-adreso:' closed_registrations: Membresko ne nun esas posible en ta instaluro. contact: Kontaktar description_headline: Quo esas %{domain}? domain_count_after: altra instaluri domain_count_before: Konektita ad - get_started: Komencar - links: Ligili other_instances: Altra instaluri source_code: Fontkodexo status_count_after: mesaji status_count_before: Qua publikigis - terms: Terms user_count_after: uzeri user_count_before: Hemo di accounts: diff --git a/config/locales/it.yml b/config/locales/it.yml index 5c014c61d2c..de96825890d 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -1,21 +1,17 @@ --- it: about: - about_mastodon: Mastodon è un social network gratuito e open-source. Un'alternativa decentralizzata alle piattaforme commerciali che evita che una singola compagnia monopolizzi il tuo modo di comunicare. Scegli un server di cui ti fidi — qualunque sia la tua scelta, potrai interagire con chiunque altro. Chiunque può sviluppare un suo server Mastodon e partecipare alla vita del social network. + about_mastodon_html: Mastodon è un social network gratuito e open-source. Un'alternativa decentralizzata alle piattaforme commerciali che evita che una singola compagnia monopolizzi il tuo modo di comunicare. Scegli un server di cui ti fidi — qualunque sia la tua scelta, potrai interagire con chiunque altro. Chiunque può sviluppare un suo server Mastodon e partecipare alla vita del social network. about_this: A proposito di questo server - business_email: 'Email di lavoro:' closed_registrations: Al momento le iscrizioni a questo server sono chiuse. contact: Contatti description_headline: Cos'è %{domain}? domain_count_after: altri server domain_count_before: Connesso a - get_started: Inizia - links: Links other_instances: Altri server source_code: Codice sorgente status_count_after: status status_count_before: Che hanno pubblicato - terms: Termini di Utilizzo user_count_after: utenti user_count_before: Casa di accounts: diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 632f93ea3b0..6763ed301ac 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -2,8 +2,7 @@ ja: about: about_mastodon_html: Mastodon は、オープンなウェブプロトコルを採用した、自由でオープンソースなソーシャルネットワークです。電子メールのような分散型の仕組みを採っています。 - about_this: このインスタンスについて - business_email: 'ビジネスメールアドレス:' + about_this: 詳細情報 closed_registrations: 現在このインスタンスでの新規登録は受け付けていません。しかし、他のインスタンスにアカウントを作成しても全く同じネットワークに参加することができます。 contact: 連絡先 description_headline: "%{domain} とは?" @@ -20,18 +19,14 @@ ja: within_reach_title: いつでも身近に find_another_instance: 他のインスタンスを探す generic_description: "%{domain} は、Mastodon インスタンスの一つです。" - get_started: 参加する hosted_on: Mastodon hosted on %{domain} learn_more: もっと詳しく - links: リンク other_instances: 他のインスタンス source_code: ソースコード status_count_after: トゥート status_count_before: トゥート数 - terms: プライバシーポリシー user_count_after: 人 user_count_before: ユーザー数 - version: バージョン what_is_mastodon: Mastodon とは? accounts: follow: フォロー @@ -198,8 +193,8 @@ ja: show: メディアを表示 title: メディア no_media: メディアなし - with_media: メディアあり title: トゥート一覧 + with_media: メディアあり subscriptions: callback_url: コールバックURL confirmed: 確認済み @@ -272,7 +267,7 @@ ja: content: セキュリティ認証に失敗しました。Cookieをブロックしていませんか? title: セキュリティ認証に失敗 '429': リクエストの制限に達しました。 - noscript: Mastodonを利用する場合はJavaScriptを有効にしてください。 + noscript: Mastodonのウェブアプリケーションを利用する場合はJavaScriptを有効にしてください。またはあなたのプラットフォーム向けのMastodonネイティブアプリを探すことができます。 exports: blocks: ブロック csv: CSV @@ -345,12 +340,12 @@ ja: favourite: title: あなたのトゥートが %{name} さんにお気に入り登録されました follow: - title: '%{name} さんにフォローされました' + title: "%{name} さんにフォローされました" mention: action_boost: ブースト action_expand: もっと見る action_favourite: お気に入り - title: '%{name} さんから返信がありました' + title: "%{name} さんから返信がありました" reblog: title: あなたのトゥートが %{name} さんにブーストされました subscribed: @@ -400,7 +395,7 @@ ja: title: セッション settings: authorized_apps: 認証済みアプリ - back: 戻る + back: Mastodon に戻る delete: アカウントの削除 edit_profile: プロフィールを編集 export: データのエクスポート diff --git a/config/locales/ko.yml b/config/locales/ko.yml index c7c310cfed2..a081de38da7 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -1,24 +1,19 @@ --- ko: about: - about_mastodon: Mastodon 은자유로운 오픈 소스소셜 네트워크입니다. 상용 플랫폼의 대체로써 분산형 구조를 채택해, 여러분의 대화가 한 회사에 독점되는 것을 방지합니다. 신뢰할 수 있는 인스턴스를 선택하세요 — 어떤 인스턴스를 고르더라도, 누구와도 대화할 수 있습니다. 누구나 자신만의 Mastodon 인스턴스를 만들 수 있으며, Seamless하게 소셜 네트워크에 참가할 수 있습니다. + about_mastodon_html: Mastodon 은자유로운 오픈 소스소셜 네트워크입니다. 상용 플랫폼의 대체로써 분산형 구조를 채택해, 여러분의 대화가 한 회사에 독점되는 것을 방지합니다. 신뢰할 수 있는 인스턴스를 선택하세요 — 어떤 인스턴스를 고르더라도, 누구와도 대화할 수 있습니다. 누구나 자신만의 Mastodon 인스턴스를 만들 수 있으며, Seamless하게 소셜 네트워크에 참가할 수 있습니다. about_this: 이 인스턴스에 대해서 - business_email: '비즈니스 메일 주소:' closed_registrations: 현재 이 인스턴스에서는 신규 등록을 받고 있지 않습니다. contact: 연락처 description_headline: "%{domain} 는 무엇인가요?" domain_count_after: 개의 인스턴스 domain_count_before: 연결됨 - get_started: 참가하기 - links: 링크 other_instances: 다른 인스턴스 source_code: 소스 코드 status_count_after: Toot status_count_before: Toot 수 - terms: 개인 정보 보호 정책 user_count_after: 명 user_count_before: 사용자 수 - version: 버전 accounts: follow: 팔로우 followers: 팔로워 diff --git a/config/locales/nl.yml b/config/locales/nl.yml index dfc58f6b35a..58282259d17 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -1,23 +1,38 @@ --- nl: about: - about_mastodon: Mastodon is een vrij, gratis en open-source sociaal netwerk. Een gedecentraliseerd alternatief voor commerciële platforms. Het voorkomt de risico's van een enkel bedrijf dat jouw communicatie monopoliseert. Kies een server die je vertrouwt — welke je ook kiest, je kunt met elke andere server communiceren. Iedereen kan een eigen Mastodon-server draaien en naadloos deelnemen in het sociale netwerk. + about_mastodon_html: Mastodon is een vrij, gratis en open-source sociaal netwerk. Een gedecentraliseerd alternatief voor commerciële platforms. Het voorkomt de risico's van een enkel bedrijf dat jouw communicatie monopoliseert. Kies een server die je vertrouwt — welke je ook kiest, je kunt met elke andere server communiceren. Iedereen kan een eigen Mastodon-server draaien en naadloos deelnemen in het sociale netwerk. about_this: Over deze server - business_email: 'E-mailadres:' closed_registrations: Registreren op deze server is momenteel uitgeschakeld. contact: Contact + contact_missing: Niet ingesteld + contact_unavailable: N/A description_headline: Wat is %{domain}? domain_count_after: andere servers domain_count_before: Verbonden met - get_started: Beginnen - links: Links + extended_description_html: | +

Een goede plek voor richtlijnen

+

De uitgebreide omschrijving is nog niet ingevuld.

+ features: + humane_approach_body: Na van de fouten van andere netwerken te hebben geleerd, tracht Mastodon ethische ontwerpkeuzes te maken om misbruik van social media te voorkomen. + humane_approach_title: Een meer menselijke aanpak + not_a_product_body: Mastodon is geen commercieel netwerk. Dus geen advertenties, geen datamining en geen besloten systemen. Er is geen centrale organisatie die alles bepaald. + not_a_product_title: Jij bent een persoon, geen product + real_conversation_body: Met 500 karakters tot jouw beschikking, en ondersteuning voor tekst- en media-waarschuwingen, kan je jezelf uiten zoals jij dat wil. + real_conversation_title: Voor echte gesprekken gemaakt + within_reach_body: Meerdere apps voor iOS, Android en andere platformen, met dank aan het ontwikkelaarsvriendelijke API-systeem, zorgen ervoor dat je overal op de hoogte blijft. + within_reach_title: Altijd binnen bereik + find_another_instance: Vind een andere server + generic_description: "%{domain} is een server in het Mastodon-netwerk" + hosted_on: Mastodon op %{domain} + learn_more: Meer leren other_instances: Andere servers source_code: Broncode status_count_after: toots status_count_before: Zij schreven - terms: Voorwaarden user_count_after: gebruikers user_count_before: Thuisbasis van + what_is_mastodon: Wat is Mastodon? accounts: follow: Volgen followers: Volgers @@ -27,8 +42,99 @@ nl: people_who_follow: Mensen die %{name} volgen posts: Toots remote_follow: Extern volgen + reserved_username: Deze gebruikersnaam is gereserveerd unfollow: Ontvolgen admin: + accounts: + are_you_sure: Weet je het zeker? + confirm: Bevestigen + confirmed: Bevestigd + disable_two_factor_authentication: 2FA uitschakelen + display_name: Weergavenaam + domain: Domein + edit: Bewerken + email: E-mail + feed_url: Feed-URL + followers: Volgers + follows: Volgt + ip: IP + location: + all: Alles + local: Lokaal + remote: Extern + title: Locatie + media_attachments: Media-bijlagen + moderation: + all: Alles + silenced: Genegeerd + suspended: Opgeschort + title: Moderatie + most_recent_activity: Laatst actief + most_recent_ip: Laatst gebruikt IP-adres + not_subscribed: Niet geabonneerd + order: + alphabetic: Alfabetisch + most_recent: Meest recent + title: + perform_full_suspension: Volledig opschorten + profile_url: Profiel-URL + public: Openbaar + push_subscription_expires: PuSH-abonnement verloopt op + redownload: Avatar vernieuwen + reset: Opnieuw + reset_password: Wachtwoord opnieuw instellen + resubscribe: Opnieuw abonneren + salmon_url: Salmon-URL + search: Zoeken + show: + created_reports: Toots door dit account gerapporteerd + report: gerapporteerd + targeted_reports: Toots van dit account gerapporteerd + silence: Negeren + statuses: Toots + subscribe: Abonneren + title: Accounts + undo_silenced: Niet meer negeren + undo_suspension: Niet meer opschorten + unsubscribe: Opzeggen + username: Gebruikersnaam + web: Webapp + domain_blocks: + add_new: Nieuwe toevoegen + created_msg: Domeinblokkade wordt nu verwerkt + destroyed_msg: Domeinblokkade is ongedaan gemaakt + domain: Domein + new: + create: Blokkade aanmaken + hint: Een domeinblokkade voorkomt niet dat accountgegevens van dit domein aan de database worden toegevoegd, maar dat er met terugwerkende kracht en automatisch bepaalde moderatiemethoden op deze accounts worden toegepast. + severity: + desc_html: "Negeren zorgt ervoor dat berichten van accounts van dit domein voor iedereen onzichtbaar zijn, behalve als een account wordt gevolgd. Opschorten zorgt ervoor dat alle berichten, media en profielgegevens van accounts van dit domein worden verwijderd. Gebruik Geen wanneer je alleen mediabestanden wilt weigeren." + noop: Geen + silence: Negeren + suspend: Opschorten + title: Nieuwe domeinblokkade + reject_media: Mediabestanden verwerpen + reject_media_hint: Verwijderd lokaal opgeslagen mediabestanden en weigert deze in de toekomst te downloaden. Irrelevant voor opgeschorte domeinen. + severities: + noop: Geen + silence: Negeren + suspend: Opschorten + severity: Zwaarte + show: + affected_accounts: + one: Eén account in de database aangepast + other: "%{count} accounts in de database aangepast" + retroactive: + silence: Alle genegeerde accounts van dit domein niet meer negeren + suspend: Alle opgeschorste accounts van dit domein niet meer opschorten + title: Domeinblokkade voor %{domain} ongedaan maken + undo: Ongedaan maken + title: Domeinblokkades + undo: Ongedaan maken + instances: + account_count: Bekende accounts + domain_name: Domein + title: Bekende servers reports: action_taken_by: Actie uitgevoerd door are_you_sure: Weet je het zeker? @@ -42,13 +148,14 @@ nl: 'false': Media tonen 'true': Media verbergen report: 'Gerapporteerde toot #%{id}' + report_contents: Inhoud reported_account: Gerapporteerde account reported_by: Gerapporteerd door resolved: Opgelost - silence_account: Account stilzwijgen + silence_account: Account negeren status: Toot - suspend_account: Account blokkeren - target: Target + suspend_account: Account opschorten + target: Gerapporteerde account title: Gerapporteerde toots unresolved: Onopgelost view: Weergeven @@ -60,7 +167,11 @@ nl: closed_message: desc_html: Wordt op de voorpagina weergegeven wanneer registratie van nieuwe accounts is uitgeschakeld
En ook hier kan je HTML gebruiken title: Bericht wanneer registratie is uitgeschakeld + deletion: + desc_html: Toestaan dat iedereen hun eigen account kan verwijderen + title: Verwijderen account toestaan open: + desc_html: Toestaan dat iedereen een account kan registereren title: Open registratie site_description: desc_html: Dit wordt als een alinea op de voorpagina getoond en gebruikt als meta-tag in de paginabron.
Je kan HTML gebruiken, zoals <a> en <em>. @@ -68,8 +179,35 @@ nl: site_description_extended: desc_html: Wordt op de uitgebreide informatiepagina weergegeven
Je kan ook hier HTML gebruiken title: Uitgebreide omschrijving Mastodon-server + site_terms: + desc_html: Je kan hier jouw eigen privacybeleid, gebruikersvoorwaarden en ander juridisch jargon kwijt. Je kan HTML gebruiken. + title: Aangepaste gebruikersvoorwaarden site_title: Naam Mastodon-server + timeline_preview: + desc_html: Toon de openbare tijdlijn op de startpagina + title: Voorbeeld tijdlijn title: Server-instellingen + statuses: + back_to_account: Terug naar accountpagina + batch: + delete: Verwijderen + nsfw_off: NSFW UIT + nsfw_on: NSFW AAN + execute: Uitvoeren + failed_to_execute: Uitvoeren mislukt + media: + hide: Media verbergen + show: Media tonen + title: Media + no_media: Geen media + title: Toots van account + subscriptions: + callback_url: Callback-URL + confirmed: Bevestigd + expires_in: Verloopt over + last_delivery: Laatste bezorging + title: PubSubHubbub + topic: Account title: Beheer admin_mailer: new_report: @@ -80,8 +218,9 @@ nl: signature: Mastodon-meldingen van %{instance} view: 'Bekijk:' applications: - invalid_url: De opgegevens URL is ongeldig + invalid_url: De opgegeven URL is ongeldig auth: + agreement_html: Wanneer je op registeren klikt ga je akkoord met onze gebruikersvoorwaarden en ons privacybeleid. change_password: Beveiliging delete_account: Account verwijderen delete_account_html: Wanneer je jouw account graag wilt verwijderen, kan je dat hier doen. We vragen jou daar om een bevestiging. @@ -96,6 +235,12 @@ nl: authorize_follow: error: Helaas, er is een fout opgetreden bij het opzoeken van de externe account follow: Volgen + follow_request: 'Jij hebt een volgverzoek ingediend bij:' + following: 'Succes! Jij volgt nu:' + post_follow: + close: Of je kan dit venster gewoon sluiten. + return: Ga terug naar het profiel van de gebruiker + web: Ga naar de webapp prompt_html: 'Je (%{self}) hebt toestemming gevraagd om iemand te mogen volgen:' title: Volg %{acct} datetime: @@ -128,7 +273,7 @@ nl: content: Veiligheidsverificatie mislukt. Blokkeer je toevallig cookies? title: Veiligheidsverificatie mislukt '429': Te veel verbindingsaanvragen. - noscript: Schakel JavaScript in om Mastodon te kunnen gebruiken. + noscript: Schakel JavaScript in om de webapplicatie van Mastodon te gebruiken. Als alternatief kan je een Mastodon-app zoeken voor jouw platform. exports: blocks: Jij blokkeert csv: CSV @@ -162,8 +307,12 @@ nl: following: Volglijst muting: Negeerlijst upload: Uploaden - landing_strip_html: "%{name} is een gebruiker op %{link_to_root_path}. Je kunt deze volgen en ermee communiceren als je ergens in deze fediverse een account hebt." + landing_strip_html: %{name} is een gebruiker op %{link_to_root_path}. Je kunt deze volgen en ermee communiceren als je ergens in deze fediverse een account hebt. landing_strip_signup_html: Als je dat niet hebt, kun je je hier registreren. + media_attachments: + validations: + images_and_video: Een video kan niet aan een toot met afbeeldingen worden gekoppeld + too_many: Er kunnen niet meer dan 4 afbeeldingen toegevoegd worden notification_mailer: digest: body: 'Hier is een korte samenvatting van wat je hebt gemist op %{instance} sinds jouw laatste bezoek op %{since}:' @@ -188,10 +337,26 @@ nl: subject: Jij bent vermeld door %{name} reblog: body: 'Jouw toot werd door %{name} geboost:' - subject: "%{name} booste jouw toot" + subject: "%{name} boostte jouw toot" pagination: next: Volgende prev: Vorige + truncate: "…" + push_notifications: + favourite: + title: "%{name} markeerde jouw toot als favoriet" + follow: + title: "%{name} volgt jou nu" + mention: + action_boost: Boost + action_expand: Meer tonen + action_favourite: Favoriet + title: "%{name} vermeldde jou" + reblog: + title: "%{name} boostte jouw toot" + subscribed: + body: Je kan nu pushmeldingen ontvangen. + title: Aanmelding bevestigd! remote_follow: acct: Geef jouw account@domein.tld op waarvandaan je wilt volgen missing_resource: Kon vereiste doorverwijzings-URL voor jouw account niet vinden @@ -233,10 +398,13 @@ nl: windows: Windows windows_mobile: Windows Mobile windows_phone: Windows Phone + revoke: Intrekken + revoke_success: Sessie succesvol ingetrokken title: Sessies settings: authorized_apps: Geautoriseerde apps back: Terug naar Mastodon + delete: Account deletion edit_profile: Profiel bewerken export: Export followers: Geautoriseerde volgers @@ -245,9 +413,9 @@ nl: settings: Instellingen two_factor_authentication: Tweestapsverificatie statuses: - open_in_web: Openen in web + open_in_web: In de webapp openen over_character_limit: Limiet van %{max} tekens overschreden - show_more: Toon meer + show_more: Meer tonen visibilities: private: Alleen volgers private_long: Alleen aan volgers tonen @@ -259,6 +427,76 @@ nl: click_to_show: Klik om te tonen reblogged: boostte sensitive_content: Gevoelige inhoud + terms: + body_html: | +

Privacy Policy

+ +

What information do we collect?

+ +

We collect information from you when you register on our site and gather data when you participate in the forum by reading, writing, and evaluating the content shared here.

+ +

When registering on our site, you may be asked to enter your name and e-mail address. You may, however, visit our site without registering. Your e-mail address will be verified by an email containing a unique link. If that link is visited, we know that you control the e-mail address.

+ +

When registered and posting, we record the IP address that the post originated from. We also may retain server logs which include the IP address of every request to our server.

+ +

What do we use your information for?

+ +

Any of the information we collect from you may be used in one of the following ways:

+ +
    +
  • To personalize your experience — your information helps us to better respond to your individual needs.
  • +
  • To improve our site — we continually strive to improve our site offerings based on the information and feedback we receive from you.
  • +
  • To improve customer service — your information helps us to more effectively respond to your customer service requests and support needs.
  • +
  • To send periodic emails — The email address you provide may be used to send you information, notifications that you request about changes to topics or in response to your user name, respond to inquiries, and/or other requests or questions.
  • +
+ +

How do we protect your information?

+ +

We implement a variety of security measures to maintain the safety of your personal information when you enter, submit, or access your personal information.

+ +

What is your data retention policy?

+ +

We will make a good faith effort to:

+ +
    +
  • Retain server logs containing the IP address of all requests to this server no more than 90 days.
  • +
  • Retain the IP addresses associated with registered users and their posts no more than 5 years.
  • +
+ +

Do we use cookies?

+ +

Yes. Cookies are small files that a site or its service provider transfers to your computer's hard drive through your Web browser (if you allow). These cookies enable the site to recognize your browser and, if you have a registered account, associate it with your registered account.

+ +

We use cookies to understand and save your preferences for future visits and compile aggregate data about site traffic and site interaction so that we can offer better site experiences and tools in the future. We may contract with third-party service providers to assist us in better understanding our site visitors. These service providers are not permitted to use the information collected on our behalf except to help us conduct and improve our business.

+ +

Do we disclose any information to outside parties?

+ +

We do not sell, trade, or otherwise transfer to outside parties your personally identifiable information. This does not include trusted third parties who assist us in operating our site, conducting our business, or servicing you, so long as those parties agree to keep this information confidential. We may also release your information when we believe release is appropriate to comply with the law, enforce our site policies, or protect ours or others rights, property, or safety. However, non-personally identifiable visitor information may be provided to other parties for marketing, advertising, or other uses.

+ +

Third party links

+ +

Occasionally, at our discretion, we may include or offer third party products or services on our site. These third party sites have separate and independent privacy policies. We therefore have no responsibility or liability for the content and activities of these linked sites. Nonetheless, we seek to protect the integrity of our site and welcome any feedback about these sites.

+ +

Children's Online Privacy Protection Act Compliance

+ +

Our site, products and services are all directed to people who are at least 13 years old. If this server is in the USA, and you are under the age of 13, per the requirements of COPPA (Children's Online Privacy Protection Act) do not use this site.

+ +

Online Privacy Policy Only

+ +

This online privacy policy applies only to information collected through our site and not to information collected offline.

+ + + +

By using our site, you consent to our web site privacy policy.

+ +

Changes to our Privacy Policy

+ +

If we decide to change our privacy policy, we will post those changes on this page.

+ +

This document is CC-BY-SA. It was last updated May 31, 2013.

+ +

Originally adapted from the Discourse privacy policy.

+ title: "%{instance} Terms of Service and Privacy Policy" time: formats: default: "%d %B %Y om %H:%M" @@ -267,11 +505,13 @@ nl: description_html: Na het instellen van tweestapsverificatie, kun jij je alleen aanmelden als je jouw mobiele telefoon bij je hebt. Hiermee genereer je namelijk de in te voeren aanmeldcode. disable: Uitschakelen enable: Inschakelen + enabled: Tweestapsverificatie is ingeschakeld enabled_success: Inschakelen tweestapsverificatie geslaagd generate_recovery_codes: Herstelcodes genereren instructions_html: "Scan deze QR-code in Google Authenticator of een soortgelijke app op jouw mobiele telefoon. Van nu af aan genereert deze app aanmeldcodes die je bij het aanmelden moet invoeren." lost_recovery_codes: Met herstelcodes kun je toegang tot jouw account krijgen wanneer je jouw telefoon bent kwijtgeraakt. Wanneer je jouw herstelcodes bent kwijtgeraakt, kan je ze hier opnieuw genereren. Jouw oude herstelcodes zijn daarna ongeldig. - manual_instructions: Hieronder vind je de geheime code in platte tekst. Voor het geval je de QR-code niet kunt scannen en het handmatig moet invoeren. + manual_instructions: 'Hieronder vind je de geheime code in platte tekst. Voor het geval je de QR-code niet kunt scannen en het handmatig moet invoeren.' + recovery_codes: Herstelcodes back-uppen recovery_codes_regenerated: Opnieuw genereren herstelcodes geslaagd recovery_instructions_html: Wanneer je ooit de toegang verliest tot jouw telefoon, kan je met behulp van een van de herstelcodes hieronder opnieuw toegang krijgen tot jouw account. Zorg ervoor dat je de herstelcodes op een veilige plek bewaard. (Je kunt ze bijvoorbeeld printen en ze samen met andere belangrijke documenten bewaren.) setup: Instellen diff --git a/config/locales/no.yml b/config/locales/no.yml index cf94524d294..122ad567585 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -1,24 +1,19 @@ --- 'no': about: - about_mastodon: Mastodon er et sosialt nettverk laget med fri programvare. Et desentralisert alternativ til kommersielle plattformer. Slik kan det unngå risikoene ved å ha et enkelt selskap som monopoliserer din kommunikasjon. Velg en tjener du stoler på — uansett hvilken du velger så kan du kommunisere med alle andre. Alle kan kjøre sin egen Mastodon og delta sømløst i det sosiale nettverket. + about_mastodon_html: Mastodon er et sosialt nettverk laget med fri programvare. Et desentralisert alternativ til kommersielle plattformer. Slik kan det unngå risikoene ved å ha et enkelt selskap som monopoliserer din kommunikasjon. Velg en tjener du stoler på — uansett hvilken du velger så kan du kommunisere med alle andre. Alle kan kjøre sin egen Mastodon og delta sømløst i det sosiale nettverket. about_this: Om denne instansen - business_email: 'Bedriftsepost:' closed_registrations: Registreringer er for øyeblikket lukket på denne instansen. contact: Kontakt description_headline: Hva er %{domain}? domain_count_after: andre instanser domain_count_before: Koblet til - get_started: Kom i gang - links: Lenker other_instances: Andre instanser source_code: Kildekode status_count_after: statuser status_count_before: Som skrev - terms: Betingelser user_count_after: brukere user_count_before: Her bor - version: Versjon accounts: follow: Følg followers: Følgere diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 2eb85be5852..6d9996dbcc8 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -1,31 +1,26 @@ --- oc: about: - about_mastodon: Mastodon es un malhum social liure e open-source. Una alternativa decentralizada a las platformas comercialas, aquò evita qu’una sola companiá monopolize vòstra comunicacion. Causissètz une servidor que vos fisatz, quina que siague vòstra causida, podètz interagir amb tot lo mond. Qual que siague pòt aver son instància Mastodon e participar al malhum social sens cap de problèmas. + about_mastodon_html: Mastodon es un malhum social liure e open-source. Una alternativa descentralizada a las plat-formas comercialas, aquò evita qu’una sola companhiá monopolize vòstra comunicacion. Causissètz un servidor que vos fisatz, quina que siasque vòstra causida, podètz interagir amb tot lo mond. Qual que siasque pòt aver son instància Mastodon e participar al malhum social sens cap de problèmas. about_this: A prepaus d’aquesta instància - business_email: 'Corrièl professional :' closed_registrations: Las inscripcions son clavadas pel moment sus aquesta instància. contact: Contacte description_headline: Qué es %{domain} ? domain_count_after: autras instàncias domain_count_before: Connectat a - get_started: Venètz al malhum - links: Ligams other_instances: Autras instàncias source_code: Còdi font status_count_after: estatuts status_count_before: qu’an escrich - terms: Tèrmes user_count_after: personas user_count_before: Ostal de - version: Version accounts: follow: Sègre followers: Seguidors following: Abonaments nothing_here: I a pas res aquí ! people_followed_by: Lo mond que %{name} sèc - people_who_follow: Lo mond que ségon %{name} + people_who_follow: Lo mond que sègon %{name} posts: Estatuts remote_follow: Sègre a distància unfollow: Quitar de sègre @@ -60,7 +55,7 @@ oc: order: alphabetic: Alfabetic most_recent: Mai recent - title: Order + title: Ordre perform_full_suspension: Botar en tren la suspension complèta profile_url: URL del perfil public: Public @@ -94,7 +89,7 @@ oc: suspend: Suspendre title: Nòu blocatge domeni reject_media: Regetar los fichièrs mèdias - reject_media_hint: Lèva los fichièrs gardats localament e regeta las demandas de telecargament dins lo futur. Servís pas a res per las suspensions + reject_media_hint: Lèva los fichièrs gardats localament e regèta las demandas de telecargament dins lo futur. Servís pas a res per las suspensions severities: silence: Silenci suspend: Suspendre @@ -108,7 +103,7 @@ oc: suspend: Levar la suspension de totes los comptes d’aqueste domeni title: Restablir lo blocatge de domeni de %{domain} undo: Restablir - title: Bloc de domeni + title: Blòc de domeni undo: Restablir instances: account_count: Comptes coneguts @@ -125,7 +120,7 @@ oc: nsfw: 'false': Sens contengut sensible 'true': Contengut sensible activat - report: 'enhalament #%{id}' + report: 'senhalament #%{id}' report_contents: Contenguts reported_account: Compte senhalat reported_by: Senhalat per @@ -145,16 +140,41 @@ oc: closed_message: desc_html: Afichat sus las pagina d’acuèlh quand las inscripcions son tampadas.
Podètz utilizar de balisas HTML title: Messatge de barradura de las inscripcions + deletion: + desc_html: Autorizar al monde a suprimir lor compte + title: Possibilitat de suprimir lo compte open: + desc_html: Autorizar lo monde a se marcar title: Inscripcions site_description: - desc_html: Afichada jos la forma de paragrafe sus la pagina d’acuèlh e utilizada coma balisa meta.
Podètz utilizar de balisas HTML, coma <a> et <em>. + desc_html: Afichada jos la forma de paragrafe sus la pagina d’acuèlh e utilizada coma balisa meta.
Podètz utilizar de balisas HTML, coma <a> e <em>. title: Descripcion del site site_description_extended: desc_html: Afichada sus la pagina d’informacion complementària del site
Podètz utilizar de balisas HTML title: Descripcion espandida del site + site_terms: + desc_html: Afichada sus la pagina de las condicions d’utilizacion
Podètz utilizar de balisas HTML + title: Politica de confidencialitat del site site_title: Títol del site + timeline_preview: + desc_html: Mostrar lo flux public sus la pagina d’acuèlh + title: Apercebut flux public title: Paramètres del site + statuses: + back_to_account: Tornar a la pagina Compte + batch: + delete: Suprimir + nsfw_off: NSFW OFF + nsfw_on: NSFW ON + execute: Lançar + failed_to_execute: Fracàs + media: + hide: Amagar mèdia + show: Mostrar mèdia + title: Mèdia + no_media: Cap mèdia + title: Estatuts del compteAccount statuses + with_media: Amb mèdia subscriptions: callback_url: URL de rapèl confirmed: Confirmat @@ -261,11 +281,11 @@ oc: x_seconds: Fa %{count} segondas deletes: bad_password_msg: Ben ensajat pirata ! Senhal incorrècte - confirm_password: Picatz vòstre senhal acutal per verificar vòstra identitat + confirm_password: Picatz vòstre senhal actual per verificar vòstra identitat description_html: Aquò suprimirà definitivament e sens possibilitat de retorn lo contengut de vòstre compte e lo desactivarà. Lo nom d’utilizaire serà gardat per evitar una futura impostura. - proceed: Delete account - success_msg: Your account was successfully deleted - warning_html: La supression del contengut d’aquesta instància es sola assegurada. Lo contengut fòrça partejat daissarà problablament de traças. Los servidors fòra-linha e los que vos sègon pas mai auràn pas la mesa a jorn de lor basa de donada. + proceed: Suprimir lo compte + success_msg: Compte ben suprimit + warning_html: La supression del contengut d’aquesta instància es sola assegurada. Lo contengut fòrça partejat daissarà probablament de traças. Los servidors fòra-linha e los que vos sègon pas mai auràn pas la mesa a jorn de lor basa de donada. warning_title: Disponibilitat del contengut difusat errors: '404': La pagina que recercatz existís pas. @@ -282,7 +302,7 @@ oc: storage: Mèdias gardats followers: domain: Domeni - explanation_html: Se volètz vos assegurar de la confidencialitat de vòstres estatuts, vos cal saber qual sèc vòstre compte. Vòstres estatuts privats son enviats a totas las instàncias qu’an de mond que vos sègon.. Benlèu que volètz repassar vòstra lista e tirar los seguidors s’avètz de dubtes tocant las politica de confidencialitat de lor instàncias. + explanation_html: Se volètz vos assegurar de la confidencialitat de vòstres estatuts, vos cal saber qual sèc vòstre compte. Vòstres estatuts privats son enviats a totas las instàncias qu’an de mond que vos sègon.. Benlèu que volètz repassar vòstra lista e tirar los seguidors s’avètz de dobtes tocant las politica de confidencialitat de lor instàncias. followers_count: Nombre de seguidors lock_link: Clavar vòstre compte purge: Tirar dels seguidors @@ -307,7 +327,7 @@ oc: following: Lista de mond que seguètz muting: Lista de mond que volètz pas legir upload: Importar - landing_strip_html: "%{name} es un utilizaire de %{link_to_root_path}. Podètz lo/la sègre o interagir amb el o ela s’avètz un compte ont que siasgue sul fediverse." + landing_strip_html: "%{name} es un utilizaire de %{link_to_root_path}. Podètz lo/la sègre o interagir amb el o ela s’avètz un compte ont que siasque sul fediverse." landing_strip_signup_html: S’es pas lo cas, podètz vos marcar aquí. media_attachments: validations: @@ -347,6 +367,45 @@ oc: missing_resource: URL de redireccion pas trobada proceed: Contunhatz per sègre prompt: 'Sètz per sègre :' + sessions: + activity: Darrièra activitat + browser: Navigator + browsers: + alipay: Alipay + blackberry: Blackberry + chrome: Chrome + edge: Microsoft Edge + firefox: Firefox + generic: Navigator desconegut + ie: Internet Explorer + micro_messenger: MicroMessenger + nokia: Nokia S40 Ovi Browser + opera: Opera + phantom_js: PhantomJS + qq: QQ Browser + safari: Safari + uc_browser: UCBrowser + weibo: Weibo + current_session: Session en cors + description: "%{browser} sus %{platform}" + explanation: Aquí los navigators connectats a vòstre compte Mastodon. + ip: IP + platforms: + adobe_air: Adobe Air + android: Android + blackberry: Blackberry + chrome_os: ChromeOS + firefox_os: Firefox OS + ios: iOS + linux: Linux + mac: Mac + other: plataforma desconeguda + windows: Windows + windows_mobile: Windows Mobile + windows_phone: Windows Phone + revoke: Revocar + revoke_success: Session ben revocada + title: Sessions settings: authorized_apps: Aplicacions autorizadas back: Tornar a Mastodon @@ -354,7 +413,7 @@ oc: edit_profile: Modificar lo perfil export: Export donadas followers: Seguidors autorizats - import: Import + import: Importar preferences: Preferéncias settings: Paramètres two_factor_authentication: Autentificacion en dos temps @@ -373,6 +432,76 @@ oc: click_to_show: Clicatz per afichar reblogged: a partejat sensitive_content: Contengut sensible + terms: + body_html: | +

Politica de confidencialitat

+ +

Quinas informacions collectem ?

+ +

Collectem informacions sus vos quand vos marcatz sus nòstre site e juntem las donadas quand participatz a nòstre forum ne legissent, escrivent e notant lo contengut partejat aquí.

+ +

Pendent l’inscripcion podèm vos demandar vòstre nom e adreça de corrièl. Podètz çaquelà visitar nòstre site sens vos marcar. Verificarem vòstra adreça amb un messatge donant un ligam unic. Se clicatz sul ligam sauprem qu’avètz lo contraròtle de l’adreça.

+ +

Quand sètz marcat e que publicatz quicòm, enregistrem l’adreça IP d’origina. Podèm tanben salvagardar los jornals del servidor que tenon l’adreça IP de totas las demandas fachas al nòstre servidor.

+ +

Qué fasèm de vòstras informacions ?

+ +

Totas las informacions que collectem de vos pòdon servir dins los cases seguents :

+ +
    +
  • Per personalizar vòstre experiéncia — vòstras informacions nos ajudaràn a respondre melhor a vòstres besonhs individuals.
  • +
  • Per melhorar nòstre site — s’eforcem de longa a melhorar çò que nòstre site ofrís segon las informacions e los comentaris que recebèm de vòstra part.
  • +
  • Per melhorar nòstre servici client — vòstras informacions nos ajudan per respondre amb mai eficacitat a vòstras demandas d’assisténcia.
  • +
  • Per enviar periodicament de corrièls — Podèm utilizar l’adreça qu’avètz donada per vos enviar d’informacions e de notificacions que demandatz tocant de cambiaments dins los subjèctes del forum o en responsa a vòstre nom d’utilizaire, en responsa a una demanda, e/o tota autra question.
  • +
+ +

Cossí protegèm vòstras informacions ?

+ +

Apliquem tota una mena de mesuras de seguretat per manténer la fisança de vòstras informacions personalas quand las picatz, mandatz, o i accedètz.

+ +

Quala es vòstra politica de conservacion de donadas ?

+ +

Farem esfòrces per :

+ +
    +
  • Gardar los jornals del servidor que contenon las adreças IP de totas las demandas al servidor pas mai de 90 jorns.
  • +
  • Gardar las adreças IP ligadas als utilizaires e lors publicacions pas mai de 5 ans.
  • +
+ +

Empleguem de cookies ?

+ +

Òc-ben. Los cookies son de pichons fichièrs qu’un site o sos forneires de servicis plaçan dins lo disc dur de vòstre ordenador via lo navigator Web (Se los acceptatz). Aqueles cookies permeton al site de reconéisser vòstre navigator e se tenètz un compte enregistrat de l’associar a vòstre compte.

+ +

Empleguem de cookies per comprendre e enregistrar vòstras preferéncias per vòstras visitas venentas, per recampar de donadas sul trafic del site e las interaccions per fin que posquem ofrir una melhora experiéncia del site e de las aisinas pel futur. Pòt arribar que contractèssem amb de forneires de servicis tèrces per nos ajudar a comprendre melhor nòstres visitors. Aqueles forneires an pas lo drech que d’utilizar las donadas collectadas per nos ajudar a menar e melhorar nòstre afar.

+ +

Divulguem d’informacions a de partits exteriors ?

+ +

Vendèm pas, comercem o qualque transferiment que siasque a de partits exteriors vòstras informacions personalas identificablas. Aquò inclutz pas los tèrces partits de confisança que nos assiston a menar nòstre site, menar nòstre afar o vos servir, baste que son d’acòrd per gardar aquelas informacions confidencialas. Pòt tanben arribar que liberèssem vòstras informacions quand cresèm qu’es apropriat d’o far per se sometre a la lei, per refortir nòstras politicas, o per protegir los dreches, proprietats o seguritat de qualqu’un o de nosautres. Pasmens es possible que mandèssem d’informacions non-personalas e identificablas de nòstres visitors a d’autres partits per d’utilizacion en marketing, publicitat o un emplec mai.

+ +

Ligams de tèrces partits

+ +

Pòt arribar, a nòstra discrecion, qu’incluguèssem o ofriguèssem de produches o servicis de tèrces partits sus nòstre site. Aqueles sites tèrces an de politicas de confidencialitats separadas e independentas. En consequéncia avèm pas cap de responsabilitat pel contengut e las activitats d’aqueles sites ligats. Pasmens cerquem de protegir l’integritat de nòstre site e aculhèm los comentaris tocant aqueles sites.

+ +

Conformitat amb la lei de proteccion de la confidencialitat dels mainatges

+ +

Nòstre site, nòstres produches e servicis son totes destinats a de monde d’almens 13 ans. S’aqueste servidor se tròba en los Estats Units per acontentar las exigéncias del COPPA (Children's Online Privacy Protection Act) utilizetz pas aqueste site.

+ +

Politica de confidencialitat en linha solament

+ +

Aquesta politica de confidencialitat s’aplica pas qu’a las informacions collectadas via nòstre site e non pas a las informacions collectadas fòra linha.

+ + + +

N’utilizant nòstre site, consentètz a nòstra politica de confidencialitat.

+ +

Cambiament dins nòstra politica de confidencialitat

+ +

Se decidèm de cambiar nòstra politica de confidencialitat, publicarem los cambiaments sus aquesta pagina.

+ +

Aqueste document es jos licéncia CC-BY-SA. Darrièra mesa a jorn lo 31 de mai de 2013

+ +

Prima adaptacion de la politica de confidencialitat de Discourse.

+ title: Condicions d’utilizacion e politica de confidencialitat de %{instance} time: formats: default: Lo %d %b de %Y a %Ho%M diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 325d52b45ce..02c97e955d3 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -3,12 +3,16 @@ pl: about: about_mastodon_html: Mastodon jest wolną i otwartą siecią społecznościową, zdecentralizowaną alternatywą dla zamkniętych, komercyjnych platform. about_this: O tej instancji - business_email: 'Służbowy adres e-mail:' closed_registrations: Rejestracja na tej instancji jest obecnie zamknięta. Możesz jednak zarejestrować się na innej instancji, uzyskując dostęp do tej samej sieci. contact: Kontakt + contact_missing: Nie ustawiono + contact_unavailable: Nie dotyczy description_headline: Czym jest %{domain}? domain_count_after: instancji domain_count_before: Serwer połączony z + extended_description_html: | +

Dobre miejsce na zasady użytkowania

+

Nie ustawiono jeszcze szczegółowego opisu

features: humane_approach_body: Nauczeni na błędach innych sieci społecznościowych, zaprojektowaliśmy Mastodona tak, aby uniknąć częstych nadużyć. humane_approach_title: Bardziej ludzkie podejście @@ -20,18 +24,14 @@ pl: within_reach_title: Zawsze w Twoim zasięgu find_another_instance: Znajdź inną instancję generic_description: "%{domain} jest jednym z serwerów sieci" - get_started: Rozpocznijmy! hosted_on: Mastodon uruchomiony na %{domain} learn_more: Dowiedz się więcej - links: Odnośniki other_instances: Lista instancji source_code: Kod źródłowy status_count_after: wpisów status_count_before: Są autorami - terms: Regulamin user_count_after: użytkowników user_count_before: Z serwera korzysta - version: Wersja what_is_mastodon: Czym jest Mastodon? accounts: follow: Śledź @@ -198,8 +198,8 @@ pl: show: Pokaż zawartość multimedialną title: Media no_media: Bez zawartości multimedialnej - with_media: Z zawartością multimedialną title: Statusy konta + with_media: Z zawartością multimedialną subscriptions: callback_url: URL zwrotny confirmed: Potwierdzono @@ -272,7 +272,7 @@ pl: content: Sprawdzanie bezpieczeństwa nie powiodło się. Czy blokujesz pliki cookie? title: Sprawdzanie bezpieczeństwa nie powiodło się '429': Uduszono - noscript: Aby korzystać z Mastodona, włącz JavaScript. + noscript: Aby korzystać z aplikacji Mastodon, włącz JavaScript. Możesz też skorzystać z natywnej aplikacji obsługującej Twoje urządzenie. exports: blocks: Blokujesz csv: CSV @@ -351,15 +351,15 @@ pl: follow: title: "%{name} zaczął Cię śledzić" mention: - action_boost: 'Podbij' - action_expand: 'Pokaż więcej' - action_favourite: 'Dodaj do ulubionych' + action_boost: Podbij + action_expand: Pokaż więcej + action_favourite: Dodaj do ulubionych title: "%{name} wspomniał o Tobie" reblog: title: "%{name} podbił Twój status" subscribed: - body: "Otrzymujesz teraz powiadomienia push." - title: "Zarejestrowano subskrypcję!" + body: Otrzymujesz teraz powiadomienia push. + title: Zarejestrowano subskrypcję! remote_follow: acct: Podaj swój adres (nazwa@domena), z którego chcesz śledzić missing_resource: Nie udało się znaleźć adresu przekierowania z Twojej domeny @@ -486,7 +486,7 @@ pl:

Polityka prywatności dotyczy tylko Internetu

-

Ta polityka prywatności dotyczy jedynie danych zbieranych w Internecie, nie tych, które przechowywane są na Twoim kompurerze, np. pliki cookies.

+

Ta polityka prywatności dotyczy jedynie danych zbieranych w Internecie, nie tych, które przechowywane są na Twoim komputerze, np. pliki cookies.

diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 5ba763ae410..9bd1b0d2823 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -1,24 +1,19 @@ --- pt-BR: about: - about_mastodon: Mastodon é um servidor de rede social grátis, e open-source. Uma alternativa descentralizada ás plataformas comerciais, que evita o risco de uma única empresa monopolizar a sua comunicação. Escolha um servidor que você confie — qualquer um que escolher, você poderá interagir com todo o resto. Qualquer um pode ter uma instância Mastodon e assim participar na rede social federada sem problemas. + about_mastodon_html: Mastodon é um servidor de rede social grátis, e open-source. Uma alternativa descentralizada ás plataformas comerciais, que evita o risco de uma única empresa monopolizar a sua comunicação. Escolha um servidor que você confie — qualquer um que escolher, você poderá interagir com todo o resto. Qualquer um pode ter uma instância Mastodon e assim participar na rede social federada sem problemas. about_this: Sobre essa instância - business_email: 'Email comercial:' closed_registrations: Registros estão fechadas para essa instância. contact: Contato description_headline: O que é %{domain}? domain_count_after: outras instâncias domain_count_before: Conectado a - get_started: Comece aqui - links: Links other_instances: Outras instâncias source_code: Source code status_count_after: status status_count_before: Quem autorizou - terms: Termos user_count_after: usuários user_count_before: Lugar de - version: Versão accounts: follow: Seguir followers: Seguidores diff --git a/config/locales/pt.yml b/config/locales/pt.yml index 346fcdda88b..6bf592d1cb3 100644 --- a/config/locales/pt.yml +++ b/config/locales/pt.yml @@ -1,24 +1,19 @@ --- pt: about: - about_mastodon: Mastodon é uma rede social grátis e em código aberto. Uma alternativa descentralizada às plataformas comerciais, que evita o risco de uma única empresa monopolizar a tua comunicação. Escolhe um servidor que confies, não importa qual, pois vais poder comunicar com todos os outros. Qualquer um pode criar uma instância Mastodon e participar nesta rede social. + about_mastodon_html: Mastodon é uma rede social grátis e em código aberto. Uma alternativa descentralizada às plataformas comerciais, que evita o risco de uma única empresa monopolizar a tua comunicação. Escolhe um servidor que confies, não importa qual, pois vais poder comunicar com todos os outros. Qualquer um pode criar uma instância Mastodon e participar nesta rede social. about_this: Sobre esta instância - business_email: 'Email comercial:' closed_registrations: Novos registos estão fechados nesta instância. contact: Contacto description_headline: O que é o %{domain}? domain_count_after: outras instâncias domain_count_before: Ligado a - get_started: Começar - links: Links other_instances: Outras instâncias source_code: Código fonte status_count_after: publicações status_count_before: Que fizeram - terms: Termos user_count_after: utilizadores user_count_before: Casa para - version: Versão accounts: follow: Seguir followers: Seguidores diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 5cfc2b1caf8..141017f40f4 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -1,24 +1,19 @@ --- ru: about: - about_mastodon: Mastodon - это свободная социальная сеть с открытым исходным кодом. Как децентрализованная альтернатива коммерческим платформам, Mastodon предотвращает риск монополизации Вашего общения одной компанией. Выберите сервер, которому Вы доверяете — что бы Вы ни выбрали, Вы сможете общаться со всеми остальными. Любой может запустить свой собственный узел Mastodon и участвовать в социальной сети совершенно бесшовно. + about_mastodon_html: Mastodon - это свободная социальная сеть с открытым исходным кодом. Как децентрализованная альтернатива коммерческим платформам, Mastodon предотвращает риск монополизации Вашего общения одной компанией. Выберите сервер, которому Вы доверяете — что бы Вы ни выбрали, Вы сможете общаться со всеми остальными. Любой может запустить свой собственный узел Mastodon и участвовать в социальной сети совершенно бесшовно. about_this: Об этом узле - business_email: 'Деловой e-mail:' closed_registrations: В данный момент регистрация на этом узле закрыта. contact: Связаться description_headline: Что такое %{domain}? domain_count_after: другими узлами domain_count_before: Связан с - get_started: Начать - links: Ссылки other_instances: Другие узлы source_code: Исходный код status_count_after: статусов status_count_before: Опубликовано - terms: Условия user_count_after: пользователей user_count_before: Здесь живет - version: Версия accounts: follow: Подписаться followers: Подписчики diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 536bb06e10e..fb8524a24c0 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -41,9 +41,9 @@ en: setting_default_privacy: Post privacy setting_default_sensitive: Always mark media as sensitive setting_delete_modal: Show confirmation dialog before deleting a toot + setting_noindex: Opt-out of search engine indexing setting_system_font_ui: Use system's default font setting_unfollow_modal: Show confirmation dialog before unfollowing someone - setting_noindex: Opt-out of search engine indexing severity: Severity type: Import type username: Username diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index 65845e1aa5a..70389e94826 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -9,7 +9,6 @@ ja: locked: フォロワーを手動で承認する必要があります。 note: あと%{count}文字入力できます。 setting_noindex: 公開プロフィールおよび各投稿ページに影響します - imports: data: 他の Mastodon インスタンスからエクスポートしたCSVファイルを選択して下さい sessions: @@ -38,9 +37,9 @@ ja: setting_default_privacy: 投稿の公開範囲 setting_default_sensitive: メディアを常に閲覧注意としてマークする setting_delete_modal: トゥートを削除する前に確認ダイアログを表示する + setting_noindex: 検索エンジンによるインデックスを拒否する setting_system_font_ui: システムのデフォルトフォントを使う setting_unfollow_modal: フォロー解除する前に確認ダイアログを表示する - setting_noindex: 検索エンジンによるインデックスを拒否する severity: 重大性 type: インポートする項目 username: ユーザー名 diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml index a8f25905716..43cb52201ae 100644 --- a/config/locales/simple_form.oc.yml +++ b/config/locales/simple_form.oc.yml @@ -27,6 +27,7 @@ oc: data: Data display_name: Escais email: Corrièl + filtered_languages: Lengas filtradas header: Bandièra locale: Lenga locked: Far venir lo compte privat @@ -37,7 +38,11 @@ oc: setting_auto_play_gif: Lectura automatica dels GIFS animats setting_boost_modal: Afichar una fenèstra de confirmacion abans de partejar un estatut setting_default_privacy: Confidencialitat de las publicacions + setting_default_sensitive: Totjorn marcar los mèdias coma sensibles setting_delete_modal: Afichar una fenèstra de confirmacion abans de suprimir un estatut + setting_noindex: Èsser pas indexat pels motors de recèrca + setting_system_font_ui: Utilizar la policia Font del sisèma + setting_unfollow_modal: Afichar una confirmacion abans de quitar de sègre qualqu’un severity: Severitat type: Tip d’impòrt username: Nom d’utilizaire diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index dc5492ea5ef..7e84472b9c3 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -40,14 +40,13 @@ pl: otp_attempt: Kod uwierzytelnienia dwustopniowego password: Hasło setting_auto_play_gif: Automatycznie odtwarzaj animowane GIFy - setting_boost_modal: Pytaj o potwierdzenie przed podbiciem setting_default_privacy: Widoczność posta setting_default_sensitive: Zawsze oznaczaj zawartość multimedialną jako wrażliwą setting_delete_modal: Pytaj o potwierdzenie przed usunięciem postu + setting_noindex: Nie indeksuj mojego profilu w wyszukiwarkach internetowych setting_system_font_ui: Używaj domyślnej czcionki systemu setting_unfollow_modal: Pytaj o potwierdzenie przed usunięciem śledzenia - setting_noindex: Nie indeksuj mojego profilu w wyszukiwarkach internetowych severity: Priorytet type: Typ importu username: Nazwa użytkownika diff --git a/config/locales/th.yml b/config/locales/th.yml index 17eb96110de..89782209e78 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -1,24 +1,19 @@ --- th: about: - about_mastodon: แมสโทดอน เป็น ดีเซ็นทรัลไลซ์ฟรีโอเพ่นซอร์ส โซเชี่ยวเน็ตเวริ์ค. เป็นทางเลือกทดแทนโซเชี่ยวเน็ตเวิร์คที่ทำเป็นธุรกิจการค้า, ป้องกันการผูกขาดช่องทางการสื่อสารของคุณ. เลือกเซร์ฟเวอร์ที่คุณไว้ใจ — ที่คุณเลือกได้เอง, สื่อสารกับคนที่คุณต้องการได้เสมอ. ใครๆก็รันแมสโทดอนอินซะแตนซ์ได้ และ เชื่อมต่อกับโซเชี่ยวเน็ตเวิร์ค โดยไม่มีอะไรมาขวางกั้น. + about_mastodon_html: แมสโทดอน เป็น ดีเซ็นทรัลไลซ์ฟรีโอเพ่นซอร์ส โซเชี่ยวเน็ตเวริ์ค. เป็นทางเลือกทดแทนโซเชี่ยวเน็ตเวิร์คที่ทำเป็นธุรกิจการค้า, ป้องกันการผูกขาดช่องทางการสื่อสารของคุณ. เลือกเซร์ฟเวอร์ที่คุณไว้ใจ — ที่คุณเลือกได้เอง, สื่อสารกับคนที่คุณต้องการได้เสมอ. ใครๆก็รันแมสโทดอนอินซะแตนซ์ได้ และ เชื่อมต่อกับโซเชี่ยวเน็ตเวิร์ค โดยไม่มีอะไรมาขวางกั้น. about_this: เกี่ยวกับอินซะแตนซ์นี้ - business_email: 'อีเมล์ธุรกิจ:' closed_registrations: อินซะแตนซ์นี้ปิดรับลงทะเบียนแล้ว. contact: ติดต่อ description_headline: โดเมนคือ %{domain} ? domain_count_after: อินซะแตนซ์อื่นๆ domain_count_before: เชื่อมต่อกับ - get_started: เริ่มกันเลย - links: ลิงก์ other_instances: อินซะแตนซ์อื่นๆ source_code: ซอร์สโค๊ด status_count_after: สถานะ status_count_before: Who authored - terms: เงื่อนไข user_count_after: ผู้ใช้ user_count_before: Home to - version: เวอร์ชั่น accounts: follow: ติดตาม followers: ผู้ติดตาม diff --git a/config/locales/tr.yml b/config/locales/tr.yml index bb83991cd92..a1f2d2078a0 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -1,24 +1,19 @@ --- tr: about: - about_mastodon: Mastodon ücretsiz ve açık kaynaklı bir sosyal ağdır. Merkezileştirilmemiş yapısı sayesinde diğer ticari sosyal platformların aksine iletişimininizin tek bir firmada tutulmasının/yönetilmesinin önüne geçer. Güvendiğiniz bir sunucuyu seçerek oradaki kişilerle etkileşimde bulunabilirsiniz. Herkes kendi Mastodon sunucusunu kurabilir ve sorunsuz bir şekilde Mastodon sosyal ağına dahil edebilir. + about_mastodon_html: Mastodon ücretsiz ve açık kaynaklı bir sosyal ağdır. Merkezileştirilmemiş yapısı sayesinde diğer ticari sosyal platformların aksine iletişimininizin tek bir firmada tutulmasının/yönetilmesinin önüne geçer. Güvendiğiniz bir sunucuyu seçerek oradaki kişilerle etkileşimde bulunabilirsiniz. Herkes kendi Mastodon sunucusunu kurabilir ve sorunsuz bir şekilde Mastodon sosyal ağına dahil edebilir. about_this: Bu sunucu hakkında - business_email: 'İş e-postası:' closed_registrations: Bu sunucu şu anda yeni kayıt almamaktadır. contact: İletişim description_headline: Peki %{domain} nedir? domain_count_after: sunucu var. domain_count_before: Bağlı olduğu - get_started: Kayıt ol - links: Bağlantılar other_instances: Diğer sunucular source_code: Kaynak kodu status_count_after: adet gönderi yazıldı. status_count_before: Şu ana kadar - terms: Kullanım koşulları user_count_after: kullanıcı var. user_count_before: Kayıtlı - version: Sürüm accounts: follow: Takip et followers: Takipçiler diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 129fc5bb79f..3237ea1db71 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -1,24 +1,19 @@ --- uk: about: - about_mastodon: Mastodon - це вільна соціальна мережа з відкритим вихідним кодом. Вона є децентралізованою альтернативою комерційним платформам, що дозволяє уникнути ризиків монополізації вашого спілкування однією компанією. Виберіть сервер, якому ви довіряєте — що б ви не вибрали, Ви зможете спілкуватись з усіма іншими. Будь-який користувач може запустити власну інстанцію Mastodon та без проблем брати участь в соціальній мережі. + about_mastodon_html: Mastodon - це вільна соціальна мережа з відкритим вихідним кодом. Вона є децентралізованою альтернативою комерційним платформам, що дозволяє уникнути ризиків монополізації вашого спілкування однією компанією. Виберіть сервер, якому ви довіряєте — що б ви не вибрали, Ви зможете спілкуватись з усіма іншими. Будь-який користувач може запустити власну інстанцію Mastodon та без проблем брати участь в соціальній мережі. about_this: Про цю інстанцію - business_email: 'Діловий email:' closed_registrations: На даний момент реєстрація на цій інстанції закрита. contact: Зв'язатися description_headline: Що таке %{domain}? domain_count_after: іншими інстанціями domain_count_before: Зв'язаний з - get_started: Почати - links: Посилання other_instances: Інші інстанції source_code: Вихідний код status_count_after: статусів status_count_before: Опубліковано - terms: Умови user_count_after: користувачів user_count_before: Тут живе - version: Версія accounts: follow: Підписатися followers: Підписники diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 0526ec1ba1d..0b026329454 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -1,24 +1,19 @@ --- zh-CN: about: - about_mastodon: Mastodon(长毛象)是一个自由、开放源码的社交网站。它是一个分布式的服务,避免你的通信被单一商业机构垄断操控。请你选择一家你信任的 Mastodon 实例,在上面创建帐号,然后你就可以和任一 Mastodon 实例上的用户互通,享受无缝的社交交流。 + about_mastodon_html: Mastodon(长毛象)是一个自由、开放源码的社交网站。它是一个分布式的服务,避免你的通信被单一商业机构垄断操控。请你选择一家你信任的 Mastodon 实例,在上面创建帐号,然后你就可以和任一 Mastodon 实例上的用户互通,享受无缝的社交交流。 about_this: 关于本实例 - business_email: 商业电邮︰ closed_registrations: 这个实例目前不开放注册 _(:3」∠)_ contact: 联络 description_headline: 关于 %{domain} domain_count_after: 个其它实例 domain_count_before: 现已接入 - get_started: 上手使用 - links: 链接 other_instances: 其它实例 source_code: 源码 status_count_after: 条嘟文 status_count_before: 他们共嘟出了 - terms: 条款 user_count_after: 位用户 user_count_before: 这里共注册有 - version: 版本 accounts: follow: 关注 followers: 粉丝 diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index 06f9ab63d48..40087ed532b 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -1,24 +1,19 @@ --- zh-HK: about: - about_mastodon: Mastodon(萬象)是自由、開源的社交網絡。服務站各自獨立而互連,避免單一商業機構壟斷。找你所信任的服務站,建立帳號,你即可與任何服務站上的用戶溝通,享受無縫的網絡交流。 + about_mastodon_html: Mastodon(萬象)是自由、開源的社交網絡。服務站各自獨立而互連,避免單一商業機構壟斷。找你所信任的服務站,建立帳號,你即可與任何服務站上的用戶溝通,享受無縫的網絡交流。 about_this: 關於本服務站 - business_email: 聯絡網站管理者︰ closed_registrations: 本服務站暫時停止接受登記。 contact: 聯絡 description_headline: 關於 %{domain} domain_count_after: 個其他服務站 domain_count_before: 已連接至 - get_started: 立即登記 - links: 連結 other_instances: 其他服務站 source_code: 源代碼 status_count_after: 篇文章 status_count_before: 他們共發佈了 - terms: 使用條款 user_count_after: 位使用者 user_count_before: 這裏共註冊有 - version: 版本 accounts: follow: 關注 followers: 關注者 diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 67aa2830fa4..e25edc8905d 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -1,21 +1,17 @@ --- zh-TW: about: - about_mastodon: Mastodon (長毛象)是一個自由、開放原始碼的社群網站。它是一個分散式的服務,避免您的通訊被單一商業機構壟斷操控。請您選擇一家您信任的 Mastodon 服務站,在上面建立帳號,然後您就可以和任一 Mastodon 服務站上的使用者互通,享受無縫的社群網路交流。 + about_mastodon_html: Mastodon (長毛象)是一個自由、開放原始碼的社群網站。它是一個分散式的服務,避免您的通訊被單一商業機構壟斷操控。請您選擇一家您信任的 Mastodon 服務站,在上面建立帳號,然後您就可以和任一 Mastodon 服務站上的使用者互通,享受無縫的社群網路交流。 about_this: 關於本服務站 - business_email: 商務信箱︰ closed_registrations: 本服務站暫時停止接受註冊。 contact: 聯絡我們 description_headline: 關於 %{domain} domain_count_after: 個服務站相連 domain_count_before: 與其他 - get_started: 立即註冊 - links: 連結 other_instances: 其他服務站 source_code: 原始碼 status_count_after: 篇文章 status_count_before: 他們共發佈了 - terms: 使用條款 user_count_after: 位註冊使用者 user_count_before: 這裡共有 accounts: diff --git a/config/routes.rb b/config/routes.rb index 50e32cce01a..71729fee5e3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -26,7 +26,7 @@ Rails.application.routes.draw do confirmations: 'auth/confirmations', } - get '/users/:username', to: redirect('/@%{username}'), constraints: lambda { |req| req.format.nil? } + get '/users/:username', to: redirect('/@%{username}'), constraints: lambda { |req| req.format.nil? || req.format.html? } resources :accounts, path: 'users', only: [:show], param: :username do resources :stream_entries, path: 'updates', only: [:show] do diff --git a/config/sidekiq.yml b/config/sidekiq.yml index 78aaa311cf3..8273c120192 100644 --- a/config/sidekiq.yml +++ b/config/sidekiq.yml @@ -18,3 +18,6 @@ doorkeeper_cleanup_scheduler: cron: '1 1 * * 0' class: Scheduler::DoorkeeperCleanupScheduler + user_cleanup_scheduler: + cron: '4 5 * * *' + class: Scheduler::UserCleanupScheduler diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 3c92ce41792..07969aff4b7 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -9,23 +9,27 @@ module Mastodon end def minor - 4 + 5 end def patch - 7 + 0 end def pre nil end + def flags + 'rc1' + end + def to_a [major, minor, patch, pre].compact end def to_s - to_a.join('.') + [to_a.join('.'), flags].join end end end diff --git a/lib/tasks/mastodon.rake b/lib/tasks/mastodon.rake index bceeeaf0114..2265235548b 100644 --- a/lib/tasks/mastodon.rake +++ b/lib/tasks/mastodon.rake @@ -1,18 +1,10 @@ # frozen_string_literal: true namespace :mastodon do - desc 'Execute daily tasks' + desc 'Execute daily tasks (deprecated)' task :daily do - %w( - mastodon:feeds:clear - mastodon:media:clear - mastodon:users:clear - mastodon:push:refresh - ).each do |task| - puts "Starting #{task} at #{Time.now.utc}" - Rake::Task[task].invoke - end - puts "Completed daily tasks at #{Time.now.utc}" + # No-op + # All of these tasks are now executed via sidekiq-scheduler end desc 'Turn a user into an admin, identified by the USERNAME environment variable' @@ -143,6 +135,13 @@ namespace :mastodon do task clear_all: :environment do Redis.current.keys('feed:*').each { |key| Redis.current.del(key) } end + + desc 'Generates home timelines for users who logged in in the past two weeks' + task build: :environment do + User.active.includes(:account).find_each do |u| + PrecomputeFeedService.new.call(u.account) + end + end end namespace :emails do @@ -155,14 +154,10 @@ namespace :mastodon do end namespace :users do - desc 'Clear out unconfirmed users' + desc 'Clear out unconfirmed users (deprecated)' task clear: :environment do - # Users that never confirmed e-mail never signed in, means they - # only have a user record and an avatar record, with no files uploaded - User.where('confirmed_at is NULL AND confirmation_sent_at <= ?', 2.days.ago).find_in_batches do |batch| - Account.where(id: batch.map(&:account_id)).delete_all - User.where(id: batch.map(&:id)).delete_all - end + # No-op + # This task is now executed via sidekiq-scheduler end desc 'List e-mails of all admin users' diff --git a/package.json b/package.json index c90e49db5c8..132d7017d53 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "compression-webpack-plugin": "^0.4.0", "cross-env": "^5.0.1", "css-loader": "^0.28.4", + "detect-passive-events": "^1.0.2", "dotenv": "^4.0.0", "emojione": "^2.2.7", "emojione-picker": "^2.2.1", diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png index 3a475f61f31..0b4eb9fdf88 100644 Binary files a/public/android-chrome-192x192.png and b/public/android-chrome-192x192.png differ diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png index b05996b3744..829263f8396 100644 Binary files a/public/apple-touch-icon.png and b/public/apple-touch-icon.png differ diff --git a/public/badge.png b/public/badge.png index fc1f42dca13..a1f2f8b0897 100644 Binary files a/public/badge.png and b/public/badge.png differ diff --git a/public/browserconfig.xml b/public/browserconfig.xml index fcf794bc22c..7fdab5058ed 100644 --- a/public/browserconfig.xml +++ b/public/browserconfig.xml @@ -3,7 +3,7 @@ - #1ea21e + #282c37 diff --git a/public/favicon-dev.ico b/public/favicon-dev.ico index 5f725d58700..3836044068b 100644 Binary files a/public/favicon-dev.ico and b/public/favicon-dev.ico differ diff --git a/public/favicon.ico b/public/favicon.ico index 3673ac0d546..79000c9cc43 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/public/mask-icon.svg b/public/mask-icon.svg index c3523011733..f91ff5067b9 100644 --- a/public/mask-icon.svg +++ b/public/mask-icon.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/public/mstile-150x150.png b/public/mstile-150x150.png index 57eae8355d0..e8e289eaac9 100644 Binary files a/public/mstile-150x150.png and b/public/mstile-150x150.png differ diff --git a/scalingo.json b/scalingo.json index 4afaa6b4e01..8df2caba16f 100644 --- a/scalingo.json +++ b/scalingo.json @@ -2,7 +2,7 @@ "name": "Mastodon", "description": "A GNU Social-compatible microblogging server", "repository": "https://github.com/tootsuite/mastodon", - "logo": "https://github.com/tootsuite/mastodon/raw/master/app/assets/images/logo.png", + "logo": "https://github.com/tootsuite/mastodon/raw/master/app/javascript/images/logo.svg", "env": { "LOCAL_DOMAIN": { "description": "The domain that your Mastodon instance will run on (this can be appname.scalingo.io or a custom domain)", diff --git a/spec/controllers/api/web/push_subscriptions_controller_spec.rb b/spec/controllers/api/web/push_subscriptions_controller_spec.rb index 871176a07a0..7e83b801d14 100644 --- a/spec/controllers/api/web/push_subscriptions_controller_spec.rb +++ b/spec/controllers/api/web/push_subscriptions_controller_spec.rb @@ -9,7 +9,7 @@ describe Api::Web::PushSubscriptionsController do let(:create_payload) do { - data: { + subscription: { endpoint: 'https://fcm.googleapis.com/fcm/send/fiuH06a27qE:APA91bHnSiGcLwdaxdyqVXNDR9w1NlztsHb6lyt5WDKOC_Z_Q8BlFxQoR8tWFSXUIDdkyw0EdvxTu63iqamSaqVSevW5LfoFwojws8XYDXv_NRRLH6vo2CdgiN4jgHv5VLt2A8ah6lUX', keys: { p256dh: 'BEm_a0bdPDhf0SOsrnB2-ategf1hHoCnpXgQsFj5JCkcoMrMt2WHoPfEYOYPzOIs9mZE8ZUaD7VA5vouy0kEkr8=', @@ -36,25 +36,17 @@ describe Api::Web::PushSubscriptionsController do it 'saves push subscriptions' do sign_in(user) - stub_request(:post, create_payload[:data][:endpoint]).to_return(status: 200) + stub_request(:post, create_payload[:subscription][:endpoint]).to_return(status: 200) post :create, format: :json, params: create_payload user.reload - push_subscription = Web::PushSubscription.find_by(endpoint: create_payload[:data][:endpoint]) + push_subscription = Web::PushSubscription.find_by(endpoint: create_payload[:subscription][:endpoint]) - expect(push_subscription['endpoint']).to eq(create_payload[:data][:endpoint]) - expect(push_subscription['key_p256dh']).to eq(create_payload[:data][:keys][:p256dh]) - expect(push_subscription['key_auth']).to eq(create_payload[:data][:keys][:auth]) - end - - it 'sends welcome notification' do - sign_in(user) - - stub_request(:post, create_payload[:data][:endpoint]).to_return(status: 200) - - post :create, format: :json, params: create_payload + expect(push_subscription['endpoint']).to eq(create_payload[:subscription][:endpoint]) + expect(push_subscription['key_p256dh']).to eq(create_payload[:subscription][:keys][:p256dh]) + expect(push_subscription['key_auth']).to eq(create_payload[:subscription][:keys][:auth]) end end @@ -62,15 +54,15 @@ describe Api::Web::PushSubscriptionsController do it 'changes alert settings' do sign_in(user) - stub_request(:post, create_payload[:data][:endpoint]).to_return(status: 200) + stub_request(:post, create_payload[:subscription][:endpoint]).to_return(status: 200) post :create, format: :json, params: create_payload - alerts_payload[:id] = Web::PushSubscription.find_by(endpoint: create_payload[:data][:endpoint]).id + alerts_payload[:id] = Web::PushSubscription.find_by(endpoint: create_payload[:subscription][:endpoint]).id put :update, format: :json, params: alerts_payload - push_subscription = Web::PushSubscription.find_by(endpoint: create_payload[:data][:endpoint]) + push_subscription = Web::PushSubscription.find_by(endpoint: create_payload[:subscription][:endpoint]) expect(push_subscription.data['follow']).to eq(alerts_payload[:data][:follow]) expect(push_subscription.data['favourite']).to eq(alerts_payload[:data][:favourite]) diff --git a/spec/views/about/_contact.html.haml_spec.rb b/spec/views/about/_contact.html.haml_spec.rb index d2e7a459899..25ba1579464 100644 --- a/spec/views/about/_contact.html.haml_spec.rb +++ b/spec/views/about/_contact.html.haml_spec.rb @@ -31,12 +31,5 @@ describe 'about/_contact.html.haml' do expect(rendered).to have_content('admin@example.com') end - - it 'does not show info when email is missing' do - contact = double(site_contact_email: nil, contact_account: nil) - render 'about/contact', contact: contact - - expect(rendered).not_to have_content(I18n.t('about.business_email')) - end end end diff --git a/spec/views/about/_links.html.haml_spec.rb b/spec/views/about/_links.html.haml_spec.rb deleted file mode 100644 index 2d7f7467a04..00000000000 --- a/spec/views/about/_links.html.haml_spec.rb +++ /dev/null @@ -1,38 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -describe 'about/_links.html.haml' do - context 'when signed in' do - before do - allow(view).to receive(:user_signed_in?).and_return(true) - end - - it 'does not show sign in link' do - render 'about/links', instance: InstancePresenter.new - - expect(rendered).to have_content(I18n.t('about.get_started')) - expect(rendered).not_to have_content(I18n.t('auth.login')) - end - end - - context 'when signed out' do - before do - allow(view).to receive(:user_signed_in?).and_return(false) - end - - it 'shows get started link when registrations are allowed' do - render 'about/links', instance: double(open_registrations: true) - - expect(rendered).to have_content(I18n.t('about.get_started')) - expect(rendered).to have_content(I18n.t('auth.login')) - end - - it 'hides get started link when registrations are closed' do - render 'about/links', instance: double(open_registrations: false) - - expect(rendered).not_to have_content(I18n.t('about.get_started')) - expect(rendered).to have_content(I18n.t('auth.login')) - end - end -end diff --git a/spec/workers/pubsubhubbub/confirmation_worker_spec.rb b/spec/workers/pubsubhubbub/confirmation_worker_spec.rb index 8f66b4520c0..1eecdd2b5b6 100644 --- a/spec/workers/pubsubhubbub/confirmation_worker_spec.rb +++ b/spec/workers/pubsubhubbub/confirmation_worker_spec.rb @@ -83,6 +83,6 @@ describe Pubsubhubbub::ConfirmationWorker do end def http_headers - { 'Connection' => 'close', 'Host' => 'example.com', 'User-Agent' => 'http.rb/2.2.2 (Mastodon/1.4.7; +https://cb6e6126.ngrok.io/)' } + { 'Connection' => 'close', 'Host' => 'example.com' } end end diff --git a/spec/workers/pubsubhubbub/delivery_worker_spec.rb b/spec/workers/pubsubhubbub/delivery_worker_spec.rb index b720015680e..c0e0d51866f 100644 --- a/spec/workers/pubsubhubbub/delivery_worker_spec.rb +++ b/spec/workers/pubsubhubbub/delivery_worker_spec.rb @@ -59,7 +59,6 @@ describe Pubsubhubbub::DeliveryWorker do 'Content-Type' => 'application/atom+xml', 'Host' => 'example.com', 'Link' => "; rel=\"hub\", ; rel=\"self\"", - 'User-Agent' => 'http.rb/2.2.2 (Mastodon/1.4.7; +https://cb6e6126.ngrok.io/)', }.tap do |basic| known_digest = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha1'), subscription.secret.to_s, payload) basic.merge('X-Hub-Signature' => "sha1=#{known_digest}") if subscription.secret? diff --git a/yarn.lock b/yarn.lock index dcf09643e05..0f895f3b61b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2328,6 +2328,10 @@ detect-node@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" +detect-passive-events@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/detect-passive-events/-/detect-passive-events-1.0.2.tgz#0e39d7b675907eff55b8965f5be3fc0b0f4178b9" + diff@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9"