From 616f53eea81ba23d824744119aeed7cf4d22a03b Mon Sep 17 00:00:00 2001 From: Jakob Kramer <811907+gandaro@users.noreply.github.com> Date: Tue, 10 Oct 2017 16:12:18 +0200 Subject: [PATCH 01/23] Update German translation (#5302) --- config/locales/de.yml | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/config/locales/de.yml b/config/locales/de.yml index 7c0edff94..a54d9734f 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -2,6 +2,7 @@ de: about: about_mastodon_html: Mastodon ist ein soziales Netzwerk. Es basiert auf offenen Web-Protokollen und freier, quelloffener Software. Es ist dezentral (so wie E-Mail!). + about_hashtag_html: Dies sind öffentliche Beiträge, die mit #%{hashtag} getaggt wurden. Wenn du ein Konto irgendwo im Fediversum besitzt, kannst du mit ihnen interagieren. about_this: Über diese Instanz closed_registrations: Die Registrierung auf dieser Instanz ist momentan geschlossen. Aber du kannst dein Konto auch auf einer anderen Instanz erstellen! Von dort hast du genauso Zugriff auf das Mastodon-Netzwerk. contact: Kontakt @@ -75,6 +76,7 @@ de: silenced: Stummgeschaltet suspended: Gesperrt title: Moderation + moderation_notes: Moderationsnotizen most_recent_activity: Letzte Aktivität most_recent_ip: Letzte IP-Adresse not_subscribed: Nicht abonniert @@ -108,11 +110,25 @@ de: unsubscribe: Abbestellen username: Profilname web: Web + account_moderation_notes: + account: Moderator*in + created_at: Datum + create: Erstellen + created_msg: Moderationsnotiz erfolgreich erstellt! + delete: Löschen + destroyed_msg: Moderationsnotiz erfolgreich gelöscht! custom_emojis: + copied_msg: Eine lokale Kopie des Emojis wurde erstellt + copy: Kopieren + copy_failed_msg: Es konnte keine lokale Kopie des Emojis erstellt werden created_msg: Emoji erstellt! delete: Löschen destroyed_msg: Emoji gelöscht! + disable: Deaktivieren + disabled_msg: Das Emoji wurde deaktiviert emoji: Emoji + enable: Aktivieren + enabled_msg: Das Emoji wurde aktiviert image_hint: PNG bis 50 kB new: title: Eigenes Emoji hinzufügen @@ -423,7 +439,7 @@ de: reblog: title: "%{name} hat deinen Beitrag geteilt" remote_follow: - acct: Dein Profilname@Domain, von dem aus du dieser Person folgen möchtest + acct: Profilname@Domain, von wo aus du dieser Person folgen möchtest missing_resource: Die erforderliche Weiterleitungs-URL für dein Konto konnte nicht gefunden werden proceed: Weiter prompt: 'Du wirst dieser Person folgen:' From bebaa6eced0af2665d105beb59bd21030425245a Mon Sep 17 00:00:00 2001 From: Nolan Lawson Date: Tue, 10 Oct 2017 09:44:51 -0700 Subject: [PATCH 02/23] Remove prop types from external libraries (#5304) --- config/webpack/loaders/babel.js | 6 +----- config/webpack/loaders/babel_external.js | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 5 deletions(-) create mode 100644 config/webpack/loaders/babel_external.js diff --git a/config/webpack/loaders/babel.js b/config/webpack/loaders/babel.js index 1416191c0..e17d2fa70 100644 --- a/config/webpack/loaders/babel.js +++ b/config/webpack/loaders/babel.js @@ -4,11 +4,7 @@ const env = process.env.NODE_ENV || 'development'; module.exports = { test: /\.js$/, - // include react-intl because transform-react-remove-prop-types needs to apply to it - exclude: { - test: /node_modules/, - exclude: /react-intl[\/\\](?!locale-data)/, - }, + exclude: /node_modules/, loader: 'babel-loader', options: { forceEnv: env, diff --git a/config/webpack/loaders/babel_external.js b/config/webpack/loaders/babel_external.js new file mode 100644 index 000000000..39e74ed90 --- /dev/null +++ b/config/webpack/loaders/babel_external.js @@ -0,0 +1,21 @@ +const { resolve } = require('path'); + +const env = process.env.NODE_ENV || 'development'; + +if (env === 'development') { + module.exports = {}; +} else { + // babel options to apply only to external libraries, e.g. remove-prop-types + module.exports = { + test: /\.js$/, + include: /node_modules/, + loader: 'babel-loader', + options: { + babelrc: false, + plugins: [ + 'transform-react-remove-prop-types', + ], + cacheDirectory: env === 'development' ? false : resolve(__dirname, '..', '..', '..', 'tmp', 'cache', 'babel-loader-external'), + }, + }; +} From 9815be2a441f8c8c4fb4adbc9cc1713a1cc4b898 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 10 Oct 2017 20:47:14 +0200 Subject: [PATCH 03/23] Fix #5293 - Pre-fill frequently used emojis to avoid bugs (#5305) --- .../emoji_picker_dropdown_container.js | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/app/javascript/mastodon/features/compose/containers/emoji_picker_dropdown_container.js b/app/javascript/mastodon/features/compose/containers/emoji_picker_dropdown_container.js index 8708f8cba..71944128c 100644 --- a/app/javascript/mastodon/features/compose/containers/emoji_picker_dropdown_container.js +++ b/app/javascript/mastodon/features/compose/containers/emoji_picker_dropdown_container.js @@ -8,15 +8,41 @@ import { useEmoji } from '../../../actions/emojis'; const perLine = 8; const lines = 2; +const DEFAULTS = [ + '+1', + 'grinning', + 'kissing_heart', + 'heart_eyes', + 'laughing', + 'stuck_out_tongue_winking_eye', + 'sweat_smile', + 'joy', + 'yum', + 'disappointed', + 'thinking_face', + 'weary', + 'sob', + 'sunglasses', + 'heart', + 'ok_hand', +]; + const getFrequentlyUsedEmojis = createSelector([ state => state.getIn(['settings', 'frequentlyUsedEmojis'], ImmutableMap()), -], emojiCounters => emojiCounters +], emojiCounters => { + let emojis = emojiCounters .keySeq() .sort((a, b) => emojiCounters.get(a) - emojiCounters.get(b)) .reverse() .slice(0, perLine * lines) - .toArray() -); + .toArray(); + + if (emojis.length < DEFAULTS.length) { + emojis = emojis.concat(DEFAULTS.slice(0, DEFAULTS.length - emojis.length)); + } + + return emojis; +}); const getCustomEmojis = createSelector([ state => state.get('custom_emojis'), From 7c33da45f08fec0d55a113ccb863be083d588ffc Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 10 Oct 2017 20:48:26 +0200 Subject: [PATCH 04/23] Bump version to 2.0.0rc2 --- lib/mastodon/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 7f54469e6..0f2fc5ac6 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -21,7 +21,7 @@ module Mastodon end def flags - 'rc1' + 'rc2' end def to_a From 552d22bec9602a64616538f7df0bdac13140c7f8 Mon Sep 17 00:00:00 2001 From: takayamaki Date: Wed, 11 Oct 2017 07:52:25 +0900 Subject: [PATCH 05/23] sign_in and sign_up views present og meta infos (#5308) --- app/controllers/auth/registrations_controller.rb | 5 +++++ app/controllers/auth/sessions_controller.rb | 5 +++++ app/views/about/more.html.haml | 2 +- app/views/about/show.html.haml | 2 +- app/views/auth/registrations/new.html.haml | 3 +++ app/views/auth/sessions/new.html.haml | 3 +++ app/views/{about => shared}/_og.html.haml | 0 7 files changed, 18 insertions(+), 2 deletions(-) rename app/views/{about => shared}/_og.html.haml (100%) diff --git a/app/controllers/auth/registrations_controller.rb b/app/controllers/auth/registrations_controller.rb index 60ace04d7..aac3c31ff 100644 --- a/app/controllers/auth/registrations_controller.rb +++ b/app/controllers/auth/registrations_controller.rb @@ -6,6 +6,7 @@ class Auth::RegistrationsController < Devise::RegistrationsController before_action :check_enabled_registrations, only: [:new, :create] before_action :configure_sign_up_params, only: [:create] before_action :set_sessions, only: [:edit, :update] + before_action :set_instance_presenter, only: [:new, :update] def destroy not_found @@ -39,6 +40,10 @@ class Auth::RegistrationsController < Devise::RegistrationsController private + def set_instance_presenter + @instance_presenter = InstancePresenter.new + end + def determine_layout %w(edit update).include?(action_name) ? 'admin' : 'auth' end diff --git a/app/controllers/auth/sessions_controller.rb b/app/controllers/auth/sessions_controller.rb index bc3bd2f4b..463a183e4 100644 --- a/app/controllers/auth/sessions_controller.rb +++ b/app/controllers/auth/sessions_controller.rb @@ -8,6 +8,7 @@ class Auth::SessionsController < Devise::SessionsController skip_before_action :require_no_authentication, only: [:create] skip_before_action :check_suspension, only: [:destroy] prepend_before_action :authenticate_with_two_factor, if: :two_factor_enabled?, only: [:create] + before_action :set_instance_presenter, only: [:new] def create super do |resource| @@ -84,6 +85,10 @@ class Auth::SessionsController < Devise::SessionsController private + def set_instance_presenter + @instance_presenter = InstancePresenter.new + end + def home_paths(resource) paths = [about_path] if single_user_mode? && resource.is_a?(User) diff --git a/app/views/about/more.html.haml b/app/views/about/more.html.haml index 1a4e74643..b012606ce 100644 --- a/app/views/about/more.html.haml +++ b/app/views/about/more.html.haml @@ -3,7 +3,7 @@ - content_for :header_tags do = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous' - = render partial: 'og' + = render partial: 'shared/og' .landing-page .header-wrapper.compact diff --git a/app/views/about/show.html.haml b/app/views/about/show.html.haml index ef27d07a1..f8f90ce24 100644 --- a/app/views/about/show.html.haml +++ b/app/views/about/show.html.haml @@ -4,7 +4,7 @@ - content_for :header_tags do %script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json) = javascript_pack_tag 'about', integrity: true, crossorigin: 'anonymous' - = render partial: 'og' + = render partial: 'shared/og' .landing-page .header-wrapper diff --git a/app/views/auth/registrations/new.html.haml b/app/views/auth/registrations/new.html.haml index 807020310..f71675df0 100644 --- a/app/views/auth/registrations/new.html.haml +++ b/app/views/auth/registrations/new.html.haml @@ -1,6 +1,9 @@ - content_for :page_title do = t('auth.register') +- content_for :header_tags do + = render partial: 'shared/og' + = simple_form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| = render 'shared/error_messages', object: resource diff --git a/app/views/auth/sessions/new.html.haml b/app/views/auth/sessions/new.html.haml index e589377bf..a52b0053b 100644 --- a/app/views/auth/sessions/new.html.haml +++ b/app/views/auth/sessions/new.html.haml @@ -1,6 +1,9 @@ - content_for :page_title do = t('auth.login') +- content_for :header_tags do + = render partial: 'shared/og' + = simple_form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| = f.input :email, autofocus: true, placeholder: t('simple_form.labels.defaults.email'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.email') } = f.input :password, placeholder: t('simple_form.labels.defaults.password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.password'), :autocomplete => 'off' } diff --git a/app/views/about/_og.html.haml b/app/views/shared/_og.html.haml similarity index 100% rename from app/views/about/_og.html.haml rename to app/views/shared/_og.html.haml From b3d7ad958fd9e26f64efb24b9ae0de8254fd1cd5 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 11 Oct 2017 01:01:17 +0200 Subject: [PATCH 06/23] Fix #5306: Stop hotkeys in input fields even when shift is pressed (#5309) AZERTY layouts require pressing shift to press a number at all, so it triggers a column switch even when simply typing numbers in textarea --- app/javascript/mastodon/features/ui/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/ui/index.js b/app/javascript/mastodon/features/ui/index.js index 21f2395ba..108b28422 100644 --- a/app/javascript/mastodon/features/ui/index.js +++ b/app/javascript/mastodon/features/ui/index.js @@ -186,7 +186,7 @@ export default class UI extends React.Component { componentDidMount () { this.hotkeys.__mousetrap__.stopCallback = (e, element) => { - return !(e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) && ['TEXTAREA', 'SELECT', 'INPUT'].includes(element.tagName); + return !(e.altKey || e.ctrlKey || e.metaKey) && ['TEXTAREA', 'SELECT', 'INPUT'].includes(element.tagName); }; } From 9b3d8ee3467e262e50a8e7414d5aadae8e345650 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 11 Oct 2017 01:33:29 +0200 Subject: [PATCH 07/23] Fix #5281 - Fix tooltip/custom emoji/search interaction (#5310) --- yarn.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yarn.lock b/yarn.lock index 13cfc879f..f32c9aceb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2192,8 +2192,8 @@ elliptic@^6.0.0: minimalistic-crypto-utils "^1.0.0" emoji-mart@Gargron/emoji-mart#build: - version "2.1.3" - resolved "https://codeload.github.com/Gargron/emoji-mart/tar.gz/74721c33954e239b0dba7e24bc7be0b4a650063a" + version "2.1.4" + resolved "https://codeload.github.com/Gargron/emoji-mart/tar.gz/a5e1afe5ebcf2841e611d20d261b029581cbe051" emoji-regex@^6.1.0: version "6.4.3" From b0407ece42dd3057716b58a0db930e79d992b0eb Mon Sep 17 00:00:00 2001 From: unarist Date: Wed, 11 Oct 2017 18:25:15 +0900 Subject: [PATCH 08/23] Fix an error when ancestors get loaded before the status itself (#5312) When ancestors get loaded, we scroll to the target status (i.e. skip ancestors). However, ancestors may get loaded before the status itself, then it causes TypeError because `this.node` is undefined yet. Since we don't show anything until the status gets loaded, we don't need to scroll to the target status in this time. If we get the status itslef later, it causes `componentDidUpdate` and scrolling correctly. --- app/javascript/mastodon/features/status/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/features/status/index.js b/app/javascript/mastodon/features/status/index.js index abcfee99e..eed8ea260 100644 --- a/app/javascript/mastodon/features/status/index.js +++ b/app/javascript/mastodon/features/status/index.js @@ -240,9 +240,9 @@ export default class Status extends ImmutablePureComponent { } componentDidUpdate () { - const { ancestorsIds } = this.props; + const { status, ancestorsIds } = this.props; - if (ancestorsIds && ancestorsIds.size > 0) { + if (status && ancestorsIds && ancestorsIds.size > 0) { const element = this.node.querySelectorAll('.focusable')[ancestorsIds.size]; element.scrollIntoView(); } From 38600b2792161547555c87586700a576631b7094 Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Wed, 11 Oct 2017 13:19:04 +0100 Subject: [PATCH 09/23] Update ar.json (#5316) Pushing new arabic translated strings for Mastodon web client. --- app/javascript/mastodon/locales/ar.json | 106 ++++++++++++------------ 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index e2df4ffc9..799819c7c 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -1,31 +1,31 @@ { "account.block": "حظر @{name}", - "account.block_domain": "Hide everything from {domain}", - "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", + "account.block_domain": "إخفاء كل شيئ قادم من إسم النطاق {domain}", + "account.disclaimer_full": "قد لا تعكس المعلومات أدناه الملف الشخصي الكامل للمستخدم.", "account.edit_profile": "تعديل الملف الشخصي", "account.follow": "تابِع", "account.followers": "المتابعون", "account.follows": "يتبع", "account.follows_you": "يتابعك", - "account.media": "Media", + "account.media": "وسائط", "account.mention": "أُذكُر @{name}", "account.mute": "أكتم @{name}", "account.posts": "المشاركات", "account.report": "أبلغ عن @{name}", "account.requested": "في انتظار الموافقة", - "account.share": "Share @{name}'s profile", + "account.share": "مشاركة @{name}'s profile", "account.unblock": "إلغاء الحظر عن @{name}", - "account.unblock_domain": "Unhide {domain}", + "account.unblock_domain": "فك حظر {domain}", "account.unfollow": "إلغاء المتابعة", "account.unmute": "إلغاء الكتم عن @{name}", - "account.view_full_profile": "View full profile", + "account.view_full_profile": "عرض الملف الشخصي كاملا", "boost_modal.combo": "يمكنك ضغط {combo} لتخطّي هذه في المرّة القادمة", - "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": "لقد وقع هناك خطأ أثناء عملية تحميل هذا العنصر.", + "bundle_column_error.retry": "إعادة المحاولة", + "bundle_column_error.title": "خطأ في الشبكة", + "bundle_modal_error.close": "أغلق", + "bundle_modal_error.message": "لقد وقع هناك خطأ أثناء عملية تحميل هذا العنصر.", + "bundle_modal_error.retry": "إعادة المحاولة", "column.blocks": "الحسابات المحجوبة", "column.community": "الخيط العام المحلي", "column.favourites": "المفضلة", @@ -33,15 +33,15 @@ "column.home": "الرئيسية", "column.mutes": "الحسابات المكتومة", "column.notifications": "الإشعارات", - "column.pins": "Pinned toot", + "column.pins": "التبويقات المثبتة", "column.public": "الخيط العام الموحد", "column_back_button.label": "العودة", - "column_header.hide_settings": "Hide settings", - "column_header.moveLeft_settings": "Move column to the left", - "column_header.moveRight_settings": "Move column to the right", - "column_header.pin": "Pin", - "column_header.show_settings": "Show settings", - "column_header.unpin": "Unpin", + "column_header.hide_settings": "إخفاء الإعدادات", + "column_header.moveLeft_settings": "نقل القائمة إلى اليسار", + "column_header.moveRight_settings": "نقل القائمة إلى اليمين", + "column_header.pin": "تدبيس", + "column_header.show_settings": "عرض الإعدادات", + "column_header.unpin": "فك التدبيس", "column_subheading.navigation": "التصفح", "column_subheading.settings": "الإعدادات", "compose_form.lock_disclaimer": "حسابك ليس {locked}. يمكن لأي شخص متابعتك و عرض المنشورات.", @@ -57,16 +57,16 @@ "confirmations.block.message": "هل أنت متأكد أنك تريد حجب {name} ؟", "confirmations.delete.confirm": "حذف", "confirmations.delete.message": "هل أنت متأكد أنك تريد حذف هذا المنشور ؟", - "confirmations.domain_block.confirm": "Hide entire domain", + "confirmations.domain_block.confirm": "إخفاء إسم النطاق كاملا", "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.", "confirmations.mute.confirm": "أكتم", "confirmations.mute.message": "هل أنت متأكد أنك تريد كتم {name} ؟", - "confirmations.unfollow.confirm": "Unfollow", - "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", - "embed.instructions": "Embed this status on your website by copying the code below.", - "embed.preview": "Here is what it will look like:", + "confirmations.unfollow.confirm": "إلغاء المتابعة", + "confirmations.unfollow.message": "متأكد من أنك تريد إلغاء متابعة {name} ؟", + "embed.instructions": "يمكنكم إدماج هذه الحالة على موقعكم الإلكتروني عن طريق نسخ الشفرة أدناه.", + "embed.preview": "هكذا ما سوف يبدو عليه :", "emoji_button.activity": "الأنشطة", - "emoji_button.custom": "Custom", + "emoji_button.custom": "مخصص", "emoji_button.flags": "الأعلام", "emoji_button.food": "الطعام والشراب", "emoji_button.label": "أدرج إيموجي", @@ -74,9 +74,9 @@ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", "emoji_button.objects": "أشياء", "emoji_button.people": "الناس", - "emoji_button.recent": "Frequently used", + "emoji_button.recent": "الشائعة الإستخدام", "emoji_button.search": "ابحث...", - "emoji_button.search_results": "Search results", + "emoji_button.search_results": "نتائج البحث", "emoji_button.symbols": "رموز", "emoji_button.travel": "أماكن و أسفار", "empty_column.community": "الخط الزمني المحلي فارغ. اكتب شيئا ما للعامة كبداية.", @@ -100,8 +100,8 @@ "home.column_settings.show_replies": "عرض الردود", "home.settings": "إعدادات العمود", "lightbox.close": "إغلاق", - "lightbox.next": "Next", - "lightbox.previous": "Previous", + "lightbox.next": "التالي", + "lightbox.previous": "العودة", "loading_indicator.label": "تحميل ...", "media_gallery.toggle_visible": "عرض / إخفاء", "missing_indicator.label": "تعذر العثور عليه", @@ -113,7 +113,7 @@ "navigation_bar.info": "معلومات إضافية", "navigation_bar.logout": "خروج", "navigation_bar.mutes": "الحسابات المكتومة", - "navigation_bar.pins": "Pinned toots", + "navigation_bar.pins": "التبويقات المثبتة", "navigation_bar.preferences": "التفضيلات", "navigation_bar.public_timeline": "الخيط العام الموحد", "notification.favourite": "{name} أعجب بمنشورك", @@ -126,8 +126,8 @@ "notifications.column_settings.favourite": "المُفَضَّلة :", "notifications.column_settings.follow": "متابعُون جُدُد :", "notifications.column_settings.mention": "الإشارات :", - "notifications.column_settings.push": "Push notifications", - "notifications.column_settings.push_meta": "This device", + "notifications.column_settings.push": "الإخطارات المدفوعة", + "notifications.column_settings.push_meta": "هذا الجهاز", "notifications.column_settings.reblog": "الترقيّات:", "notifications.column_settings.show": "إعرِضها في عمود", "notifications.column_settings.sound": "أصدر صوتا", @@ -165,23 +165,23 @@ "report.submit": "إرسال", "report.target": "إبلاغ", "search.placeholder": "ابحث", - "search_popout.search_format": "Advanced search format", - "search_popout.tips.hashtag": "hashtag", - "search_popout.tips.status": "status", + "search_popout.search_format": "نمط البحث المتقدم", + "search_popout.tips.hashtag": "وسم", + "search_popout.tips.status": "حالة", "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", - "search_popout.tips.user": "user", + "search_popout.tips.user": "مستخدِم", "search_results.total": "{count, number} {count, plural, one {result} other {results}}", - "standalone.public_title": "A look inside...", + "standalone.public_title": "نظرة على ...", "status.cannot_reblog": "تعذرت ترقية هذا المنشور", "status.delete": "إحذف", - "status.embed": "Embed", + "status.embed": "إدماج", "status.favourite": "أضف إلى المفضلة", "status.load_more": "حمّل المزيد", "status.media_hidden": "الصورة مستترة", "status.mention": "أذكُر @{name}", - "status.mute_conversation": "Mute conversation", + "status.mute_conversation": "كتم المحادثة", "status.open": "وسع هذه المشاركة", - "status.pin": "Pin on profile", + "status.pin": "تدبيس على الملف الشخصي", "status.reblog": "رَقِّي", "status.reblogged_by": "{name} رقى", "status.reply": "ردّ", @@ -189,11 +189,11 @@ "status.report": "إبلِغ عن @{name}", "status.sensitive_toggle": "اضغط للعرض", "status.sensitive_warning": "محتوى حساس", - "status.share": "Share", + "status.share": "مشاركة", "status.show_less": "إعرض أقلّ", "status.show_more": "أظهر المزيد", - "status.unmute_conversation": "Unmute conversation", - "status.unpin": "Unpin from profile", + "status.unmute_conversation": "فك الكتم عن المحادثة", + "status.unpin": "فك التدبيس من الملف الشخصي", "tabs_bar.compose": "تحرير", "tabs_bar.federated_timeline": "الموحَّد", "tabs_bar.home": "الرئيسية", @@ -201,16 +201,16 @@ "tabs_bar.notifications": "الإخطارات", "upload_area.title": "إسحب ثم أفلت للرفع", "upload_button.label": "إضافة وسائط", - "upload_form.description": "Describe for the visually impaired", + "upload_form.description": "وصف للمعاقين بصريا", "upload_form.undo": "إلغاء", "upload_progress.label": "يرفع...", - "video.close": "Close video", - "video.exit_fullscreen": "Exit full screen", - "video.expand": "Expand video", - "video.fullscreen": "Full screen", - "video.hide": "Hide video", - "video.mute": "Mute sound", - "video.pause": "Pause", - "video.play": "Play", - "video.unmute": "Unmute sound" + "video.close": "إغلاق الفيديو", + "video.exit_fullscreen": "الخروج من وضع الشاشة المليئة", + "video.expand": "توسيع الفيديو", + "video.fullscreen": "ملء الشاشة", + "video.hide": "إخفاء الفيديو", + "video.mute": "كتم الصوت", + "video.pause": "إيقاف مؤقت", + "video.play": "تشغيل", + "video.unmute": "تشغيل الصوت" } From fe6941e28e3324650d0df4ad09f821bc430870ed Mon Sep 17 00:00:00 2001 From: JohnD28 <32609514+JohnD28@users.noreply.github.com> Date: Wed, 11 Oct 2017 15:04:36 +0200 Subject: [PATCH 10/23] Update doorkeeper.fr.yml (#5317) --- config/locales/doorkeeper.fr.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/locales/doorkeeper.fr.yml b/config/locales/doorkeeper.fr.yml index 3398b248d..88a8ec12f 100644 --- a/config/locales/doorkeeper.fr.yml +++ b/config/locales/doorkeeper.fr.yml @@ -59,7 +59,7 @@ fr: prompt: Autoriser %{client_name} à utiliser votre compte ? title: Autorisation requise show: - title: Copy this authorization code and paste it to the application. + title: Copiez ce code d'autorisation et collez-le dans l'application. authorized_applications: buttons: revoke: Annuler @@ -112,4 +112,4 @@ fr: scopes: follow: s’abonner, se désabonner, bloquer et débloquer des comptes read: lire les données de votre compte - write: poster en tant que vous + write: poster en votre nom From 19d3317a69bebf5239e7a4ef157be5f19b2a351b Mon Sep 17 00:00:00 2001 From: JohnD28 <32609514+JohnD28@users.noreply.github.com> Date: Wed, 11 Oct 2017 15:07:09 +0200 Subject: [PATCH 11/23] Update french translation : mastodon/locales/fr.json (#5318) * Update fr.json * Update fr.json * Update fr.json --- app/javascript/mastodon/locales/fr.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 0dda5af9c..350d92c44 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -66,7 +66,7 @@ "embed.instructions": "Intégrez ce statut à votre site en copiant ce code ci-dessous.", "embed.preview": "Il apparaîtra comme cela : ", "emoji_button.activity": "Activités", - "emoji_button.custom": "Custom", + "emoji_button.custom": "Personnalisés", "emoji_button.flags": "Drapeaux", "emoji_button.food": "Boire et manger", "emoji_button.label": "Insérer un emoji", @@ -74,9 +74,9 @@ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", "emoji_button.objects": "Objets", "emoji_button.people": "Personnages", - "emoji_button.recent": "Frequently used", + "emoji_button.recent": "Fréquemment utilisés", "emoji_button.search": "Recherche…", - "emoji_button.search_results": "Search results", + "emoji_button.search_results": "Résultats de la recherche", "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 !", @@ -165,11 +165,11 @@ "report.submit": "Envoyer", "report.target": "Signalement", "search.placeholder": "Rechercher", - "search_popout.search_format": "Advanced search format", + "search_popout.search_format": "Recherche avancée", "search_popout.tips.hashtag": "hashtag", - "search_popout.tips.status": "status", - "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", - "search_popout.tips.user": "user", + "search_popout.tips.status": "statuts", + "search_popout.tips.text": "Un texte simple renvoie les noms affichés, les noms d'utilisateur et les hashtags correspondants", + "search_popout.tips.user": "utilisateur", "search_results.total": "{count, number} {count, plural, one {résultat} other {résultats}}", "standalone.public_title": "Jeter un coup d’œil…", "status.cannot_reblog": "Cette publication ne peut être boostée", @@ -201,7 +201,7 @@ "tabs_bar.notifications": "Notifications", "upload_area.title": "Glissez et déposez pour envoyer", "upload_button.label": "Joindre un média", - "upload_form.description": "Describe for the visually impaired", + "upload_form.description": "Décrire pour les malvoyants", "upload_form.undo": "Annuler", "upload_progress.label": "Envoi en cours…", "video.close": "Fermer la vidéo", From 476e79b8e340c9103352a0799e102e4aca1a5593 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 11 Oct 2017 16:31:07 +0200 Subject: [PATCH 12/23] Fully disable hotkeys when input element is focused (#5324) Because alt+n is a way to enter some kinda letter on some keyboard --- app/javascript/mastodon/features/ui/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/ui/index.js b/app/javascript/mastodon/features/ui/index.js index 108b28422..70e451373 100644 --- a/app/javascript/mastodon/features/ui/index.js +++ b/app/javascript/mastodon/features/ui/index.js @@ -186,7 +186,7 @@ export default class UI extends React.Component { componentDidMount () { this.hotkeys.__mousetrap__.stopCallback = (e, element) => { - return !(e.altKey || e.ctrlKey || e.metaKey) && ['TEXTAREA', 'SELECT', 'INPUT'].includes(element.tagName); + return ['TEXTAREA', 'SELECT', 'INPUT'].includes(element.tagName); }; } From b17e571bc291a1f989004bf9adf36e2d1b0c60db Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 11 Oct 2017 19:11:15 +0200 Subject: [PATCH 13/23] Add padding to Android icon, change Apple and MS icons (#5321) --- public/android-chrome-192x192.png | Bin 10152 -> 10339 bytes public/apple-touch-icon.png | Bin 6977 -> 6129 bytes public/mstile-150x150.png | Bin 5796 -> 5621 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png index 2d2d25e37f6e27dfffc5847cb046f4434b09b188..923d0d7decf5d8c6fea297de728c83350408da6e 100644 GIT binary patch literal 10339 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 O0V)a_^0l&-;r|DI`Mk~m literal 10152 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 diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png index 829263f83964188f93a80822db90a17e82693bad..70ec8dbf9b785d944cc4cbcc9af0b5d60ebdeb20 100644 GIT binary patch literal 6129 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 delta 6956 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 G67fIUxZf!N delta 5765 zcmV;07JBLRE2J%uQhx^*00tkmaC^c402VPxL_t(|+U=cra9wwG$3N%Z`<|W_+mgK7 zieqQTdJ>WYA%v2Yr9+{Gp|mW8VMz;2hn)f9m%y-;62CwQln$W;CNu3&NGX(*C4>^z zgaioK&(gC=oW${NOY$O1deU3&y{CWNYsWN_e5H4v*57C5j(;@LUC-}(&+q)sZ@I!e zr|VOB!NwA>R1p;{QAvtu(nk`4CQyMXk+!GGPEN&7}v6L4kr4|N`1>p6l+ zgIo=|9#{b^2T~Y{p{E-FMnLaZWV^sV;1F;smq`~FwXoVh`H1B>UWbTw1AhW^0ULp) z&9vAUjN+#tTA5PG&8@Bk`3ikIJcV`p)}3#&W3%kojnR$1f0i$(MrkiP<5Ve}C@ zLm)o@|9=5N?(<=_`OptP zZt1)hR@Z0p4S2j3cs zp90xjCjH>N5!MwS&r2%BTY!&+Ej-JV<(xx-!+&7i>`3yC-)+6bo72MTzNNQORXz#4 z-;~{ak(l0&lF8lFF+3-QwdI!H)e4_cl{cEwnr~sgd>g#??8tN;nNz~*`t78>zSX;6^X&>v~!ZdV#$7*Q=at_A(dmhA5485h>Gvya)pHqh6Eb+ln& z#aw@(=xtYKdlNG%tO}*KgS@j=X$!+FHxdCwulJDm%vg-omCe5p_!_X*l)-|hKMdx7 zR8x=D`RU#3fSZ6d#^#HHmB2?jv-yoR6Mt6cwtUj^{p$(FPMPX&@l=afS#W(eicq73C1HiX=H7Vv7|GGpgO$;H5{ugK=@cs*97a24=oQw1(+ z-jafAViVT0Kf5CdTyFyQMNcd6)~;Lg4Y3HTQb}9`yxrK<0P-eWxw>j$g)M>C8-Ifu z0u<0UcV~AsRO_)e0xvZNHJrnX72Q;ouq4P?tunSWoWn|jad*=b)|IzDl2mvdK_0_k zI70&AwOu#=AvG;w`L5dzY%+ECjqwbV(0{G4A+oTp%;p7XV}gSWhLCjv8@g`JOC(`=iVdU* zmP#}jCc**Qv2dbQg@O%SV(ey!z-0<{)EFxTTyAV;h`<#B^-+b@gc)~bi0H9Gy+jd~ z)?+407^2Y{*<*>AwX6)$@s;J#JeG>71`W{>*&In&YT_%yRCI-28nr4k9e>Y;$SATY zn#WSJ0IgvvE=yNOY!$N7Sj#X4mlau9t;Sl0=rNYGMirL%W{qJgE~_r0u*3+D<4s*}FHcTB@PXi`Srd6I}R2Y9P>!nwY8Mz2R3SJNpjVNjdZVXvMRp!v2$Ga)%21c7K6GgJl40tG4%6@sySZo9?zop1Y}$^~;i6w4#osbvB+V#|th` z953;Be~Ab84YQ}ONXb(Ymekr!C{a9TS2kY&8fqdcfzh(EdWpl^p0|n@Ub=)eOC799 zUaga(F1wG8ar*-U?0+~oN-9yC0(5;vM0ibi3$NSK%GzZ~8j}-81% z+CGS)I5iSi(N(T&Yv3QAzlzOkQnWTW6YlFP92=_e(>+6c+_<^mT}7~+h|BkE&RX!-P4noQUhA9=|-E?HT}SlO>SXcmED#pi{WF69l+T3*$;-tg?@ zyx@|h6kV-4Xcl0!;&bWB6d!)cIucbV_Tm+FeBcGEX@5*w_%+a$BGH6Zi$;#;!*e$_ z@w|(hsy`uaT0Ibti`DLs@R26vE0{^I-8fLn`_dl7G*4| zuwsoAd{x#iOS0vH_!^o^>ukE)8qVf$rW^AuZ*sWy;-#?~`npS&(%Rrqo~C!uFmCH= zYhX!Te4QXyZfIc5(nRdlp&}zS70_h)m(I2IG=C=IGm>Kq8(Zsw*5Nb^B|xd7T(&Yr zYh%1USSuQBE?=3VRMu&^epN^%EH<{*;l$`+8k061>l&zde$2|!$ij;4X{<1gS>KY3 z)kp#~*W1)N(|rsTl ztbcec6(MCytbvZL6#!J5rq|> zqJ1D?Sv)aNq7q|*&R1oiP@(8eKR`}8!hfN`3WajKF~>;B=g_GN348hti;}AxFI4bj zjI=AhvUi|NLM&pAvQ9=6md1MBge~+Q9b>Q)P*oAs%L@JL^gql2Yb zt$cK-#3OyhY4>T01j*6I2TE1NY5$+WQIFoEW3i_kB)YKT?NSnfp`ypn9vzPDoPYfz zF26lcs4C%Si%{{D@AM85S3}A3mGATno=tF0w_)OW%ES9d7#MbAv)NDf3^QExVjoJQ zBFASXcs~;}+_QU-V?&i#&iDQNAiYOMNhPQM2)@F~Mu+eA4)WlWBeC4q1A9mKUhg0) zo1CihMX97k?~x++>>7;8i&nUI_kUp3JpvO{aFIQh8~3#xOXxW~#&>&9Rei4C9Vl?; zLj$B7E0(@OOW=#Y?Bn=Ib)p{_arx5y{a9A@QK}HMEWi5T0KY#_sM==V?L9@$krv!HRAH6lzPJc@D0e<|oNwwn|)*!1GS zp`yoaKRd?mz9LRc1M3pDFzPBFyXP>wjuxkVp6~2D#ht%Cj#sNuxWehE!m8BZ@+2)` zxa4!oPmb}W2l}Uc{Ldd7;)8b|WZ#K0$(RFB3%Dmg$VY#0n1K;DvM^Mkf7sxzBxhCu}C_CjPp7b%05R1%iOj7B%l9zAIF9&B%B&_qzVYaWBo;b zv%kQqB?%gn775!LcgS(s^*K>+`R)EuK6=k#ezR|cgk{ylBiNR3a(~q2!6yq;JY_|b zL&CPkeYt#9P8Wj~W%jhoWQ=3%J#9!gP*@8uo@I7;1t{=X!Gk9Zx%@j+7q%C2$R(~+5%JrYJnV$8+HRm93 zbuN=W@<%n(OvYH_x>0%RZFI}yJ8Mg3ezx41Lh&`of|thWIHy1`v%VEPqoK8m2%$>PPfgqJzd>h6uR8@m!`eny@VNgt3_+0%I_K24R92O9qV1 z43Xk1)!``!%Xln9B#t057+F}BTE~se3=udC)~U$C@+}=RHZzKl5sMr z2E)@sah)(0pKNHd5tm`oz};8bHC16%7-z1S!Eg>I6n~wvu*!gG85$#r zk7bw!F35d;St?WVSYkYuVRA-5|F`F+%{nDvDdGVp`)-(sU!wF(w!=i3cVCUiGE7(v z^3~jp=}8yja3-h)jm}b?~t+WqGbr=%ehSZ4bwSzLXY+E zP0uJ{hA1yq9tYkxT~VDc#zK{S5`1-_(b#&?@P9DK2XdMA`>Q$0q{0%>Uf{S9)}mkp z_$HG0U~cQ>RWB4fsjz&D-ImXB;6h{f1|I*S5u7;60ybi*uh z2>84puZ&Yv=M~n&A56O-zhZ_KVl&Jb`+z%vw>m;*N2WdY*1vQ9T{I7Ie|p6*TXB>k zUw;wwZeT|)lOC?sg(3)xLj+m)HKttVEd`LTE8MQiqbd}8GU=LzH|G_W4+kxH#0YC% zp<(!v2e}L7JJ{^qc|-e*)ja1FmhDuA)lEDM{OKGrS^;P>`gt0oz+)(R5$^DOe$#VP zducXqB+}x#UD^E0f$z>4VTpbS6$LH{w|@(O6+jCUd=z1UGDa{Ua}SV1=t2E^bD7Rr zUn0SYD8I*04geeGfH4J?2XmS9LtQubCa|OxWGQG1&=!j987Q49JVT&);pj+Cf&Kw> z2S_h)0NAhS@tv8DIW^)pny@PNUL5Z};P2*$ftLd0ZtAE2ec?vew*12c>-^i{vwzuw z)`4{U$~9u~EL75<&FAhD{tjj&vB*EuhRuFVuH4%JAsQ#QS z8H(?W0Idmxs9|cxJLl&ap^Sww(0?#N_sIyzsG@zM90b`fmcMt$){X-#0Guf(@E5@E zfh*_0`%rb2y#2<`!vwtwPoq8iXsXWgQoirkgQQSWiZ&uN2qZxgpowwBNG5EdP^Jo&E7+Vdb_ya}<%U5e!+LP1b|H zG=1wI5~dgzg2w`KTid@6{C|3u?>z~;#Bn_{Y)NI3wV8JHeY9oa)Agd zmr4H+xObNCKLNZ?=FX5FLku1Z;KRVN*-kwO+|iZI8*wcZVdXOE$AAybf#=u&e94Gw z;dm^7?*reO1J7~=@b#{2{%u{^e99E<>>_cTq$``h8n}zOF|oA*e1AjGn^k3R?#A@I zn!47R?GX`6c5Y4ki(XivxZVqVin%i#e>ckASbPiRfRCK+$+XYO6$-nuyX!$4K$j8> zwN9v5zu38T^SoX7&WTT=%fEo0SOa9{$g^!m*o^WTV26c1)RoQe2A<4i(tBp}#yW24 zZLn1?1l9qo!M_~1G=CJ;2H;^)|M$$}6%{4kH!r^g_#E)}1YJHdN1js&MsOB@CxBf9 zgZ%aYyGhuO=05O@(VB?pBl(2AL^r9*DC z3hBP3cOA&Ts`BzV`pn8xLx@KR2J@XJ7&ctusWJ2e;s3@^Mt{_zATWZSU2fpai<3}T zD!~k)W|S6$R)UEgtAGZA;m*zBW`)PeB=*mtyefBN`bkq2hV0ndaisIp`FB~01H5#O zzDyDp@R`CMPkes3DT0cg738`50Ej$wJ_|Yfdo?d@6GC#aryHI|&kgAVz?P)d?j!bkjJbPI9a*W8(~dFWS`tr$z{^F0e^1>*#`6yOb#_Xg~L2w%w)C} z!XTGPZ^!fh33vl=Bk*H_sp+Ow2uC#d+Lj3rtD$RKuPwH{R8?Pu>dSyv5@fO$8wY`} z`6}Nkr-pNny#H$72rDj;W%Cx$4e}h&>j=iRZwS3>V!pSQ&cP33%+mxDQ+@>eJeNuD zHci^vi+`-1pu_e8pgjAFg6+JnR=Pfu7hINw z;#v`Uw~e4}AZ-LATGt`0sr9^Vfs(>rf<;pffPNeWeIodsJ|B+tWYVV>ORy*l>0!FJ zE{-b#x&#;kMi53&84|Ql zk)w!z7_7bO`%j3-iBMPtg;9YDh_B%7%(O4ck1zZm=)n)fEmcfs00000NkvXXu0mjf Dn Date: Wed, 11 Oct 2017 10:20:55 -0700 Subject: [PATCH 14/23] Only preload JS in /web pages (#5325) --- app/views/home/index.html.haml | 6 ++++++ app/views/layouts/application.html.haml | 8 -------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/app/views/home/index.html.haml b/app/views/home/index.html.haml index 6c93281db..659295ebf 100644 --- a/app/views/home/index.html.haml +++ b/app/views/home/index.html.haml @@ -1,4 +1,10 @@ - content_for :header_tags do + %link{ href: asset_pack_path('features/getting_started.js'), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/ + %link{ href: asset_pack_path('features/compose.js'), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/ + %link{ href: asset_pack_path('features/home_timeline.js'), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/ + %link{ href: asset_pack_path('features/notifications.js'), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/ + %link{ href: asset_pack_path('features/community_timeline.js'), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/ + %link{ href: asset_pack_path('features/public_timeline.js'), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/ %meta{name: 'applicationServerKey', content: Rails.configuration.x.vapid_public_key} %script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json) diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 8c6fc27df..ee995c987 100755 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -21,14 +21,6 @@ = stylesheet_pack_tag 'common', media: 'all' = stylesheet_pack_tag current_theme, media: 'all' = javascript_pack_tag 'common', integrity: true, crossorigin: 'anonymous' - - %link{ href: asset_pack_path('features/getting_started.js'), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/ - %link{ href: asset_pack_path('features/compose.js'), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/ - %link{ href: asset_pack_path('features/home_timeline.js'), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/ - %link{ href: asset_pack_path('features/notifications.js'), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/ - %link{ href: asset_pack_path('features/community_timeline.js'), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/ - %link{ href: asset_pack_path('features/public_timeline.js'), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/ - = javascript_pack_tag "locale_#{I18n.locale}", integrity: true, crossorigin: 'anonymous' = csrf_meta_tags From 1823cf435a30af3d54e8b2a072df6f8d6fa59c6d Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 11 Oct 2017 19:21:44 +0200 Subject: [PATCH 15/23] In thread view, only scroll first update, scroll to replied-to post (#5322) --- app/javascript/mastodon/features/status/index.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/features/status/index.js b/app/javascript/mastodon/features/status/index.js index eed8ea260..7ad3a7644 100644 --- a/app/javascript/mastodon/features/status/index.js +++ b/app/javascript/mastodon/features/status/index.js @@ -78,6 +78,7 @@ export default class Status extends ImmutablePureComponent { componentWillReceiveProps (nextProps) { if (nextProps.params.statusId !== this.props.params.statusId && nextProps.params.statusId) { + this._scrolledIntoView = false; this.props.dispatch(fetchStatus(nextProps.params.statusId)); } } @@ -240,11 +241,17 @@ export default class Status extends ImmutablePureComponent { } componentDidUpdate () { + if (this._scrolledIntoView) { + return; + } + const { status, ancestorsIds } = this.props; if (status && ancestorsIds && ancestorsIds.size > 0) { - const element = this.node.querySelectorAll('.focusable')[ancestorsIds.size]; - element.scrollIntoView(); + const element = this.node.querySelectorAll('.focusable')[ancestorsIds.size - 1]; + + element.scrollIntoView(true); + this._scrolledIntoView = true; } } From 27101f1bebf8beb96a027dba6852529e3f1b66ab Mon Sep 17 00:00:00 2001 From: takayamaki Date: Thu, 12 Oct 2017 02:22:21 +0900 Subject: [PATCH 16/23] fix presented og:url is incorrect (#5320) --- app/views/shared/_og.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/shared/_og.html.haml b/app/views/shared/_og.html.haml index dbd476915..a6d805bea 100644 --- a/app/views/shared/_og.html.haml +++ b/app/views/shared/_og.html.haml @@ -1,6 +1,6 @@ - thumbnail = @instance_presenter.thumbnail = opengraph 'og:site_name', t('about.hosted_on', domain: site_hostname) -= opengraph 'og:url', about_url += opengraph 'og:url', url_for(only_path: false) = opengraph 'og:type', 'website' = opengraph 'og:title', @instance_presenter.site_title = opengraph 'og:description', strip_tags(@instance_presenter.site_description.presence || t('about.about_mastodon_html')) From 07ea625cb228b36b8d87de32141024ec98d875da Mon Sep 17 00:00:00 2001 From: Lynx Kotoura Date: Thu, 12 Oct 2017 04:18:46 +0900 Subject: [PATCH 17/23] Fix styles of error pages (#5335) Signed-off-by: Lynx Kotoura Signed-off-by: Lynx Kotoura --- app/javascript/styles/basics.scss | 36 +++++++++++++++++++------------ 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/app/javascript/styles/basics.scss b/app/javascript/styles/basics.scss index b829191ad..43c32c8bc 100644 --- a/app/javascript/styles/basics.scss +++ b/app/javascript/styles/basics.scss @@ -29,8 +29,7 @@ body { font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", mastodon-font-sans-serif, sans-serif; } - &.app-body, - &.error { + &.app-body { position: fixed; width: 100%; height: 100%; @@ -70,25 +69,34 @@ body { } &.error { + position: absolute; text-align: center; color: $ui-primary-color; - padding: 20px; + background: $ui-base-color; + width: 100%; + height: 100%; + padding: 0; display: flex; justify-content: center; align-items: center; - .dialog img { - display: block; - max-width: 470px; - width: 100%; - height: auto; - margin-top: -120px; - } + .dialog { + vertical-align: middle; + margin: 20px; - .dialog h1 { - font-size: 20px; - line-height: 28px; - font-weight: 400; + img { + display: block; + max-width: 470px; + width: 100%; + height: auto; + margin-top: -120px; + } + + h1 { + font-size: 20px; + line-height: 28px; + font-weight: 400; + } } } } From e5d8166a12bc5db2f15afa8f2573be6892481e01 Mon Sep 17 00:00:00 2001 From: aschmitz Date: Wed, 11 Oct 2017 14:20:39 -0500 Subject: [PATCH 18/23] Fix #5329 (#5332) This fixes #5329, which occurred when using MigrationHelpers on a table that Postgres estimated to be non-empty when it was actually empty. --- lib/mastodon/migration_helpers.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/mastodon/migration_helpers.rb b/lib/mastodon/migration_helpers.rb index ed716501e..80a8f440c 100644 --- a/lib/mastodon/migration_helpers.rb +++ b/lib/mastodon/migration_helpers.rb @@ -335,7 +335,10 @@ module Mastodon start_arel = table.project(table[:id]).order(table[:id].asc).take(1) start_arel = yield table, start_arel if block_given? - start_id = exec_query(start_arel.to_sql).to_hash.first['id'].to_i + first_row = exec_query(start_arel.to_sql).to_hash.first + # In case there are no rows but we didn't catch it in the estimated size: + return unless first_row + start_id = first_row['id'].to_i say "Migrating #{table_name}.#{column} (~#{total.to_i} rows)" From 0352c40e9950c83a5416ed505d43fe41e417254c Mon Sep 17 00:00:00 2001 From: Alda Marteau-Hardi Date: Wed, 11 Oct 2017 21:20:56 +0200 Subject: [PATCH 19/23] Use gender neutral language as in the rest of the french translation (#5331) --- app/javascript/mastodon/locales/fr.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 350d92c44..48f174c4c 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -168,8 +168,8 @@ "search_popout.search_format": "Recherche avancée", "search_popout.tips.hashtag": "hashtag", "search_popout.tips.status": "statuts", - "search_popout.tips.text": "Un texte simple renvoie les noms affichés, les noms d'utilisateur et les hashtags correspondants", - "search_popout.tips.user": "utilisateur", + "search_popout.tips.text": "Un texte simple renvoie les noms affichés, les noms d'utilisateur⋅ice et les hashtags correspondants", + "search_popout.tips.user": "utilisateur⋅ice", "search_results.total": "{count, number} {count, plural, one {résultat} other {résultats}}", "standalone.public_title": "Jeter un coup d’œil…", "status.cannot_reblog": "Cette publication ne peut être boostée", From fbc6375fde90cddac47ee28982f49d471ce6e18f Mon Sep 17 00:00:00 2001 From: Alda Marteau-Hardi Date: Wed, 11 Oct 2017 21:21:13 +0200 Subject: [PATCH 20/23] Add myself as codeowner of the translation files. (#5333) --- CODEOWNERS | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CODEOWNERS b/CODEOWNERS index 42fc73ded..b7291a40b 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -8,8 +8,17 @@ # /config/locales/*.fr.yml @żelipapą # /config/locales/fr.yml @żelipapą +# Polish /app/javascript/mastodon/locales/pl.json @m4sk1n /app/views/user_mailer/*.pl.html.erb @m4sk1n /app/views/user_mailer/*.pl.text.erb @m4sk1n /config/locales/*.pl.yml @m4sk1n /config/locales/pl.yml @m4sk1n + +# French +/app/javascript/mastodon/locales/fr.json @aldarone +/app/javascript/mastodon/locales/whitelist_fr.json @aldarone +/app/views/user_mailer/*.fr.html.erb @aldarone +/app/views/user_mailer/*.fr.text.erb @aldarone +/config/locales/*.fr.yml @aldarone +/config/locales/fr.yml @aldarone From 6bc07d3de37f8bcfdd3324eb5aca05bee0e8d19c Mon Sep 17 00:00:00 2001 From: Jeroen Date: Wed, 11 Oct 2017 21:21:22 +0200 Subject: [PATCH 21/23] Updating Dutch strings for 2.0 (#5334) --- app/javascript/mastodon/locales/nl.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index bad2d78c5..a3e237f6b 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -66,17 +66,17 @@ "embed.instructions": "Embed deze toot op jouw website, door de onderstaande code te kopiëren.", "embed.preview": "Zo komt het eruit te zien:", "emoji_button.activity": "Activiteiten", - "emoji_button.custom": "Custom", + "emoji_button.custom": "Lokale emoji’s", "emoji_button.flags": "Vlaggen", "emoji_button.food": "Eten en drinken", "emoji_button.label": "Emoji toevoegen", "emoji_button.nature": "Natuur", - "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "Geen emoji’s!! (╯°□°)╯︵ ┻━┻", "emoji_button.objects": "Voorwerpen", "emoji_button.people": "Mensen", - "emoji_button.recent": "Frequently used", + "emoji_button.recent": "Vaak gebruikt", "emoji_button.search": "Zoeken...", - "emoji_button.search_results": "Search results", + "emoji_button.search_results": "Zoekresultaten", "emoji_button.symbols": "Symbolen", "emoji_button.travel": "Reizen en plekken", "empty_column.community": "De lokale tijdlijn is nog leeg. Toot iets in het openbaar om de bal aan het rollen te krijgen!", @@ -165,11 +165,11 @@ "report.submit": "Verzenden", "report.target": "Rapporteren van", "search.placeholder": "Zoeken", - "search_popout.search_format": "Advanced search format", + "search_popout.search_format": "Geavanceerd zoeken", "search_popout.tips.hashtag": "hashtag", - "search_popout.tips.status": "status", - "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", - "search_popout.tips.user": "user", + "search_popout.tips.status": "toot", + "search_popout.tips.text": "Gebruik gewone tekst om te zoeken op weergavenamen, gebruikersnamen en hashtags.", + "search_popout.tips.user": "gebruiker", "search_results.total": "{count, number} {count, plural, one {resultaat} other {resultaten}}", "standalone.public_title": "Een kijkje binnenin...", "status.cannot_reblog": "Deze toot kan niet geboost worden", @@ -201,11 +201,11 @@ "tabs_bar.notifications": "Meldingen", "upload_area.title": "Hierin slepen om te uploaden", "upload_button.label": "Media toevoegen", - "upload_form.description": "Describe for the visually impaired", + "upload_form.description": "Omschrijf dit voor mensen met een visuele beperking", "upload_form.undo": "Ongedaan maken", "upload_progress.label": "Uploaden...", - "video.close": "Close video", - "video.exit_fullscreen": "Exit full screen", + "video.close": "Video sluiten", + "video.exit_fullscreen": "Volledig scherm sluiten", "video.expand": "Video groter maken", "video.fullscreen": "Volledig scherm", "video.hide": "Video verbergen", From 3ebe03b72992f0c0efc437870c2e3471dea744a8 Mon Sep 17 00:00:00 2001 From: Sylvhem Date: Thu, 12 Oct 2017 00:58:01 +0200 Subject: [PATCH 22/23] Fixes and updates for the French translation (#5340) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Ajout du support des thèmes multiples Ajoute des traductions pour les nouvelles chaînes permettant le support de thèmes multiples. Add translations for the new strings allowing support for multiple themes. * Mise à jour de la traduction Met à jour les chaînes modifiées et ajoute des traductions pour celle n’en ayant pas. Update modified strings and add new translations for the ones who are missing them. * Remplace « ' » par « ’ » Retire de la traduction les apostrophes droites « ' » (U+0027) au profit des apostrophes typographiques « ’ » (U+2019). En typographie française, les apostrophes typographiques sont utilisées à la place des apostrophes droites. La traduction était incohérente et utilisait les deux. Remove from the translation all the vertical apostrophes (U+0027) in favor of the curly ones (U+2019). In French typography, typographic apostrophes are used instead of vertical ones. The translation was incoherent and used both. --- app/javascript/mastodon/locales/fr.json | 2 +- config/locales/fr.yml | 70 +++++++++++++++++++++++-- config/locales/simple_form.fr.yml | 5 +- 3 files changed, 70 insertions(+), 7 deletions(-) diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 48f174c4c..4eca47b60 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -168,7 +168,7 @@ "search_popout.search_format": "Recherche avancée", "search_popout.tips.hashtag": "hashtag", "search_popout.tips.status": "statuts", - "search_popout.tips.text": "Un texte simple renvoie les noms affichés, les noms d'utilisateur⋅ice et les hashtags correspondants", + "search_popout.tips.text": "Un texte simple renvoie les noms affichés, les noms d’utilisateur⋅ice et les hashtags correspondants", "search_popout.tips.user": "utilisateur⋅ice", "search_results.total": "{count, number} {count, plural, one {résultat} other {résultats}}", "standalone.public_title": "Jeter un coup d’œil…", diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 6198a5454..07df89e9b 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -2,6 +2,7 @@ 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_hashtag_html: Figurent ci-dessous les pouets tagués avec #%{hashtag}. Vous pouvez interagir avec eux si vous avez un compte n’importe où dans le Fediverse. about_this: À propos 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 @@ -12,7 +13,7 @@ fr: domain_count_before: Connectés à extended_description_html: |

Un bon endroit pour les règles

-

La description étendue n'a pas été remplie.

+

La description étendue n’a pas été remplie.

features: humane_approach_body: Ayant appris des échecs d’autres réseaux, Mastodon à l’ambition de combattre l’abus des médias sociaux en effectuant des choix de conception éthiques. humane_approach_title: Une approche plus humaine @@ -60,8 +61,9 @@ fr: email: Courriel feed_url: URL du flux followers: Abonné⋅es + followers_url: URL des abonné·e·s follows: Abonnements - inbox_url: URL d'entrée + inbox_url: URL d’entrée ip: Adresse IP location: all: Tous @@ -74,6 +76,7 @@ fr: silenced: Masqués suspended: Suspendus title: Modération + moderation_notes: Notes de modération most_recent_activity: Dernière activité most_recent_ip: Adresse IP la plus récente not_subscribed: Non abonné @@ -93,6 +96,7 @@ fr: resubscribe: Se réabonner salmon_url: URL Salmon search: Rechercher + shared_inbox_url: URL de la boite de réception partagée show: created_reports: Signalements créés par ce compte report: signalement @@ -106,6 +110,32 @@ fr: unsubscribe: Se désabonner username: Nom d’utilisateur⋅ice web: Web + account_moderation_notes: + account: Modérateur·rice + created_at: Date + create: Créer + created_msg: Note de modération créée avec succès ! + delete: Supprimer + destroyed_msg: Note de modération supprimée avec succès ! + custom_emojis: + copied_msg: Copie locale de l’émoji créée avec succès + copy: Copier + copy_failed_msg: Impossible de faire une copie locale de cet émoji + created_msg: Émoji créé avec succès ! + delete: Supprimer + destroyed_msg: Emojo successfully destroyed! + disable: Désactiver + disabled_msg: Émoji désactivé avec succès + emoji: Émoji + enable: Activer + enabled_msg: Émoji activé avec succès + image_hint: PNG de moins de 50 Ko + new: + title: Ajouter un nouvel émoji personnalisé + shortcode: Raccourci + shortcode_hint: Au moins deux caractères, seulement des caractères alphanumériques ou des tirets bas + title: Émoji personnalisés + upload: Téléverser domain_blocks: add_new: Ajouter created_msg: Le blocage de domaine est désormais activé @@ -138,9 +168,21 @@ fr: undo: Annuler title: Blocage de domaines undo: Annuler + email_domain_blocks: + add_new: Ajouter + created_msg: Le blocage de domaine de courriel est désormais activé + delete: Supprimer + destroyed_msg: Le blocage de domaine de courriel a été désactivé + domain: Domaine + new: + create: Créer le blocage + title: Nouveau blocage de domaine de courriel + title: Blocage de domaines de courriel instances: account_count: Comptes connus domain_name: Domaine + reset: Réinitialisation + search: Rechercher title: Instances connues reports: action_taken_by: Intervention de @@ -167,6 +209,9 @@ fr: unresolved: Non résolus view: Voir settings: + bootstrap_timeline_accounts: + desc_html: Séparez les noms d’utilisateur·rice par des virgules. Ne fonctionne qu’avec des comptes locaux et non-verrouillés. Si laissé vide, les administrateur·rice·s locaux·les sont utilisé·e·s. + title: Abonnements par défaut pour les nouveaux·elles utilisateur·rice·s contact_information: email: Entrez une adresse courriel publique username: Entrez un nom d’utilisateur⋅ice @@ -190,6 +235,9 @@ fr: desc_html: Affichée sur la page des conditions d’utilisation du site
Vous pouvez utiliser des balises HTML title: Politique de confidentialité site_title: Titre du site + thumbnail: + desc_html: Utilisée pour les prévisualisation via OpenGraph et l’API. 1200x630px recommandé + title: Vignette de l’instance timeline_preview: desc_html: Afficher le fil public sur la page d’accueil title: Prévisualisation du fil global @@ -229,10 +277,10 @@ fr: created: Application créée avec succès destroyed: Application supprimée avec succès invalid_url: L’URL fournie est invalide - regenerate_token: Regénérer le jeton d'accès - token_regenerated: Jeton d'accès regénéré avec succès + regenerate_token: Regénérer le jeton d’accès + token_regenerated: Jeton d’accès regénéré avec succès warning: Soyez prudent⋅e avec ces données. Ne les partagez pas ! - your_token: Votre jeton d'accès + your_token: Votre jeton d’accès auth: agreement_html: En vous inscrivant, vous souscrivez à nos conditions d’utilisation ainsi qu’à notre politique de confidentialité. change_password: Sécurité @@ -293,6 +341,9 @@ fr: content: Vérification de sécurité échouée. Bloquez-vous les cookies ? title: Vérification de sécurité échouée '429': Trop de requêtes émises dans un délai donné. + '500': + content: Nous sommes désolé·e·s, mais quelque chose s’est mal passé de notre côté. + title: Cette page n’est pas correcte noscript_html: Pour utiliser Mastodon, veuillez activer JavaScript exports: blocks: Vous bloquez @@ -372,6 +423,11 @@ fr: pagination: next: Suivant prev: Précédent + preferences: + languages: Langues + other: Autre + publishing: Publication + web: Web push_notifications: favourite: title: "%{name} à mis votre statut en favori" @@ -439,6 +495,7 @@ fr: export: Export de données followers: Abonné⋅es autorisé⋅es import: Import de données + notifications: Notifications preferences: Préférences settings: Réglages two_factor_authentication: Identification à deux facteurs @@ -447,6 +504,7 @@ fr: open_in_web: Ouvrir sur le web over_character_limit: limite de caractères dépassée de %{max} caractères pin_errors: + limit: Trop de pouets épinglés ownership: Vous ne pouvez pas épingler un statut ne vous appartenant pas private: Les statuts non-publics ne peuvent pas être épinglés reblog: Un partage ne peut pas être épinglé @@ -466,6 +524,8 @@ fr: terms: 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 électronique. Vous pouvez, cependant, visiter notre site sans inscription. Votre adresse électronique devra être vérifiée grâce à un courriel contenant un lien unique. Si ce lien est visité, nous savons que vous contrôlez cette adresse.

\n\n

Lors de l’inscription et de la publication de statuts, nous enregistrons l’adresse IP de laquelle les statuts proviennent. 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 courriels à intervalles réguliers — l’adresse électronique 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, de l’associer à celui-ci.

\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 destinés à l’usage de personnes âgées 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 présente politique de confidentialité.

\n\n

Changements de notre politique de confidentialité

\n\n

Si nous décidons d’apporter des changements à notre politique de confidentialité, nous les publierons 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é" + themes: + default: Mastodon time: formats: default: "%d %b %Y, %H:%M" diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index adfb1a875..37fc86b0e 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -4,6 +4,7 @@ fr: hints: defaults: avatar: Au format PNG, GIF ou JPG. 2Mo maximum. Sera réduit à 120x120px + digest: Envoyé après une longue période d’inactivité et contient un résumé des notifications que vous avez reçues pendant votre absence display_name: one: 1 caractère restant other: %{count} caractères restants @@ -13,12 +14,13 @@ fr: one: 1 caractère restant other: %{count} caractères restants setting_noindex: Affecte votre profil public ainsi que vos statuts + setting_theme: Affecte l’apparence de Mastodon quand vous êtes connecté·e depuis n’importe quel appareil. imports: data: Un fichier CSV généré par une autre instance de Mastodon sessions: otp: Entrez le code d’authentification à deux facteurs depuis votre téléphone ou utilisez un de vos codes de récupération. user: - filtered_languages: Les langues sélectionnées seront retirées de vos fils publics. + filtered_languages: Les langues sélectionnées seront filtrées hors de vos fils publics pour vous labels: defaults: avatar: Image de profil @@ -43,6 +45,7 @@ fr: setting_delete_modal: Afficher un dialogue de confirmation avant de supprimer un pouet setting_noindex: Demander aux moteurs de recherche de ne pas indexer vos informations personnelles setting_system_font_ui: Utiliser la police par défaut du système + setting_theme: Thème du site setting_unfollow_modal: Afficher un dialogue de confirmation avant de vous désabonner d’un compte severity: Séverité type: Type d’import From 8e9911962d71e5f010bf5e8974dbe9ab59220185 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 12 Oct 2017 00:58:14 +0200 Subject: [PATCH 23/23] Change Android icon padding again to half of previous (#5339) --- public/android-chrome-192x192.png | Bin 10339 -> 13546 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png index 923d0d7decf5d8c6fea297de728c83350408da6e..166cabdaa73725867f56f682949109c79348bd65 100644 GIT binary patch literal 13546 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 C`}M;B literal 10339 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 O0V)a_^0l&-;r|DI`Mk~m