,
, etc.)
- // and replacing valid unicode strings
- // that _aren't_ within tags with an version.
- // The goal is to be the same as an emojione.regUnicode replacement, but faster.
- let i = -1;
- let insideTag = false;
- let match;
- while (++i < str.length) {
- const char = str.charAt(i);
- if (insideTag && char === '>') {
- insideTag = false;
- } else if (char === '<') {
- insideTag = true;
- } else if (!insideTag && (match = trie.search(str.substring(i)))) {
- const unicodeStr = match;
- if (unicodeStr in unicodeMapping && excluded.indexOf(unicodeStr) === -1) {
- const [filename, shortCode] = unicodeMapping[unicodeStr];
- const alt = unicodeStr;
- const replacement = ``;
- str = str.substring(0, i) + replacement + str.substring(i + unicodeStr.length);
- i += (replacement.length - unicodeStr.length); // jump ahead the length we've added to the string
- }
+const emojify = str => {
+ let rtn = '';
+ for (;;) {
+ let match, i = 0;
+ while (i < str.length && str[i] !== '<' && !(match = trie.search(str.slice(i)))) {
+ i += str.codePointAt(i) < 65536 ? 1 : 2;
+ }
+ if (i === str.length)
+ break;
+ else if (str[i] === '<') {
+ let tagend = str.indexOf('>', i + 1) + 1;
+ if (!tagend)
+ break;
+ rtn += str.slice(0, tagend);
+ str = str.slice(tagend);
+ } else {
+ const [filename, shortCode] = unicodeMapping[match];
+ rtn += str.slice(0, i) + ``;
+ str = str.slice(i + match.length);
}
}
- return str;
-}
+ return rtn + str;
+};
export default emojify;
diff --git a/app/javascript/mastodon/emojione_light.js b/app/javascript/mastodon/emojione_light.js
index 985e9dbcb3d..0d07d012f05 100644
--- a/app/javascript/mastodon/emojione_light.js
+++ b/app/javascript/mastodon/emojione_light.js
@@ -4,8 +4,10 @@
const emojione = require('emojione');
const mappedUnicode = emojione.mapUnicodeToShort();
+const excluded = ['®', '©', '™'];
module.exports.unicodeMapping = Object.keys(emojione.jsEscapeMap)
+ .filter(c => !excluded.includes(c))
.map(unicodeStr => [unicodeStr, mappedUnicode[emojione.jsEscapeMap[unicodeStr]]])
.map(([unicodeStr, shortCode]) => ({ [unicodeStr]: [emojione.emojioneList[shortCode].fname, shortCode.slice(1, shortCode.length - 1)] }))
.reduce((x, y) => Object.assign(x, y), { });
diff --git a/app/javascript/mastodon/features/account/components/header.js b/app/javascript/mastodon/features/account/components/header.js
index 9d7bc82c049..320e669a20b 100644
--- a/app/javascript/mastodon/features/account/components/header.js
+++ b/app/javascript/mastodon/features/account/components/header.js
@@ -4,8 +4,6 @@
import React from 'react';
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
-import emojify from '../../../emoji';
-import escapeTextContentForBrowser from 'escape-html';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import IconButton from '../../../components/icon_button';
import Motion from 'react-motion/lib/Motion';
@@ -95,15 +93,10 @@ export default class Header extends ImmutablePureComponent {
return null;
}
- let displayName = account.get('display_name');
let info = '';
let actionBtn = '';
let lockedIcon = '';
- if (displayName.length === 0) {
- displayName = account.get('username');
- }
-
if (me !== account.get('id') && account.getIn(['relationship', 'followed_by'])) {
info =
/g, '\n').replace(/<\/p>
/g, '\n\n'); - normalStatus.search_index = new DOMParser().parseFromString(searchContent, 'text/html').documentElement.textContent; + normalStatus.search_index = domParser.parseFromString(searchContent, 'text/html').documentElement.textContent; + normalStatus.contentHtml = emojify(normalStatus.content); + normalStatus.spoilerHtml = emojify(escapeTextContentForBrowser(normalStatus.spoiler_text || '')); return state.update(status.id, ImmutableMap(), map => map.mergeDeep(fromJS(normalStatus))); }; @@ -82,6 +90,18 @@ const filterStatuses = (state, relationship) => { return state; }; +const setHeight = (state, id, height) => { + return state.update(id, ImmutableMap(), map => map.set('height', height)); +}; + +const clearHeights = (state) => { + state.forEach(status => { + state = state.deleteIn([status.get('id'), 'height']); + }); + + return state; +}; + const initialState = ImmutableMap(); export default function statuses(state = initialState, action) { @@ -120,6 +140,10 @@ export default function statuses(state = initialState, action) { return deleteStatus(state, action.id, action.references); case ACCOUNT_BLOCK_SUCCESS: return filterStatuses(state, action.relationship); + case STATUS_SET_HEIGHT: + return setHeight(state, action.id, action.height); + case STATUSES_CLEAR_HEIGHT: + return clearHeights(state); default: return state; } diff --git a/app/javascript/mastodon/scroll.js b/app/javascript/mastodon/scroll.js index c089d37db80..44f95b17f08 100644 --- a/app/javascript/mastodon/scroll.js +++ b/app/javascript/mastodon/scroll.js @@ -1,9 +1,9 @@ const easingOutQuint = (x, t, b, c, d) => c * ((t = t / d - 1) * t * t * t * t + 1) + b; -const scrollTop = (node) => { +const scroll = (node, key, target) => { const startTime = Date.now(); - const offset = node.scrollTop; - const targetY = -offset; + const offset = node[key]; + const gap = target - offset; const duration = 1000; let interrupt = false; @@ -15,7 +15,7 @@ const scrollTop = (node) => { return; } - node.scrollTop = easingOutQuint(0, elapsed, offset, targetY, duration); + node[key] = easingOutQuint(0, elapsed, offset, gap, duration); requestAnimationFrame(step); }; @@ -26,4 +26,5 @@ const scrollTop = (node) => { }; }; -export default scrollTop; +export const scrollRight = (node) => scroll(node, 'scrollLeft', node.scrollWidth); +export const scrollTop = (node) => scroll(node, 'scrollTop', 0); diff --git a/app/javascript/styles/accounts.scss b/app/javascript/styles/accounts.scss index 3d5c1a69253..5a910510916 100644 --- a/app/javascript/styles/accounts.scss +++ b/app/javascript/styles/accounts.scss @@ -7,7 +7,7 @@ box-shadow: 0 0 15px rgba($base-shadow-color, 0.2); overflow: hidden; - @media screen and (max-width: 700px) { + @media screen and (max-width: 740px) { border-radius: 0; box-shadow: none; } @@ -298,7 +298,7 @@ display: flex; flex-wrap: wrap; - @media screen and (max-width: 700px) { + @media screen and (max-width: 740px) { border-radius: 0; box-shadow: none; } diff --git a/app/javascript/styles/basics.scss b/app/javascript/styles/basics.scss index 182ea36a436..4e51b555ca5 100644 --- a/app/javascript/styles/basics.scss +++ b/app/javascript/styles/basics.scss @@ -47,7 +47,7 @@ body { padding: 0; } - @media screen and (max-width: 360px) { + @media screen and (max-width: 400px) { padding-bottom: 0; } } diff --git a/app/javascript/styles/compact_header.scss b/app/javascript/styles/compact_header.scss index 27a67135f11..cf12fcfec36 100644 --- a/app/javascript/styles/compact_header.scss +++ b/app/javascript/styles/compact_header.scss @@ -3,9 +3,15 @@ font-size: 24px; line-height: 28px; color: $ui-primary-color; - overflow: hidden; font-weight: 500; margin-bottom: 20px; + padding: 0 10px; + overflow-wrap: break-word; + + @media screen and (max-width: 740px) { + text-align: center; + padding: 20px 10px 0; + } a { color: inherit; diff --git a/app/javascript/styles/components.scss b/app/javascript/styles/components.scss index 41735c7a456..b5efd560f4d 100644 --- a/app/javascript/styles/components.scss +++ b/app/javascript/styles/components.scss @@ -1835,7 +1835,6 @@ overflow-y: scroll; overflow-x: hidden; flex: 1 1 auto; - backface-visibility: hidden; -webkit-overflow-scrolling: touch; @supports(display: grid) { // hack to fix Chrome <57 contain: strict; @@ -1853,8 +1852,9 @@ flex: 0 0 auto; font-size: 16px; border: 0; - text-align: start; + text-align: unset; padding: 15px; + margin: 0; z-index: 3; &:hover { diff --git a/app/javascript/styles/containers.scss b/app/javascript/styles/containers.scss index 7dcf2c0062d..536f4e5a156 100644 --- a/app/javascript/styles/containers.scss +++ b/app/javascript/styles/containers.scss @@ -3,7 +3,7 @@ margin: 0 auto; margin-top: 40px; - @media screen and (max-width: 700px) { + @media screen and (max-width: 740px) { width: 100%; margin: 0; } @@ -13,8 +13,9 @@ margin: 100px auto; margin-bottom: 50px; - @media screen and (max-width: 360px) { + @media screen and (max-width: 400px) { margin: 30px auto; + margin-bottom: 20px; } h1 { @@ -42,3 +43,54 @@ } } } + +.account-header { + width: 400px; + margin: 0 auto; + display: flex; + font-size: 13px; + line-height: 18px; + box-sizing: border-box; + padding: 20px 0; + padding-bottom: 0; + margin-bottom: -30px; + margin-top: 40px; + + @media screen and (max-width: 400px) { + width: 100%; + margin: 0; + margin-bottom: 10px; + padding: 20px; + padding-bottom: 0; + } + + .avatar { + width: 40px; + height: 40px; + margin-right: 8px; + + img { + width: 100%; + height: 100%; + display: block; + margin: 0; + border-radius: 4px; + } + } + + .name { + flex: 1 1 auto; + color: $ui-secondary-color; + + .username { + display: block; + font-weight: 500; + } + } + + .logout-link { + display: block; + font-size: 32px; + line-height: 40px; + } +} diff --git a/app/javascript/styles/forms.scss b/app/javascript/styles/forms.scss index cffb6f19727..62094e98ee0 100644 --- a/app/javascript/styles/forms.scss +++ b/app/javascript/styles/forms.scss @@ -317,7 +317,7 @@ code { } .flash-message { - background: $ui-base-color; + background: lighten($ui-base-color, 8%); color: $ui-primary-color; border-radius: 4px; padding: 15px 10px; diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb index 7b89305ac53..cacc0364fd8 100644 --- a/app/lib/formatter.rb +++ b/app/lib/formatter.rb @@ -104,7 +104,7 @@ class Formatter html_attrs = { target: '_blank', rel: 'nofollow noopener' } Twitter::Autolink.send(:link_to_text, entity, link_html(entity[:url]), normalized_url, html_attrs) - rescue Addressable::URI::InvalidURIError + rescue Addressable::URI::InvalidURIError, IDN::Idna::IdnaError encode(entity[:url]) end diff --git a/app/models/concerns/account_avatar.rb b/app/models/concerns/account_avatar.rb index a6527a85bc2..b0ec689a736 100644 --- a/app/models/concerns/account_avatar.rb +++ b/app/models/concerns/account_avatar.rb @@ -8,7 +8,7 @@ module AccountAvatar class_methods do def avatar_styles(file) styles = { original: '120x120#' } - styles[:static] = { format: 'png' } if file.content_type == 'image/gif' + styles[:static] = { animated: false } if file.content_type == 'image/gif' styles end diff --git a/app/models/concerns/account_header.rb b/app/models/concerns/account_header.rb index 4ba9212a25d..542e25abe22 100644 --- a/app/models/concerns/account_header.rb +++ b/app/models/concerns/account_header.rb @@ -8,7 +8,7 @@ module AccountHeader class_methods do def header_styles(file) styles = { original: '700x335#' } - styles[:static] = { format: 'png' } if file.content_type == 'image/gif' + styles[:static] = { animated: false } if file.content_type == 'image/gif' styles end diff --git a/app/views/authorize_follows/show.html.haml b/app/views/authorize_follows/show.html.haml index 3b60df0580b..f7a8f72d20d 100644 --- a/app/views/authorize_follows/show.html.haml +++ b/app/views/authorize_follows/show.html.haml @@ -3,10 +3,9 @@ .form-container .follow-prompt - %h2= t('authorize_follow.prompt_html', self: current_account.username) - = render 'card', account: @account - = form_tag authorize_follow_path, method: :post, class: 'simple_form' do - = hidden_field_tag :acct, @account.acct - = button_tag t('authorize_follow.follow'), type: :submit + - unless current_account.following?(@account) + = form_tag authorize_follow_path, method: :post, class: 'simple_form' do + = hidden_field_tag :acct, @account.acct + = button_tag t('authorize_follow.follow'), type: :submit diff --git a/app/views/layouts/modal.html.haml b/app/views/layouts/modal.html.haml new file mode 100644 index 00000000000..a819e098d6c --- /dev/null +++ b/app/views/layouts/modal.html.haml @@ -0,0 +1,16 @@ +- content_for :header_tags do + = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous' + +- content_for :content do + - if user_signed_in? + .account-header + .avatar= image_tag current_account.avatar.url(:original) + .name + = t 'users.signed_in_as' + %span.username @#{current_account.local_username_and_domain} + = link_to destroy_user_session_path, method: :delete, class: 'logout-link icon-button' do + = fa_icon 'sign-out' + + .container= yield + += render template: 'layouts/application' diff --git a/app/views/tags/show.html.haml b/app/views/tags/show.html.haml index 15bf714c284..8cd2f1825f7 100644 --- a/app/views/tags/show.html.haml +++ b/app/views/tags/show.html.haml @@ -4,6 +4,7 @@ .compact-header %h1< = link_to site_title, root_path + %br %small ##{@tag.name} - if @statuses.empty? diff --git a/config/application.rb b/config/application.rb index ed5fdb7f702..eb89f0a105c 100644 --- a/config/application.rb +++ b/config/application.rb @@ -86,7 +86,7 @@ module Mastodon config.middleware.use Rack::Deflater config.to_prepare do - Doorkeeper::AuthorizationsController.layout 'public' + Doorkeeper::AuthorizationsController.layout 'modal' Doorkeeper::AuthorizedApplicationsController.layout 'admin' Doorkeeper::Application.send :include, ApplicationExtension end diff --git a/config/i18n-tasks.yml b/config/i18n-tasks.yml index f2bb220a6da..849e8116aa5 100644 --- a/config/i18n-tasks.yml +++ b/config/i18n-tasks.yml @@ -42,7 +42,9 @@ ignore_missing: - 'simple_form.{error_notification,required}.:' - 'errors.messages.*' - 'activerecord.errors.models.doorkeeper/*' - + - 'sessions.{browsers,platforms}.*' + - 'terms.body_html' + - 'application_mailer.salutation' ignore_unused: - 'activemodel.errors.*' - 'activerecord.attributes.*' diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb index b618bf344d3..056a3651a69 100644 --- a/config/initializers/doorkeeper.rb +++ b/config/initializers/doorkeeper.rb @@ -34,6 +34,11 @@ Doorkeeper.configure do # https://github.com/doorkeeper-gem/doorkeeper#custom-access-token-generator # access_token_generator "::Doorkeeper::JWT" + # The controller Doorkeeper::ApplicationController inherits from. + # Defaults to ActionController::Base. + # https://github.com/doorkeeper-gem/doorkeeper#custom-base-controller + base_controller 'ApplicationController' + # Reuse access token for the same resource owner within an application (disabled by default) # Rationale: https://github.com/doorkeeper-gem/doorkeeper/issues/383 reuse_access_token diff --git a/config/locales/ar.yml b/config/locales/ar.yml index ec051591aba..575c5114c2c 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -43,7 +43,6 @@ ar: authorize_follow: error: Unfortunately, there was an error looking up the remote account follow: إتبع - prompt_html: 'You (%{self}) have requested to follow:' title: إتباع %{acct} datetime: distance_in_words: diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 65ff5c02515..e7c3e1ef64b 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -43,7 +43,6 @@ bg: authorize_follow: error: Възникна грешка в откриването на потребителя follow: Последвай - prompt_html: "(%{self}), молбата ти беше изпратена до:" title: Последвай %{acct} datetime: distance_in_words: diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 725b120ec3e..a9f9e4c9327 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -185,7 +185,6 @@ ca: authorize_follow: error: Malauradament, ha ocorregut un error buscant el compte remot follow: Seguir - prompt_html: 'Tú (%{self}) has solicitat seguir:' title: Seguir %{acct} datetime: distance_in_words: diff --git a/config/locales/de.yml b/config/locales/de.yml index 87c5fa67a0d..1f3675f4774 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -166,7 +166,6 @@ de: authorize_follow: error: Das Profil konnte nicht geladen werden follow: Folgen - prompt_html: 'Du (%{self}) möchtest dieser Person folgen:' title: "%{acct} folgen" datetime: distance_in_words: diff --git a/config/locales/devise.pl.yml b/config/locales/devise.pl.yml index 1c692f7a87a..d537efc6ebd 100644 --- a/config/locales/devise.pl.yml +++ b/config/locales/devise.pl.yml @@ -12,9 +12,9 @@ pl: last_attempt: Masz jeszcze jedną próbę; Twoje konto zostanie zablokowane jeśli się nie powiedzie. locked: Twoje konto zostało zablokowane. not_found_in_database: Nieprawidłowy %{authentication_keys} lub hasło. - timeout: Twoja sesja wygasła. Zaloguj się ponownie aby kontynuować.. - unauthenticated: Zapisz się lub zaloguj aby kontynuować. - unconfirmed: Zweryfikuj adres e-mail aby kontynuować. + timeout: Twoja sesja wygasła. Zaloguj się ponownie, aby kontynuować.. + unauthenticated: Zapisz się lub zaloguj, aby kontynuować. + unconfirmed: Zweryfikuj adres e-mail, aby kontynuować. mailer: confirmation_instructions: subject: 'Mastodon: Instrukcje weryfikacji adresu e-mail' @@ -38,7 +38,7 @@ pl: signed_up: Twoje konto zostało utworzone. Witamy! signed_up_but_inactive: Twoje konto zostało utworzone. Nie mogliśmy Cię jednak zalogować, ponieważ konto nie zostało jeszcze aktywowane. signed_up_but_locked: Twoje konto zostało utworzone. Nie mogliśmy Cię jednak zalogować, ponieważ konto jest zablokowane. - signed_up_but_unconfirmed: Na Twój adres e-mail została wysłana wiadomosć z odnośnikiem potwierdzającym. Kliknij w odnośnik aby aktywować konto. Jeżeli nie otrzymano wiadomości, sprawdź folder ze spamem. + signed_up_but_unconfirmed: Na Twój adres e-mail została wysłana wiadomosć z odnośnikiem potwierdzającym. Kliknij w odnośnik, aby aktywować konto. Jeżeli nie otrzymano wiadomości, sprawdź folder ze spamem. update_needs_confirmation: Konto zostało zaktualizowane, musimy jednak zweryfikować Twój nowy adres e-mail. Została na niego wysłana wiadomość z odnośnikiem potwierdzającym. Jeżeli nie otrzymano wiadomości, sprawdź folder ze spamem. updated: Konto zostało zaktualizowane. sessions: @@ -48,7 +48,7 @@ pl: unlocks: send_instructions: W ciągu kilku minut otrzymasz wiadomość e-mail z instrukcjami odblokowania konta. Jeżeli nie otrzymano wiadomości, sprawdź folder ze spamem. send_paranoid_instructions: Jeśli Twoje konto istnieje, instrukcje odblokowania go otrzymasz w wiadomości e-mail w ciągu kilku minut. Jeżeli nie otrzymano wiadomości, sprawdź folder ze spamem. - unlocked: Twoje konto zostało odblokowane. Zaloguj się aby kontynuować. + unlocked: Twoje konto zostało odblokowane. Zaloguj się, aby kontynuować. errors: messages: already_confirmed: był już potwierdzony, spróbuj się zalogować diff --git a/config/locales/doorkeeper.pl.yml b/config/locales/doorkeeper.pl.yml index 8103c456163..72b967e3543 100644 --- a/config/locales/doorkeeper.pl.yml +++ b/config/locales/doorkeeper.pl.yml @@ -31,7 +31,7 @@ pl: help: native_redirect_uri: Użyj %{native_redirect_uri} do lokalnych testów redirect_uri: Jeden adres na linię tekstu - scopes: Rozdziel zakresy (scopes) spacjami. Zostaw puste aby użyć domyślnych zakresów. + scopes: Rozdziel zakresy (scopes) spacjami. Zostaw puste, aby użyć domyślnych zakresów. index: callback_url: URL wywołania zwrotnego (callback) name: Nazwa diff --git a/config/locales/en.yml b/config/locales/en.yml index 90b4fe82bcc..1fa0de90b2c 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -215,7 +215,7 @@ en: body: "%{reporter} has reported %{target}" subject: New report for %{instance} (#%{id}) application_mailer: - salutation: '%{name},' + salutation: "%{name}," settings: 'Change e-mail preferences: %{link}' signature: Mastodon notifications from %{instance} view: 'View:' @@ -228,6 +228,7 @@ en: delete_account_html: If you wish to delete your account, you can proceed here. You will be asked for confirmation. didnt_get_confirmation: Didn't receive confirmation instructions? forgot_password: Forgot your password? + invalid_reset_password_token: Password reset token is invalid or expired. Please request a new one. login: Log in logout: Logout register: Sign up @@ -243,7 +244,6 @@ en: close: Or, you can just close this window. return: Return to the user's profile web: Go to web - prompt_html: 'You (%{self}) have requested to follow:' title: Follow %{acct} datetime: distance_in_words: @@ -523,3 +523,4 @@ en: users: invalid_email: The e-mail address is invalid invalid_otp_token: Invalid two-factor code + signed_in_as: 'Signed in as:' diff --git a/config/locales/eo.yml b/config/locales/eo.yml index 6673b6516ac..f8b5ec0acf3 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -42,7 +42,6 @@ eo: authorize_follow: error: Bedaŭrinde, okazis eraro provante konsulti la foran konton follow: Sekvi - prompt_html: 'Vi (%{self}) petis sekvi:' title: Sekvi %{acct} datetime: distance_in_words: diff --git a/config/locales/es.yml b/config/locales/es.yml index 89e2828d0be..d2d1de14f82 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -43,7 +43,6 @@ es: authorize_follow: error: Desafortunadamente, ha ocurrido un error buscando la cuenta remota follow: Seguir - prompt_html: 'Tú (%{self}) has solicitado seguir:' title: Seguir %{acct} datetime: distance_in_words: diff --git a/config/locales/fa.yml b/config/locales/fa.yml index eb66a9c4102..0c575e23e24 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -2,7 +2,7 @@ fa: about: about_mastodon_html: ماستدون (Mastodon) یک شبکهٔ اجتماعی است که بر اساس پروتکلهای آزاد وب و نرمافزارهای آزاد و کدباز ساخته شده است. این شبکه مانند ایمیل غیرمتمرکز است. - about_this: درباره. + about_this: درباره closed_registrations: ثبتنام روی این سرور هماینک فعال نیست. اما شما میتوانید سرور دیگری بیابید و با حسابی که آنجا میسازید دقیقاً به همین شبکه دسترسی داشته باشید. contact: تماس contact_missing: تعیین نشده @@ -20,11 +20,11 @@ fa: not_a_product_title: شما یک انسان هستید، نه یک محصول real_conversation_body: با ۵۰۰ نویسه برای هر نوشته و با پشتیبانی از هشدارهای موردی برای نوشتهها و تصاویر، میتوانید خود را همان گونه که میخواهید ابراز کنید. real_conversation_title: برای گفتگوهای واقعی - within_reach_body: اپهای متنوع برای iOS، اندروید، و سیستمهای دیگر به خاطر وحود یک اکوسیستم API دوستانه برای برنامهنویسان. از همه جا با دوستان خود ارتباط داشته باشید. + within_reach_body: اپهای متنوع برای iOS، اندروید، و سیستمهای دیگر به خاطر وجود یک اکوسیستم API دوستانه برای برنامهنویسان. از همه جا با دوستان خود ارتباط داشته باشید. within_reach_title: همیشه در دسترس find_another_instance: یافتن سرورهای دیگر generic_description: "%{domain} یک سرور روی شبکه است" - hosted_on: ماستدون میزبانیشده روی %{domain} + hosted_on: ماستدون، میزبانیشده روی %{domain} learn_more: بیشتر بدانید other_instances: فهرست سرورها source_code: کدهای منبع @@ -212,10 +212,10 @@ fa: title: مدیریت admin_mailer: new_report: - body: "کاربر %{reporter} کاربر %{target} را گزارش داد" + body: کاربر %{reporter} کاربر %{target} را گزارش داد subject: گزارش تازهای برای %{instance} (#%{id}) application_mailer: - salutation: '%{name},' + salutation: "%{name}," settings: 'تغییر تنظیمات ایمیل: %{link}' signature: اعلانهای ماستدون از %{instance} view: 'نمایش:' @@ -243,7 +243,6 @@ fa: close: یا این پنجره را ببندید. return: به نمایهٔ این کاربر بازگردید web: رفتن به وب - prompt_html: 'شما (%{self}) میخواهید این حساب را پی بگیرید:' title: پیگیری %{acct} datetime: distance_in_words: @@ -433,7 +432,7 @@ fa: sensitive_content: محتوای حساس terms: body_html: | -
Privacy Policy
+سیاست رازداری (Privacy Policy)
ما چه اطلاعاتی را گردآوری میکنیم؟
@@ -451,7 +450,7 @@ fa:ما چگونه از اطلاعات شما محافظت میکنیم؟
@@ -500,7 +499,7 @@ fa:این نوشته تحت اجازهنامهٔ CC-BY-SA قرار دارد. تاریخ آخرین بهروزرسانی آن ۱۰ خرداد ۱۳۹۲ است.
این نوشته اقتباسی است از سیاست رازداری Discourse.
- title: "شرایط استفاده و سیاست رازداری %{instance}" + title: شرایط استفاده و سیاست رازداری %{instance} time: formats: default: "%d %b %Y, %H:%M" diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 23c844741c8..b748f718468 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -42,7 +42,6 @@ fi: authorize_follow: error: Valitettavasti tapahtui virhe etätilin haussa. follow: Seuraa - prompt_html: 'Sinä (%{self}) olet pyytänyt lupaa seurata:' title: Seuraa %{acct} datetime: distance_in_words: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 7fde60a2be6..d7aa414971a 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -220,6 +220,7 @@ fr: delete_account_html: Si vous désirez supprimer votre compte, vous pouvez cliquer ici. Il vous sera demandé de confirmer cette action. didnt_get_confirmation: Vous n’avez pas reçu les consignes de confirmation ? forgot_password: Mot de passe oublié ? + invalid_reset_password_token: Le lien de réinitialisation du mot de passe est invalide ou a expiré. Merci de réessayer. login: Se connecter logout: Se déconnecter register: S’inscrire @@ -235,7 +236,6 @@ fr: close: Ou bien, vous pouvez fermer cette fenêtre. return: Retour au profil de l'utilisateur⋅trice web: Retour à l'interface web - prompt_html: 'Vous (%{self}) avez demandé à suivre :' title: Suivre %{acct} datetime: distance_in_words: @@ -278,7 +278,7 @@ fr: blocks: Vous bloquez csv: CSV follows: Vous suivez - mutes: Vous faites taire + mutes: Vous masquez storage: Médias stockés followers: domain: Domaine @@ -305,7 +305,7 @@ fr: types: blocking: Liste d’utilisateur⋅ice⋅s bloqué⋅es following: Liste d’utilisateur⋅ice⋅s suivi⋅es - muting: Liste d’utilisateur⋅ice⋅s que vous faites taire + muting: Liste d’utilisateur⋅ice⋅s que vous masquez upload: Importer landing_strip_html: %{name} utilise %{link_to_root_path}. Vous pouvez le/la suivre et interagir si vous possédez un compte quelque part dans le "fediverse". landing_strip_signup_html: Si ce n’est pas le cas, vous pouvez en créer un ici. @@ -451,3 +451,4 @@ fr: users: invalid_email: L’adresse courriel est invalide invalid_otp_token: Le code d’authentification à deux facteurs est invalide + signed_in_as: 'Connecté·e en tant que :' diff --git a/config/locales/he.yml b/config/locales/he.yml index 7772e6a76e9..f04e8ad6218 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -177,7 +177,6 @@ he: authorize_follow: error: למרבה הצער, היתה שגיאה בחיפוש החשבון המרוחק follow: לעקוב - prompt_html: 'בקשת מעקב ממך (%{self}) אחרי:' title: לעקוב אחרי %{acct} datetime: distance_in_words: diff --git a/config/locales/hr.yml b/config/locales/hr.yml index 2d43fcad816..52a8bd35f8f 100644 --- a/config/locales/hr.yml +++ b/config/locales/hr.yml @@ -43,7 +43,6 @@ hr: authorize_follow: error: Nažalost, došlo je do greške looking up the remote račun follow: Slijedi - prompt_html: 'Ti si (%{self}) poslao zahtjev za sljeđenje:' title: Slijedi %{acct} datetime: distance_in_words: diff --git a/config/locales/id.yml b/config/locales/id.yml index 0d5937cfbb5..c76b3d6bbe2 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -168,7 +168,6 @@ id: authorize_follow: error: Sayangnya, ada error saat melihat akun remote follow: Ikuti - prompt_html: 'Anda (%{self}) telah diminta untuk mengikuti:' title: Mengikuti %{acct} datetime: distance_in_words: diff --git a/config/locales/io.yml b/config/locales/io.yml index c9abd571103..112771ee4f6 100644 --- a/config/locales/io.yml +++ b/config/locales/io.yml @@ -166,7 +166,6 @@ io: authorize_follow: error: Regretinde, eventis eraro probante konsultar la fora konto follow: Sequar - prompt_html: 'Tu (%{self}) demandis sequar:' title: Sequar %{acct} datetime: distance_in_words: diff --git a/config/locales/it.yml b/config/locales/it.yml index de96825890d..75d56362a6e 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -43,7 +43,6 @@ it: authorize_follow: error: Sfortunatamente c'è stato un errore nel consultare l'account remoto follow: Segui - prompt_html: 'Tu, (%{self}), hai richiesto di seguire:' title: Segui %{acct} datetime: distance_in_words: diff --git a/config/locales/ja.yml b/config/locales/ja.yml index fa8f4566c9a..05c71223412 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -234,7 +234,7 @@ ja: reset_password: パスワードを再発行 set_new_password: 新しいパスワード authorize_follow: - error: 残念ながら、リモートアカウントにエラーが発生しました。 + error: 残念ながら、リモートアカウント情報の取得中にエラーが発生しました。 follow: フォロー follow_request: 'あなたは以下のアカウントにフォローリクエストを送信しました:' following: '成功! あなたは現在以下のアカウントをフォローしています:' @@ -242,7 +242,6 @@ ja: close: またはこのウィンドウを閉じます return: ユーザーのプロフィールに戻る web: Web を開く - prompt_html: 'あなた(%{self})は以下のアカウントのフォローをリクエストしました:' title: "%{acct} をフォロー" datetime: distance_in_words: @@ -522,3 +521,4 @@ ja: users: invalid_email: メールアドレスが無効です invalid_otp_token: 二段階認証コードが間違っています + signed_in_as: '下記でログイン中:' diff --git a/config/locales/ko.yml b/config/locales/ko.yml index aae0e62e724..f3bde5bbb0d 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -189,7 +189,6 @@ ko: authorize_follow: error: 리모트 팔로우 도중 오류가 발생했습니다. follow: 팔로우 - prompt_html: '나(%{self}) 는 아래 계정의 팔로우를 요청했습니다:' title: "%{acct} 를 팔로우" datetime: distance_in_words: diff --git a/config/locales/nl.yml b/config/locales/nl.yml index e65658d8b65..6562767a95a 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -106,7 +106,7 @@ nl: 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. + 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 @@ -129,7 +129,7 @@ nl: suspend: Alle opgeschorste accounts van dit domein niet meer opschorten title: Domeinblokkade voor %{domain} ongedaan maken undo: Ongedaan maken - title: Domeinblokkades + title: Domeinblokkades undo: Ongedaan maken instances: account_count: Bekende accounts @@ -169,7 +169,7 @@ nl: title: Bericht wanneer registratie is uitgeschakeld deletion: desc_html: Toestaan dat iedereen hun eigen account kan verwijderen - title: Verwijderen account toestaan + title: Verwijderen account toestaan open: desc_html: Toestaan dat iedereen een account kan registereren title: Open registratie @@ -220,7 +220,7 @@ nl: applications: invalid_url: De opgegeven URL is ongeldig auth: - agreement_html: Wanneer je op registeren klikt ga je akkoord met onze gebruikersvoorwaarden en ons privacybeleid. + agreement_html: Wanneer je op registreren 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. @@ -241,7 +241,6 @@ nl: 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: distance_in_words: @@ -307,7 +306,7 @@ 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: @@ -510,7 +509,7 @@ nl: 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.) diff --git a/config/locales/no.yml b/config/locales/no.yml index b2e5773de0e..996ea1d97f1 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -170,7 +170,6 @@ authorize_follow: error: Uheldigvis så skjedde det en feil da vi prøvde å få tak i en bruker fra en annen instans. follow: Følg - prompt_html: 'Du (%{self}) har spurt om å følge:' title: Følg %{acct} datetime: distance_in_words: diff --git a/config/locales/oc.yml b/config/locales/oc.yml index d9a5892876e..6c3f95823a5 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -31,7 +31,7 @@ oc: status_count_after: estatuts status_count_before: qu’an escrich user_count_after: personas - user_count_before: Ostal de + user_count_before: Ostal de what_is_mastodon: Qu’es Mastodon ? accounts: follow: Sègre @@ -214,6 +214,7 @@ oc: body: "%{reporter} a senhalat %{target}" subject: Novèl senhalament per %{instance} (#%{id}) application_mailer: + salutation: '%{name},' settings: 'Cambiar las preferéncias de corrièl : %{link}' signature: Notificacion de Mastodon sus %{instance} view: 'Veire :' @@ -232,6 +233,7 @@ oc: resend_confirmation: Tornar mandar las instruccions de confirmacion reset_password: Reïnicializar lo senhal set_new_password: Picar un nòu senhal + invalid_reset_password_token: Ligam de reïnicializacion invalid o acabat. Tornatz ensajar se vos plai. authorize_follow: error: O planhèm, i a agut una error al moment de cercar lo compte follow: Sègre @@ -241,7 +243,6 @@ oc: close: O podètz tampar aquesta fenèstra. return: Tornar al perfil web: Tornar a l’interfàcia Web - prompt_html: 'Avètz (%{self}) demandat de sègre :' title: Sègre %{acct} date: abbr_day_names: @@ -579,3 +580,4 @@ oc: users: invalid_email: L’adreça de corrièl es invalida invalid_otp_token: Còdi d’autentificacion en dos temps invalid + signed_in_as: 'Session a' diff --git a/config/locales/pl.yml b/config/locales/pl.yml index a30092d505f..415c3b9931a 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -109,12 +109,14 @@ pl: hint: Blokada domen nie zabroni tworzenia wpisów kont w bazie danych, ale pozwoli na automatyczną moderację kont do nich należących. severity: desc_html: "Wyciszenie uczyni wpisy użytkownika widoczne tylko dla osób, które go śledzą. Zawieszenie spowoduje usunięcie całej zawartości dodanej przez użytkownika." + noop: Nic nie rób silence: Wycisz suspend: Zawieś title: Nowa blokada domen reject_media: Odrzucaj pliki multimedialne reject_media_hint: Usuwa przechowywane lokalnie pliki multimedialne i nie pozwala na ich pobieranie. Nieprzydatne przy zawieszeniu severities: + noop: Nic nie rób silence: Wycisz suspend: Zawieś severity: Priorytet @@ -175,8 +177,8 @@ pl: desc_html: Akapit wprowadzający, widoczny na stronie głównej i znacznikach meta. Możesz korzystać z tagów HTML, w szczególności<a>
i <em>
.
title: Opis instancji
site_description_extended:
- desc_html: Dobre miejsce na zasady użytkowania, wprowadzenie i inne rzeczy, które wyróżniają tą instancję. Możesz korzystać z tagów HTML
- title: Niestandrdowy opis strony
+ desc_html: Dobre miejsce na zasady użytkowania, wprowadzenie i inne rzeczy, które wyróżniają tę instancję. Możesz korzystać z tagów HTML
+ title: Niestandardowy opis strony
site_terms:
desc_html: Miejsce na własną politykę prywatności, zasady użytkowania i inne unormowania prawne. Możesz używać tagów HTML
title: Niestandardowe zasady użytkowania
@@ -213,6 +215,7 @@ pl:
body: Użytkownik %{reporter} zgłosił %{target}
subject: Nowe zgłoszenie na %{instance} (#%{id})
application_mailer:
+ salutation: "%{name},"
settings: 'Zmień ustawienia powiadamiania: %{link}'
signature: Powiadomienie Mastodona z instancji %{instance}
view: 'Zobacz:'
@@ -225,6 +228,7 @@ pl:
delete_account_html: Jeżeli chcesz usunąć konto, przejdź tutaj. Otrzymasz prośbę o potwierdzenie.
didnt_get_confirmation: Nie otrzymałeś instrukcji weryfikacji?
forgot_password: Nie pamiętasz hasła?
+ invalid_reset_password_token: Token do resetowania hasła jest nieprawidłowy lub utracił ważność. Spróbuj uzyskać nowy.
login: Zaloguj się
logout: Wyloguj się
register: Rejestracja
@@ -237,10 +241,9 @@ pl:
follow_request: 'Wysłano prośbę o pozwolenie na śledzenie:'
following: 'Pomyślnie! Od teraz śledzisz:'
post_follow:
- close: Ewentualnie, możesz po prostu zamknąć tą stronę.
+ close: Ewentualnie, możesz po prostu zamknąć tę stronę.
return: Powróć do strony użytkownika
web: Przejdź do sieci
- prompt_html: 'Ty (%{self}) chcesz śledzić:'
title: Śledź %{acct}
datetime:
distance_in_words:
@@ -262,10 +265,10 @@ pl:
description_html: Ta opcja usunie bezpowrotnie i nieodwracalnie całą zawartość konta i zdezaktywuje je. Twoja nazwa użytkownika pozostanie zarezerwowana, aby zapobiec nadużyciom.
proceed: Usuń konto
success_msg: Twoje konto zostało pomyślnie usunięte
- warning_html: Możemy usunąć zawartość jedynie w obrębie tej instancji. Zawartość udostępniona publicznie pozostawia trwałe ślady. Serwery niepodłączone do sieci, bądź nieśledzące Twoich aktualizacji mogą zachować Twoje dane.
+ warning_html: Możemy usunąć zawartość jedynie w obrębie tej instancji. Zawartość udostępniona publicznie pozostawia trwałe ślady. Serwery niepodłączone do sieci bądź nieśledzące Twoich aktualizacji mogą zachować Twoje dane.
warning_title: Dostępność usuniętej zawartości
errors:
- '403': Nie masz uprawnień, aby wyświetlić tą stronę.
+ '403': Nie masz uprawnień, aby wyświetlić tę stronę.
'404': Strona, którą próbujesz odwiedzić, nie istnieje.
'410': Strona, którą próbujesz odwiedzić, już nie istnieje.
'422':
@@ -336,8 +339,8 @@ pl:
body: "%{name} poprosił o możliwość śledzenia Cię"
subject: 'Prośba o możliwość śledzenia: %{name}'
mention:
- body: "%{name} wspomniał Cię w:"
- subject: "%{name} Cię wspomniał"
+ body: "%{name} wspomniał o Tobie w:"
+ subject: "%{name} wspomniał o Tobie"
reblog:
body: 'Twój wpis został podbity przez %{name}:'
subject: Twój wpis został podbity przez %{name}
@@ -524,3 +527,4 @@ pl:
users:
invalid_email: Adres e-mail jest niepoprawny
invalid_otp_token: Kod uwierzytelniający jest niepoprawny
+ signed_in_as: 'Zalogowany jako:'
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
index 68b1c549cec..6dec2b50a60 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -169,7 +169,6 @@ pt-BR:
authorize_follow:
error: Infelizmente houve um erro olhando uma conta remota
follow: Seguir
- prompt_html: 'Você (%{self}) pediu pra seguir:'
title: Seguir %{acct}
datetime:
distance_in_words:
diff --git a/config/locales/ru.yml b/config/locales/ru.yml
index 348f670b574..0156f0e95f6 100644
--- a/config/locales/ru.yml
+++ b/config/locales/ru.yml
@@ -162,7 +162,6 @@ ru:
authorize_follow:
error: К сожалению, при поиске удаленного аккаунта возникла ошибка
follow: Подписаться
- prompt_html: 'Вы (%{self}) запросили подписку:'
title: Подписаться на %{acct}
datetime:
distance_in_words:
@@ -269,14 +268,14 @@ ru:
truncate: "…"
push_notifications:
favourite:
- title: "Ваш статус понравился %{name}"
+ title: Ваш статус понравился %{name}
follow:
title: "%{name} теперь подписан(а) на Вас"
mention:
action_boost: Продвинуть
action_expand: Развернуть
action_favourite: Нравится
- title: "Вас упомянул(а) %{name}"
+ title: Вас упомянул(а) %{name}
reblog:
title: "%{name} продвинул(а) Ваш статус"
subscribed:
@@ -351,7 +350,7 @@ ru:
reblogged: продвинул(а)
sensitive_content: Чувствительный контент
terms:
- title: "Условия обслуживания и политика конфиденциальности %{instance}"
+ title: Условия обслуживания и политика конфиденциальности %{instance}
time:
formats:
default: "%b %d, %Y, %H:%M"
diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml
index 71a9d6e1fc8..dd72a19bda3 100644
--- a/config/locales/simple_form.fa.yml
+++ b/config/locales/simple_form.fa.yml
@@ -40,7 +40,7 @@ fa:
setting_boost_modal: نمایش پیغام تأیید پیش از بازبوقیدن
setting_default_privacy: حریم خصوصی نوشتهها
setting_default_sensitive: همیشه تصاویر را به عنوان حساس علامت بزن
- setting_delete_modal: پیش از پاک کردن یک بوق پیغام تأیید نشان بده
+ setting_delete_modal: پیش از پاک کردن یک نوشته پیغام تأیید نشان بده
setting_noindex: درخواست از موتورهای جستجو برای لغو فهرستسازی
setting_system_font_ui: بهکاربردن قلم پیشفرض سیستم
setting_unfollow_modal: نمایش پیغام تأیید پیش از لغو پیگیری دیگران
diff --git a/config/locales/th.yml b/config/locales/th.yml
index 801f4886faf..9d088792820 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -170,7 +170,6 @@ th:
authorize_follow:
error: Unfortunately, there was an error looking up the remote account
follow: ติดตาม
- prompt_html: 'คุณ (%{self}) ขอติดตาม:'
title: ติดตาม %{acct}
datetime:
distance_in_words:
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index ac378090c7e..91ef9544cfc 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -169,7 +169,6 @@ tr:
authorize_follow:
error: Uzak hesap aranırken bir hata oluştu.
follow: Takip et
- prompt_html: 'Siz (%{self}) bu kullanıcıyı takip etmek istiyor musunuz?:'
title: "%{acct}'i takip et"
datetime:
distance_in_words:
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index 22fff6961db..4d12ddf4e87 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -160,7 +160,6 @@ uk:
authorize_follow:
error: На жаль, при пошуку віддаленого аккаунту виникла помилка
follow: Підписатися
- prompt_html: 'Ви (%{self}) запитали про підписку:'
title: Підписатися на %{acct}
datetime:
distance_in_words:
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index 5018b48b80b..0672202a212 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -176,7 +176,6 @@ zh-CN:
authorize_follow:
error: 对不起,寻找这个跨站用户时出错
follow: 关注
- prompt_html: 你 (%{self}) 正准备关注︰
title: 关注 %{acct}
datetime:
distance_in_words:
diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml
index 40087ed532b..9d6c74008a1 100644
--- a/config/locales/zh-HK.yml
+++ b/config/locales/zh-HK.yml
@@ -169,7 +169,6 @@ zh-HK:
authorize_follow:
error: 對不起,尋找這個跨站用戶的過程發生錯誤
follow: 關注
- prompt_html: 你 (%{self}) 正準備關注︰
title: 關注 %{acct}
datetime:
distance_in_words:
diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml
index 0ea3457c7e7..7065acf9abb 100644
--- a/config/locales/zh-TW.yml
+++ b/config/locales/zh-TW.yml
@@ -140,7 +140,6 @@ zh-TW:
authorize_follow:
error: 對不起,尋找這個跨站使用者的過程發生錯誤
follow: 關注
- prompt_html: 您 (%{self}) 正準備關注︰
title: 關注 %{acct}
datetime:
distance_in_words:
diff --git a/config/webpack/loaders/babel.js b/config/webpack/loaders/babel.js
index 49b191d267f..05ef8431c4f 100644
--- a/config/webpack/loaders/babel.js
+++ b/config/webpack/loaders/babel.js
@@ -1,3 +1,5 @@
+const { resolve } = require('path');
+
module.exports = {
test: /\.js$/,
// include react-intl because transform-react-remove-prop-types needs to apply to it
@@ -9,5 +11,6 @@ module.exports = {
options: {
forceEnv: process.env.NODE_ENV || 'development',
sourceRoot: 'app/javascript',
+ cacheDirectory: resolve(__dirname, '..', '..', '..', 'tmp', 'cache', 'babel-loader'),
},
};
diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb
index aeb5492dc6c..381e9aac92d 100644
--- a/lib/mastodon/version.rb
+++ b/lib/mastodon/version.rb
@@ -13,7 +13,7 @@ module Mastodon
end
def patch
- 0
+ 1
end
def pre
diff --git a/spec/controllers/auth/passwords_controller_spec.rb b/spec/controllers/auth/passwords_controller_spec.rb
index 60b225efaed..992d2e29d2c 100644
--- a/spec/controllers/auth/passwords_controller_spec.rb
+++ b/spec/controllers/auth/passwords_controller_spec.rb
@@ -3,6 +3,8 @@
require 'rails_helper'
describe Auth::PasswordsController, type: :controller do
+ include Devise::Test::ControllerHelpers
+
describe 'GET #new' do
it 'returns http success' do
@request.env['devise.mapping'] = Devise.mappings[:user]
@@ -10,4 +12,27 @@ describe Auth::PasswordsController, type: :controller do
expect(response).to have_http_status(:success)
end
end
+
+ describe 'GET #edit' do
+ let(:user) { Fabricate(:user) }
+
+ before do
+ request.env['devise.mapping'] = Devise.mappings[:user]
+ @token = user.send_reset_password_instructions
+ end
+
+ context 'with valid reset_password_token' do
+ it 'returns http success' do
+ get :edit, params: { reset_password_token: @token }
+ expect(response).to have_http_status(:success)
+ end
+ end
+
+ context 'with invalid reset_password_token' do
+ it 'redirects to #new' do
+ get :edit, params: { reset_password_token: 'some_invalid_value' }
+ expect(response).to redirect_to subject.new_password_path(subject.send(:resource_name))
+ end
+ end
+ end
end
diff --git a/spec/controllers/auth/sessions_controller_spec.rb b/spec/controllers/auth/sessions_controller_spec.rb
index 06fdbaabc31..88f0a4734d1 100644
--- a/spec/controllers/auth/sessions_controller_spec.rb
+++ b/spec/controllers/auth/sessions_controller_spec.rb
@@ -28,7 +28,7 @@ RSpec.describe Auth::SessionsController, type: :controller do
sign_in(user, scope: :user)
delete :destroy
- expect(response).to redirect_to(root_path)
+ expect(response).to redirect_to(new_user_session_path)
end
end
@@ -38,7 +38,7 @@ RSpec.describe Auth::SessionsController, type: :controller do
sign_in(user, scope: :user)
delete :destroy
- expect(response).to redirect_to(root_path)
+ expect(response).to redirect_to(new_user_session_path)
end
end
end
diff --git a/spec/javascript/components/display_name.test.js b/spec/javascript/components/display_name.test.js
index ad9288d4dfc..ab484cf3e29 100644
--- a/spec/javascript/components/display_name.test.js
+++ b/spec/javascript/components/display_name.test.js
@@ -9,19 +9,9 @@ describe('Foo
', }); const wrapper = render(