From 817f4cd0fc4ef6be4fdedd20bf9d1da51ecd075a Mon Sep 17 00:00:00 2001 From: Juha Leinonen Date: Tue, 13 Dec 2016 03:53:01 +0200 Subject: [PATCH 0001/1355] FEATURE: Split Reply-button into 'Reply Post' and 'Reply Topic' --- .../templates/components/topic-footer-buttons.hbs | 4 ++-- app/assets/javascripts/discourse/widgets/post-menu.js.es6 | 2 +- config/locales/client.en.yml | 8 ++++++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/app/assets/javascripts/discourse/templates/components/topic-footer-buttons.hbs b/app/assets/javascripts/discourse/templates/components/topic-footer-buttons.hbs index 518abc95c2..83ed1bfe24 100644 --- a/app/assets/javascripts/discourse/templates/components/topic-footer-buttons.hbs +++ b/app/assets/javascripts/discourse/templates/components/topic-footer-buttons.hbs @@ -49,8 +49,8 @@ {{d-button class="btn-primary create" icon="reply" action="replyToPost" - label="topic.reply.title" - title="topic.reply.help"}} + label="topic.reply.topic.title" + title="topic.reply.topic.help"}} {{/if}} {{plugin-outlet "after-topic-footer-main-buttons" tagName="span"}} diff --git a/app/assets/javascripts/discourse/widgets/post-menu.js.es6 b/app/assets/javascripts/discourse/widgets/post-menu.js.es6 index 4c39f4a542..cf3b3127f4 100644 --- a/app/assets/javascripts/discourse/widgets/post-menu.js.es6 +++ b/app/assets/javascripts/discourse/widgets/post-menu.js.es6 @@ -135,7 +135,7 @@ registerButton('reply', attrs => { if (!attrs.canCreatePost) { return; } if (!attrs.mobileView) { - args.label = 'topic.reply.title'; + args.label = 'topic.reply.post.title'; } return args; diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index c5c9c3443b..62cd9883e8 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -1542,8 +1542,12 @@ en: remove_banner: "Remove Banner Topic" reply: - title: 'Reply' - help: 'begin composing a reply to this topic' + post: + title: 'Reply' + # help i.e. tooltop is at controls.reply + topic: + title: 'Reply' + help: 'begin composing a reply to this topic' clear_pin: title: "Clear pin" From d15bfc9880907523e74d4c6eb0542dd53399994f Mon Sep 17 00:00:00 2001 From: Clay Griffiths Date: Mon, 19 Dec 2016 14:34:19 -0700 Subject: [PATCH 0002/1355] Forced trailing slash on messageBus.baseUrl --- .../javascripts/discourse/initializers/message-bus.js.es6 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/initializers/message-bus.js.es6 b/app/assets/javascripts/discourse/initializers/message-bus.js.es6 index 650a9544a8..3ce1a033c3 100644 --- a/app/assets/javascripts/discourse/initializers/message-bus.js.es6 +++ b/app/assets/javascripts/discourse/initializers/message-bus.js.es6 @@ -29,7 +29,7 @@ export default { messageBus.callbackInterval = siteSettings.anon_polling_interval; messageBus.backgroundCallbackInterval = siteSettings.background_polling_interval; - messageBus.baseUrl = siteSettings.long_polling_base_url; + messageBus.baseUrl = siteSettings.long_polling_base_url.replace(/\/$/, '') + '/'; if (messageBus.baseUrl !== '/') { // zepto compatible, 1 param only From 499a83270a834234117890cb5bb8728281148a91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Thu, 12 Jan 2017 22:35:33 +0100 Subject: [PATCH 0003/1355] FIX: don't onebox to IP addresses --- .../engine/whitelisted_generic_onebox.rb | 4 +++- .../engine/whitelisted_generic_onebox_spec.rb | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 spec/components/onebox/engine/whitelisted_generic_onebox_spec.rb diff --git a/lib/onebox/engine/whitelisted_generic_onebox.rb b/lib/onebox/engine/whitelisted_generic_onebox.rb index 1ea9a90892..e711b960c9 100644 --- a/lib/onebox/engine/whitelisted_generic_onebox.rb +++ b/lib/onebox/engine/whitelisted_generic_onebox.rb @@ -1,10 +1,12 @@ +require "ipaddr" + module Onebox module Engine class WhitelistedGenericOnebox # overwrite the whitelist def self.===(other) - true + other.is_a?(URI) ? (IPAddr.new(other.hostname) rescue nil).nil? : true end # ensure we're the last engine to be used diff --git a/spec/components/onebox/engine/whitelisted_generic_onebox_spec.rb b/spec/components/onebox/engine/whitelisted_generic_onebox_spec.rb new file mode 100644 index 0000000000..f6d8c38840 --- /dev/null +++ b/spec/components/onebox/engine/whitelisted_generic_onebox_spec.rb @@ -0,0 +1,18 @@ +require 'rails_helper' + +describe Onebox::Engine::WhitelistedGenericOnebox do + + describe ".===" do + + it "matches any domain" do + expect(described_class === URI('http://foo.bar/resource')).to be(true) + end + + it "doesn't match an IP address" do + expect(described_class === URI('http://1.2.3.4/resource')).to be(false) + expect(described_class === URI('http://1.2.3.4:1234/resource')).to be(false) + end + + end + +end From 04ae3539d05432b83c6e1a233a39605e83b223cf Mon Sep 17 00:00:00 2001 From: Matt Palmer Date: Fri, 13 Jan 2017 11:05:00 +1100 Subject: [PATCH 0004/1355] FEATURE: Better error message when incoming e-mail is missing a Date: header --- lib/email/receiver.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/email/receiver.rb b/lib/email/receiver.rb index 3acdafe96f..843a64d55e 100644 --- a/lib/email/receiver.rb +++ b/lib/email/receiver.rb @@ -573,6 +573,10 @@ module Email # ensure posts aren't created in the future options[:created_at] ||= @mail.date + if options[:created_at].nil? + raise InvalidPost, "No post creation date found. Is the e-mail missing a Date: header?" + end + options[:created_at] = DateTime.now if options[:created_at] > DateTime.now is_private_message = options[:archetype] == Archetype.private_message || From b5d65d8dda2a00e1f8ab94ef41f615cd207352b2 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Fri, 13 Jan 2017 09:51:09 +0800 Subject: [PATCH 0005/1355] Remove lines that are no longer valid. --- Gemfile | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Gemfile b/Gemfile index a0a8419621..25fcaa8662 100644 --- a/Gemfile +++ b/Gemfile @@ -183,11 +183,3 @@ gem 'memory_profiler', require: false, platform: :mri gem 'rmmseg-cpp', require: false gem 'logster' - -# perftools only works on 1.9 atm -group :profile do - # travis refuses to install this, instead of fuffing, just avoid it for now - # - # if you need to profile, uncomment out this line - # gem 'rack-perftools_profiler', require: 'rack/perftools_profiler', platform: :mri_19 -end From d49473757ef758c25a8a1e122323df171653b1c5 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Fri, 13 Jan 2017 11:39:52 -0500 Subject: [PATCH 0006/1355] Version bump to v1.8.0.beta2 --- lib/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/version.rb b/lib/version.rb index 78cd1fbdf3..312e96a6f5 100644 --- a/lib/version.rb +++ b/lib/version.rb @@ -5,7 +5,7 @@ module Discourse MAJOR = 1 MINOR = 8 TINY = 0 - PRE = 'beta1' + PRE = 'beta2' STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.') end From adb73180f727be5b5bf4772c81f99e5ac9d10eea Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Thu, 12 Jan 2017 15:43:09 -0500 Subject: [PATCH 0007/1355] FEATURE: Let plugins register themes easily --- .../discourse/templates/application.hbs | 4 +-- app/models/color_scheme.rb | 18 +++++++---- lib/discourse.rb | 4 +++ lib/plugin/instance.rb | 26 ++++++++++++++- lib/plugin/theme.rb | 32 +++++++++++++++++++ lib/sass/discourse_sass_importer.rb | 12 ++----- spec/components/plugin/instance_spec.rb | 25 +++++++++++++-- 7 files changed, 101 insertions(+), 20 deletions(-) create mode 100644 lib/plugin/theme.rb diff --git a/app/assets/javascripts/discourse/templates/application.hbs b/app/assets/javascripts/discourse/templates/application.hbs index bf2de38396..6250c28d1f 100644 --- a/app/assets/javascripts/discourse/templates/application.hbs +++ b/app/assets/javascripts/discourse/templates/application.hbs @@ -20,11 +20,11 @@ {{outlet "user-card"}} -{{plugin-outlet name="above-footer"}} +{{plugin-outlet name="above-footer" args=(hash showFooter=showFooter)}} {{#if showFooter}} {{custom-html name="footer"}} {{/if}} -{{plugin-outlet name="below-footer"}} +{{plugin-outlet name="below-footer" args=(hash showFooter=showFooter)}} {{outlet "modal"}} {{topic-entrance}} diff --git a/app/models/color_scheme.rb b/app/models/color_scheme.rb index c2af572183..d9c9216c27 100644 --- a/app/models/color_scheme.rb +++ b/app/models/color_scheme.rb @@ -92,15 +92,21 @@ class ColorScheme < ActiveRecord::Base new_color_scheme end - def self.hex_for_name(name) - val = begin - hex_cache[name] ||= begin - # Can't use `where` here because base doesn't allow it - (enabled || base).colors.find {|c| c.name == name }.try(:hex) || :nil + def self.lookup_hex_for_name(name) + Discourse.plugin_themes.each do |pt| + if pt.color_scheme + found = pt.color_scheme[name.to_sym] + return found if found end end - val == :nil ? nil : val + # Can't use `where` here because base doesn't allow it + (enabled || base).colors.find {|c| c.name == name }.try(:hex) || :nil + end + + def self.hex_for_name(name) + hex_cache[name] ||= lookup_hex_for_name(name) + hex_cache[name] == :nil ? nil : hex_cache[name] end def colors=(arr) diff --git a/lib/discourse.rb b/lib/discourse.rb index 9c960ae3de..20227f2dfc 100644 --- a/lib/discourse.rb +++ b/lib/discourse.rb @@ -121,6 +121,10 @@ module Discourse @plugins ||= [] end + def self.plugin_themes + @plugin_themes ||= plugins.map(&:themes).flatten + end + def self.official_plugins plugins.find_all{|p| p.metadata.official?} end diff --git a/lib/plugin/instance.rb b/lib/plugin/instance.rb index 393e4eb086..043ae45416 100644 --- a/lib/plugin/instance.rb +++ b/lib/plugin/instance.rb @@ -2,6 +2,7 @@ require 'digest/sha1' require 'fileutils' require_dependency 'plugin/metadata' require_dependency 'plugin/auth_provider' +require_dependency 'plugin/theme' class Plugin::CustomEmoji def self.cache_key @@ -24,7 +25,13 @@ class Plugin::Instance attr_reader :admin_route # Memoized array readers - [:assets, :auth_providers, :color_schemes, :initializers, :javascripts, :styles].each do |att| + [:assets, + :auth_providers, + :color_schemes, + :initializers, + :javascripts, + :styles, + :themes].each do |att| class_eval %Q{ def #{att} @#{att} ||= [] @@ -173,6 +180,10 @@ class Plugin::Instance end end + def directory + File.dirname(path) + end + def auto_generated_path File.dirname(path) << "/auto_generated" end @@ -244,6 +255,19 @@ class Plugin::Instance Plugin::CustomEmoji.register(name, url) end + def register_theme(name) + return unless enabled? + + theme = Plugin::Theme.new(self, name) + yield theme + themes << theme + end + + # def register_public + # return unless enabled? + # + # end + def automatic_assets css = styles.join("\n") js = javascripts.join("\n") diff --git a/lib/plugin/theme.rb b/lib/plugin/theme.rb new file mode 100644 index 0000000000..15cb38c8d0 --- /dev/null +++ b/lib/plugin/theme.rb @@ -0,0 +1,32 @@ +class Plugin::Theme + attr_reader :color_scheme + + def initialize(plugin, name) + @plugin = plugin + @name = name + end + + def css(name) + @plugin.register_asset("stylesheets/#{name}.scss") + end + + def set_color_scheme(scheme) + @color_scheme = scheme + end + + def register_public + public_dir = "#{@plugin.directory}/public" + if File.exist?(public_dir) + if Rails.env.development? + Rails.application.config.before_initialize do |app| + app.middleware.insert_before( + ::ActionDispatch::Static, + ::ActionDispatch::Static, + public_dir + ) + end + end + end + end +end + diff --git a/lib/sass/discourse_sass_importer.rb b/lib/sass/discourse_sass_importer.rb index a3e877b8e5..62230db937 100644 --- a/lib/sass/discourse_sass_importer.rb +++ b/lib/sass/discourse_sass_importer.rb @@ -41,15 +41,9 @@ class DiscourseSassImporter < Sass::Importers::Filesystem case name when "theme_variables" contents = "" - if color_scheme = ColorScheme.enabled - ColorScheme.base_colors.each do |n, base_hex| - override = color_scheme.colors_by_name[n] - contents << "$#{n}: ##{override ? override.hex : base_hex} !default;\n" - end - else - special_imports[name].each do |css_file| - contents << File.read(css_file) - end + ColorScheme.base_colors.each do |n, base_hex| + hex_val = ColorScheme.hex_for_name(n) || base_hex + contents << "$#{n}: ##{hex_val} !default;\n" end when "category_backgrounds" contents = "" diff --git a/spec/components/plugin/instance_spec.rb b/spec/components/plugin/instance_spec.rb index d5c7150850..0e9c0fd592 100644 --- a/spec/components/plugin/instance_spec.rb +++ b/spec/components/plugin/instance_spec.rb @@ -160,6 +160,27 @@ describe Plugin::Instance do end end + context "themes" do + it "can register a theme" do + plugin = Plugin::Instance.new nil, "/tmp/test.rb" + plugin.register_theme('plugin') do |theme| + theme.set_color_scheme( + primary: 'ffff00', + secondary: '222222', + tertiary: '0f82af', + quaternary: 'c14924', + header_background: '111111', + header_primary: '333333', + highlight: 'a87137', + danger: 'e45735', + success: '1ca551', + love: 'fa6c8d' + ) + end + expect(plugin.themes).to be_present + end + end + context "register_color_scheme" do it "can add a color scheme for the first time" do plugin = Plugin::Instance.new nil, "/tmp/test.rb" @@ -207,7 +228,7 @@ describe Plugin::Instance do it 'should add the right callback' do called = 0 - method_name = plugin_instance.add_model_callback(User, :after_create) do + plugin_instance.add_model_callback(User, :after_create) do called += 1 end @@ -223,7 +244,7 @@ describe Plugin::Instance do it 'should add the right callback with options' do called = 0 - method_name = plugin_instance.add_model_callback(User, :after_commit, on: :create) do + plugin_instance.add_model_callback(User, :after_commit, on: :create) do called += 1 end From e8307ac24c9ce90c1efc0c90368274fea2df0656 Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Fri, 13 Jan 2017 13:46:33 -0500 Subject: [PATCH 0008/1355] FIX: mailing list mode digest emails included whispers --- app/models/post.rb | 11 +++++++---- spec/mailers/user_notifications_spec.rb | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/app/models/post.rb b/app/models/post.rb index 417788a349..51ac444211 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -69,10 +69,13 @@ class Post < ActiveRecord::Base scope :visible, -> { joins(:topic).where('topics.visible = true').where(hidden: false) } scope :secured, lambda { |guardian| where('posts.post_type in (?)', Topic.visible_post_types(guardian && guardian.user))} scope :for_mailing_list, ->(user, since) { - created_since(since) - .joins(:topic) - .where(topic: Topic.for_digest(user, 100.years.ago)) # we want all topics with new content, regardless when they were created - .order('posts.created_at ASC') + q = created_since(since) + .joins(:topic) + .where(topic: Topic.for_digest(user, 100.years.ago)) # we want all topics with new content, regardless when they were created + + q = q.where.not(post_type: Post.types[:whisper]) unless user.staff? + + q.order('posts.created_at ASC') } scope :mailing_list_new_topics, ->(user, since) { for_mailing_list(user, since).where('topics.created_at > ?', since) } scope :mailing_list_updates, ->(user, since) { for_mailing_list(user, since).where('topics.created_at <= ?', since) } diff --git a/spec/mailers/user_notifications_spec.rb b/spec/mailers/user_notifications_spec.rb index d6359818c9..d24d76588f 100644 --- a/spec/mailers/user_notifications_spec.rb +++ b/spec/mailers/user_notifications_spec.rb @@ -137,6 +137,21 @@ describe UserNotifications do expect(subject.subject).to match(/Try Discourse/) expect(subject.subject).not_to match(/Discourse Meta/) end + + it "excludes whispers" do + new_post_in_old_topic + whisper = Fabricate(:post, topic: old_topic, created_at: 1.hour.ago, raw: "This is secret", post_type: Post.types[:whisper]) + expect(subject.html_part.body.to_s).to include old_topic.title + expect(subject.html_part.body.to_s).to_not include whisper.cooked + end + + it "includes whispers for staff" do + user.admin = true; user.save! + new_post_in_old_topic + whisper = Fabricate(:post, topic: old_topic, created_at: 1.hour.ago, raw: "This is secret", post_type: Post.types[:whisper]) + expect(subject.html_part.body.to_s).to include old_topic.title + expect(subject.html_part.body.to_s).to include whisper.cooked + end end end From 5f08630c27c9249a6a8f08ad8d97d800449b1058 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Fri, 13 Jan 2017 15:48:49 -0500 Subject: [PATCH 0009/1355] Update topic status to use more ES6 features, clean up --- .../discourse/raw-views/topic-status.js.es6 | 51 ++++++++++--------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/app/assets/javascripts/discourse/raw-views/topic-status.js.es6 b/app/assets/javascripts/discourse/raw-views/topic-status.js.es6 index 17e370bc6e..e5d5befde9 100644 --- a/app/assets/javascripts/discourse/raw-views/topic-status.js.es6 +++ b/app/assets/javascripts/discourse/raw-views/topic-status.js.es6 @@ -1,54 +1,58 @@ +import computed from 'ember-addons/ember-computed-decorators'; + export default Ember.Object.extend({ - renderDiv: function(){ + + @computed + renderDiv() { return this.get('statuses').length > 0 && !this.noDiv; - }.property(), - statuses: function(){ - var topic = this.get("topic"); - var results = []; - var self = this; + }, + + @computed + statuses() { + const topic = this.get("topic"); + const results = []; // TODO, custom statuses? via override? - - if(topic.get('is_warning')){ + if (topic.get('is_warning')) { results.push({icon: 'envelope', key: 'warning'}); } - if(topic.get('bookmarked')){ - var url = topic.get('url'); - var postNumbers = topic.get('bookmarked_post_numbers'); - var extraClasses = ""; - if(postNumbers && postNumbers[0] > 1) { + if (topic.get('bookmarked')) { + const postNumbers = topic.get('bookmarked_post_numbers'); + let url = topic.get('url'); + let extraClasses = ""; + if (postNumbers && postNumbers[0] > 1) { url += '/' + postNumbers[0]; } else { extraClasses = "op-bookmark"; } - results.push({extraClasses: extraClasses, icon: 'bookmark', key: 'bookmarked', href: url}); + results.push({ extraClasses, icon: 'bookmark', key: 'bookmarked', href: url }); } if (topic.get('closed') && topic.get('archived')) { results.push({icon: 'lock', key: 'locked_and_archived'}); - } else if(topic.get('closed')){ + } else if (topic.get('closed')) { results.push({icon: 'lock', key: 'locked'}); - } else if(topic.get('archived')){ + } else if (topic.get('archived')) { results.push({icon: 'lock', key: 'archived'}); } - if(topic.get('pinned')){ + if (topic.get('pinned')) { results.push({icon: 'thumb-tack', key: 'pinned'}); } - if(topic.get('unpinned')){ + if (topic.get('unpinned')) { results.push({icon: 'thumb-tack unpinned', key: 'unpinned'}); } - if(topic.get('invisible')){ + if (topic.get('invisible')) { results.push({icon: 'eye-slash', key: 'invisible'}); } - _.each(results, function(result){ - result.title = I18n.t("topic_statuses." + result.key + ".help"); - if(!self.disableActions && (result.key === "pinned" ||result.key === "unpinned")){ + results.forEach(result => { + result.title = I18n.t(`topic_statuses.${result.key}.help`); + if (!self.disableActions && (result.key === "pinned" ||result.key === "unpinned")) { result.openTag = 'a href'; result.closeTag = 'a'; } else { @@ -58,6 +62,5 @@ export default Ember.Object.extend({ }); return results; - }.property() + } }); - From d0a3dc10d81a29441cecf296cf26bc591219d469 Mon Sep 17 00:00:00 2001 From: cpradio Date: Sat, 14 Jan 2017 14:04:17 -0500 Subject: [PATCH 0010/1355] FIX: RSS Language should use a dash/hypen instead of underscore --- app/views/list/list.rss.erb | 2 +- app/views/topics/show.rss.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/list/list.rss.erb b/app/views/list/list.rss.erb index 78193a8f0d..d0f6c14957 100644 --- a/app/views/list/list.rss.erb +++ b/app/views/list/list.rss.erb @@ -6,7 +6,7 @@ <%= @title %> <%= @link %> <%= @description %> - <% if lang %><%= lang%><% end %> + <% if lang %><%= lang.sub('_', '-')%><% end %> <% if @topic_list.topics && @topic_list.topics.length > 0 %> <%= @topic_list.topics.first.created_at.rfc2822 %> diff --git a/app/views/topics/show.rss.erb b/app/views/topics/show.rss.erb index aa7d08c4a8..a7efff9364 100644 --- a/app/views/topics/show.rss.erb +++ b/app/views/topics/show.rss.erb @@ -7,7 +7,7 @@ <%= @topic_view.title %> <%= topic_url %> <%= @topic_view.posts.first.raw %> - <%= "#{lang}" if lang %> + <% if lang %><%= lang.sub('_', '-')%><% end %> <%= @topic_view.topic.bumped_at.rfc2822 %> <%= @topic_view.topic.category.name %> From e90af4f2deae2bde4237f8a5038eca86a7700c90 Mon Sep 17 00:00:00 2001 From: Sam Saffron Date: Sat, 14 Jan 2017 20:10:09 -0500 Subject: [PATCH 0011/1355] FEATURE: Update omniauth twitter as prep for Ruby 2.4 support --- Gemfile.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index fd19febf79..efcda4dc6a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -116,7 +116,7 @@ GEM globalid (0.3.7) activesupport (>= 4.1.0) guess_html_encoding (0.0.11) - hashie (3.4.4) + hashie (3.4.6) highline (1.7.8) hiredis (0.6.1) htmlentities (4.3.4) @@ -137,7 +137,7 @@ GEM rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) - json (1.8.3) + json (1.8.6) jwt (1.5.2) kgio (2.10.0) libv8 (5.3.332.38.3) @@ -172,7 +172,7 @@ GEM mini_portile2 (~> 2.1.0) nokogumbo (1.4.7) nokogiri - oauth (0.4.7) + oauth (0.5.1) oauth2 (1.0.0) faraday (>= 0.8, < 0.10) jwt (~> 1.0) @@ -205,9 +205,9 @@ GEM omniauth-openid (1.0.1) omniauth (~> 1.0) rack-openid (~> 1.3.1) - omniauth-twitter (1.2.1) - json (~> 1.3) + omniauth-twitter (1.3.0) omniauth-oauth (~> 1.1) + rack onebox (1.7.3) fast_blank (>= 1.0.0) htmlentities (~> 4.3.4) From d87e5ae819aaafc2d5c4428e1aedbc28e4f611fb Mon Sep 17 00:00:00 2001 From: Jeff Atwood Date: Thu, 12 Jan 2017 14:16:39 -0800 Subject: [PATCH 0012/1355] tighten spacing for poll voters list --- plugins/poll/assets/stylesheets/common/poll.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/poll/assets/stylesheets/common/poll.scss b/plugins/poll/assets/stylesheets/common/poll.scss index 762ce7638f..8eba8781a8 100644 --- a/plugins/poll/assets/stylesheets/common/poll.scss +++ b/plugins/poll/assets/stylesheets/common/poll.scss @@ -77,7 +77,7 @@ div.poll { display: inline; } - margin-top: 10px; + margin-top: 4px; } .poll-voters-toggle-expand { From 56abe065bc6d32252b5422a8aead67d26a4e702c Mon Sep 17 00:00:00 2001 From: Jeff Atwood Date: Sat, 14 Jan 2017 22:11:43 -0800 Subject: [PATCH 0013/1355] tighten header margin on onebox --- app/assets/stylesheets/common/base/onebox.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/stylesheets/common/base/onebox.scss b/app/assets/stylesheets/common/base/onebox.scss index ba0e0fb075..9ad0c248a8 100644 --- a/app/assets/stylesheets/common/base/onebox.scss +++ b/app/assets/stylesheets/common/base/onebox.scss @@ -95,6 +95,7 @@ aside.onebox { font-size: 1em; header { + margin-bottom: 8px; a[href] { color: dark-light-choose(scale-color($primary, $lightness: 50%), scale-color($secondary, $lightness: 50%)); text-decoration: none; From b2162b910b91edfd2ea900a43520c9ecbb060367 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Mon, 16 Jan 2017 08:06:03 +0800 Subject: [PATCH 0014/1355] Update rbtrace to work on 2.4.0. --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index efcda4dc6a..4f5eb6b58f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -107,7 +107,7 @@ GEM rake rake-compiler fast_xs (0.8.0) - ffi (1.9.10) + ffi (1.9.17) flamegraph (0.9.5) foreman (0.82.0) thor (~> 0.19.1) @@ -162,7 +162,7 @@ GEM metaclass (~> 0.0.1) mock_redis (0.15.4) moneta (0.8.1) - msgpack (0.7.6) + msgpack (1.0.2) multi_json (1.12.1) multi_xml (0.5.5) multipart-post (2.0.0) From ed5fa20b0c459445c71c71fe5dbcae1cf1648e6a Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Mon, 16 Jan 2017 09:44:10 +0800 Subject: [PATCH 0015/1355] Revert "FIX: error during signup saying "Password is the same as your current password" due to automatic group membership granting a trust level" This reverts commit 9c40657ba4a23e2bea074fb1654923b17327ab84. Calling this whenever a user is initialize is hurting us bad on performance. --- app/models/group.rb | 5 ----- app/models/user.rb | 20 +++----------------- spec/models/user_spec.rb | 11 ----------- 3 files changed, 3 insertions(+), 33 deletions(-) diff --git a/app/models/group.rb b/app/models/group.rb index ecf0033ed3..b97c34356c 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -370,11 +370,6 @@ class Group < ActiveRecord::Base self.where("string_to_array(incoming_email, '|') @> ARRAY[?]", Email.downcase(email)).first end - def self.grants_by_email_domain - Group.where(automatic: false) - .where("LENGTH(COALESCE(automatic_membership_email_domains, '')) > 0") - end - def bulk_add(user_ids) if user_ids.present? Group.exec_sql("INSERT INTO group_users diff --git a/app/models/user.rb b/app/models/user.rb index 6873d60eb6..a2c3095a41 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -932,7 +932,9 @@ class User < ActiveRecord::Base end def automatic_group_membership - Group.grants_by_email_domain.each do |group| + Group.where(automatic: false) + .where("LENGTH(COALESCE(automatic_membership_email_domains, '')) > 0") + .each do |group| domains = group.automatic_membership_email_domains.gsub('.', '\.') if self.email =~ Regexp.new("@(#{domains})$", true) && !group.users.include?(self) group.add(self) @@ -941,14 +943,6 @@ class User < ActiveRecord::Base end end - def automatic_group_from_email - Group.grants_by_email_domain.each do |group| - domains = group.automatic_membership_email_domains.gsub('.', '\.') - return group if self.email =~ Regexp.new("@(#{domains})$", true) - end - nil - end - def create_user_stat stat = UserStat.new(new_since: Time.now) stat.user_id = id @@ -978,15 +972,7 @@ class User < ActiveRecord::Base def add_trust_level # there is a possibility we did not load trust level column, skip it return unless has_attribute? :trust_level - self.trust_level ||= SiteSetting.default_trust_level - - group_from_email = automatic_group_from_email - if group_from_email&.grant_trust_level && - group_from_email.grant_trust_level > self.trust_level - self.trust_level = group_from_email.grant_trust_level - self.trust_level_locked = true - end end def update_username_lower diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 216231d482..2ee4a3e94e 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -1196,17 +1196,6 @@ describe User do expect(group_history.target_user).to eq(user) end - it "get attributes from the group" do - group = Fabricate(:group, automatic_membership_email_domains: "bar.com|wat.com", grant_trust_level: 1, title: "bars and wats", primary_group: true) - user = Fabricate.build(:user, trust_level: 0, email: "foo@bar.com", password: "strongpassword4Uguys") - user.password_required! - expect(user.save).to eq(true) - user.reload - expect(user.title).to eq("bars and wats") - expect(user.trust_level).to eq(1) - expect(user.trust_level_locked).to eq(true) - end - end describe "number_of_flags_given" do From e3b6f9b8ae77ca6d9820a9364b0ea96d9df4b3ce Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Mon, 16 Jan 2017 10:18:10 +0800 Subject: [PATCH 0016/1355] FIX: Do not update user stats like counts for private messages. --- app/models/user_action.rb | 4 +- lib/post_revisor.rb | 26 +++++---- spec/models/user_action_spec.rb | 19 ++++++- spec/services/post_owner_changer_spec.rb | 67 ++++++++++++++++++++---- 4 files changed, 93 insertions(+), 23 deletions(-) diff --git a/app/models/user_action.rb b/app/models/user_action.rb index 4a880a10c2..5051302b81 100644 --- a/app/models/user_action.rb +++ b/app/models/user_action.rb @@ -277,7 +277,9 @@ SQL MessageBus.publish("/user/#{hash[:user_id]}", {user_action_id: action.id, remove: true}) end - update_like_count(hash[:user_id], hash[:action_type], -1) + if !Topic.where(id: hash[:target_topic_id], archetype: Archetype.private_message).exists? + update_like_count(hash[:user_id], hash[:action_type], -1) + end end def self.synchronize_target_topic_ids(post_ids = nil) diff --git a/lib/post_revisor.rb b/lib/post_revisor.rb index bf12588e70..9b9ef68d54 100644 --- a/lib/post_revisor.rb +++ b/lib/post_revisor.rb @@ -287,22 +287,26 @@ class PostRevisor .where(action_type: UserAction::WAS_LIKED) .update_all(user_id: new_owner.id) - prev_owner.user_stat.post_count -= 1 - prev_owner.user_stat.topic_count -= 1 if @post.is_first_post? - prev_owner.user_stat.likes_received -= likes - prev_owner.user_stat.update_topic_reply_count + private_message = @post.topic.private_message? + + prev_owner_user_stat = prev_owner.user_stat + prev_owner_user_stat.post_count -= 1 + prev_owner_user_stat.topic_count -= 1 if @post.is_first_post? + prev_owner_user_stat.likes_received -= likes if !private_message + prev_owner_user_stat.update_topic_reply_count if @post.created_at == prev_owner.user_stat.first_post_created_at - prev_owner.user_stat.first_post_created_at = prev_owner.posts.order('created_at ASC').first.try(:created_at) + prev_owner_user_stat.first_post_created_at = prev_owner.posts.order('created_at ASC').first.try(:created_at) end - prev_owner.user_stat.save + prev_owner_user_stat.save! - new_owner.user_stat.post_count += 1 - new_owner.user_stat.topic_count += 1 if @post.is_first_post? - new_owner.user_stat.likes_received += likes - new_owner.user_stat.update_topic_reply_count - new_owner.user_stat.save + new_owner_user_stat = new_owner.user_stat + new_owner_user_stat.post_count += 1 + new_owner_user_stat.topic_count += 1 if @post.is_first_post? + new_owner_user_stat.likes_received += likes if !private_message + new_owner_user_stat.update_topic_reply_count + new_owner_user_stat.save! end end diff --git a/spec/models/user_action_spec.rb b/spec/models/user_action_spec.rb index 5aeaa25781..73ccd9a067 100644 --- a/spec/models/user_action_spec.rb +++ b/spec/models/user_action_spec.rb @@ -105,7 +105,7 @@ describe UserAction do describe 'when user likes' do - let!(:post) { Fabricate(:post) } + let(:post) { Fabricate(:post) } let(:likee) { post.user } let(:liker) { Fabricate(:coding_horror) } @@ -140,6 +140,23 @@ describe UserAction do expect(liker.user_stat.reload.likes_given).to eq(0) end + context 'private message' do + let(:post) { Fabricate(:private_message_post) } + let(:likee) { post.topic.topic_allowed_users.first.user } + let(:liker) { post.topic.topic_allowed_users.last.user } + + it 'should not increase user stats' do + expect(@liker_action).not_to eq(nil) + expect(liker.user_stat.reload.likes_given).to eq(0) + expect(@likee_action).not_to eq(nil) + expect(likee.user_stat.reload.likes_received).to eq(0) + + PostAction.remove_act(liker, post, PostActionType.types[:like]) + expect(liker.user_stat.reload.likes_given).to eq(0) + expect(likee.user_stat.reload.likes_received).to eq(0) + end + end + end context "liking a private message" do diff --git a/spec/services/post_owner_changer_spec.rb b/spec/services/post_owner_changer_spec.rb index bdbb36541a..10fb1cebec 100644 --- a/spec/services/post_owner_changer_spec.rb +++ b/spec/services/post_owner_changer_spec.rb @@ -63,11 +63,21 @@ describe PostOwnerChanger do let(:p2user) { p2.user } before do - topic.user_id = p1user.id - topic.save! + topic.update!(user_id: p1user.id) - p1user.user_stat.update_attributes(topic_count: 1, post_count: 1, first_post_created_at: p1.created_at, topic_reply_count: 0) - p2user.user_stat.update_attributes(topic_count: 0, post_count: 1, first_post_created_at: p2.created_at, topic_reply_count: 1) + p1user.user_stat.update!( + topic_count: 1, + post_count: 1, + first_post_created_at: p1.created_at, + topic_reply_count: 0 + ) + + p2user.user_stat.update!( + topic_count: 0, + post_count: 1, + first_post_created_at: p2.created_at, + topic_reply_count: 1 + ) UserAction.create!( action_type: UserAction::NEW_TOPIC, user_id: p1user.id, acting_user_id: p1user.id, target_post_id: -1, target_topic_id: p1.topic_id, created_at: p1.created_at ) @@ -78,9 +88,19 @@ describe PostOwnerChanger do UserActionCreator.enable end - subject(:change_owners) { described_class.new(post_ids: [p1.id, p2.id], topic_id: topic.id, new_owner: user_a, acting_user: editor).change_owner! } + subject(:change_owners) do + described_class.new( + post_ids: [p1.id, p2.id], + topic_id: topic.id, + new_owner: user_a, + acting_user: editor + ).change_owner! + end it "updates users' topic and post counts" do + PostAction.act(p2user, p1, PostActionType.types[:like]) + expect(p1user.user_stat.reload.likes_received).to eq(1) + change_owners p1user.reload; p2user.reload; user_a.reload @@ -90,11 +110,38 @@ describe PostOwnerChanger do expect(p2user.post_count).to eq(0) expect(user_a.topic_count).to eq(1) expect(user_a.post_count).to eq(2) - expect(p1user.user_stat.first_post_created_at).to eq(nil) - expect(p2user.user_stat.first_post_created_at).to eq(nil) - expect(p1user.user_stat.topic_reply_count).to eq(0) - expect(p2user.user_stat.topic_reply_count).to eq(0) - expect(user_a.user_stat.first_post_created_at).to be_present + + p1_user_stat = p1user.user_stat + + expect(p1_user_stat.first_post_created_at).to eq(nil) + expect(p1_user_stat.topic_reply_count).to eq(0) + expect(p1_user_stat.likes_received).to eq(0) + + p2_user_stat = p2user.user_stat + + expect(p2_user_stat.first_post_created_at).to eq(nil) + expect(p2_user_stat.topic_reply_count).to eq(0) + + user_a_stat = user_a.user_stat + + expect(user_a_stat.first_post_created_at).to be_present + expect(user_a_stat.likes_received).to eq(1) + end + + context 'private message topic' do + let(:topic) { Fabricate(:private_message_topic) } + + it "should update users' counts" do + PostAction.act(p2user, p1, PostActionType.types[:like]) + + change_owners + + expect(p1user.user_stat.likes_received).to eq(0) + + user_a_stat = user_a.user_stat + expect(user_a_stat.first_post_created_at).to be_present + expect(user_a_stat.likes_received).to eq(0) + end end it "updates UserAction records" do From 63954c1b3355f595b7a88f9a3d41eaf4ed921059 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Mon, 16 Jan 2017 16:40:05 +0800 Subject: [PATCH 0017/1355] FIX: Same user record being saved twice causing validation to fail. --- app/models/user.rb | 11 +++++++---- spec/models/user_spec.rb | 22 ++++++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index a2c3095a41..192dcdcf71 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -90,13 +90,13 @@ class User < ActiveRecord::Base after_create :create_user_option after_create :create_user_profile after_create :ensure_in_trust_level_group - after_create :automatic_group_membership after_create :set_default_categories_preferences after_create :trigger_user_created_event before_save :update_username_lower before_save :ensure_password_is_hashed + after_save :automatic_group_membership after_save :clear_global_notice_if_needed after_save :refresh_avatar after_save :badge_grant @@ -935,10 +935,13 @@ class User < ActiveRecord::Base Group.where(automatic: false) .where("LENGTH(COALESCE(automatic_membership_email_domains, '')) > 0") .each do |group| + domains = group.automatic_membership_email_domains.gsub('.', '\.') - if self.email =~ Regexp.new("@(#{domains})$", true) && !group.users.include?(self) - group.add(self) - GroupActionLogger.new(Discourse.system_user, group).log_add_user_to_group(self) + user = User.find(self.id) + + if user.reload.email =~ Regexp.new("@(#{domains})$", true) && !group.users.include?(user) + group.add(user) + GroupActionLogger.new(Discourse.system_user, group).log_add_user_to_group(user) end end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 2ee4a3e94e..52cf4ea841 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -1196,6 +1196,28 @@ describe User do expect(group_history.target_user).to eq(user) end + it "get attributes from the group" do + group = Fabricate(:group, + automatic_membership_email_domains: "bar.com|wat.com", + grant_trust_level: 1, + title: "bars and wats", + primary_group: true + ) + + user = Fabricate.build(:user, + trust_level: 0, + email: "foo@bar.com", + password: "strongpassword4Uguys" + ) + + user.password_required! + user.save! + user.reload + + expect(user.title).to eq("bars and wats") + expect(user.trust_level).to eq(1) + expect(user.trust_level_locked).to eq(true) + end end describe "number_of_flags_given" do From d4b2a635c7519f88869ee2f897911f80e4bb121f Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Mon, 16 Jan 2017 16:57:46 +0800 Subject: [PATCH 0018/1355] FIX: Live updates for polls was broken. --- .../poll/assets/javascripts/initializers/extend-for-poll.js.es6 | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/poll/assets/javascripts/initializers/extend-for-poll.js.es6 b/plugins/poll/assets/javascripts/initializers/extend-for-poll.js.es6 index 09b8fdfa31..9fa2577af6 100644 --- a/plugins/poll/assets/javascripts/initializers/extend-for-poll.js.es6 +++ b/plugins/poll/assets/javascripts/initializers/extend-for-poll.js.es6 @@ -43,6 +43,7 @@ function initializePolls(api) { } }); this.set("pollsObject", this._polls); + _glued.forEach(g => g.queueRerender()); } } }); From b60e9b7330bd942290c2cc693abeb0a421b0f004 Mon Sep 17 00:00:00 2001 From: Leo McArdle Date: Mon, 16 Jan 2017 10:50:07 +0000 Subject: [PATCH 0019/1355] FIX: Handle img src starting with "//" in pull_hotlinked_images job --- app/jobs/regular/pull_hotlinked_images.rb | 4 ++-- spec/jobs/pull_hotlinked_images_spec.rb | 28 +++++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 spec/jobs/pull_hotlinked_images_spec.rb diff --git a/app/jobs/regular/pull_hotlinked_images.rb b/app/jobs/regular/pull_hotlinked_images.rb index fd8191f4a1..14bd57948e 100644 --- a/app/jobs/regular/pull_hotlinked_images.rb +++ b/app/jobs/regular/pull_hotlinked_images.rb @@ -26,7 +26,7 @@ module Jobs downloaded_urls = {} extract_images_from(post.cooked).each do |image| - src = image['src'] + src = original_src = image['src'] src = "http:" + src if src.start_with?("//") if is_valid_image_url(src) @@ -53,7 +53,7 @@ module Jobs # have we successfully downloaded that file? if downloaded_urls[src].present? url = downloaded_urls[src] - escaped_src = Regexp.escape(src) + escaped_src = Regexp.escape(original_src) # there are 6 ways to insert an image in a post # HTML tag - raw.gsub!(/src=["']#{escaped_src}["']/i, "src='#{url}'") diff --git a/spec/jobs/pull_hotlinked_images_spec.rb b/spec/jobs/pull_hotlinked_images_spec.rb new file mode 100644 index 0000000000..f9f5076678 --- /dev/null +++ b/spec/jobs/pull_hotlinked_images_spec.rb @@ -0,0 +1,28 @@ +require 'rails_helper' +require 'jobs/regular/pull_hotlinked_images' + +describe Jobs::PullHotlinkedImages do + + png = Base64.decode64("R0lGODlhAQABALMAAAAAAIAAAACAAICAAAAAgIAAgACAgMDAwICAgP8AAAD/AP//AAAA//8A/wD//wBiZCH5BAEAAA8ALAAAAAABAAEAAAQC8EUAOw==") + FakeWeb.register_uri(:get, "http://wiki.mozilla.org/images/2/2e/Longcat1.png", body: png) + SiteSetting.download_remote_images_to_local = true + + it 'replaces image src' do + post = Fabricate(:post, raw: "") + + Jobs::PullHotlinkedImages.new.execute(post_id: post.id) + post.reload + + expect(post.raw).to match(/^") + + Jobs::PullHotlinkedImages.new.execute(post_id: post.id) + post.reload + + expect(post.raw).to match(/^ Date: Mon, 16 Jan 2017 23:41:41 +0800 Subject: [PATCH 0022/1355] FIX: Sort is destructive and that is not what we want. --- plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6 b/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6 index e6d961a562..843278f700 100644 --- a/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6 +++ b/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6 @@ -135,10 +135,10 @@ createWidget('discourse-poll-standard-results', { html(attrs) { const { poll } = attrs; const options = poll.get('options'); - if (options) { + if (options) { const voters = poll.get('voters'); - const ordered = options.sort((a, b) => { + const ordered = _.clone(options).sort((a, b) => { if (a.votes < b.votes) { return 1; } else if (a.votes === b.votes) { From 86c52c72f66dc81a6fe4621a68af4d892d231749 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Mon, 16 Jan 2017 11:46:05 -0500 Subject: [PATCH 0023/1355] FIX: Deleting a user was not deleting their directory items --- app/models/user.rb | 1 + spec/services/user_destroyer_spec.rb | 20 +++++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/app/models/user.rb b/app/models/user.rb index 192dcdcf71..0efcb78c84 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -40,6 +40,7 @@ class User < ActiveRecord::Base has_many :warnings has_many :user_archived_messages, dependent: :destroy has_many :email_change_requests, dependent: :destroy + has_many :directory_items, dependent: :delete_all has_one :user_option, dependent: :destroy diff --git a/spec/services/user_destroyer_spec.rb b/spec/services/user_destroyer_spec.rb index a31a8ffaaa..55b94ff3fb 100644 --- a/spec/services/user_destroyer_spec.rb +++ b/spec/services/user_destroyer_spec.rb @@ -82,7 +82,25 @@ describe UserDestroyer do UserDestroyer.new(admin).destroy(user) expect(QueuedPost.where(user_id: user.id).count).to eq(0) end + end + context "with a directory item record" do + let(:user) { Fabricate(:user) } + let(:admin) { Fabricate(:admin) } + + it "removes the directory item" do + DirectoryItem.create!( + user: user, + period_type: 1, + likes_received: 0, + likes_given: 0, + topics_entered: 0, + topic_count: 0, + post_count: 0 + ) + UserDestroyer.new(admin).destroy(user) + expect(DirectoryItem.where(user_id: user.id).count).to eq(0) + end end context "with a draft" do @@ -146,7 +164,7 @@ describe UserDestroyer do it "deletes topics started by the deleted user" do spammer_topic = Fabricate(:topic, user: @user) - spammer_post = Fabricate(:post, user: @user, topic: spammer_topic) + Fabricate(:post, user: @user, topic: spammer_topic) destroy expect(spammer_topic.reload.deleted_at).not_to eq(nil) expect(spammer_topic.user_id).to eq(nil) From 3db3ee65b7dca6f0d7cfca14f3487d40fcf5efb0 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Mon, 16 Jan 2017 11:53:09 -0500 Subject: [PATCH 0024/1355] UX: Make it easier for plugins to add stuff before topics on the list --- .../templates/list/topic-list-item.raw.hbs | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/app/assets/javascripts/discourse/templates/list/topic-list-item.raw.hbs b/app/assets/javascripts/discourse/templates/list/topic-list-item.raw.hbs index bd444a8e55..05b387b719 100644 --- a/app/assets/javascripts/discourse/templates/list/topic-list-item.raw.hbs +++ b/app/assets/javascripts/discourse/templates/list/topic-list-item.raw.hbs @@ -5,15 +5,19 @@ {{/if}} - {{raw "topic-status" topic=topic}} - {{topic-link topic}} - {{#if topic.featured_link}} - {{topic-featured-link topic}} - {{/if}} - {{raw-plugin-outlet name="topic-list-after-title"}} - {{#if showTopicPostBadges}} - {{raw "topic-post-badges" unread=topic.unread newPosts=topic.displayNewPosts unseen=topic.unseen url=topic.lastUnreadUrl}} - {{/if}} + + {{raw-plugin-outlet name="topic-list-before-status"}} + {{raw "topic-status" topic=topic}} + {{topic-link topic}} + {{#if topic.featured_link}} + {{topic-featured-link topic}} + {{/if}} + {{raw-plugin-outlet name="topic-list-after-title"}} + {{#if showTopicPostBadges}} + {{raw "topic-post-badges" unread=topic.unread newPosts=topic.displayNewPosts unseen=topic.unseen url=topic.lastUnreadUrl}} + {{/if}} + + {{#if topic.tags}}
{{#each topic.visibleListTags as |tag|}} From 5f7a33efe5547c0714131395d50b3e33d65525ab Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Mon, 16 Jan 2017 12:02:32 -0500 Subject: [PATCH 0025/1355] FIX: [object Object] when hovering over view count --- app/assets/javascripts/discourse/helpers/application.js.es6 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/helpers/application.js.es6 b/app/assets/javascripts/discourse/helpers/application.js.es6 index 455a2b9fb9..17f37e9455 100644 --- a/app/assets/javascripts/discourse/helpers/application.js.es6 +++ b/app/assets/javascripts/discourse/helpers/application.js.es6 @@ -13,7 +13,7 @@ registerUnbound('number', (orig, params) => { let title = I18n.toNumber(orig, { precision: 0 }); if (params.numberKey) { - title = I18n.t(params.numberKey, { number: title }); + title = I18n.t(params.numberKey, { number: title, count: parseInt(title) }); } let classNames = 'number'; From 116e74325a41b601182c6b6e080ab123f8e5a066 Mon Sep 17 00:00:00 2001 From: Rafael dos Santos Silva Date: Mon, 16 Jan 2017 15:04:33 -0200 Subject: [PATCH 0026/1355] FIX: Topic Status should display on categories and topic view --- .../discourse/templates/components/latest-topic-list-item.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/templates/components/latest-topic-list-item.hbs b/app/assets/javascripts/discourse/templates/components/latest-topic-list-item.hbs index e42241f0bb..3d4aeab6a0 100644 --- a/app/assets/javascripts/discourse/templates/components/latest-topic-list-item.hbs +++ b/app/assets/javascripts/discourse/templates/components/latest-topic-list-item.hbs @@ -10,7 +10,7 @@ - {{topic-status topic=topic}} + {{raw "topic-status" topic=topic}} {{topic-link topic}} {{#if topic.featured_link}} {{topic-featured-link topic}} From fbf9172db8e70d6507960a37dd5d490660c3922c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Mon, 16 Jan 2017 19:53:31 +0100 Subject: [PATCH 0027/1355] FIX: log backups download/destroy staff action FIX: clean up junk left by the specs RENAME: 'backup_operation' to 'backup_create' to match other backup log types --- app/controllers/admin/backups_controller.rb | 12 +++++----- app/models/backup.rb | 4 +++- app/models/user_history.rb | 13 ++++++----- app/services/staff_action_logger.rb | 22 +++++++++++++++++-- config/locales/client.en.yml | 4 +++- .../admin/backups_controller_spec.rb | 22 ++++++++++++++----- 6 files changed, 56 insertions(+), 21 deletions(-) diff --git a/app/controllers/admin/backups_controller.rb b/app/controllers/admin/backups_controller.rb index feed2a709d..b0449ec606 100644 --- a/app/controllers/admin/backups_controller.rb +++ b/app/controllers/admin/backups_controller.rb @@ -32,7 +32,7 @@ class Admin::BackupsController < Admin::AdminController rescue BackupRestore::OperationRunningError render json: failed_json.merge(message: I18n.t("backup.operation_already_running")) else - StaffActionLogger.new(current_user).log_backup_operation + StaffActionLogger.new(current_user).log_backup_create render json: success_json end @@ -46,9 +46,9 @@ class Admin::BackupsController < Admin::AdminController # download def show - filename = params.fetch(:id) - if backup = Backup[filename] - headers['Content-Length'] = File.size(backup.path) + if backup = Backup[params.fetch(:id)] + StaffActionLogger.new(current_user).log_backup_download(backup) + headers['Content-Length'] = File.size(backup.path).to_s send_file backup.path else render nothing: true, status: 404 @@ -56,8 +56,8 @@ class Admin::BackupsController < Admin::AdminController end def destroy - backup = Backup[params.fetch(:id)] - if backup + if backup = Backup[params.fetch(:id)] + StaffActionLogger.new(current_user).log_backup_destroy(backup) backup.remove render nothing: true else diff --git a/app/models/backup.rb b/app/models/backup.rb index dfa5381219..d23d459d00 100644 --- a/app/models/backup.rb +++ b/app/models/backup.rb @@ -61,7 +61,9 @@ class Backup end def self.base_directory - File.join(Rails.root, "public", "backups", RailsMultisite::ConnectionManagement.current_db) + base_directory = File.join(Rails.root, "public", "backups", RailsMultisite::ConnectionManagement.current_db) + FileUtils.mkdir_p(base_directory) unless Dir.exists?(base_directory) + base_directory end def self.chunk_path(identifier, filename, chunk_number) diff --git a/app/models/user_history.rb b/app/models/user_history.rb index ddc4828663..50b616391c 100644 --- a/app/models/user_history.rb +++ b/app/models/user_history.rb @@ -51,7 +51,7 @@ class UserHistory < ActiveRecord::Base revoke_admin: 33, grant_moderation: 34, revoke_moderation: 35, - backup_operation: 36, + backup_create: 36, rate_limited_like: 37, # not used anymore revoke_email: 38, deactivate_user: 39, @@ -59,8 +59,9 @@ class UserHistory < ActiveRecord::Base lock_trust_level: 41, unlock_trust_level: 42, activate_user: 43, - change_readonly_mode: 44 - ) + change_readonly_mode: 44, + backup_download: 45, + backup_destroy: 46) end # Staff actions is a subset of all actions, used to audit actions taken by staff users. @@ -93,13 +94,15 @@ class UserHistory < ActiveRecord::Base :revoke_admin, :grant_moderation, :revoke_moderation, - :backup_operation, + :backup_create, :revoke_email, :deactivate_user, :lock_trust_level, :unlock_trust_level, :activate_user, - :change_readonly_mode] + :change_readonly_mode, + :backup_download, + :backup_destroy] end def self.staff_action_ids diff --git a/app/services/staff_action_logger.rb b/app/services/staff_action_logger.rb index c872fdd0f6..2bd24889fe 100644 --- a/app/services/staff_action_logger.rb +++ b/app/services/staff_action_logger.rb @@ -336,13 +336,31 @@ class StaffActionLogger })) end - def log_backup_operation(opts={}) + def log_backup_create(opts={}) UserHistory.create(params(opts).merge({ - action: UserHistory.actions[:backup_operation], + action: UserHistory.actions[:backup_create], ip_address: @admin.ip_address.to_s })) end + def log_backup_download(backup, opts={}) + raise Discourse::InvalidParameters.new(:backup) unless backup + UserHistory.create(params(opts).merge({ + action: UserHistory.actions[:backup_download], + ip_address: @admin.ip_address.to_s, + details: backup.filename + })) + end + + def log_backup_destroy(backup, opts={}) + raise Discourse::InvalidParameters.new(:backup) unless backup + UserHistory.create(params(opts).merge({ + action: UserHistory.actions[:backup_destroy], + ip_address: @admin.ip_address.to_s, + details: backup.filename + })) + end + def log_revoke_email(user, reason, opts={}) UserHistory.create(params(opts).merge({ action: UserHistory.actions[:revoke_email], diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 0620de21f3..5b38645a9e 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -2911,7 +2911,7 @@ en: revoke_admin: "revoke admin" grant_moderation: "grant moderation" revoke_moderation: "revoke moderation" - backup_operation: "backup operation" + backup_create: "create backup" deleted_tag: "deleted tag" renamed_tag: "renamed tag" revoke_email: "revoke email" @@ -2920,6 +2920,8 @@ en: activate_user: "activate user" deactivate_user: "deactivate user" change_readonly_mode: "change readonly mode" + backup_download: "download backup" + backup_destroy: "destroy backup" screened_emails: title: "Screened Emails" description: "When someone tries to create a new account, the following email addresses will be checked and the registration will be blocked, or some other action performed." diff --git a/spec/controllers/admin/backups_controller_spec.rb b/spec/controllers/admin/backups_controller_spec.rb index 270dc9a231..0669f667b3 100644 --- a/spec/controllers/admin/backups_controller_spec.rb +++ b/spec/controllers/admin/backups_controller_spec.rb @@ -90,16 +90,18 @@ describe Admin::BackupsController do describe ".show" do it "uses send_file to transmit the backup" do - FileUtils.mkdir_p Backup.base_directory - File.open(Backup.base_directory << "/" << backup_filename, "w") do |f| - f.write("hello") - end + path = File.join(Backup.base_directory, backup_filename) + File.open(path, "w") { |f| f.write("hello") } Backup.create_from_filename(backup_filename) + StaffActionLogger.any_instance.expects(:log_backup_download).once + get :show, id: backup_filename - expect(response.headers['Content-Length']).to eq(5) + File.delete(path) rescue nil + + expect(response.headers['Content-Length']).to eq("5") expect(response.headers['Content-Disposition']).to match(/attachment; filename/) end @@ -120,7 +122,11 @@ describe Admin::BackupsController do it "removes the backup if found" do Backup.expects(:[]).with(backup_filename).returns(b) b.expects(:remove) + + StaffActionLogger.any_instance.expects(:log_backup_destroy).with(b).once + xhr :delete, :destroy, id: backup_filename + expect(response).to be_success end @@ -223,8 +229,10 @@ describe Admin::BackupsController do it "should upload the file successfully" do described_class.any_instance.expects(:has_enough_space_on_disk?).returns(true) + filename = 'test_Site-0123456789.tar.gz' + xhr :post, :upload_backup_chunk, - resumableFilename: 'test_Site-0123456789.tar.gz', + resumableFilename: filename, resumableTotalSize: 1, resumableIdentifier: 'test', resumableChunkNumber: '1', @@ -234,6 +242,8 @@ describe Admin::BackupsController do expect(response.status).to eq(200) expect(response.body).to eq("") + + File.delete(File.join(Backup.base_directory, filename)) rescue nil end end end From 646b49e5ae5c8d5232e9cafe4b9171e2ceb7b6c2 Mon Sep 17 00:00:00 2001 From: James Kiesel Date: Tue, 17 Jan 2017 08:19:29 +1300 Subject: [PATCH 0028/1355] Expose reopenWidget through plugin api --- .../javascripts/discourse/lib/plugin-api.js.es6 | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/lib/plugin-api.js.es6 b/app/assets/javascripts/discourse/lib/plugin-api.js.es6 index b8beb0020d..62c984447f 100644 --- a/app/assets/javascripts/discourse/lib/plugin-api.js.es6 +++ b/app/assets/javascripts/discourse/lib/plugin-api.js.es6 @@ -5,7 +5,7 @@ import { addButton } from 'discourse/widgets/post-menu'; import { includeAttributes } from 'discourse/lib/transform-post'; import { addToolbarCallback } from 'discourse/components/d-editor'; import { addWidgetCleanCallback } from 'discourse/components/mount-widget'; -import { createWidget, decorateWidget, changeSetting } from 'discourse/widgets/widget'; +import { createWidget, reopenWidget, decorateWidget, changeSetting } from 'discourse/widgets/widget'; import { onPageChange } from 'discourse/lib/page-tracker'; import { preventCloak } from 'discourse/widgets/post-stream'; import { h } from 'virtual-dom'; @@ -307,6 +307,16 @@ class PluginApi { return createWidget(name, args); } + /** + * Exposes the widget update ability to plugins. Updates the widget + * registry for the given widget name to include the properties on args + * See `reopenWidget` in `discourse/widgets/widget` from more ifo. + **/ + + reopenWidget(name, args) { + return reopenWidget(name, args); + } + /** * Adds a property that can be summed for calculating the flag counter **/ From 1d8882a1dd6a9c60841fd22c88705f153ff493c1 Mon Sep 17 00:00:00 2001 From: James Kiesel Date: Tue, 17 Jan 2017 08:20:57 +1300 Subject: [PATCH 0029/1355] oops semicolons --- app/assets/javascripts/discourse/widgets/widget.js.es6 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/discourse/widgets/widget.js.es6 b/app/assets/javascripts/discourse/widgets/widget.js.es6 index 45bdac0624..4eddd1867c 100644 --- a/app/assets/javascripts/discourse/widgets/widget.js.es6 +++ b/app/assets/javascripts/discourse/widgets/widget.js.es6 @@ -126,14 +126,14 @@ export function createWidget(name, opts) { } export function reopenWidget(name, opts) { - let existing = _registry[name] + let existing = _registry[name]; if (!existing) { console.error(`Could not find widget ${name} in registry`); return } - Object.keys(opts).forEach(k => existing.prototype[k] = opts[k]) - return existing + Object.keys(opts).forEach(k => existing.prototype[k] = opts[k]); + return existing; } export default class Widget { From 60a9030d25d8f48102d4fbc975766d39d6fb3793 Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Mon, 16 Jan 2017 16:33:14 -0500 Subject: [PATCH 0030/1355] UX: don't show search and hamburger menus to anon visitors on login-required sites --- .../discourse/widgets/header.js.es6 | 2 + .../acceptance/login-required-test.js.es6 | 15 -------- test/javascripts/widgets/header-test.js.es6 | 38 +++++++++++++++++++ 3 files changed, 40 insertions(+), 15 deletions(-) diff --git a/app/assets/javascripts/discourse/widgets/header.js.es6 b/app/assets/javascripts/discourse/widgets/header.js.es6 index 03fe6a6901..e4abd88493 100644 --- a/app/assets/javascripts/discourse/widgets/header.js.es6 +++ b/app/assets/javascripts/discourse/widgets/header.js.es6 @@ -104,6 +104,8 @@ createWidget('header-icons', { }, html(attrs) { + if (this.siteSettings.login_required && !this.currentUser) { return []; } + const hamburger = this.attach('header-dropdown', { title: 'hamburger_menu', icon: 'bars', diff --git a/test/javascripts/acceptance/login-required-test.js.es6 b/test/javascripts/acceptance/login-required-test.js.es6 index abdb2eea94..4bbec697a4 100644 --- a/test/javascripts/acceptance/login-required-test.js.es6 +++ b/test/javascripts/acceptance/login-required-test.js.es6 @@ -26,19 +26,4 @@ test("redirect", () => { andThen(() => { ok(invisible('.login-modal'), "it closes the login modal"); }); - - click('#search-button'); - andThen(() => { - ok(exists('.login-modal'), "clicking search opens the login modal"); - }); - - click('.modal-header .close'); - andThen(() => { - ok(invisible('.login-modal'), "it closes the login modal"); - }); - - click('#toggle-hamburger-menu'); - andThen(() => { - ok(exists('.login-modal'), "site map opens the login modal"); - }); }); diff --git a/test/javascripts/widgets/header-test.js.es6 b/test/javascripts/widgets/header-test.js.es6 index f3a7b8f907..71676a0338 100644 --- a/test/javascripts/widgets/header-test.js.es6 +++ b/test/javascripts/widgets/header-test.js.es6 @@ -35,3 +35,41 @@ widgetTest('sign up / login buttons', { }); } }); + +widgetTest('anon when login required', { + template: '{{mount-widget widget="header" showCreateAccount="showCreateAccount" showLogin="showLogin" args=args}}', + anonymous: true, + + setup() { + this.set('args', { canSignUp: true }); + this.on('showCreateAccount', () => this.signupShown = true); + this.on('showLogin', () => this.loginShown = true); + this.siteSettings.login_required = true; + }, + + test(assert) { + assert.ok(exists('button.login-button')); + assert.ok(exists('button.sign-up-button')); + assert.ok(!exists('#search-button')); + assert.ok(!exists('#toggle-hamburger-menu')); + } +}); + +widgetTest('logged in when login required', { + template: '{{mount-widget widget="header" showCreateAccount="showCreateAccount" showLogin="showLogin" args=args}}', + + setup() { + this.set('args', { canSignUp: true }); + this.on('showCreateAccount', () => this.signupShown = true); + this.on('showLogin', () => this.loginShown = true); + this.siteSettings.login_required = true; + }, + + test(assert) { + assert.ok(!exists('button.login-button')); + assert.ok(!exists('button.sign-up-button')); + assert.ok(exists('#search-button')); + assert.ok(exists('#toggle-hamburger-menu')); + assert.ok(exists('#current-user')); + } +}); From 17da0bd11f821b2ec82cf4232bdd5b03155ce91d Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Mon, 16 Jan 2017 15:54:51 +0800 Subject: [PATCH 0031/1355] UX: Display wiki icon on post edits indicator. --- .../widgets/post-edits-indicator.js.es6 | 16 +++++++++++++--- .../javascripts/discourse/widgets/post.js.es6 | 18 ------------------ .../stylesheets/common/base/discourse.scss | 9 --------- .../stylesheets/common/base/topic-post.scss | 9 +++++---- app/assets/stylesheets/desktop/topic-post.scss | 4 ---- app/assets/stylesheets/mobile/topic-post.scss | 2 +- config/locales/client.en.yml | 4 +--- test/javascripts/widgets/post-test.js.es6 | 10 +++++----- 8 files changed, 25 insertions(+), 47 deletions(-) diff --git a/app/assets/javascripts/discourse/widgets/post-edits-indicator.js.es6 b/app/assets/javascripts/discourse/widgets/post-edits-indicator.js.es6 index 9eac352d6b..f0d3cc1141 100644 --- a/app/assets/javascripts/discourse/widgets/post-edits-indicator.js.es6 +++ b/app/assets/javascripts/discourse/widgets/post-edits-indicator.js.es6 @@ -22,12 +22,22 @@ export default createWidget('post-edits-indicator', { }, html(attrs) { - const contents = [attrs.version - 1, ' ', iconNode('pencil')]; + let icon = 'pencil'; + let titleKey = 'post.last_edited_on'; const updatedAt = new Date(attrs.updated_at); + let className = this.historyHeat(updatedAt); - const title = `${I18n.t('post.last_edited_on')} ${longDate(updatedAt)}`; + if (attrs.wiki) { + icon = 'pencil-square-o'; + titleKey = 'post.wiki_last_edited_on'; + className = `${className} wiki`; + } + + const contents = [attrs.version - 1, ' ', iconNode(icon)]; + + const title = `${I18n.t(titleKey)} ${longDate(updatedAt)}`; return h('a', { - className: this.historyHeat(updatedAt), + className, attributes: { title } }, contents); }, diff --git a/app/assets/javascripts/discourse/widgets/post.js.es6 b/app/assets/javascripts/discourse/widgets/post.js.es6 index 7e9fd93496..f92dd1d954 100644 --- a/app/assets/javascripts/discourse/widgets/post.js.es6 +++ b/app/assets/javascripts/discourse/widgets/post.js.es6 @@ -110,20 +110,6 @@ createWidget('post-avatar', { } }); - -createWidget('wiki-edit-button', { - tagName: 'div.post-info.wiki', - title: 'post.wiki.about', - - html() { - return iconNode('pencil-square-o'); - }, - - click() { - this.sendWidgetAction('editPost'); - } -}); - createWidget('post-email-indicator', { tagName: 'div.post-info.via-email', @@ -185,10 +171,6 @@ createWidget('post-meta-data', { result.push(this.attach('post-edits-indicator', attrs)); } - if (attrs.wiki) { - result.push(this.attach('wiki-edit-button', attrs)); - } - if (attrs.multiSelect) { result.push(this.attach('select-post', attrs)); } diff --git a/app/assets/stylesheets/common/base/discourse.scss b/app/assets/stylesheets/common/base/discourse.scss index 1429c55124..58cd75db00 100644 --- a/app/assets/stylesheets/common/base/discourse.scss +++ b/app/assets/stylesheets/common/base/discourse.scss @@ -80,15 +80,6 @@ body { .coldmap-low { color: dark-light-choose(scale-color($primary, $lightness: 50%), scale-color($secondary, $lightness: 50%)) !important; } - .heatmap-high { - color: #fe7a15 !important; - } - .heatmap-med { - color: #cf7721 !important; - } - .heatmap-low { - color: #9b764f !important; - } #loading-message { position: absolute; diff --git a/app/assets/stylesheets/common/base/topic-post.scss b/app/assets/stylesheets/common/base/topic-post.scss index b946073cc8..22345f03d9 100644 --- a/app/assets/stylesheets/common/base/topic-post.scss +++ b/app/assets/stylesheets/common/base/topic-post.scss @@ -220,16 +220,17 @@ aside.quote { } .post-info { - &.wiki, &.via-email, &.whisper { + &.via-email, &.whisper { margin-right: 5px; i.fa { font-size: 1em; } } - &.wiki { - cursor: pointer; - color: #408040; + + .wiki { + color: green !important; } + &.via-email { color: dark-light-choose(scale-color($primary, $lightness: 70%), scale-color($secondary, $lightness: 30%)); } diff --git a/app/assets/stylesheets/desktop/topic-post.scss b/app/assets/stylesheets/desktop/topic-post.scss index 75680a1061..f060add16f 100644 --- a/app/assets/stylesheets/desktop/topic-post.scss +++ b/app/assets/stylesheets/desktop/topic-post.scss @@ -155,10 +155,6 @@ nav.post-controls { box-shadow: none; } - &.wikied { - color: green; - } - &.bookmark {padding: 8px 11px; } .read-icon { diff --git a/app/assets/stylesheets/mobile/topic-post.scss b/app/assets/stylesheets/mobile/topic-post.scss index 92c004d064..c8e2d1ffad 100644 --- a/app/assets/stylesheets/mobile/topic-post.scss +++ b/app/assets/stylesheets/mobile/topic-post.scss @@ -76,7 +76,7 @@ button { margin:10px 0 10px 0; } &.has-like {color: $love;} - &.wikied { color: green; } + .read-icon { &:before { font-family: "FontAwesome"; diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 0620de21f3..17e68926ed 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -1700,6 +1700,7 @@ en: edit: "Editing {{link}} {{replyAvatar}} {{username}}" edit_reason: "Reason: " post_number: "post {{number}}" + wiki_last_edited_on: "wiki last edited on" last_edited_on: "post last edited on" reply_as_new_topic: "Reply as linked Topic" continue_discussion: "Continuing the discussion from {{postLink}}:" @@ -1752,9 +1753,6 @@ en: via_auto_generated_email: "this post arrived via an auto generated email" whisper: "this post is a private whisper for moderators" - wiki: - about: "this post is a wiki" - archetypes: save: 'Save Options' diff --git a/test/javascripts/widgets/post-test.js.es6 b/test/javascripts/widgets/post-test.js.es6 index 67886da768..559ac87960 100644 --- a/test/javascripts/widgets/post-test.js.es6 +++ b/test/javascripts/widgets/post-test.js.es6 @@ -17,15 +17,15 @@ widgetTest('basic elements', { }); widgetTest('wiki', { - template: '{{mount-widget widget="post" args=args editPost="editPost"}}', + template: '{{mount-widget widget="post" args=args showHistory="showHistory"}}', setup() { - this.set('args', { wiki: true }); - this.on('editPost', () => this.editPostCalled = true); + this.set('args', { wiki: true, version: 2, canViewEditHistory: true }); + this.on('showHistory', () => this.historyShown = true); }, test(assert) { - click('.post-info.wiki'); + click('.post-info .wiki'); andThen(() => { - assert.ok(this.editPostCalled, 'clicking the wiki icon edits the post'); + assert.ok(this.historyShown, 'clicking the wiki icon displays the post history'); }); } }); From de6ca4f736b91d57b0b0e60f86669a9eb7bece66 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Tue, 17 Jan 2017 11:01:33 +0800 Subject: [PATCH 0032/1355] FIX: Pressing enter when searchContext is enabled should just trigger a search. --- app/assets/javascripts/discourse/widgets/search-menu.js.es6 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/assets/javascripts/discourse/widgets/search-menu.js.es6 b/app/assets/javascripts/discourse/widgets/search-menu.js.es6 index f8d626f456..5a561d2a27 100644 --- a/app/assets/javascripts/discourse/widgets/search-menu.js.es6 +++ b/app/assets/javascripts/discourse/widgets/search-menu.js.es6 @@ -191,6 +191,8 @@ export default createWidget('search-menu', { if (url) { this.sendWidgetEvent('linkClicked'); DiscourseURL.routeTo(url); + } else if (searchData.contextEnabled) { + this.triggerSearch(); } } }); From ee58c4cd94d58047ec4096440fa3d6d8c4aadbc9 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Tue, 17 Jan 2017 12:35:48 +0800 Subject: [PATCH 0033/1355] FIX: Don't close search menu on link clicked when context is enabled. --- app/assets/javascripts/discourse/widgets/header.js.es6 | 4 ++-- app/assets/javascripts/discourse/widgets/link.js.es6 | 2 +- .../discourse/widgets/search-menu-results.js.es6 | 9 +++++++-- .../javascripts/discourse/widgets/search-menu.js.es6 | 3 ++- app/assets/javascripts/discourse/widgets/widget.js.es6 | 4 ++-- 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/app/assets/javascripts/discourse/widgets/header.js.es6 b/app/assets/javascripts/discourse/widgets/header.js.es6 index e4abd88493..1ccdfb0e65 100644 --- a/app/assets/javascripts/discourse/widgets/header.js.es6 +++ b/app/assets/javascripts/discourse/widgets/header.js.es6 @@ -225,8 +225,8 @@ export default createWidget('header', { this.state.searchVisible = false; }, - linkClickedEvent() { - this.closeAll(); + linkClickedEvent(attrs) { + if (!attrs.searchContextEnabled) this.closeAll(); this.updateHighlight(); }, diff --git a/app/assets/javascripts/discourse/widgets/link.js.es6 b/app/assets/javascripts/discourse/widgets/link.js.es6 index 9ba519fff4..429403268d 100644 --- a/app/assets/javascripts/discourse/widgets/link.js.es6 +++ b/app/assets/javascripts/discourse/widgets/link.js.es6 @@ -79,7 +79,7 @@ export default createWidget('link', { e.preventDefault(); return this.sendWidgetAction(this.attrs.action, this.attrs.actionParam); } else { - this.sendWidgetEvent('linkClicked'); + this.sendWidgetEvent('linkClicked', this.attrs); } return DiscourseURL.routeToTag($(e.target).closest('a')[0]); diff --git a/app/assets/javascripts/discourse/widgets/search-menu-results.js.es6 b/app/assets/javascripts/discourse/widgets/search-menu-results.js.es6 index 2eddf7f87f..56ac661370 100644 --- a/app/assets/javascripts/discourse/widgets/search-menu-results.js.es6 +++ b/app/assets/javascripts/discourse/widgets/search-menu-results.js.es6 @@ -25,7 +25,8 @@ function createSearchResult(type, linkField, fn) { return h('li', this.attach('link', { href: r.get(linkField), contents: () => fn.call(this, r, attrs.term), - className: 'search-link' + className: 'search-link', + searchContextEnabled: this.attrs.searchContextEnabled })); }); } @@ -98,7 +99,11 @@ createWidget('search-menu-results', { } return [ - h('ul', this.attach(rt.componentName, { results: rt.results, term: attrs.term })), + h('ul', this.attach(rt.componentName, { + searchContextEnabled: this.attrs.searchContextEnabled, + results: rt.results, + term: attrs.term + })), h('div.no-results', more) ]; }); diff --git a/app/assets/javascripts/discourse/widgets/search-menu.js.es6 b/app/assets/javascripts/discourse/widgets/search-menu.js.es6 index 5a561d2a27..c50a314e45 100644 --- a/app/assets/javascripts/discourse/widgets/search-menu.js.es6 +++ b/app/assets/javascripts/discourse/widgets/search-menu.js.es6 @@ -125,7 +125,8 @@ export default createWidget('search-menu', { results.push(this.attach('search-menu-results', { term: searchData.term, noResults: searchData.noResults, results: searchData.results, - invalidTerm: searchData.invalidTerm })); + invalidTerm: searchData.invalidTerm, + searchContextEnabled: searchData.contextEnabled })); } } diff --git a/app/assets/javascripts/discourse/widgets/widget.js.es6 b/app/assets/javascripts/discourse/widgets/widget.js.es6 index f3f5d95356..0b3e169a46 100644 --- a/app/assets/javascripts/discourse/widgets/widget.js.es6 +++ b/app/assets/javascripts/discourse/widgets/widget.js.es6 @@ -298,12 +298,12 @@ export default class Widget { return result; } - sendWidgetEvent(name) { + sendWidgetEvent(name, attrs) { const methodName = `${name}Event`; return this.rerenderResult(() => { const widget = this._findAncestorWithProperty(methodName); if (widget) { - return widget[methodName](); + return widget[methodName](attrs); } }); } From fc52624aac658eef63f5b61bb1846463216d49e6 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Tue, 17 Jan 2017 16:31:57 +0800 Subject: [PATCH 0034/1355] Fix undefined `attrs`. --- app/assets/javascripts/discourse/widgets/header.js.es6 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/widgets/header.js.es6 b/app/assets/javascripts/discourse/widgets/header.js.es6 index 1ccdfb0e65..fe6ea451dd 100644 --- a/app/assets/javascripts/discourse/widgets/header.js.es6 +++ b/app/assets/javascripts/discourse/widgets/header.js.es6 @@ -226,7 +226,7 @@ export default createWidget('header', { }, linkClickedEvent(attrs) { - if (!attrs.searchContextEnabled) this.closeAll(); + if (!(attrs && attrs.searchContextEnabled)) this.closeAll(); this.updateHighlight(); }, From 1e1e40c75f55de0f545b54e250abe19552b47a34 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Tue, 17 Jan 2017 18:40:46 +0800 Subject: [PATCH 0035/1355] Dump the page's content as well on failure. --- spec/phantom_js/smoke_test.js | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/phantom_js/smoke_test.js b/spec/phantom_js/smoke_test.js index 6cac5534f5..1d43de145e 100644 --- a/spec/phantom_js/smoke_test.js +++ b/spec/phantom_js/smoke_test.js @@ -46,6 +46,7 @@ page.waitFor = function(desc, fn, cb) { if (diff > TIMEOUT) { console.log("FAILED: " + desc + " - " + diff + "ms"); page.render('/tmp/failed.png'); + console.log('Content:' + page.content); cb(false); } else { setTimeout(check, 25); From 11641fb3cd9b40ffa7801a72416c8b35bb810565 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 17 Jan 2017 11:11:09 -0500 Subject: [PATCH 0036/1355] Whitelist the alternative `raw` url --- app/assets/javascripts/discourse/lib/url.js.es6 | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/javascripts/discourse/lib/url.js.es6 b/app/assets/javascripts/discourse/lib/url.js.es6 index 6aca579c13..4dbf9cb25f 100644 --- a/app/assets/javascripts/discourse/lib/url.js.es6 +++ b/app/assets/javascripts/discourse/lib/url.js.es6 @@ -8,6 +8,7 @@ const TOPIC_REGEXP = /\/t\/([^\/]+)\/(\d+)\/?(\d+)?/; // We can add links here that have server side responses but not client side. const SERVER_SIDE_ONLY = [ /^\/posts\/\d+\/raw/, + /^\/raw\/\d+/, /\.rss$/, /\.json/, ]; From f641655f1b0d393abe53eb0e9224290b15b0deaf Mon Sep 17 00:00:00 2001 From: Ryan Mulligan Date: Tue, 17 Jan 2017 09:51:39 -0800 Subject: [PATCH 0037/1355] add more SERVER_SIDE_ONLY routes; use pathname in matching --- app/assets/javascripts/discourse/lib/url.js.es6 | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/discourse/lib/url.js.es6 b/app/assets/javascripts/discourse/lib/url.js.es6 index 6aca579c13..b48e21bbdd 100644 --- a/app/assets/javascripts/discourse/lib/url.js.es6 +++ b/app/assets/javascripts/discourse/lib/url.js.es6 @@ -7,9 +7,14 @@ const TOPIC_REGEXP = /\/t\/([^\/]+)\/(\d+)\/?(\d+)?/; // We can add links here that have server side responses but not client side. const SERVER_SIDE_ONLY = [ + /^\/assets\//, + /^\/uploads\//, + /^\/stylesheets\//, + /^\/site_customizations\//, + /^\/raw\//, /^\/posts\/\d+\/raw/, /\.rss$/, - /\.json/, + /\.json$/, ]; let _jumpScheduled = false; @@ -121,8 +126,9 @@ const DiscourseURL = Ember.Object.extend({ return; } + const pathname = path.replace(/(https?\:)?\/\/[^\/]+/, ''); const serverSide = SERVER_SIDE_ONLY.some(r => { - if (path.match(r)) { + if (pathname.match(r)) { document.location = path; return true; } From bfc52a8e6f8eba65bb1be973d730e37a4879ec01 Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Tue, 17 Jan 2017 15:14:58 -0500 Subject: [PATCH 0038/1355] FIX: long titles need a max-width in composer when replying on desktop view --- app/assets/stylesheets/desktop/compose.scss | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/app/assets/stylesheets/desktop/compose.scss b/app/assets/stylesheets/desktop/compose.scss index 620a31a022..0f9bfb589b 100644 --- a/app/assets/stylesheets/desktop/compose.scss +++ b/app/assets/stylesheets/desktop/compose.scss @@ -373,6 +373,20 @@ .reply-to { margin-bottom: 10px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + color: $tertiary; + + @media (min-width: 1101px) { + max-width: 80%; + } + @media (max-width: 1100px) { + max-width: 500px; + } + @media (max-width: 600px) { + max-width: 300px; + } i { color: dark-light-choose(scale-color($primary, $lightness: 50%), scale-color($secondary, $lightness: 50%)); From 59dfb51a35ce37c91d34e9c1817c6e536735f1bb Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Wed, 18 Jan 2017 12:20:23 +0800 Subject: [PATCH 0039/1355] FIX: Don't change automatic group name if localized name has been taken. --- app/models/group.rb | 8 +++++++- spec/models/group_spec.rb | 39 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/app/models/group.rb b/app/models/group.rb index b97c34356c..fa6cb204d1 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -161,7 +161,13 @@ class Group < ActiveRecord::Base # don't allow shoddy localization to break this localized_name = I18n.t("groups.default_names.#{name}") validator = UsernameValidator.new(localized_name) - group.name = validator.valid_format? ? localized_name : name + + group.name = + if !Group.where(name: localized_name).exists? && validator.valid_format? + localized_name + else + name + end # the everyone group is special, it can include non-users so there is no # way to have the membership in a table diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb index 8a6477ed73..86f79597c3 100644 --- a/spec/models/group_spec.rb +++ b/spec/models/group_spec.rb @@ -154,9 +154,42 @@ describe Group do end - it "makes sure the everyone group is not visible" do - g = Group.refresh_automatic_group!(:everyone) - expect(g.visible).to eq(false) + describe '.refresh_automatic_group!' do + it "makes sure the everyone group is not visible" do + g = Group.refresh_automatic_group!(:everyone) + expect(g.visible).to eq(false) + end + + it "uses the localized name if name has not been taken" do + begin + default_locale = SiteSetting.default_locale + I18n.locale = SiteSetting.default_locale = 'de' + + group = Group.refresh_automatic_group!(:staff) + + expect(group.name).to_not eq('staff') + expect(group.name).to eq(I18n.t('groups.default_names.staff')) + ensure + I18n.locale = SiteSetting.default_locale = default_locale + end + end + + it "does not use the localized name if name has already been taken" do + begin + default_locale = SiteSetting.default_locale + I18n.locale = SiteSetting.default_locale = 'de' + + another_group = Fabricate(:group, + name: I18n.t('groups.default_names.staff') + ) + + group = Group.refresh_automatic_group!(:staff) + + expect(group.name).to eq('staff') + ensure + I18n.locale = SiteSetting.default_locale = default_locale + end + end end it "Correctly handles removal of primary group" do From 706b4f6b9faf1f820a294e83f82b0b5a5dba0475 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Wed, 18 Jan 2017 13:39:34 +0800 Subject: [PATCH 0040/1355] FEATURE: Remap group mentions when group name has been changed. --- app/jobs/regular/update_group_mentions.rb | 14 +++++++ app/models/group.rb | 12 ++++++ app/services/group_mentions_updater.rb | 14 +++++++ spec/services/group_mentions_updater_spec.rb | 39 ++++++++++++++++++++ 4 files changed, 79 insertions(+) create mode 100644 app/jobs/regular/update_group_mentions.rb create mode 100644 app/services/group_mentions_updater.rb create mode 100644 spec/services/group_mentions_updater_spec.rb diff --git a/app/jobs/regular/update_group_mentions.rb b/app/jobs/regular/update_group_mentions.rb new file mode 100644 index 0000000000..67ea356d3b --- /dev/null +++ b/app/jobs/regular/update_group_mentions.rb @@ -0,0 +1,14 @@ +module Jobs + + class UpdateGroupMentions < Jobs::Base + + def execute(args) + group = Group.find_by(id: args[:group_id]) + return unless group + + previous_group_name = args[:previous_name] + + GroupMentionsUpdater.update(group.name, previous_group_name) + end + end +end diff --git a/app/models/group.rb b/app/models/group.rb index fa6cb204d1..618d71cf31 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -22,6 +22,9 @@ class Group < ActiveRecord::Base after_save :update_primary_group after_save :update_title + after_save :enqueue_update_mentions_job, + if: Proc.new { |g| g.name_was && g.name_changed? } + after_save :expire_cache after_destroy :expire_cache @@ -493,6 +496,15 @@ SQL builder.exec end end + + private + + def enqueue_update_mentions_job + Jobs.enqueue(:update_group_mentions, + previous_name: self.name_was, + group_id: self.id + ) + end end # == Schema Information diff --git a/app/services/group_mentions_updater.rb b/app/services/group_mentions_updater.rb new file mode 100644 index 0000000000..0bd07a6425 --- /dev/null +++ b/app/services/group_mentions_updater.rb @@ -0,0 +1,14 @@ +class GroupMentionsUpdater + def self.update(current_name, previous_name) + Post.where( + "cooked LIKE '%class=\"mention-group\"%' AND raw LIKE :previous_name", + previous_name: "%@#{previous_name}%" + ).find_in_batches do |posts| + + posts.each do |post| + post.raw.gsub!(/(^|\s)(@#{previous_name})(\s|$)/, "\\1@#{current_name}\\3") + post.save! + end + end + end +end diff --git a/spec/services/group_mentions_updater_spec.rb b/spec/services/group_mentions_updater_spec.rb new file mode 100644 index 0000000000..688e672c04 --- /dev/null +++ b/spec/services/group_mentions_updater_spec.rb @@ -0,0 +1,39 @@ +require 'rails_helper' + +RSpec.describe GroupMentionsUpdater do + let(:post) { Fabricate(:post) } + + describe '.update' do + it 'should update valid group mentions' do + new_group_name = 'awesome_team' + old_group_name = 'team' + + [ + ["@#{old_group_name} is awesome!", "@#{new_group_name} is awesome!"], + ["This @#{old_group_name} is awesome!", "This @#{new_group_name} is awesome!"], + ["Mention us @ @#{old_group_name}", "Mention us @ @#{new_group_name}"], + ].each do |raw, expected_raw| + group = Fabricate(:group, name: old_group_name) + post.update!(raw: raw) + group.update!(name: new_group_name) + post.reload + + expect(post.raw_mentions).to eq([new_group_name]) + expect(post.raw).to eq(expected_raw) + + group.destroy! + end + end + + it 'should not update invalid group mentions' do + group = Fabricate(:group, name: 'team') + post.update!(raw: 'This is not valid@team.com') + + expect(post.reload.raw_mentions).to eq([]) + + group.update!(name: 'new_team_name') + + expect(post.reload.raw_mentions).to eq([]) + end + end +end From 49515d5a38fc69b39b20c35d207ef3145a6dfc29 Mon Sep 17 00:00:00 2001 From: Jeff Atwood Date: Wed, 18 Jan 2017 01:09:10 -0800 Subject: [PATCH 0041/1355] minor copyedit on invites --- config/locales/server.en.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 6468a337a0..a54482a929 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -1694,9 +1694,8 @@ en: > %{site_title} -- %{site_description} - Message from %{invitee_name}: - %{user_custom_message} + > %{user_custom_message} If you're interested, click the link below: @@ -1730,9 +1729,8 @@ en: > > %{site_description} - Message from %{invitee_name}: - %{user_custom_message} + > %{user_custom_message} If you're interested, click the link below: From 095ec9cf6384dca4010fdc3247b714ebd63f45f6 Mon Sep 17 00:00:00 2001 From: Jeff Atwood Date: Wed, 18 Jan 2017 01:11:49 -0800 Subject: [PATCH 0042/1355] minor css change to user page --- app/assets/stylesheets/desktop/user.scss | 1 - config/locales/server.en.yml | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/desktop/user.scss b/app/assets/stylesheets/desktop/user.scss index 5ec7d0ecd8..7b4527c9f5 100644 --- a/app/assets/stylesheets/desktop/user.scss +++ b/app/assets/stylesheets/desktop/user.scss @@ -142,7 +142,6 @@ .user-content { padding: 10px 8px; background-color: $secondary; - border: 1px solid dark-light-diff($primary, $secondary, 90%, -60%); margin-bottom: 10px; box-sizing: border-box; diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index a54482a929..749c69bc26 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -1694,6 +1694,7 @@ en: > %{site_title} -- %{site_description} + With this note > %{user_custom_message} @@ -1729,6 +1730,7 @@ en: > > %{site_description} + With this note > %{user_custom_message} From d4b08d8bc670d84dc5fedd94e38192334fd20a3b Mon Sep 17 00:00:00 2001 From: Jeff Atwood Date: Wed, 18 Jan 2017 02:50:52 -0800 Subject: [PATCH 0043/1355] tweak to signup hints --- config/locales/client.en.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 63f5a786d3..b65332aa71 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -696,7 +696,7 @@ en: email: title: "Email" - instructions: "Never shown to the public" + instructions: "never shown to the public" ok: "We will email you to confirm" invalid: "Please enter a valid email address" authenticated: "Your email has been authenticated by {{provider}}" @@ -707,13 +707,13 @@ en: name: title: "Name" - instructions: "Your full name (optional)" + instructions: "your full name (optional)" instructions_required: "Your full name" too_short: "Your name is too short" ok: "Your name looks good" username: title: "Username" - instructions: "Unique, no spaces, short" + instructions: "unique, no spaces, short" short_instructions: "People can mention you as @{{username}}" available: "Your username is available" global_match: "Email matches the registered username" @@ -842,7 +842,7 @@ en: same_as_username: "Your password is the same as your username." same_as_email: "Your password is the same as your email." ok: "Your password looks good." - instructions: "At least %{count} characters." + instructions: "at least %{count} characters" summary: title: "Summary" From af0a0017c1f4bd398472c069f9c5b12419cca66e Mon Sep 17 00:00:00 2001 From: Jeff Atwood Date: Wed, 18 Jan 2017 03:00:43 -0800 Subject: [PATCH 0044/1355] Omit needless words --- config/locales/server.en.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 749c69bc26..461bb46c96 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -566,8 +566,8 @@ en: password_reset: no_token: "Sorry, that password change link is too old. Select the Log In button and use 'I forgot my password' to get a new link." - choose_new: "Please choose a new password" - choose: "Please choose a password" + choose_new: "Choose a new password" + choose: "Choose a password" update: 'Update Password' save: 'Set Password' title: 'Reset Password' From 01c8974c363301a806d180b95b5a5a446f3f707e Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Wed, 18 Jan 2017 20:10:49 +0530 Subject: [PATCH 0045/1355] typo --- lib/tasks/posts.rake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tasks/posts.rake b/lib/tasks/posts.rake index 324d3ded1d..7c9c3407c2 100644 --- a/lib/tasks/posts.rake +++ b/lib/tasks/posts.rake @@ -121,7 +121,7 @@ task 'posts:remap', [:find, :replace] => [:environment] do |_,args| find = args[:find] replace = args[:replace] if !find || !replace - puts "ERROR: Expecting rake posts:rebake_match[find,replace]" + puts "ERROR: Expecting rake posts:remap[find,replace]" exit 1 end From 61d4c1203e6a8d0f92de1f32a942fd2d4dcae46d Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Wed, 18 Jan 2017 11:37:43 -0500 Subject: [PATCH 0046/1355] FEATURE: group avatar flair shows on topic participants list, and participant avatars can have custom styles --- .../discourse/widgets/avatar-flair.js.es6 | 5 ++- .../discourse/widgets/topic-map.js.es6 | 8 ++++ .../stylesheets/common/base/topic-post.scss | 38 ++++++++++++++----- .../stylesheets/desktop/topic-post.scss | 2 +- app/assets/stylesheets/mobile/topic-post.scss | 2 +- .../topic_post_count_serializer.rb | 20 +++++++++- lib/topic_view.rb | 2 +- 7 files changed, 63 insertions(+), 14 deletions(-) diff --git a/app/assets/javascripts/discourse/widgets/avatar-flair.js.es6 b/app/assets/javascripts/discourse/widgets/avatar-flair.js.es6 index 64aa2218e4..1c489367c2 100644 --- a/app/assets/javascripts/discourse/widgets/avatar-flair.js.es6 +++ b/app/assets/javascripts/discourse/widgets/avatar-flair.js.es6 @@ -38,7 +38,10 @@ createWidget('avatar-flair', { html(attrs) { if (this.isIcon(attrs)) { - return [h('i', { className: 'fa ' + attrs.primary_group_flair_url })]; + return [h('i', { + className: 'fa ' + attrs.primary_group_flair_url, + attributes: { style: attrs.primary_group_flair_color ? 'color: #' + Handlebars.Utils.escapeExpression(attrs.primary_group_flair_color) + '; ' : '' } + })]; } else { return []; } diff --git a/app/assets/javascripts/discourse/widgets/topic-map.js.es6 b/app/assets/javascripts/discourse/widgets/topic-map.js.es6 index 4cbcfae591..7d4c89c0b3 100644 --- a/app/assets/javascripts/discourse/widgets/topic-map.js.es6 +++ b/app/assets/javascripts/discourse/widgets/topic-map.js.es6 @@ -27,6 +27,10 @@ createWidget('topic-map-show-links', { }); createWidget('topic-participant', { + buildClasses(attrs) { + if (attrs.primary_group_name) { return `group-${attrs.primary_group_name}`; } + }, + html(attrs, state) { const linkContents = [avatarImg('medium', { username: attrs.username, template: attrs.avatar_template })]; @@ -34,6 +38,10 @@ createWidget('topic-participant', { linkContents.push(h('span.post-count', attrs.post_count.toString())); } + if (attrs.primary_group_flair_url || attrs.primary_group_flair_bg_color) { + linkContents.push(this.attach('avatar-flair', attrs)); + } + return h('a.poster.trigger-user-card', { className: state.toggled ? 'toggled' : null, attributes: { title: attrs.username, 'data-user-card': attrs.username } diff --git a/app/assets/stylesheets/common/base/topic-post.scss b/app/assets/stylesheets/common/base/topic-post.scss index 22345f03d9..4c82cb4f8e 100644 --- a/app/assets/stylesheets/common/base/topic-post.scss +++ b/app/assets/stylesheets/common/base/topic-post.scss @@ -158,15 +158,17 @@ aside.quote { position: relative; } -.topic-avatar .avatar-flair, .avatar-flair-preview .avatar-flair, .user-card-avatar .avatar-flair { - display: flex; - align-items: center; - justify-content: center; - background-repeat: no-repeat; - background-position: center; - position: absolute; - bottom: 0; - right: -6px; +.topic-avatar, .avatar-flair-preview, .user-card-avatar, .topic-map .poster { + .avatar-flair { + display: flex; + align-items: center; + justify-content: center; + background-repeat: no-repeat; + background-position: center; + position: absolute; + bottom: 0; + right: -6px; + } } .topic-avatar .avatar-flair, .avatar-flair-preview .avatar-flair { background-size: 20px 20px; @@ -197,6 +199,24 @@ aside.quote { font-size: 24px; } } +.topic-map .poster .avatar-flair { + right: 0; + background-size: 12px 12px; + width: 16px; + height: 16px; + bottom: -3px; + &.rounded { + background-size: 12px 12px; + border-radius: 8px; + width: 16px; + height: 16px; + bottom: -2px; + right: 0; + } + .fa { + font-size: 14px; + } +} .topic-avatar .poster-avatar-extra { display: none; } diff --git a/app/assets/stylesheets/desktop/topic-post.scss b/app/assets/stylesheets/desktop/topic-post.scss index f060add16f..219d31569f 100644 --- a/app/assets/stylesheets/desktop/topic-post.scss +++ b/app/assets/stylesheets/desktop/topic-post.scss @@ -329,7 +329,7 @@ a.star { } .post-count { position: absolute; - right: 3px; + right: 0; border-radius: 100px; padding: 4px 5px 2px 5px; text-align: center; diff --git a/app/assets/stylesheets/mobile/topic-post.scss b/app/assets/stylesheets/mobile/topic-post.scss index c8e2d1ffad..475d35b0c9 100644 --- a/app/assets/stylesheets/mobile/topic-post.scss +++ b/app/assets/stylesheets/mobile/topic-post.scss @@ -221,7 +221,7 @@ a.star { } .post-count { position: absolute; - right: 3px; + right: 0; border-radius: 100px; padding: 4px 5px 2px 5px; text-align: center; diff --git a/app/serializers/topic_post_count_serializer.rb b/app/serializers/topic_post_count_serializer.rb index c780d12031..70cac7fa57 100644 --- a/app/serializers/topic_post_count_serializer.rb +++ b/app/serializers/topic_post_count_serializer.rb @@ -1,6 +1,7 @@ class TopicPostCountSerializer < BasicUserSerializer - attributes :post_count + attributes :post_count, :primary_group_name, + :primary_group_flair_url, :primary_group_flair_color, :primary_group_flair_bg_color def id object[:user].id @@ -14,4 +15,21 @@ class TopicPostCountSerializer < BasicUserSerializer object[:post_count] end + def primary_group_name + return nil unless object[:user].primary_group_id + object[:user]&.primary_group&.name + end + + def primary_group_flair_url + object[:user]&.primary_group&.flair_url + end + + def primary_group_flair_bg_color + object[:user]&.primary_group&.flair_bg_color + end + + def primary_group_flair_color + object[:user]&.primary_group&.flair_color + end + end diff --git a/lib/topic_view.rb b/lib/topic_view.rb index 93bda88857..81e6999796 100644 --- a/lib/topic_view.rb +++ b/lib/topic_view.rb @@ -280,7 +280,7 @@ class TopicView def participants @participants ||= begin participants = {} - User.where(id: post_counts_by_user.map {|k,v| k}).each {|u| participants[u.id] = u} + User.where(id: post_counts_by_user.map {|k,v| k}).includes(:primary_group).each {|u| participants[u.id] = u} participants end end From bcbcfa2078d760e5ecbbdaabd912cccb7d0ae5a3 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Wed, 18 Jan 2017 22:03:12 +0530 Subject: [PATCH 0047/1355] Update Translations --- config/locales/client.ar.yml | 3 - config/locales/client.bs_BA.yml | 2 - config/locales/client.cs.yml | 3 - config/locales/client.da.yml | 3 - config/locales/client.de.yml | 14 +- config/locales/client.es.yml | 18 +- config/locales/client.et.yml | 4 - config/locales/client.fa_IR.yml | 3 - config/locales/client.fi.yml | 11 +- config/locales/client.fr.yml | 7 +- config/locales/client.gl.yml | 3 - config/locales/client.he.yml | 16 +- config/locales/client.it.yml | 4 - config/locales/client.ja.yml | 3 - config/locales/client.ko.yml | 13 +- config/locales/client.nb_NO.yml | 17 +- config/locales/client.nl.yml | 17 +- config/locales/client.pl_PL.yml | 3 - config/locales/client.pt.yml | 4 - config/locales/client.pt_BR.yml | 4 - config/locales/client.ro.yml | 4 - config/locales/client.ru.yml | 37 ++- config/locales/client.sk.yml | 3 - config/locales/client.sq.yml | 3 - config/locales/client.sv.yml | 4 - config/locales/client.te.yml | 3 - config/locales/client.tr_TR.yml | 98 ++++++- config/locales/client.uk.yml | 1 - config/locales/client.ur.yml | 35 +++ config/locales/client.vi.yml | 3 - config/locales/client.zh_CN.yml | 8 +- config/locales/client.zh_TW.yml | 24 +- config/locales/server.ar.yml | 20 -- config/locales/server.bs_BA.yml | 18 -- config/locales/server.de.yml | 115 ++++++-- config/locales/server.es.yml | 68 +---- config/locales/server.et.yml | 1 - config/locales/server.fa_IR.yml | 40 +-- config/locales/server.fi.yml | 69 +++-- config/locales/server.fr.yml | 57 +--- config/locales/server.he.yml | 101 ++++++- config/locales/server.ja.yml | 19 -- config/locales/server.ko.yml | 20 -- config/locales/server.nb_NO.yml | 9 +- config/locales/server.nl.yml | 42 +++ config/locales/server.pl_PL.yml | 2 + config/locales/server.pt.yml | 54 ---- config/locales/server.pt_BR.yml | 23 -- config/locales/server.ro.yml | 54 ---- config/locales/server.ru.yml | 328 ++++++++++++++++++++-- config/locales/server.sq.yml | 44 --- config/locales/server.sv.yml | 48 ---- config/locales/server.tr_TR.yml | 52 ---- config/locales/server.ur.yml | 1 + config/locales/server.vi.yml | 20 -- config/locales/server.zh_CN.yml | 58 +--- config/locales/server.zh_TW.yml | 262 +++++++++-------- plugins/poll/config/locales/server.nl.yml | 4 +- public/503.ur.html | 8 +- 59 files changed, 1021 insertions(+), 891 deletions(-) diff --git a/config/locales/client.ar.yml b/config/locales/client.ar.yml index c70963c9b8..be52c0a93f 100644 --- a/config/locales/client.ar.yml +++ b/config/locales/client.ar.yml @@ -2127,7 +2127,6 @@ ar: many: "المشاهدات" other: "المشاهدات" replies: "الردود" - views_long: "هذا الموضوع قد تمت مشاهدته {{number}} مرات" activity: "النشاط" likes: "اعجابات" likes_lowercase: @@ -2456,8 +2455,6 @@ ar: backups: "النسخ الاحتياطية" traffic_short: "المرور" traffic: "طلبات تطبيقات الويب" - page_views: "طلبات API " - page_views_short: "طلبات API " show_traffic_report: "عرض تقرير مرور مفصل" reports: today: "اليوم" diff --git a/config/locales/client.bs_BA.yml b/config/locales/client.bs_BA.yml index 540965f483..c99081e1dc 100644 --- a/config/locales/client.bs_BA.yml +++ b/config/locales/client.bs_BA.yml @@ -1246,7 +1246,6 @@ bs_BA: original_post: "Originalni Odgovor" views: "Pregleda" replies: "Odgovora" - views_long: "ova tema je pregledana {{number}} puta" activity: "Aktivnost" likes: "Lajkovi" likes_long: "postoji {{number}} lajkova u ovoj temi" @@ -1339,7 +1338,6 @@ bs_BA: space_free: "{{size}} slobodno" uploads: "Učitavanja" backups: "backupovi" - page_views_short: "API pozivi" show_traffic_report: "Pokaži detaljan izvještaj prometa" reports: today: "Today" diff --git a/config/locales/client.cs.yml b/config/locales/client.cs.yml index 876d31c75d..0631c278f3 100644 --- a/config/locales/client.cs.yml +++ b/config/locales/client.cs.yml @@ -1891,7 +1891,6 @@ cs: few: "zobrazení" other: "zobrazení" replies: "Odpovědi" - views_long: "toto téma bylo zobrazeno {{number}}krát" activity: "Aktivita" likes: "Líbí se" likes_lowercase: @@ -2195,8 +2194,6 @@ cs: backups: "zálohy" traffic_short: "Provoz" traffic: "Webové požadavky na aplikaci" - page_views: "API požadavky" - page_views_short: "API požadavky" show_traffic_report: "Zobrazit detailní zprávu o provozu" reports: today: "Dnes" diff --git a/config/locales/client.da.yml b/config/locales/client.da.yml index 9a3c5e0fe7..6ea55ddc40 100644 --- a/config/locales/client.da.yml +++ b/config/locales/client.da.yml @@ -1715,7 +1715,6 @@ da: one: "visning" other: "visninger" replies: "Svar" - views_long: "dette emne er blevet vist {{number}} gange" activity: "Aktivitet" likes: "Likes" likes_lowercase: @@ -1965,8 +1964,6 @@ da: backups: "backups" traffic_short: "Trafik" traffic: "Applikation web forespørgsler" - page_views: "API Forespørgsler" - page_views_short: "API Forespørgsler" show_traffic_report: "Vist detaljeret trafik rapport" reports: today: "I dag" diff --git a/config/locales/client.de.yml b/config/locales/client.de.yml index 0dd4935720..51f6da0df7 100644 --- a/config/locales/client.de.yml +++ b/config/locales/client.de.yml @@ -749,6 +749,7 @@ de: none: "Du hast hier noch niemanden eingeladen. Du kannst einzelne Einladungen versenden, oder eine Reihe von Leuten auf einmal einladen, indem du eine CSV-Datei hochlädst." text: "Masseneinladung aus Datei" success: "Die Datei wurde erfolgreich hochgeladen. Du erhältst eine Nachricht, sobald der Vorgang abgeschlossen ist." + error: "Entschuldige, die Datei sollte im CSV-Format sein." password: title: "Passwort" too_short: "Dein Passwort ist zu kurz." @@ -1883,7 +1884,9 @@ de: one: "Aufruf" other: "Aufrufe" replies: "Antworten" - views_long: "dieses Thema wurde {{number}} mal betrachtet" + views_long: + one: "dieses Thema wurde 1-mal betrachtet" + other: "dieses Thema wurde {{number}}-mal betrachtet" activity: "Aktivität" likes: "Likes" likes_lowercase: @@ -2188,8 +2191,8 @@ de: backups: "Backups" traffic_short: "Traffic" traffic: "Web Requests der Applikation" - page_views: "API Requests" - page_views_short: "API Requests" + page_views: "Seitenaufrufe" + page_views_short: "Seitenaufrufe" show_traffic_report: "Zeige detaillierten Traffic-Bericht" reports: today: "Heute" @@ -2676,6 +2679,11 @@ de: deleted_tag: "Schlagwort gelöscht" renamed_tag: "Schlagwort umbenannt" revoke_email: "E-Mail widerrufen" + lock_trust_level: "Vertrauensstufe sperren" + unlock_trust_level: "Vertrauensstufe entsperren" + activate_user: "Benutzer aktivieren" + deactivate_user: "Benutzer deaktivieren" + change_readonly_mode: "Nur-Lesen-Modus ändern" screened_emails: title: "Gefilterte E-Mails" description: "Wenn jemand ein Konto erstellt, werden die folgenden E-Mail-Adressen überprüft und es wird die Anmeldung blockiert oder eine andere Aktion ausgeführt." diff --git a/config/locales/client.es.yml b/config/locales/client.es.yml index 8c492be56b..f8596ce4d8 100644 --- a/config/locales/client.es.yml +++ b/config/locales/client.es.yml @@ -358,7 +358,7 @@ es: logs: "No hay registros para este grupo." add: "Añadir" join: "Unirse al grupo" - leave: "Salirse del grupo" + leave: "Salir del grupo" request: "Solicitar unirse al grupo" automatic_group: Grupo automático closed_group: Grupo cerrado @@ -749,6 +749,7 @@ es: none: "Aún no has invitado a nadie aquí. Puedes enviar invitaciones individuales, o invitar varias personas a la vez subiendo un archivo CSV." text: "Archivo de Invitación en Masa" success: "Archivo subido correctamente, se te notificará con un mensaje cuando se complete el proceso." + error: "Lo sentimos, el archivo debería tener formato csv." password: title: "Contraseña" too_short: "Tu contraseña es demasiada corta." @@ -1887,7 +1888,9 @@ es: one: "visita" other: "visitas" replies: "Respuestas" - views_long: "este tema se ha visto {{number}} veces" + views_long: + one: "este tema se ha visto 1 vez" + other: "este tema se ha visto {{number}} veces" activity: "Actividad" likes: "Likes" likes_lowercase: @@ -2192,8 +2195,8 @@ es: backups: "backups" traffic_short: "Tráfico" traffic: "Peticiones web de la app" - page_views: "Peticiones de API" - page_views_short: "Peticiones de API" + page_views: "Páginas vistas" + page_views_short: "Páginas vistas" show_traffic_report: "Mostrar informe detallado del tráfico" reports: today: "Hoy" @@ -2336,7 +2339,7 @@ es: warn_local_payload_url: "Parece que estás estableciendo el webhook a una url local. El evento enviado a una dirección local podría causar algún efecto secundario o comportamientos inesperados. ¿Continuar?" secret_invalid: "Secret no debe tener espacios en blanco." secret_too_short: "Secret debería tener al menos 12 caracteres." - secret_placeholder: "Una cadena opcional, para generar firma" + secret_placeholder: "Una cadena opcional, utilizada para generar una firma" event_type_missing: "Necesitas establecer al menos un tipo de evento." content_type: "Tipo de contenido" secret: "Secret" @@ -2680,6 +2683,11 @@ es: deleted_tag: "etiqueta eliminada" renamed_tag: "etiqueta renombrada" revoke_email: "revocar email" + lock_trust_level: "Bloqueó el nivel de confianza" + unlock_trust_level: "Desbloqueó el nivel de confianza" + activate_user: "activó a un usuario" + deactivate_user: "desactivó a un usuario" + change_readonly_mode: "cambio a modo de sólo lectura" screened_emails: title: "Correos bloqueados" description: "Cuando alguien trata de crear una cuenta nueva, los siguientes correos serán revisados y el registro será bloqueado, o alguna otra acción será realizada." diff --git a/config/locales/client.et.yml b/config/locales/client.et.yml index f61c6a0af9..ce8595abe5 100644 --- a/config/locales/client.et.yml +++ b/config/locales/client.et.yml @@ -1885,7 +1885,6 @@ et: one: "vaatamine" other: "vaatamisi" replies: "Vastuseid" - views_long: "seda teemat on vaadatud {{number}} korda" activity: "Aktiivsus" likes: "Meeldimisi" likes_lowercase: @@ -2192,8 +2191,6 @@ et: backups: "varundusi" traffic_short: "Liiklus" traffic: "Rakenduse veebipäringud" - page_views: "API päringuid" - page_views_short: "API päringuid" show_traffic_report: "Näita liikluse detailraportit" reports: today: "Täna" @@ -2336,7 +2333,6 @@ et: warn_local_payload_url: "Näib, et püüad seada veebihaaki lokaalsele URL-le. Lokaalsele aadressile saadetud sündmus võib esile kusuda kõrvalnähte või ootamatusi. Kas jätkame?" secret_invalid: "Salavõti ei tohi sisaldada tühikuid." secret_too_short: "Salavõti peab olema vähemalt 12 sümbolit pikk." - secret_placeholder: "Valikuline tekst, kasutatakse allkirja genereerimiseks" event_type_missing: "Pead seadistama vähemalt ühe sündmuse liigi." content_type: "Sisutüüp" secret: "Salavõti" diff --git a/config/locales/client.fa_IR.yml b/config/locales/client.fa_IR.yml index f5ea1fc915..a7af2fce1c 100644 --- a/config/locales/client.fa_IR.yml +++ b/config/locales/client.fa_IR.yml @@ -1411,7 +1411,6 @@ fa_IR: views_lowercase: other: "بازدیدها" replies: "پاسخ‌ها" - views_long: "از این موضوع {{number}} بار بازدید شده" activity: "فعالیت" likes: "پسندها" likes_lowercase: @@ -1543,8 +1542,6 @@ fa_IR: backups: "پشتیبان ها" traffic_short: "ترافیک" traffic: "درخواست های نرم افزار وب" - page_views: "درخواست های API" - page_views_short: "درخواست های API" show_traffic_report: "نمایش دقیق گزارش ترافیک" reports: today: "امروز" diff --git a/config/locales/client.fi.yml b/config/locales/client.fi.yml index 7e192e7492..a37bce8f29 100644 --- a/config/locales/client.fi.yml +++ b/config/locales/client.fi.yml @@ -748,6 +748,7 @@ fi: none: "Et ole kutsunut vielä ketään tänne. Voit lähettää yksittäisiä kutsuja tai kutsua joukon ihmisiä kerralla lataamalla CSV-tiedoston." text: "Lähetä massakutsu tiedostosta" success: "Tiedoston lähettäminen onnistui. Saat viestin, kun prosessi on valmis." + error: "Pahoittelut, tiedoston tulee olla CSV-muodossa." password: title: "Salasana" too_short: "Salasanasi on liian lyhyt." @@ -1886,7 +1887,9 @@ fi: one: "katselu" other: "katselut" replies: "Vastauksia" - views_long: "tätä ketjua on katseltu {{number}} kertaa" + views_long: + one: "ketjua on katseltu yhden kerran" + other: "ketjua on katseltu {{number}} kertaa" activity: "Toiminta" likes: "Tykkäykset" likes_lowercase: @@ -2191,8 +2194,8 @@ fi: backups: "varmuuskopiot" traffic_short: "Liikenne" traffic: "Sovelluksen web-pyynnöt" - page_views: "API pyynnöt" - page_views_short: "API pyynnöt" + page_views: "Sivunkatselut" + page_views_short: "Sivunkatselut" show_traffic_report: "Näytä yksityiskohtainen liikenneraportti" reports: today: "Tänään" @@ -2618,6 +2621,8 @@ fi: deleted_tag: "poistettu tunniste" renamed_tag: "uudelleen nimetty tunniste" revoke_email: "peru sähköpostiosoite" + unlock_trust_level: "poista luottamustason lukitus" + activate_user: "aktivoi käyttäjä" screened_emails: title: "Seulottavat sähköpostiosoitteet" description: "Uuden käyttäjätunnuksen luonnin yhteydessä annettua sähköpostiosoitetta verrataan alla olevaan listaan ja tarvittaessa tunnuksen luonti joko estetään tai suoritetaan muita toimenpiteitä." diff --git a/config/locales/client.fr.yml b/config/locales/client.fr.yml index 87ef615c99..313adca253 100644 --- a/config/locales/client.fr.yml +++ b/config/locales/client.fr.yml @@ -749,6 +749,7 @@ fr: none: "Vous n'avez invité personne pour le moment. Vous pouvez envoyer des invitations individuelles ou inviter plusieurs personnes à la fois en envoyant un fichier CSV." text: "Invitation massive depuis un fichier" success: "Le fichier a été correctement importé. Vous serez notifié par message privé lorsque le traitement sera terminé." + error: "Désolé, le fichier doit être au format CSV." password: title: "Mot de passe" too_short: "Votre mot de passe est trop court." @@ -1887,7 +1888,6 @@ fr: one: "vue" other: "vues" replies: "Réponses" - views_long: "ce sujet a été vu {{number}} fois" activity: "Activité" likes: "J'aime" likes_lowercase: @@ -2192,8 +2192,6 @@ fr: backups: "sauvegardes" traffic_short: "Trafic" traffic: "Requêtes Web Application" - page_views: "Requêtes API" - page_views_short: "Requêtes API" show_traffic_report: "Afficher le rapport de trafic détaillé" reports: today: "Aujourd'hui" @@ -2336,7 +2334,6 @@ fr: warn_local_payload_url: "Il semble que vous essayez de configurer le Webhook vers une URL locale. Les événements délivrés à une adresse locale peuvent causer des effets de bords ou des comportements inattendus. Continuer ?" secret_invalid: "La clé secrète ne doit pas contenir d'espaces." secret_too_short: "La clé secrète doit contenir au moins 12 caractères." - secret_placeholder: "Une chaîne de caractères facultative pour générer la signature" event_type_missing: "Vous devez configurer au moins un type d'évènement." content_type: "Type de contenu" secret: "Clé secrète" @@ -2575,7 +2572,7 @@ fr: send_test: "Envoyer un courriel de test" sent_test: "Envoyé !" delivery_method: "Méthode d'envoi" - preview_digest_desc: "Prévisualiser le contenu des courriels hebdomadaires sommaires envoyés aux utilisateurs inactifs." + preview_digest_desc: "Prévisualiser le contenu des résumés par courriel envoyés aux utilisateurs inactifs." refresh: "Rafraîchir" send_digest_label: "Envoyer ce résultat à :" send_digest: "Envoyer" diff --git a/config/locales/client.gl.yml b/config/locales/client.gl.yml index 0473816158..08373c1cbe 100644 --- a/config/locales/client.gl.yml +++ b/config/locales/client.gl.yml @@ -1568,7 +1568,6 @@ gl: one: "vista" other: "vistas" replies: "Respostas" - views_long: "este tema visitouse {{number}} veces" activity: "Actividade" likes: "Gústames" likes_lowercase: @@ -1700,8 +1699,6 @@ gl: backups: "copias de seguranza" traffic_short: "Tráfico" traffic: "Peticións web de aplicativos" - page_views: "Peticións API" - page_views_short: "Peticións API" show_traffic_report: "Amosar o informe detallado do tráfico" reports: today: "Hoxe" diff --git a/config/locales/client.he.yml b/config/locales/client.he.yml index 10c90c7b8f..384de1961d 100644 --- a/config/locales/client.he.yml +++ b/config/locales/client.he.yml @@ -749,6 +749,7 @@ he: none: "עדיין לא הזמנתם לכאן אף אחד. תוכלו לשלוח הזמנות פרטניות, או להזמין כמה אנשים יחד על ידי העלאת קובץ CSV." text: "הזמנה קבוצתית מקובץ" success: "העלאת הקובץ החלה בהצלחה, תקבלו התראה באמצעות מסר כאשר התהליך יושלם." + error: "מצטערים, הקובץ צריך להיות בפורמט csv." password: title: "סיסמה" too_short: "הסיסמה שלך קצרה מידי." @@ -1889,7 +1890,9 @@ he: one: "צפיה" other: "צפיות" replies: "תגובות" - views_long: "הנושא הזה נצפה {{number}} פעמים" + views_long: + one: "נושא זה נצפה פעם 1" + other: "נושא זה נצפה {{number}} פעמים" activity: "פעילות" likes: "לייקים" likes_lowercase: @@ -2194,8 +2197,8 @@ he: backups: "גיבויים" traffic_short: "תנועה" traffic: "בקשות יישום web" - page_views: "בקשות API" - page_views_short: "בקשות API" + page_views: "צפיות-דף" + page_views_short: "צפיות-דף" show_traffic_report: "הצגת דו\"ח תנועה מפורט" reports: today: "היום" @@ -2338,7 +2341,7 @@ he: warn_local_payload_url: "נראה שאתם מנסים להגדיר webhook ל url מקומי. אירוע שנשלח לכתובת מקומית עלול לגרום לתופעות בלתי-צפויות מראש. האם להמשיך?" secret_invalid: "אסור שהסוד יכיל תווי רווח כלשהם." secret_too_short: "הסוד אמור להכיל לפחות 12 תווים." - secret_placeholder: "מחרוזת אופציונלית, משמשת ליצירת חתימות" + secret_placeholder: "מחרוזת אופציונלית, משמשת ליצירת חתימה" event_type_missing: "אתם צריכים לקבוע לפחות סוג אירועים אחד." content_type: "סוג תוכן" secret: "סוד" @@ -2682,6 +2685,11 @@ he: deleted_tag: "תגית נמחקה" renamed_tag: "תגית שונתה" revoke_email: "שללו מייל" + lock_trust_level: "נעילת רמת אמון" + unlock_trust_level: "שחרור רמת אמון מנעילה" + activate_user: "הפעלת משתמש/ת" + deactivate_user: "ניטרול משתמש/ת" + change_readonly_mode: "שינוי מצב קריאה בלבד" screened_emails: title: "הודעות דואר מסוננות" description: "כשמישהו מנסה ליצור חשבון חדש, כתובות הדואר האלקטרוני הבאות ייבדקו וההרשמה תחסם או שיבוצו פעולות אחרות." diff --git a/config/locales/client.it.yml b/config/locales/client.it.yml index f1acec4aec..b971589b97 100644 --- a/config/locales/client.it.yml +++ b/config/locales/client.it.yml @@ -1874,7 +1874,6 @@ it: one: "visita" other: "visite" replies: "Risposte" - views_long: "questo argomento è stato visto {{number}} volte" activity: "Attività" likes: "Mi piace" likes_lowercase: @@ -2179,8 +2178,6 @@ it: backups: "backup" traffic_short: "Traffico" traffic: "Richieste web dell'applicazione" - page_views: "Richieste API" - page_views_short: "Richieste API" show_traffic_report: "Mostra rapporto di traffico dettagliato" reports: today: "Oggi" @@ -2323,7 +2320,6 @@ it: warn_local_payload_url: "Stai impostando un webhook che punta ad un indirizzo locale. Eventi inviati ad un indirizzo locale possono causare effetti collaterali o risultati inaspettati. Vuoi continuare?" secret_invalid: "La chiave segreta non può contenere spazi vuoti." secret_too_short: "La chiave segreta deve contenere almeno 12 caratteri." - secret_placeholder: "Una stringa opzionale, usata per generare la firma" event_type_missing: "Devi impostare almeno un tipo di evento." content_type: "Tipo Contenuto" secret: "Chiave segreta" diff --git a/config/locales/client.ja.yml b/config/locales/client.ja.yml index 890b564449..17527c9036 100644 --- a/config/locales/client.ja.yml +++ b/config/locales/client.ja.yml @@ -1474,7 +1474,6 @@ ja: views_lowercase: other: " 閲覧" replies: "返信" - views_long: "このトピックは{{number}}回閲覧されました" activity: "アクティビティ" likes: "いいね!" likes_lowercase: @@ -1659,8 +1658,6 @@ ja: backups: "バックアップ" traffic_short: "トラフィック" traffic: "Application web requests" - page_views: "API Requests" - page_views_short: "API Requests" show_traffic_report: "Show Detailed Traffic Report" reports: today: "今日" diff --git a/config/locales/client.ko.yml b/config/locales/client.ko.yml index 90200ca37d..39797de845 100644 --- a/config/locales/client.ko.yml +++ b/config/locales/client.ko.yml @@ -755,13 +755,13 @@ ko: complete_email_not_found: "%{email}과 일치하는 계정이 없습니다." login: title: "로그인" - username: "사용자" + username: "아이디" password: "비밀번호" - email_placeholder: "이메일 주소 또는 사용자 이름" + email_placeholder: "이메일 주소 또는 아이디" caps_lock_warning: "Caps Lock 켜짐" error: "알 수없는 오류" rate_limit: "다시 로그인 하기전에 잠시만 기다려주세요." - blank_username_or_password: "이메일 또는 사용자명과 비밀번호를 입력해 주세요." + blank_username_or_password: "이메일 또는 아이디, 비밀번호를 입력해 주세요." reset_password: '암호 재설정' logging_in: "로그인 중.." or: "또는" @@ -1508,7 +1508,6 @@ ko: views_lowercase: other: "조회" replies: "답변" - views_long: "이 주제는 {{number}}번 읽혔습니다." activity: "활동" likes: "좋아요" likes_lowercase: @@ -1639,8 +1638,6 @@ ko: backups: "백업" traffic_short: "트래픽" traffic: "어플리케이션 웹 요청" - page_views: "API 요청" - page_views_short: "API 응답" show_traffic_report: "자세한 트래픽 리포트 보기" reports: today: "오늘" @@ -1965,7 +1962,7 @@ ko: none: "로그가 없습니다." filters: title: "필터" - user_placeholder: "사용자명" + user_placeholder: "아이디" address_placeholder: "name@example.com" type_placeholder: "다이제스트, 가입..." reply_key_placeholder: "답글 키" @@ -1988,7 +1985,7 @@ ko: do_nothing: "아무것도 하지 않음" staff_actions: title: "스태프 기록" - instructions: "사용자 이름을 클릭하여 목록에서 차단하십시오. 프로필 사진을 클릭하여 사용자 페이지로 갑니다." + instructions: "사용자 아이디을 클릭하여 목록에서 차단하십시오. 프로필 사진을 클릭하여 사용자 페이지로 갑니다." clear_filters: "전체 보기" staff_user: "스태프 사용자" target_user: "타겟 사용자" diff --git a/config/locales/client.nb_NO.yml b/config/locales/client.nb_NO.yml index 04f0801a4a..2f27326f78 100644 --- a/config/locales/client.nb_NO.yml +++ b/config/locales/client.nb_NO.yml @@ -749,6 +749,7 @@ nb_NO: none: "Du har ikke invitert noen hit enda. Du kan sende individuelle invitasjoner, eller du kan invitere flere personer samtidig ved å laste opp en CSV-fil." text: "Masseinvitasjon fra fil" success: "Filen er lastet opp, du vil motta en melding når prosessesen er ferdig" + error: "Beklager, filen skal være i CSV-format." password: title: "Passord" too_short: "Passordet ditt er for kort" @@ -1887,7 +1888,9 @@ nb_NO: one: "visninger" other: "visninger" replies: "Svar" - views_long: "dette emnet har blit sett {{number}} ganger" + views_long: + one: "dette emnet er vist 1 gang" + other: "dette emnet er vist {{number}} ganger" activity: "Aktivitet" likes: "Liker" likes_lowercase: @@ -2192,8 +2195,8 @@ nb_NO: backups: "sikkerhetskopier" traffic_short: "Trafikk" traffic: "Applikasjon webforespørsler" - page_views: "API forespørsler" - page_views_short: "API forespørsler" + page_views: "Sidevisninger" + page_views_short: "Sidevisninger" show_traffic_report: "Vis detaljert trafikkrapport" reports: today: "I dag" @@ -2336,7 +2339,7 @@ nb_NO: warn_local_payload_url: "Det ser ut som du prøver å sende webhooken til en lokal URL. Hendelser som sendes til lokale adresser kan gi sideeffekter eller føre til uventet oppførsel. Fortsette?" secret_invalid: "Delt hemmelighet kan ikke inneholde blanke tegn." secret_too_short: "Delt hemmelighet må være minst 12 tegn." - secret_placeholder: "En valgfri streng, brukt til å generere signatur" + secret_placeholder: "En valgfri streng som brukes for å lage signatur" event_type_missing: "Du må sette opp minst en type hendelse." content_type: "Content Type" secret: "Delt hemmelighet" @@ -2680,6 +2683,8 @@ nb_NO: deleted_tag: "slettet stikkord" renamed_tag: "stikkord med nytt navn" revoke_email: "tilbakekall e-post" + lock_trust_level: "lås tillitsnivå" + unlock_trust_level: "lås opp tillitsnivå" screened_emails: title: "Kontrollerte e-poster" description: "Når noen forsøker å lage en ny konto, vil de følgende e-postadressene bli sjekket, og registreringen vil bli blokkert, eller en annen handling vil bli utført." @@ -3038,7 +3043,7 @@ nb_NO: error_help: "Se følgende lenker for hjelp til spørringer for merker." bad_count_warning: header: "ADVARSEL!" - text: "Det er manglende grant samples. Dette skjer når merkesøket returnerer bruker-ID-er eller innleggs-ID-er som ikke eksisterer. Dette kan føre til uventede resultater senere - dobbeltsjekk søket ditt." + text: "Det er manglende grant samples. Dette skjer når merke-søket returnerer bruker-IDer eller innleggs-ID-er som ikke eksisterer. Dette kan føre til uventede resultater senere - dobbeltsjekk søket ditt." no_grant_count: "Ingen merker å tildele." grant_count: one: "Ett merke å tildele." @@ -3062,7 +3067,7 @@ nb_NO: sample: "Bruk følgende HTML-kode på siden din for å bygge inn Discourse-emner. Erstatt ERSTATT_MEG med kanonisk nettadresse fra siden du bygger den inn i." title: "Innbygging" host: "Tillatte verter" - path_whitelist: "Hvitliste for søkesti" + path_whitelist: "Tillatte stier" edit: "rediger" category: "Legg til innlegg i kategori" add_host: "Legg til vert" diff --git a/config/locales/client.nl.yml b/config/locales/client.nl.yml index c17803f668..b628324cff 100644 --- a/config/locales/client.nl.yml +++ b/config/locales/client.nl.yml @@ -321,7 +321,19 @@ nl: total_rows: one: "1 lid" other: "%{count} leden" + group_histories: + actions: + change_group_setting: "Wijzig groepsinstellingen" + add_user_to_group: "Gebruiker toevoegen" + remove_user_from_group: "Gebruiker verwijderen" + make_user_group_owner: "Maak eigenaar" + remove_user_as_group_owner: "Eigenaar intrekken" groups: + edit: + title: 'Wijzig groep' + full_name: 'Volledige Naam' + add_members: "Voeg leden toe" + delete_member_confirm: "Verwijder '%{username}' uit de '%{group}' groep?" add: "Voeg toe" selector_placeholder: "Voeg leden toe" owner: "eigenaar" @@ -1815,7 +1827,6 @@ nl: one: "weergave" other: "weergaves" replies: "Reacties" - views_long: "deze topic is {{number}} keer bekeken" activity: "Activiteit" likes: "Likes" likes_lowercase: @@ -2118,8 +2129,6 @@ nl: backups: "backups" traffic_short: "Verkeer" traffic: "Applicatie webverzoeken" - page_views: "API-verzoeken" - page_views_short: "API-verzoeken" show_traffic_report: "Laat gedetailleerd verkeersrapport zien" reports: today: "Vandaag" @@ -2262,7 +2271,6 @@ nl: warn_local_payload_url: "Zo te zien probeer je een webhook naar een lokale URL te laten wijzen. Gebeurtenissen die hierheen gestuurd worden kunnen mogelijk resulteren in onverwacht gedrag. Doorgaan?" secret_invalid: "Secret mag geen lege tekens bevatten." secret_too_short: "Secret moet uit minimaal 12 tekens bestaan." - secret_placeholder: "Een optionele waarde, gebruikt bij het maken van een handtekening" event_type_missing: "Stel minstens één event type in." content_type: "Type inhoud" secret: "Secret" @@ -2903,6 +2911,7 @@ nl: user_preferences: "Gebruikersvoorkeuren" tags: "Tags" search: "Zoek" + groups: "Groepen" badges: title: Badges new_badge: Nieuwe badge diff --git a/config/locales/client.pl_PL.yml b/config/locales/client.pl_PL.yml index 666600d81c..872692909e 100644 --- a/config/locales/client.pl_PL.yml +++ b/config/locales/client.pl_PL.yml @@ -1876,7 +1876,6 @@ pl_PL: few: "odsłony" other: "odsłon" replies: "Odpowiedzi" - views_long: "ten temat był oglądany {number}} razy" activity: "Aktywność" likes: "Lajki" likes_lowercase: @@ -2178,8 +2177,6 @@ pl_PL: backups: "kopie zapasowe" traffic_short: "Ruch" traffic: "Zapytania do aplikacji" - page_views: "Zapytania API" - page_views_short: "Zapytania API" show_traffic_report: "Pokaż szczegółowy raport ruchu" reports: today: "Dzisiaj" diff --git a/config/locales/client.pt.yml b/config/locales/client.pt.yml index cc3aae884e..c65fe3099f 100644 --- a/config/locales/client.pt.yml +++ b/config/locales/client.pt.yml @@ -1849,7 +1849,6 @@ pt: one: "vista" other: "vistas" replies: "Respostas" - views_long: "este tópico foi visto {{number}} vezes" activity: "Atividade" likes: "Gostos" likes_lowercase: @@ -2154,8 +2153,6 @@ pt: backups: "fazer cópias de segurança" traffic_short: "Tráfego" traffic: "Pedidos de aplicação web" - page_views: "Pedidos API" - page_views_short: "Pedidos API" show_traffic_report: "Mostrar Relatório Detalhado do Tráfego" reports: today: "Hoje" @@ -2298,7 +2295,6 @@ pt: warn_local_payload_url: "Parece que está a tentar configurar um webhook para um url local. Eventos entregues num endereço local poderão causar efeitos secundários ou comportamentos inesperados. Continuar?" secret_invalid: "O segredo não pode ter espaços." secret_too_short: "O segredo tem de ter pelo menos 12 caracteres." - secret_placeholder: "Um texto adicional, usado para gerar uma assinatura" event_type_missing: "Tem de configurar pelo menos um tipo de evento." content_type: "Tipo de Conteúdo" secret: "Segredo" diff --git a/config/locales/client.pt_BR.yml b/config/locales/client.pt_BR.yml index 7b3979a90d..3b9bd220d3 100644 --- a/config/locales/client.pt_BR.yml +++ b/config/locales/client.pt_BR.yml @@ -1821,7 +1821,6 @@ pt_BR: one: "visualizar" other: "visualizações" replies: "Respostas" - views_long: "este tópico foi visto {{number}} vezes" activity: "Atividade" likes: "Curtidas" likes_lowercase: @@ -2124,8 +2123,6 @@ pt_BR: backups: "backups" traffic_short: "Tráfego" traffic: "Solicitações do aplicativo pela web" - page_views: "Solicitações de API" - page_views_short: "Solicitações de API" show_traffic_report: "Mostrar Relatório de Tráfego Detalhado" reports: today: "Hoje" @@ -2268,7 +2265,6 @@ pt_BR: warn_local_payload_url: "Parece que você está tentando configurar um webhook para uma URL local. Eventos entregues a endereços locais podem causar efeitos colaterais ou comportamentos inesperados. Continuar?" secret_invalid: "O segredo não deve conter caracteres em branco." secret_too_short: "O segredo deve ter pelo menos 12 caracteres." - secret_placeholder: "Uma string opcional, usada para gerar assinaturas" event_type_missing: "Você deve configurar apenas um tipo de evento." content_type: "Tipo de Conteúdo" secret: "Segredo" diff --git a/config/locales/client.ro.yml b/config/locales/client.ro.yml index 5dc82097e4..a556f3b4a9 100644 --- a/config/locales/client.ro.yml +++ b/config/locales/client.ro.yml @@ -1975,7 +1975,6 @@ ro: few: "vizualizări" other: "de vizualizări" replies: "Răspunsuri" - views_long: "acest subiect a fost vizualizat de {{number}} (de) ori" activity: "Activitate" likes: "Aprecieri" likes_lowercase: @@ -2292,8 +2291,6 @@ ro: backups: "back-up" traffic_short: "Trafic" traffic: "Cereri web" - page_views: "Cereri API" - page_views_short: "Cereri API" show_traffic_report: "Arată raportul detaliat cu privire la trafic" reports: today: "Astăzi" @@ -2441,7 +2438,6 @@ ro: warn_local_payload_url: "Se pare că dorești să setezi un webhook pentru un url local. Un eveniment livrat către o adresă locală ar putea avea efecte secundare și genera comportamente neașteptate. Continuă?" secret_invalid: "Secretul nu trebuie să aibă nici un caracter spațiu-gol." secret_too_short: "Secretul trebuie sa conțină cel puțin 12 caractere." - secret_placeholder: "Un șir opțional, folosit la generarea semnăturii" event_type_missing: "Va trebui să setezi cel puțin un tip de evenimente." content_type: "Tip conținut" secret: "Secret" diff --git a/config/locales/client.ru.yml b/config/locales/client.ru.yml index 43bc1d0fe3..2b4ef33c7d 100644 --- a/config/locales/client.ru.yml +++ b/config/locales/client.ru.yml @@ -594,7 +594,7 @@ ru: watched_tags: "Наблюдение" watched_tags_instructions: "Вы будете автоматически отслеживать все новые темы в этих тэгах. Вам будут приходить уведомления о новых сообщениях и темах, а также количество непрочитанных и новых сообщений будет показано рядом с названиями тем. " tracked_tags: "Отслеживаемая" - tracked_tags_instructions: "Вы будете автоматически отслеживать новые темы в этих разделах. Рядом со списком тем будет отображено количество непрочитанных и новых сообщений." + tracked_tags_instructions: "Вы будете автоматически отслеживать новые темы с этими тегами. Рядом со списком тем будет отображено количество непрочитанных и новых сообщений." muted_tags: "Выключено" muted_tags_instructions: "Вы не будете получать уведомления о новых темах в этих разделах. Также, они не будут показываться во вкладке Непрочитанное." watched_categories: "Наблюдение" @@ -810,6 +810,7 @@ ru: none: "Вы еще никого не приглашали сюда. Вы можете отправить индивидуальные приглашения или пригласить группу людей сразу загрузив CSV файл." text: "Пригласить всех из файла" success: "Файл успешно загружен, вы получите сообщение, когда процесс будет завершен." + error: "Извините, но файл должен быть в csv формате." password: title: "Пароль" too_short: "Пароль слишком короткий." @@ -1347,7 +1348,7 @@ ru: one: "1 сообщение в теме" few: "{{post_count}} сообщений в теме" many: "{{post_count}} сообщений в теме" - other: "{{post_count}} сообщений в теме" + other: "{{count}} сообщений в теме" create: 'Создать Тему' create_long: 'Создать новую тему' private_message: 'Новое личное соощение' @@ -2066,7 +2067,11 @@ ru: few: "просмотра" other: "просмотров" replies: "Ответов" - views_long: "тема просмотрена {{number}} раз" + views_long: + one: "тема просмотрена 1 раз" + few: "тема просмотрена {{number}} раза" + many: "тема просмотрена {{number}} раз" + other: "тема просмотрена {{number}} раз" activity: "Активность" likes: "Нрав." likes_lowercase: @@ -2393,8 +2398,8 @@ ru: backups: "Резервные копии" traffic_short: "Трафик" traffic: "Трафик (веб-запросы)" - page_views: "Запросы API" - page_views_short: "Запросы API" + page_views: "Просмотров Страниц" + page_views_short: "Просмотров" show_traffic_report: "Раширенный отчет по трафику" reports: today: "Сегодня" @@ -2532,6 +2537,7 @@ ru: note_html: "Никому не сообщайте этот ключ. Тот, у кого он есть, сможет создавать сообщения, выдавая себя за любого пользователя форума." web_hooks: title: "Webhooks" + none: "Сейчас нет веб-перехватчиков." instruction: "Webhooks позволяют Discourse уведомлять внешние службы, когда определенное событие происходит на вашем сайте. При срабатывании webhook, на соответствующий URL будет отправлен POST-запрос." detailed_instruction: "При наступлении выбранного события, на соответствующий URL будет отправлен POST-запрос." new: "Добавить Webhook" @@ -2539,17 +2545,27 @@ ru: save: "Сохранить" destroy: "Удалить" description: "Описание" + controls: "Управление" go_back: "Вернуться к списку" + payload_url: "Ссылка для отправки" payload_url_placeholder: "https://example.com/postreceive" + warn_local_payload_url: "По-видимому вы пытаетесь настроить веб-перехватчик на локальный URL. Собитие, отправляемое на локальный адрес может иметь побочное действие или неожиданное поведение. Продолжить?" secret_invalid: "Ключ не должен содержать пустых символов." secret_too_short: "Ключ должен быть не менее 12 символов." - secret_placeholder: "Необязательная строка, используется для генерации подписи" + secret_placeholder: "Допольнительная строка, используется для создания подписи" event_type_missing: "Вам необходимо настроить по крайней мере один тип событий." + content_type: "Тип Содержимого" secret: "Ключ" + event_chooser: "Какие события должны вызывать веб-перехватчик?" wildcard_event: "Присылать мне всё." individual_event: "Выбрать отдельные события." + verify_certificate: "Проверять TLS сертификат ссылки для отправки данных" active: "Активный" active_notice: "Мы будем отправлять подробности события, когда оно будет происходить." + categories_filter_instructions: "Подходящие веб-перехватчики будут срабатывать только если событие связано с указанными разделами. Оставьте пустым, чтобы веб-перехватчик срабатывал для всех разделов." + categories_filter: "Только Для Этих Разделов" + groups_filter_instructions: "Подходящие веб-перехватчики будут срабатывать только если событие связано с указанными группами. Оставьте пустым, чтобы веб-перехватчик срабатывал для всех групп." + groups_filter: "Только Для Групп" delete_confirm: "Удалить Webhook?" topic_event: name: "Событие темы" @@ -2580,14 +2596,18 @@ ru: other: "Завершится через {{count}} секунд." request: "Запрос" response: "Ответ" + redeliver_confirm: "Вы уверены, что хотите повторно отправить теже самые данные?" headers: "Заголовки" + payload: "Данные для отправки" body: "Тело" go_list: "Перейти к списку" go_details: "Редактировать webhook" go_events: "Перейти к событию" ping: "Ping" + status: "Код Состояния" event_id: "Идентификатор (ID)" timestamp: "Создано" + completion: "Время Завершения" actions: "Действия" plugins: title: "Плагины" @@ -2880,6 +2900,11 @@ ru: deleted_tag: "удаленный тег" renamed_tag: "переименованный тэг" revoke_email: "отозвать e-mail" + lock_trust_level: "заморозка уровня доверия" + unlock_trust_level: "разморозка уровня доверия" + activate_user: "активация пользователя" + deactivate_user: "деактивация пользователя" + change_readonly_mode: "изменение режима \"только для чтения\"" screened_emails: title: "Почтовые адреса" description: "Когда кто-то создает новую учетную запись, проверяется данный почтовый адрес и регистрация блокируется или производятся другие дополнительные действия." diff --git a/config/locales/client.sk.yml b/config/locales/client.sk.yml index e11000f12a..27df271ba9 100644 --- a/config/locales/client.sk.yml +++ b/config/locales/client.sk.yml @@ -1767,7 +1767,6 @@ sk: few: "zobrazenia" other: "zobrazení" replies: "Odpovede" - views_long: "táto téma bola prezeraná {{number}} krát " activity: "Aktivita" likes: "Páči sa mi" likes_lowercase: @@ -2054,8 +2053,6 @@ sk: backups: "zálohy" traffic_short: "Vyťaženie" traffic: "Požiadavky webových aplikácií" - page_views: "Požiadavky API" - page_views_short: "Požiadavky API" show_traffic_report: "Zobraziť detaily vyťaženia" reports: today: "Dnes" diff --git a/config/locales/client.sq.yml b/config/locales/client.sq.yml index 2f9c815211..521f727663 100644 --- a/config/locales/client.sq.yml +++ b/config/locales/client.sq.yml @@ -1707,7 +1707,6 @@ sq: one: "shikim" other: "shikime" replies: "Përgjigjet" - views_long: "kjo temë është parë {{number}} herë" activity: "Aktiviteti" likes: "Pëlqimet" likes_lowercase: @@ -2002,8 +2001,6 @@ sq: backups: "backupe" traffic_short: "Trafik" traffic: "Kërkesat web të aplikimit" - page_views: "Kërkesat në API" - page_views_short: "Kërkesat në API" show_traffic_report: "Trego raportin e detajuar të trafikut" reports: today: "Sot" diff --git a/config/locales/client.sv.yml b/config/locales/client.sv.yml index d822038cdb..70ed37119f 100644 --- a/config/locales/client.sv.yml +++ b/config/locales/client.sv.yml @@ -1811,7 +1811,6 @@ sv: one: "visning" other: "visningar" replies: "Svar" - views_long: "detta ämne har visats {{number}} gånger" activity: "Aktivitet" likes: "Gillningar" likes_lowercase: @@ -2113,8 +2112,6 @@ sv: backups: "säkerhetskopior" traffic_short: "Trafik" traffic: "Applikations-webbegäran" - page_views: "API-förfrågningar" - page_views_short: "API-förfrågningar" show_traffic_report: "Visa detaljerad trafikrapport" reports: today: "Idag" @@ -2253,7 +2250,6 @@ sv: payload_url_placeholder: "https://example.com/postreceive" secret_invalid: "Hemligheten får inte ha några blanka tecken." secret_too_short: "Hemligheten bör vara minst 12 tecken." - secret_placeholder: "En valfri sträng, används för att generera signatur" content_type: "Innehållstyp" secret: "Hemlighet" event_chooser: "Vilka event vill du ska utlösa den här webhooken?" diff --git a/config/locales/client.te.yml b/config/locales/client.te.yml index 6256baa99c..44b0764ac2 100644 --- a/config/locales/client.te.yml +++ b/config/locales/client.te.yml @@ -1078,7 +1078,6 @@ te: original_post: "మూల టపా" views: "చూపులు" replies: "జవాబులు" - views_long: "ఈ విషయం {{number}} సార్లు చూడబడింది." activity: "కలాపం" likes: "ఇష్టాలు" likes_long: "ఈ విషయానికి {{number}} ఇష్టాలు ఉన్నాయి" @@ -1158,8 +1157,6 @@ te: backups: "బ్యాకప్లు" traffic_short: "ట్రాఫిక్" traffic: "అనువర్తన జాల రిక్వెస్టులు" - page_views: "API అభ్యర్ధనలు" - page_views_short: "API అభ్యర్ధనలు" show_traffic_report: "సవివరణ ట్రాఫిక్ రిపోర్టు చూపు" reports: today: "ఈరోజు" diff --git a/config/locales/client.tr_TR.yml b/config/locales/client.tr_TR.yml index b937320bb5..2b1ad1d892 100644 --- a/config/locales/client.tr_TR.yml +++ b/config/locales/client.tr_TR.yml @@ -295,18 +295,62 @@ tr_TR: posts_read_long: "Okunmuş Gönderiler" total_rows: other: "%{count} kullanıcı" + group_histories: + actions: + change_group_setting: "Grup ayarlarını değiştir" + add_user_to_group: "Kullanıcı ekle" + remove_user_from_group: "Kullanıcıyı kaldır" + make_user_group_owner: "Sahip yap" + remove_user_as_group_owner: "Sahipliğini İptal Et" groups: logs: + title: "Kayıtlar" when: "Ne zaman" action: "Eylem" + acting_user: "Temsili Kullanıcılar" + target_user: "Hedef Kullanıcı" subject: "Konu" details: "Ayrıntılar" + from: "Gönderen" + to: "Kime" + edit: + title: 'Grubu düzenle' + full_name: 'Tam İsim' + add_members: "Üyeleri ekle" + delete_member_confirm: "'%{username}' adlı kullanıcıyı '%{group}' grubundan çıkart?" + request_membership_pm: + title: "Üyelik isteği" + body: "@%{groupName} adlı gruba üye olarak başvurmak istiyorum." + name_placeholder: "Grup adı, kullanıcı adındaki gibi boşluksuz olmalı" + public: "Kullanıcıların gruptan serbest bir şekilde ayrılıp/katılmasına izin ver (grubun görünür olması gerekmekte)" + empty: + posts: "Bu grubun üyelerinden konu yok." + members: "Bu grupta üye bulunmamaktır." + mentions: "Bu grupta kimseden bahsedilmemiştir." + messages: "Bu grupta mesaj bulunmamaktadır." + topics: "Bu grubun üyeleri tarafından oluşturulmuştur başlık yoktur." + logs: "Bu grup için log kaydı bulunmamaktadır." add: "Ekle" + join: "Gruba katıl" + leave: "Gruptan ayrıl" + request: "Gruba katılmak için istek yolla" + automatic_group: Otomatik Grup + closed_group: Kapanmış Grup + is_group_user: "Bu grubun bir üyesisiniz." + allow_membership_requests: "Kullanıcıların Grup başlarına üyelik istekleri göndermelerine izin ver ( Herkesin grupta birbirleri hakkında bahsetme özelliğinin açık olması gerekmektedir.)" + membership: "Üyelik" + name: "İsim" + user_count: "Grup Sayısı" + bio: "Grup Hakkında" selector_placeholder: "Üye ekle" owner: "sahip" visible: "Grup tüm kullanıcılar tarafından görüntülenebiliyor" + index: + title: "Gruplar" + empty: "Görünen hiç bir grup bulunmamaktadır." title: other: "gruplar" + activity: "Etkinlik" members: "Üyeler" topics: "Konular" posts: "Gönderiler" @@ -338,6 +382,15 @@ tr_TR: muted: title: "Susturuldu" description: "Bu gruptaki herhangi yeni bir konuyla ilgili asla bildirim almayacaksınız." + flair_url: "Avatar Kabiliyet Resmi" + flair_url_placeholder: "(İsteğe bağlı) Resim URL'si veya Font Awesome Class'ı" + flair_bg_color: "Avatar Kabiliyet Arkaplan Rengi" + flair_bg_color_placeholder: "(İsteğe bağlı) Hex renk değeri" + flair_color: "Avatar Kabiliyet Rengi" + flair_color_placeholder: "(İsteğe bağlı) Hex renk değeri" + flair_preview_icon: "İkonu önizle" + flair_preview_image: "Resimi önizle" + flair_note: "Not: Kabiliyet sadece bir kullanıcının birincil grubu için gösterecek." user_action_groups: '1': "Verilen Beğeniler" '2': "Alınan Beğeniler" @@ -400,6 +453,8 @@ tr_TR: download_archive: button_text: "Gönderilerimi İndir" confirm: "Gönderilerinizi indirmek istediğinize emin misiniz?" + success: "İndirme başlatıldı, İşlem tamamlandığında mesaj ile bilgilendirileceksiniz." + rate_limit_error: "Gönderiler günde bir kez indirilebilir, lütfen yarın tekrar deneyin." new_private_message: "Yeni İleti" private_message: "İleti" private_messages: "İletiler" @@ -423,6 +478,7 @@ tr_TR: each_browser_note: "Not: Bu ayarı kullandığınız her tarayıcıda değiştirmelisiniz." dismiss_notifications: "Tümünü Yoksay" dismiss_notifications_tooltip: "Tüm okunmamış bildirileri okunmuş olarak işaretle" + first_notification: "İlk bilidiriminiz! Başlamak için seçiniz" disable_jump_reply: "Cevapladıktan sonra gönderime atlama" dynamic_favicon: "Tarayıcı simgesinde yeni / güncellenen konu sayısını göster" external_links_in_new_tab: "Tüm dış bağlantıları yeni sekmede aç" @@ -445,6 +501,7 @@ tr_TR: Susturulmuş konular ve kategoriler bu e-postalarda yer almaz. daily: "Günlük güncellemeleri gönder" individual: "Her yeni gönderi için bir e-posta gönder" + individual_no_echo: "Benim gönderilerim haricindeki her gönderi için mail gönder" many_per_day: "Her yeni gönderi için bir e-posta gönder (günde yaklaşık {{dailyEmailEstimate}})." few_per_day: "Her yeni gönderi için bana e-posta gönder ( günlük yaklaşık 2 )" tag_settings: "Etiketler" @@ -655,9 +712,13 @@ tr_TR: account_age_days: "Hesabın gün olarak yaşı" create: "Davet Yolla" generate_link: "Davet bağlantısını kopyala" + link_generated: "Davet linki başarılı bir şekilde oluşturuldu" + valid_for: "Davet linki sadece bu adres için geçerlidir: %{email}" bulk_invite: + none: "Henüz kimseyi davet etmemiş görünüyorsun. İstersen bireysel davetler gönderebilir veya CSV dosyası yükleyerek bir çok insanı aynı anda davet edebilirsin." text: "Dosyadan Toplu Davet Gönder" success: "Dosya başarıyla yüklendi, işlem tamamlandığında iletiyle bilgilendirileceksiniz." + error: "Üzgünüz, Dosya csv formatında olmalı" password: title: "Parola" too_short: "Parolanız çok kısa." @@ -800,6 +861,7 @@ tr_TR: trust_level: 'Güven Seviyesi' search_hint: 'kullanıcı adı, e-posta veya IP adresi' create_account: + disclaimer: "Kayıt olarak, gizlilik ilkesi ve hizmet kullanım şartlarını kabul etmiş olmaktasınız." title: "Yeni Hesap Oluştur" failed: "Bir şeyler ters gitti. Bu e-posta adına daha önce bir kayıt oluşturulmuş olabilir, parolamı unuttum bağlantısını dene." forgot_password: @@ -889,6 +951,9 @@ tr_TR: drafts_offline: "çevrimdışı taslaklar" group_mentioned: other: "{{group}} hakkında konuşarak {{count}} kişiyi bilgilendirmek üzeresin, emin misin?" + cannot_see_mention: + category: "{{username}} adlı kullanıcıdan bahsettiniz fakat Ona bildirim gönderilmeyecek çünkü bu kategoriye ulaşma izni yok. Bunun gerçekleşmesi için kişi bu gruba eklemeniz gerekmektedir." + private: "{{username}} adlı kullanıcıdan bahsettiniz fakat Ona bildirim gönderilmeyecek çünkü bu kişisel mesaja ulaşma izni yok. Bunun gerçekleşmesi için kişiyi bu PM'ye eklemeniz gerekmektedir." duplicate_link: "Görünüşe göre {{domain}} alan adına bağlanan bağlantınız @{{username}} tarafından a cevabı içerisinde {{ago}} yayınlanmış görünüyor. – tekrar yayınlamak istediğinize emin misiniz?" error: title_missing: "Başlık gerekli" @@ -908,8 +973,10 @@ tr_TR: title: "Ya da Ctrl+Enter'a bas" users_placeholder: "Kullanıcı ekle" title_placeholder: "Bir cümlede açıklamak gerekirse bu tartışmanın konusu nedir?" + title_or_link_placeholder: "Buraya bir başlık girin veya bir link paylaşın" edit_reason_placeholder: "neden düzenleme yapıyorsunuz?" show_edit_reason: "(düzenleme sebebi ekle)" + topic_featured_link_placeholder: "Başlığı olan bir link giriniz." reply_placeholder: "Buraya yazın. Biçimlendirmek için Markdown, BBCode ya da HTML kullanabilirsin. Resimleri sürükleyebilir ya da yapıştırabilirsin." view_new_post: "Yeni gönderinizi görüntüleyin." saving: "Kaydediliyor" @@ -1054,6 +1121,8 @@ tr_TR: label: Şu Kategoride in_group: label: Şu Grupta + with_badge: + label: Rozetle with_tags: label: Şu Etiketli filters: @@ -1064,6 +1133,7 @@ tr_TR: tracking: takip ettiğim private: iletilerimde olan bookmarks: imlediğim + first: en ilk gönderidir. pinned: tutturulmuş unpinned: tutturulmamış wiki: wiki olan @@ -1090,6 +1160,7 @@ tr_TR: new_messages_marker: "son ziyaret" bulk: select_all: "Tümünü Seç" + clear_all: "Tümünü Temizle" unlist_topics: "Konuları Listeleme" reset_read: "Okunmuşları Sıfırla" delete: "Konuları Sil" @@ -1207,6 +1278,8 @@ tr_TR: go_bottom: "en alt" go: "git" jump_bottom: "son gönderiye geç" + jump_prompt: "atla" + jump_prompt_of: " %{count} gönderinin" jump_prompt_long: "Hangi gönderiye gitmek istersin?" jump_bottom_with_number: "%{post_number} numaralı gönderiye geç" total: tüm gönderiler @@ -1393,6 +1466,7 @@ tr_TR: post: reply: " {{replyAvatar}} {{usernameLink}}" reply_topic: " {{link}}" + quote_reply: "Alıntı" edit: "{{link}} {{replyAvatar}} {{username}} düzenleniyor" edit_reason: "Neden: " post_number: "gönderi {{number}}" @@ -1424,6 +1498,7 @@ tr_TR: file_too_large: "Üzgünüz, bu dosya çok büyük (en fazla {{max_size_kb}}kb). Neden büyük boyutlu dosyanı bir paylaşım servisine yükleyip, sonra bağlantını paylaşmıyorsun ?" too_many_uploads: "Üzgünüz, aynı anda birden fazla dosya yükleyemezsiniz." too_many_dragged_and_dropped_files: "Üzgünüz, aynı anda 10'dan fazla dosya yükleyemezsiniz." + upload_not_authorized: "Üzgünüz, yüklemeye çalıştığınız dosya izinli değil (authorized extensions: {{authorized_extensions}})." image_upload_not_allowed_for_new_user: "Üzgünüz, yeni kullanıcılar resim yükleyemezler." attachment_upload_not_allowed_for_new_user: "Üzgünüz, yeni kullanıcılar dosya yükleyemezler." attachment_download_requires_login: "Üzgünüz, eklentileri indirebilmek için oturum açmanız gerekiyor." @@ -1569,6 +1644,7 @@ tr_TR: tags_allowed_tag_groups: "Yalnızca bu kategoride kullanılabilir etiket grupları:" tags_placeholder: "(Seçmeli) izin verilen etiketlerin listesi" tag_groups_placeholder: "(Seçmeli) izin verilen etiket gruplarının listesi" + topic_featured_link_allowed: " Featured link'lere bu kategoride izin ver" delete: 'Kategoriyi Sil' create: 'Yeni Kategori' create_long: 'Yeni bir kategori oluştur' @@ -1603,6 +1679,7 @@ tr_TR: email_in_disabled: "E-posta üzerinden yeni konu oluşturma özelliği Site Ayarları'nda devre dışı bırakılmış. E-posta üzerinden yeni konu oluşturma özelliğini etkinleştirmek için," email_in_disabled_click: '"e-postala" ayarını etkinleştir' suppress_from_homepage: "Bu kategoriyi ana sayfadan gizle" + all_topics_wiki: "Yeni konuyu varsayılan olarak wiki yap" sort_order: "Öntanımlı Sıralama:" allow_badges_label: "Bu kategoride rozet verilmesine izin ver" edit_permissions: "İzinleri Düzenle" @@ -1632,11 +1709,15 @@ tr_TR: sort_options: default: "öntanımlı" likes: "Beğeniler" + op_likes: "Orijinal Gönderi Beğenileri" views: "Gösterimler" posts: "Gönderiler" activity: "Etkinlik" + posters: "Yazanlar" category: "Kategori" created: "Oluşturulma" + sort_ascending: 'Artan' + sort_descending: 'Azalan' flagging: title: 'Topluluğumuzun düzenli kalmasına desteğiniz için teşekkürler!' action: 'Gönderiyi Bildir' @@ -1715,7 +1796,8 @@ tr_TR: views_lowercase: other: "gösterim" replies: "Cevap" - views_long: "bu konu {{number}} defa görüntülendi" + views_long: + other: "bu konu {{number}} defa görüntülendi" activity: "Etkinlik" likes: "Beğeni" likes_lowercase: @@ -2008,8 +2090,8 @@ tr_TR: backups: "yedekler" traffic_short: "Trafik" traffic: "Uygulama web istekleri" - page_views: "API istekleri" - page_views_short: "API istekleri" + page_views: "Sayfa Görüntülemeleri" + page_views_short: "Sayfa Görüntülemeleri" show_traffic_report: "Ayrıntılı Trafik Raporunu Görüntüle" reports: today: "Bugün" @@ -2147,7 +2229,7 @@ tr_TR: warn_local_payload_url: "Öyle görünüyor ki, web kancasını yerel bir URL'e ayarlamaya çalışıyorsunuz. Yerel bir adrese iletilen olay yan etki veya beklenmedik davranışlara neden olabilir. Devam edilsin mi?" secret_invalid: "Gizli alanında boş karakter olamaz." secret_too_short: "Gizi en azından 12 karakter olmalı." - secret_placeholder: "İsteğe bağlı bir kelime, imza oluşturmak için kullanılacak" + secret_placeholder: "İmza oluşturmak için isteğe bağlı bir dizi" event_type_missing: "En az bir olay tipi ayarlamalısınız." content_type: "İçerik Türü" secret: "Gizli" @@ -2170,6 +2252,7 @@ tr_TR: details: "Yeni bir cevap oluşturulduğunda, düzenlendiğinde veya silindiğinde." user_event: name: "Kullanıcı Olayı" + details: "Bir kullanıcı oluşturulduğunda, onaylandığında veya güncellendiğinde" delivery_status: title: "Teslim Durumu" inactive: "Etkin Değil" @@ -2392,6 +2475,7 @@ tr_TR: html: "html" text: "yazı" last_seen_user: "Son Görülen Kullanıcı:" + no_result: "Derleme için hiç bir sonuç bulunamadı." reply_key: "Cevapla Tuşu" skipped_reason: "Nedeni Atla" incoming_emails: @@ -2487,6 +2571,11 @@ tr_TR: deleted_tag: "silinmiş etiket" renamed_tag: "yeniden adlandırılmış etiket" revoke_email: "e-postayı kaldır" + lock_trust_level: "Güven Seviyesini Kilitle" + unlock_trust_level: "Güvenlik Seviyesi Kilidini Aç" + activate_user: "Kullanıcıyı etkinleştir." + deactivate_user: "Kullanıcıyı dondur" + change_readonly_mode: "Salt-okunur modunu değiştir" screened_emails: title: "Taranmış E-postalar" description: "Biri yeni bir hesap oluşturmaya çalıştığında, aşağıdaki e-posta adresleri kontrol edilecek ve kayıt önlenecek veya başka bir eylem gerçekleşecek." @@ -2779,6 +2868,7 @@ tr_TR: user_preferences: "Kullanıcı Tercihleri" tags: "Etiketler" search: "Arama" + groups: "Gruplar" badges: title: Rozetler new_badge: Yeni Rozet diff --git a/config/locales/client.uk.yml b/config/locales/client.uk.yml index b6e0ec8b4c..48af95cb77 100644 --- a/config/locales/client.uk.yml +++ b/config/locales/client.uk.yml @@ -1059,7 +1059,6 @@ uk: original_post: "Перший допис" views: "Перегляди" replies: "Відповіді" - views_long: "цю тему переглянули {{number}} разів" activity: "Активність" likes: "Вподобання" likes_long: "в цій темі {{number}} вподобань" diff --git a/config/locales/client.ur.yml b/config/locales/client.ur.yml index 6b20cfbffb..b500d837aa 100644 --- a/config/locales/client.ur.yml +++ b/config/locales/client.ur.yml @@ -19,6 +19,17 @@ ur: mb: ایم بی tb: ٹی بی dates: + time: "h:mm a" + medium: + x_minutes: + one: "1 منٹ" + other: "%{گنتی} منٹس" + x_hours: + one: "1 گھنٹا" + other: "%{گنتی} گھنٹے" + x_days: + one: "1 دن" + other: "%{گنتی} دن" medium_with_ago: x_minutes: one: "1 منٹ قبل" @@ -26,6 +37,23 @@ ur: x_hours: one: "1 گھنٹہ قبل " other: " %{count} گھنٹے قبل " + x_days: + one: "1 دن قبل" + other: "%{گنتی} دن قبل" + later: + x_days: + one: "1 دن بعد" + other: "%{گنتی} دن بعد" + x_months: + one: "1 مہینے بعد" + other: "%{گنتی} مہینے بعد" + x_years: + one: "1 سال بعد" + other: "%{گنتی} سال بعد" + previous_month: 'پچھلے ماہ' + next_month: 'اگلے ماہ' + share: + topic: 'اس ٹاپک کا لنک شیئرکریں' no_value: "نہیں " yes_value: "ہاں " age: "عمر " @@ -42,6 +70,13 @@ ur: user: desktop_notifications: each_browser_note: "نوٹ: آپ کو ہر براؤزر پر اس سیٹنگ کو تبدیل کرنا ہوگا." + name: + instructions: "آپ کا پورا نام (اختیاری)" + instructions_required: "آپ کا پورا نام" + too_short: "آپ کا نام بہت چھوٹا ہے" + ok: "آپ کا نام صحیح لگ رہا ہے" + username: + title: "صارف کا نام" admin_js: admin: export_json: diff --git a/config/locales/client.vi.yml b/config/locales/client.vi.yml index 3ead479e62..85ce0c40db 100644 --- a/config/locales/client.vi.yml +++ b/config/locales/client.vi.yml @@ -1526,7 +1526,6 @@ vi: views_lowercase: other: "lượt xem" replies: "Trả lời" - views_long: "chủ đề đã được xem {{number}} lần" activity: "Hoạt động" likes: "Lượt thích" likes_lowercase: @@ -1650,8 +1649,6 @@ vi: backups: "sao lưu" traffic_short: "Băng thông" traffic: "Application web requests" - page_views: "API Requests" - page_views_short: "API Requests" show_traffic_report: "Xem chi tiết Báo cáo Lưu lượng" reports: today: "Hôm nay" diff --git a/config/locales/client.zh_CN.yml b/config/locales/client.zh_CN.yml index 24340c53e2..a70f150e4f 100644 --- a/config/locales/client.zh_CN.yml +++ b/config/locales/client.zh_CN.yml @@ -338,9 +338,9 @@ zh_CN: closed_group: 封闭群组 is_group_user: "你是该群组的一个成员" allow_membership_requests: "允许用户向群组拥有者发送加入小组请求(群组需要能让所有人提及)" - membership: "成员" + membership: "成员资格" name: "名字" - user_count: "成员数量" + user_count: "成员数目" bio: "关于群组" selector_placeholder: "添加成员" owner: "所有者" @@ -1795,7 +1795,6 @@ zh_CN: views_lowercase: other: "浏览" replies: "回复" - views_long: "本主题已经被浏览过 {{number}} 次" activity: "活动" likes: "赞" likes_lowercase: @@ -2088,8 +2087,6 @@ zh_CN: backups: "备份" traffic_short: "流量" traffic: "应用 web 请求" - page_views: "API 请求" - page_views_short: "API 请求" show_traffic_report: "显示详细的流量报告" reports: today: "今天" @@ -2227,7 +2224,6 @@ zh_CN: warn_local_payload_url: "你好像将 webhook 指向了一个本地地址。把相关事件发送到本地可能产生副作用或未预期的行为。继续吗?" secret_invalid: "密钥不能包含空白字符。" secret_too_short: "密钥必须至少有 12 个字符。" - secret_placeholder: "可选字符串,用于生成签名" event_type_missing: "你必须设置一个事件类型。" content_type: "内容格式" secret: "密钥" diff --git a/config/locales/client.zh_TW.yml b/config/locales/client.zh_TW.yml index e0cb9f6c2b..44a835f88f 100644 --- a/config/locales/client.zh_TW.yml +++ b/config/locales/client.zh_TW.yml @@ -317,7 +317,7 @@ zh_TW: title: '編輯群組' full_name: '全名' add_members: "增加成員" - delete_member_confirm: "從 '%{group}' 群組刪除 '%{username}' ?" + delete_member_confirm: "從「%{group}」群組移除「%{username}」?" request_membership_pm: title: "請求會員資格" body: "我想申請 @%{groupName} 的成員資格。" @@ -375,13 +375,13 @@ zh_TW: description: "你只會收到此組中每個新主題的第一帖的通知。" tracking: title: "追蹤" - description: "只有當有人@您或者回覆您的文章時,您才會收到通知,並且會顯示新回覆的次數。" + description: "只有當有人 @您 或者回覆您的文章時您才會收到通知,並且會顯示新回覆的數目。" regular: title: "一般" - description: "只有當有人@您或者回覆您的文章時,您才會收到通知。" + description: "只有當有人 @您 或者回覆您的文章時您才會收到通知。" muted: title: "靜音" - description: "你將不會再收到任何關於此群組的新通知。" + description: "您將不會再收到任何關於此群組新討論話題的通知。" flair_url: "頭像圖片" flair_url_placeholder: "(可選)圖片 URL 或 Font Awesome class" flair_bg_color: "頭像背景顏色" @@ -453,7 +453,7 @@ zh_TW: download_archive: button_text: "下載我的文章" confirm: "你確定要下載你的文章嗎?" - success: "開始下載,處理完畢後將以私人訊息通知你。" + success: "開始下載,處理完畢後將以私人訊息通知您。" rate_limit_error: "帖子只能每天下載一次,請明天再重試。" new_private_message: "新訊息" private_message: "訊息" @@ -718,6 +718,7 @@ zh_TW: none: "你還沒有邀請過任何人。你可以邀請一個人,或者上傳 CSV 檔案邀請一批人。" text: "從檔案大量邀請" success: "檔案已上傳成功,處理完畢後將以私人訊息通知你。" + error: "抱歉,檔案應該要用 CSV 格式。" password: title: "密碼" too_short: "你的密碼太短。" @@ -1795,7 +1796,8 @@ zh_TW: views_lowercase: other: "觀看" replies: "回覆" - views_long: "此討論話題已被看過 {{number}} 次" + views_long: + other: "這個討論話題已經被檢視過 {{number}} 次" activity: "活動" likes: "讚" likes_lowercase: @@ -2088,8 +2090,8 @@ zh_TW: backups: "備份檔" traffic_short: "流量" traffic: "網頁應用程式請求數" - page_views: "API 請求數量" - page_views_short: "API 請求數量" + page_views: "瀏覽數" + page_views_short: "瀏覽數" show_traffic_report: "顯示詳細的流量報表" reports: today: "今天" @@ -2227,7 +2229,6 @@ zh_TW: warn_local_payload_url: "你好像將 webhook 指向了一個本地地址。把相關事件發送到本地可能產生副作用或未預期的行為。繼續嗎?" secret_invalid: "密鑰不能包含空白字元。" secret_too_short: "密鑰必須至少有 12 個字元。" - secret_placeholder: "可選字元串,用於生成簽名" event_type_missing: "你必須設置一個事件類型。" content_type: "內容格式" secret: "密鑰" @@ -2569,6 +2570,11 @@ zh_TW: deleted_tag: "刪除的標籤" renamed_tag: "重命名的標籤" revoke_email: "撤銷郵件" + lock_trust_level: "鎖定信任等級" + unlock_trust_level: "解除信任等級鎖定" + activate_user: "啟動使用者" + deactivate_user: "撤銷使用者" + change_readonly_mode: "變更唯讀模式" screened_emails: title: "過濾的電子郵件地址" description: "以下的電子郵件地址將無法用來建立新用戶。" diff --git a/config/locales/server.ar.yml b/config/locales/server.ar.yml index 7b72d2fe20..2910360b49 100644 --- a/config/locales/server.ar.yml +++ b/config/locales/server.ar.yml @@ -1496,26 +1496,6 @@ ar: (أذا كنت بحاجة للتواصل مع [الموظفين](%{base_url}/about) كمستخدم جديد, فقط مجرد الرد على هذه الرسالة.) welcome_invite: subject_template: "مرحبا بك في %{site_name}!" - text_body_template: | - شكرًا لقبولك الدعوة إلى موقع %{site_name} أهلا بك . - - انشأنا حساب جديد لك **%{username}** وستقوم بتسجيل الدخول، وستتمكن من تغيير اسمك من [your user profile][prefs]. - - لتسجيل الدخول لاحقا: - - 1.دائما **استخدم نفس البريد الالكتروني الذي استقبلت فيه الدعوة** عند تسجيل الدخول، وإلا فإننا لن نستطيع معرفة أنه أنت ! - - 2. أنشأ كلمة مرور فريدة [your user profile][prefs] واستخدمها لتسجيل الدخول . - - %{new_user_tips} - - ونحن نتبع [civilized community behavior](%{base_url}/guidelines)دائما.. - - استمتع بوجودك بيننا ! - - (إذا كنت تريد التواصل مع [staff members](%{base_url}/about) كمستخدم جديد، رد على هذه الرسالة فقط لتتواصل معهم) - - [prefs]: %{user_preferences_url} backup_succeeded: subject_template: "اكتملت عملية النسخ الإحتياطي بنجاح" backup_failed: diff --git a/config/locales/server.bs_BA.yml b/config/locales/server.bs_BA.yml index 2f8009c83b..8e1da3c6a4 100644 --- a/config/locales/server.bs_BA.yml +++ b/config/locales/server.bs_BA.yml @@ -743,24 +743,6 @@ bs_BA: (Ako trebate razgovarati s nekim od [članova osoblja](%{base_url}/about) kao novi korisnik, samo odgovorite na ovu poruku.) welcome_invite: subject_template: "Dobrodošli na %{site_name}!" - text_body_template: | - Hvala vam što ste primili pozivnicu na %{site_name} -- dobrodošli! - - Mi smo automatski kreirali vaše korisničko ime: **%{username}**, ali možete ga promjeniti preko [tvoj profil][postavke]. - - Da se opet ulogujete: - - 1. Log in using any method you like -- but it must resolve to the **same email address** that you received your original invitation email at. Otherwise we won't be able to tell it is you! - - 2. Create a unique password for [your user profile][prefs], and use it to log in. - - %{new_user_tips} - - We believe in [civilized community behavior](%{base_url}/guidelines) at all times. - - Enjoy your stay! - - [prefs]: %{user_preferences_url} backup_succeeded: subject_template: "Backup completed successfully" backup_failed: diff --git a/config/locales/server.de.yml b/config/locales/server.de.yml index a810b90a58..88a3653a42 100644 --- a/config/locales/server.de.yml +++ b/config/locales/server.de.yml @@ -32,6 +32,7 @@ de: purge_reason: "Verlassenes, deaktiviertes Konto automatisch gelöscht" disable_remote_images_download_reason: "Der Download von Bildern wurde deaktiviert, weil nicht mehr genug Plattenplatz vorhanden war." anonymous: "Anonym" + remove_posts_deleted_by_author: "Gelöscht vom Verfasser" emails: incoming: default_subject: "Eingehende E-Mail von %{email}" @@ -72,6 +73,8 @@ de: inclusion: ist nicht in der Liste enthalten invalid: ist ungültig is_invalid: "scheint unklar, ist das ein ganzer Satz?" + contains_censored_words: "Beinhaltet ein oder mehrere verbotene Wörter: %{censored_words}" + matches_censored_pattern: "stimmt mit dem folgenden verbotenen regulären Ausdruck überein: %{censored_pattern}" less_than: muss weniger als %{count} sein less_than_or_equal_to: muss weniger oder gleich %{count} sein not_a_number: ist keine Zahl @@ -1072,6 +1075,7 @@ de: max_attachment_size_kb: "Maximale Größe hochgeladener Dateianhänge in kB. Dieser Wert muss auch in Nginx (client_max_body_size), Apache oder anderen Proxies entsprechend konfiguriert werden." authorized_extensions: "Liste von erlaubten Dateiendungen für hochgeladene Dateien ('*' um alle Dateiendungen zu erlauben)" max_similar_results: "Anzahl ähnlicher Themen, die beim Erstellen eines neuen Themas über dem Editor angezeigt werden. Ähnlichkeit wird an Hand des Titels und Inhalts bestimmt." + max_image_megapixels: "Maximale erlaubte Auflösung für Bilder (in Megapixeln)." title_prettify: "Verhindert gängige Fehler im Titel, wie reine Grossschreibung, Kleinbuchstaben am Anfang, mehrere ! und ?, überflüssiger . am Ende, etc." topic_views_heat_low: "Aufrufe-Feld leicht hervorheben, sobald das Thema so oft gelesen wurde." topic_views_heat_medium: "Aufrufe-Feld mäßig hervorheben, sobald das Thema so oft gelesen wurde." @@ -1404,6 +1408,8 @@ de: user: no_accounts_associated: "Es sind keine Konten zugeordnet" deactivated: "Deaktiviert wegen zu vielen unzustellbaren E-Mails an '%{email}'." + deactivated_by_staff: "Deaktiviert vom Team" + activated_by_staff: "Aktiviert vom Team" username: short: "muss mindestens %{min} Zeichen lang sein" long: "darf nicht länger als %{max} Zeichen sein" @@ -1431,6 +1437,7 @@ de: one: "Eine Markierung wartet auf Bearbeitung" other: "%{count} Markierungen warten auf Bearbeitung" unsubscribe_mailer: + title: "Abbestellung von E-Mail-Updates" subject_template: "Bitte bestätige, dass du keine E-Mail-Updates mehr von %{site_title} erhalten möchtest." text_body_template: | Jemand (wahrscheinlich du?) hat angefragt, keine E-Mail-Updates mehr von %{site_domain_name} auf dieser Adresse zu erhalten. @@ -1441,6 +1448,7 @@ de: Wenn du weiterhin E-Mail-Updates erhalten möchtest, dann kannst du diese E-Mail ignorieren. invite_mailer: + title: "Einladung zu einem Thema" subject_template: "%{invitee_name} hat dich zum Thema '%{topic_title}' auf %{site_domain_name} eingeladen" text_body_template: | %{invitee_name} hat dich dazu eingeladen, an einer Diskussion teilzunehmen: @@ -1457,6 +1465,7 @@ de: Dies ist eine Einladung von einem vertrauenswürdigen Benutzer. Du kannst deshalb sofort auf die Diskussion antworten. custom_invite_mailer: + title: "Einladung zu einem Thema (mit Nachricht)" subject_template: "%{invitee_name} hat dich eingeladen zu '%{topic_title}' auf %{site_domain_name}" text_body_template: | %{invitee_name} hat dich zu einer Diskussion eingeladen @@ -1479,38 +1488,45 @@ de: Diese Einladung stammt von einem vertrauenswürdigen Benutzer, daher kannst du direkt auf die Diskussion antworten. invite_forum_mailer: + title: "Einladung zur Teilnahme" subject_template: "%{invitee_name} hat dich eingeladen %{site_domain_name} beizutreten" text_body_template: | - %{invitee_name} hat dich zur Teilnahme eingeladen + %{invitee_name} hat dich eingeladen, > **%{site_title}** > > %{site_description} - Wenn du Interesse hast, klicke auf den nachfolgenden Link: + beizutreten. + + Wenn du interessiert bist, folge dem folgenden Link: %{invite_link} - Diese Einladung stammt von einem vertrauenswürdigen Benutzer. Daher wird für dich automatisch ein Konto erstellt. + Die Einladung kommt von einem vertrauenswürdigen Benutzer. Daher wird für dich beim Betreten automatisch ein Benutzerkonto mit dieser E-Mail-Adresse erstellt. custom_invite_forum_mailer: + title: "Einladung zur Teilnahme" subject_template: "%{invitee_name} hat dich eingeladen %{site_domain_name} beizutreten" text_body_template: | - %{invitee_name} hat dich zur Teilnahme eingeladen + %{invitee_name} hat dich eingeladen, > **%{site_title}** > > %{site_description} + beizutreten. + Nachricht von %{invitee_name}: %{user_custom_message} - Wenn du Interesse hast, klicke auf den nachfolgenden Link: + Wenn du interessiert bist, folge einfach diesem Link: %{invite_link} - Diese Einladung stammt von einem vertrauenswürdigen Benutzer. Daher wird für dich automatisch ein Konto erstellt. + Diese Einladung kommt von einem vertrauenswürdigen Benutzer. Daher wird für dich beim Betreten automatisch ein Benutzerkonto mit dieser E-Mail-Adresse erstellt. invite_password_instructions: + title: "Passwort festlegen" subject_template: "Lege ein Passwort für dein %{site_name}-Konto fest" text_body_template: | Schön, dass du die Einladung zu %{site_name} angenommen hast -- Willkommen! @@ -1520,6 +1536,7 @@ de: (Wenn der Link abgelaufen ist, wähle "Passwort vergessen" aus, wenn du dich mit deiner E-Mail-Adresse einloggen möchtest.) test_mailer: + title: "Test-E-Mail" subject_template: "[%{site_name}] Test der E-Mail-Zustellbarkeit" text_body_template: | Dies ist eine Test-E-Mail von @@ -1563,6 +1580,7 @@ de: [mj]: https://www.mailjet.com/pricing [mt]: http://www.mail-tester.com/ new_version_mailer: + title: "Neue Version" subject_template: "[%{site_name}] Neue Discourse Version, Update verfügbar" text_body_template: | Hurra, eine neue Version von [Discourse](http://www.discourse.org) ist verfügbar! @@ -1576,6 +1594,7 @@ de: - Besuche [meta.discourse.org](https://meta.discourse.org) für Neuigkeiten, Diskussionen und Support für Discourse new_version_mailer_with_notes: + title: "Neue Version mit Versionshinweisen" subject_template: "[%{site_name}] Update verfügbar" text_body_template: | Hurra, eine neue Version von [Discourse](http://www.discourse.org) ist verfügbar! @@ -1593,6 +1612,7 @@ de: %{notes} queued_posts_reminder: + title: "Erinnerung an Freischaltung wartender Beiträge" subject_template: one: "[%{site_name}] %{count} auf Freischaltung wartender Beitrag." other: "[%{site_name}] %{count} auf Freischaltung wartende Beiträge." @@ -1614,6 +1634,7 @@ de: temporarily_closed_due_to_flags: "Dieses Thema ist vorrübergehend geschlossen. Mehrere User haben dieses Thema gemeldet. " system_messages: post_hidden: + title: "Benachrichtigung: Beitrag versteckt" subject_template: "Beitrag versteckt wegen Community-Meldungen" text_body_template: | Hallo, @@ -1635,6 +1656,7 @@ de: Während du hier teilnimmst, werden wir dich kennenlernen und die vorübergehenden Einschränkungen für neue Benutzer werden aufgehoben. Über die Zeit, erreichst du [Vertrauensstufen](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924), die spezielle Fähigkeiten beinhalten, um die Community gemeinsam zu verwalten. welcome_user: + title: "Willkommen: Benutzer" subject_template: "Willkommen bei %{site_name}!" text_body_template: | Danke fürs Anmelden bei %{site_name}, sei willkommen! @@ -1647,28 +1669,26 @@ de: (Wenn du als neuer Benutzer unter vier Augen mit einem unserer [Team-Mitglieder](%{base_url}/about) reden möchtest, antworte einfach auf diese Nachricht.) welcome_invite: + title: "Willkommen: Einladung" subject_template: "Willkommen bei %{site_name}!" text_body_template: | - Danke, dass du der Einladung zu %{site_name} gefolgt bist -- herzlich willkommen! + Danke, dass du die Einladung zu %{site_name} angenommen hast -- und willkommen! - Wir haben automatisch das Konto **%{username}** für dich angelegt und du bist bereits angemeldet, aber du kannst deinen Benutzernamen in [deinem Profil][prefs] noch ändern. + - Wir haben dieses neue Konto **%{username}** für dich erstellt. Ändere deinen Namen oder dein Passwort, indem du [dein Benutzerprofil][prefs] aufrufst. - Um dich später wieder anzumelden: - - 1. Verwende bitte **dieselbe E-Mail-Adresse, unter der du die ursprüngliche Einladung erhalten hast**. Ansonsten können wir nicht erkennen, dass du es bist! - - 2. Wähle ein eindeutiges Passwort in [deinem Profil][prefs] und verwende dieses, um dich anzumelden. + - Wenn du dich anmeldest, **verwende immer die gleiche E-Mail-Adresse wie von deiner ursprünglichen Einladung** – sonst wissen wir nicht, ob du es wirklich bist! %{new_user_tips} - Wir wünschen uns ein stets [zivilisiertes Verhalten in unserer Community](%{base_url}/guidelines). + Wir glauben an [zivilisiertes Verhalten in unserer Community(%{base_url}/guidelines) zu jeder Zeit. - Viel Spaß! + Genieße deinen Aufenthalt! - (Wenn du als neuer Benutzer unter vier Augen mit einem unserer [Team-Mitgileder](%{base_url}/about) reden möchtest, antworte einfach auf diese Nachricht.) + (Wenn du als neuer Benutzer mit [Team-mitgliedern](%{base_url}/about) kommunizieren möchtest, antworte einfach auf diese Nachricht.) [prefs]: %{user_preferences_url} backup_succeeded: + title: "Backup erfolgreich" subject_template: "Sicherung erfolgreich abgeschlossen" text_body_template: | Backup erfolgreich erstellt. @@ -1681,6 +1701,7 @@ de: %{logs} ``` backup_failed: + title: "Backup fehlgeschlagen" subject_template: "Sicherung fehlgeschlagen" text_body_template: | Die Sicherung ist fehlgeschlagen. @@ -1691,6 +1712,7 @@ de: %{logs} ``` restore_succeeded: + title: "Wiederherstellung erfolgreich" subject_template: "Wiederherstellung erfolgreich abgeschlossen" text_body_template: | Die Wiederherstellung war erfolgreich. @@ -1701,6 +1723,7 @@ de: %{logs} ``` restore_failed: + title: "Wiederherstellung fehlgeschlagen" subject_template: "Wiederherstellung fehlgeschlagen" text_body_template: | Die Wiederherstellung ist fehlgeschlagen. @@ -1711,9 +1734,11 @@ de: %{logs} ``` bulk_invite_succeeded: + title: "Masseneinladung erfolgreich" subject_template: "Masseneinladung von Benutzern erfolgreich verarbeitet" text_body_template: "Deine Masseneinladung von Benutzern wurde erfolgreich verarbeitet, insgesamt wurden %{sent} Einladungen per E-Mail verschickt." bulk_invite_failed: + title: "Masseneinladung fehlgeschlagen" subject_template: "Bei der Verarbeitung der Masseneinladung von Benutzern sind Fehler aufgetreten" text_body_template: | Deine Masseneinladungs-Datei wurde verarbeitet, insgesamt wurden %{sent} Einladungen verschickt und dabei traten %{failed} Fehler auf. @@ -1724,6 +1749,7 @@ de: %{logs} ``` csv_export_succeeded: + title: "CSV-Export erfolgreich" subject_template: "Datenexport abgeschlossen" text_body_template: | Deine Daten wurden erfolgreich exportiert! :dvd: @@ -1732,51 +1758,60 @@ de: Dieser Download-Link ist für die nächsten 48 Stunden gültig. csv_export_failed: + title: "CSV-Export fehlgeschlagen" subject_template: "Datenexport fehlgeschlagen" text_body_template: "Entschuldigung, beim Exportieren deiner Daten trat ein Fehler auf. Bitte kontaktiere ein Team-Mitglied oder überprüfe die Logdateien." email_reject_insufficient_trust_level: + title: "E-Mail abgelehnt weil Vertrauensstufe unzureichend" subject_template: "[%{site_name}] E-Mail-Problem -- Unzureichende Vertrauensstufe" text_body_template: | Entschuldige, aber deine E-Mail-Nachricht an %{destination} (Titel: %{former_title}) konnte nicht zugestellt werden. Du hast nicht die notwendige Vertrauensstufe, um neue Themen über diese E-Mail-Adresse zu erstellen. Wenn du glaubst, dass das ein Irrtum ist, dann kontaktiere ein Team-Mitglied. email_reject_user_not_found: + title: "E-Mail abgelehnt weil Benutzer nicht gefunden" subject_template: "[%{site_name}] E-Mail-Problem -- Benutzer nicht gefunden" text_body_template: | Entschuldige, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) konnte nicht zugestellt werden. Deine Antwort wurde von einer unbekannten E-Mail-Adresse gesendet. Probiere eine andere Absende-Adresse oder wende dich an ein Team-Mitglied. email_reject_screened_email: + title: "E-Mail abgelehnt weil E-Mail-Adresse gesperrt" subject_template: "[%{site_name}] E-Mail-Problem -- Blockiertee E-Mail-Adresse" text_body_template: | Entschuldige, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) konnte nicht zugestellt werden. Deine Antwort wurde von einer blockierten E-Mail-Adresse gesendet. Probiere eine andere Absende-Adresse oder wende dich an ein Team-Mitglied. email_reject_inactive_user: + title: "E-Mail abgelehnt weil Benutzer inaktiv" subject_template: "[%{site_name}] E-Mail-Problem -- Inaktiver Benutzer" text_body_template: | Es tut uns leid, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) hat nicht funktioniert. Dein mit dieser E-Mail-Adresse verbundenes Benutzerkonto ist nicht aktiviert. Bitte aktiviere dein Konto bevor du E-Mails sendest. email_reject_blocked_user: + title: "E-Mail abgelehnt weil Benutzer gesperrt" subject_template: "[%{site_name}] E-Mail-Problem -- Blockierter Benutzer" text_body_template: | Es tut uns leid, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) hat nicht funktioniert. Dein mit dieser E-Mail-Adresse verbundenes Konto wurde blockiert. email_reject_reply_user_not_matching: + title: "E-Mail abgelehnt weil E-Mail-Adresse abweichend" subject_template: "[%{site_name}] E-Mail-Problem -- Unerwartete Antwort-Adresse" text_body_template: | Entschuldige, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) konnte nicht zugestellt werden. Deine Antwort wurde von einer anderen E-Mail-Adresse versandt als wir erwartet haben, weshalb wir nicht sicher wissen ob das die gleiche Person ist. Probiere eine andere Absende-Adresse oder wende dich an ein Team-Mitglied. email_reject_no_account: + title: "E-Mail abgelehnt weil unbekanntes Konto" subject_template: "[%{site_name}] E-Mail-Problem -- Unbekanntes Konto" text_body_template: | Entschuldige, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) konnte nicht zugestellt werden. Wir konnten kein Konto finden, das zu deiner E-Mail-Adresse passt. Probiere eine andere Absende-Adresse oder wende dich an ein Team-Mitglied. email_reject_empty: + title: "E-Mail abgelehnt weil kein Inhalt" subject_template: "[%{site_name}] E-Mail-Problem -- Kein Inhalt" text_body_template: | Es tut uns leid, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) hat nicht funktioniert. @@ -1785,30 +1820,35 @@ de: Wenn du diese E-Mail bekommst, obwohl deine E-Mail Inhalt enthalten hat, versuche es erneut mit weniger Formatierung. email_reject_parsing: + title: "E-Mail abgelehnt weil Inhalt nicht erkannt" subject_template: "[%{site_name}] E-Mail-Problem -- Inhalt nicht erkannt" text_body_template: | Es tut uns leid, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) hat nicht funktioniert. Wir konnten keinen Inhalt in deiner E-Mail feststellen. **Versichere dich, dass du den Inhalt oberhalb der erhaltenen E-Mail eingegeben hast** -- Eingebettete Antworten können wir nicht verarbeiten. email_reject_invalid_access: + title: "E-Mail abgelehnt weil nicht erlaubt" subject_template: "[%{site_name}] E-Mail-Problem -- Nicht erlaubt" text_body_template: | Entschuldige, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) konnte nicht zugestellt werden. Du hast nicht die notwendigen Zugriffsrechte, um neue Themen in dieser Kategorie zu erstellen. Wenn du glaubst, dass das ein Irrtum ist, dann kontaktiere ein Team-Mitglied. email_reject_strangers_not_allowed: + title: "E-Mail abgelehnt weil Zugriff nicht erlaubt" subject_template: "[%{site_name}] E-Mail-Problem -- Zugriff nicht erlaubt" text_body_template: | Entschuldige, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) konnte nicht zugestellt werden. Die Kategorie, an die du die E-Mail geschickt hast, erlaubt nur Antworten von Benutzern mit gültigem Konto und von bekannten E-Mail-Adressen. Wenn du glaubst, dass das ein Irrtum ist, dann kontaktiere ein Team-Mitglied. email_reject_invalid_post: + title: "E-Mail abgelehnt weil ungültiger Beitrag" subject_template: "[%{site_name}] E-Mail-Problem -- Ungültiger Beitrag" text_body_template: | Es tut uns leid, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) hat nicht funktioniert. Mögliche Gründe sind komplizierte Formatierung und zu lange oder kurze Nachrichten. Bitte versuche es erneut oder schreibe deinen Beitrag über die Website. email_reject_invalid_post_specified: + title: "E-Mail abgelehnt weil ungültiger Beitrag" subject_template: "[%{site_name}] E-Mail-Problem -- Ungültiger Beitrag" text_body_template: | Es tut uns leid, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) hat nicht funktioniert. @@ -1819,42 +1859,49 @@ de: Bitte versuch es erneut, wenn du das Problem beheben kannst. email_reject_invalid_post_action: + title: "E-Mail abgelehnt weil fehlerhafte Beitragsaktion" subject_template: "[%{site_name}] E-Mail-Problem -- Fehlerhafte Beitragsaktion" text_body_template: | Es tut uns leid, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) hat nicht funktioniert. Die Beitragsaktion wurde nicht erkannt. Bitte versuche es erneut oder erstelle deinen Beitrag auf der Website, wenn der Fehler weiterhin auftritt. email_reject_reply_key: + title: "E-Mail abgelehnt weil unbekannter Antwort-Schlüssel" subject_template: "[%{site_name}] E-Mail-Problem -- Unbekannter Antwort-Schlüssel" text_body_template: | Entschuldige, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) konnte nicht zugestellt werden. Der angegebene Antwort-Schlüssel ist ungültig oder unbekannt. Wir wissen daher nicht auf welchen Beitrag diese E-Mail antwortet. Bitte kontaktiere ein Team-Mitglied. email_reject_bad_destination_address: + title: "E-Mail abgelehnt weil unbekannte Empfänger-Adresse" subject_template: "[%{site_name}] E-Mail Problem -- Unbekannte An:-Adresse" text_body_template: | Entschuldige, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) konnte nicht zugestellt werden. Keine der Ziel-E-Mail-Adressen wurde erkannt. Bitte stelle sicher, dass du die E-Mail an die richtige Adresse schickst, die dir von unserem Team genannt wurde. email_reject_topic_not_found: + title: "E-Mail abgelehnt weil Thema nicht gefunden" subject_template: "[%{site_name}] E-Mail-Problem -- Thema nicht gefunden" text_body_template: | Entschuldige, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) konnte nicht zugestellt werden. Das Thema, auf das du geantwortet hast, existiert nicht mehr -- vielleicht wurde es gelöscht? Wenn du glaubst, dass dies ein Irrtum ist, nimm Bitte Kontakt mit einem Team-Mitglied auf. email_reject_topic_closed: + title: "E-Mail abgelehnt weil Thema geschlossen" subject_template: "[%{site_name}] E-Mail-Problem -- Thema geschlossen" text_body_template: | Entschuldige, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) konnte nicht zugestellt werden. Das Thema, auf das du geantwortet hast, ist derzeit geschlossen und akzeptiert keine Antworten mehr. Wenn du glaubst, dass dies ein Irrtum ist, nimm bitte Kontakt mit einem Team-Mitglied auf. email_reject_auto_generated: + title: "E-Mail abgelehnt weil automatisch generierte Antwort" subject_template: "[%{site_name}] E-Mail-Problem -- Automatisch erzeugte Antwort" text_body_template: | Entschuldige, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) konnte nicht zugestellt werden. Deine E-Mail wurde als „automatisch generiert“ markiert, was bedeutet, dass sie automatisch von einem Computer erstellt wurde statt von einem Menschen getippt; wir können diese Arten von E-Mails nicht akzeptieren. Wenn du glaubst, dass dies ein Irrtum ist, nimm bitte Kontakt mit einem Team-Mitglied auf. email_error_notification: + title: "Benachrichtigung zu E-Mail-POP-Authentifizierungsfehler" subject_template: "[%{site_name}] E-Mail-Problem -- POP-Authentifizierungsfehler" text_body_template: | Leider gab es einen Authentifizierungsfehler beim Abrufen von E-Mails vom POP-Server. @@ -1863,6 +1910,7 @@ de: Wenn es eine Weboberfläche für das POP-E-Mail-Postfach gibt, möchtest du dich eventuell dort anmelden und die Einstellungen überprüfen. too_many_spam_flags: + title: "Neues Konto gesperrt wegen zu viel Spam" subject_template: "Neues Konto gesperrt" text_body_template: | Hallo, @@ -1873,6 +1921,7 @@ de: Weitere Hinweise findest du in unseren [Community-Richtlinien](%{base_url}/guidelines). too_many_tl3_flags: + title: "E-Mail abgelehnt wegen Meldungen durch Vertrauensstufe 3" subject_template: "Neues Konto gesperrt" text_body_template: | Hallo, @@ -1883,6 +1932,7 @@ de: Weitere Hinweise findest du in unseren [Community-Richtlinien](%{base_url}/guidelines). blocked_by_staff: + title: "Gesperrt vom Team" subject_template: "Konto vorübergehend gesperrt" text_body_template: | Hallo, @@ -1893,6 +1943,7 @@ de: Weitere Hinweise findest du in unseren [Community-Richtlinien](%{base_url}/guidelines). user_automatically_blocked: + title: "Benutzer automatisch gesperrt" subject_template: "Neuer Benutzer %{username} gesperrt wegen Community-Meldungen" text_body_template: | Dies ist eine automatisierte Nachricht. @@ -1903,6 +1954,7 @@ de: Der Schwellenwert kann über die Einstellung `block_new_user` geändert werden. spam_post_blocked: + title: "Spam-Beitrag gesperrt" subject_template: "Beiträge des neuen Benutzers ${username} wegen mehrfacher Verlinkung blockiert" text_body_template: | Dies ist eine automatisierte Nachricht. @@ -1913,6 +1965,7 @@ de: Dies kann über die Einstellungen `newuser_spam_host_threshold` und `white_listed_spam_host_domains` geändert werden. unblocked: + title: "Entsperrt" subject_template: "Konto nicht mehr gesperrt" text_body_template: | Hallo, @@ -1921,6 +1974,7 @@ de: Du kannst nun wieder neue Antworten und Themen erstellen. Vielen Dank für deine Geduld. pending_users_reminder: + title: "Benachrichtigung: Benutzer warten auf Freigabe" subject_template: one: "Es gibt einen nicht freigegebenen Benutzer" other: "Es gibt %{count} nicht freigegebene Benutzer" @@ -1929,9 +1983,11 @@ de: [Bitte bewerte diese im Administrationsbereich](/admin/users/list/pending). download_remote_images_disabled: + title: "Download von externen Bildern deaktiviert" subject_template: "Download von externen Bildern deaktiviert" text_body_template: "Die `download_remote_images_to_local` Einstellung wurde deaktiviert, da das Speicherplatz Limit von `download_remote_images_threshold` erreicht wurde." dashboard_problems: + title: "Dashboard-Probleme" subject_template: "Probleme wurden festgestellt" text_body_template: | Es wurden Probleme in deinem Admin-Dashboard gemeldet. @@ -1983,6 +2039,7 @@ de: > %{site_title} -- %{site_description} user_invited_to_private_message_pm: + title: "Benutzer zu Nachricht eingeladen" subject_template: "[%{site_name}] %{username} hat dich zur Unterhaltung '%{topic_title}' eingeladen" text_body_template: | %{header_instructions} @@ -1991,6 +2048,7 @@ de: %{respond_instructions} user_invited_to_private_message_pm_staged: + title: "Benutzer zu Nachricht eingeladen (automatisch)" subject_template: "[%{site_name}] %{username} hat dich zur Unterhaltung '%{topic_title}' eingeladen" text_body_template: | %{header_instructions} @@ -1999,6 +2057,7 @@ de: %{respond_instructions} user_invited_to_topic: + title: "Benutzer zu Thema eingeladen" subject_template: "[%{site_name}] %{username} hat dich zum Thema '%{topic_title}' eingeladen" text_body_template: | %{header_instructions} @@ -2007,6 +2066,7 @@ de: %{respond_instructions} user_replied: + title: "Benutzer hat auf Beitrag geantwortet" subject_template: "[%{site_name}] %{username} hat auf deinen Beitrag '%{topic_title}' geantwortet" text_body_template: | %{header_instructions} @@ -2017,6 +2077,7 @@ de: %{respond_instructions} user_replied_pm: + title: "Benutzer hat auf Nachricht geantwortet" subject_template: "[%{site_name}] [PN] %{topic_title}" text_body_template: | %{header_instructions} @@ -2027,6 +2088,7 @@ de: %{respond_instructions} user_quoted: + title: "Benutzer wurde zitiert" subject_template: "[%{site_name}] %{username} hat Dich in '%{topic_title}' zitiert" text_body_template: | %{header_instructions} @@ -2037,6 +2099,7 @@ de: %{respond_instructions} user_linked: + title: "Benutzer wurde verlinkt" subject_template: "[%{site_name}] %{topic_title}" text_body_template: | %{header_instructions} @@ -2047,6 +2110,7 @@ de: %{respond_instructions} user_mentioned: + title: "Benutzer wurde erwähnt" subject_template: "[%{site_name}] %{username} hat Dich in '%{topic_title}' erwähnt" text_body_template: | %{header_instructions} @@ -2057,6 +2121,7 @@ de: %{respond_instructions} user_group_mentioned: + title: "Gruppe wurde erwähnt" subject_template: "[%{site_name}] %{topic_title}" text_body_template: | %{header_instructions} @@ -2067,6 +2132,7 @@ de: %{respond_instructions} user_posted: + title: "Benutzer hat in Thema geantwortet" subject_template: "[%{site_name}] %{subject_prefix}%{username} hat auf '%{topic_title}' geantwortet" text_body_template: | %{header_instructions} @@ -2077,6 +2143,7 @@ de: %{respond_instructions} user_watching_first_post: + title: "Benutzer folgt erstem Beitrag" subject_template: "[%{site_name}] %{topic_title}" text_body_template: | %{header_instructions} @@ -2087,6 +2154,7 @@ de: %{respond_instructions} user_posted_pm: + title: "Benutzer hat Nachricht geschrieben" subject_template: "[%{site_name}] [PN] %{topic_title}" text_body_template: | %{header_instructions} @@ -2097,6 +2165,7 @@ de: %{respond_instructions} user_posted_pm_staged: + title: "Benutzer hat Nachricht geschrieben (automatisch)" subject_template: "%{optional_re}%{topic_title}" text_body_template: |2 @@ -2131,6 +2200,7 @@ de: view_this_topic: "Thema anzeigen" back_to_top: "Zurück nach oben" forgot_password: + title: "Passwort vergessen" subject_template: "[%{site_name}] Passwort zurückgesetzt" text_body_template: | Jemand hat darum gebeten, dein Passwort auf [%{site_name}](%{base_url}) zurückzusetzen. @@ -2140,6 +2210,7 @@ de: Andernfalls besuche den folgenden Link, um ein neues Passwort zu wählen: %{base_url}/users/password-reset/%{email_token} set_password: + title: "Passwort setzen" subject_template: "[%{site_name}] Setze Passwort" text_body_template: | Jemand hat ein Passwort für dein Konto auf [%{site_name}](%{base_url}) beantragt. Alternativ kannst du dich mit einem unterstützen Online-Service (Google, Facebook, etc), der mit dieser validierten E-Mail-Adresse verknüpft ist, anmelden. @@ -2149,6 +2220,7 @@ de: Klicke auf den folgenden Link, um ein Passwort auszuwählen: %{base_url}/users/password-reset/%{email_token} admin_login: + title: "Administrator-Anmeldung" subject_template: "[%{site_name}] Anmeldung" text_body_template: | Jemand hat versucht sich in dein Konto auf [%{site_name}](%{base_url}) anzumelden. @@ -2158,6 +2230,7 @@ de: Klicke den folgenden Link, um dich anzumelden: %{base_url}/users/admin-login/%{email_token} account_created: + title: "Konto erstellt" subject_template: "[%{site_name}] Dein neues Konto" text_body_template: | Ein neues Konto wurde für dich auf %{site_name} erstellt. @@ -2165,12 +2238,14 @@ de: Klicke auf den folgenden Link, um ein Passwort für dein neues Konto festzulegen: %{base_url}/users/password-reset/%{email_token} confirm_new_email: + title: "E-Mail-Adresse bestätigen (an neue)" subject_template: "[%{site_name}] Bestätige deine neue E-Mail-Adresse" text_body_template: | Um deine E-Mail-Adresse für %{site_name} zu bestätigen, klicke auf den folgenden Link: %{base_url}/users/authorize-email/%{email_token} confirm_old_email: + title: "E-Mail-Adresse bestätigen (an alte)" subject_template: "[%{site_name}] Bestätige deine aktuelle E-Mail-Adresse" text_body_template: | Bevor wir deine E-Mail-Adresse ändern können, müssen wir dich bitten zu bestätigen, dass du das E-Mail-Konto kontrollierst. Nach diesem Schritt, werden wir dich bitten die neue E-Mail-Adresse zu bestätigen. @@ -2179,6 +2254,7 @@ de: %{base_url}/users/authorize-email/%{email_token} notify_old_email: + title: "Benachrichtigung an alte E-Mail-Adresse" subject_template: "[%{site_name}] Deine E-Mail-Adresse wurde geändert" text_body_template: | Dies ist eine automatisierte Nachricht, um eine Änderung deiner E-Mail-Adresse für %{site_name} mitzuteilen. Bitte kontaktiere ein Team-Mitglied, wenn du von einem Fehler ausgehst. @@ -2187,6 +2263,7 @@ de: %{new_email} signup_after_approval: + title: "Konto bestätigen nach Genehmigung" subject_template: "You've been approved on %{site_name}!" text_body_template: | Willkommen bei %{site_name}! @@ -2206,6 +2283,7 @@ de: (Wenn du als neuer Benutzer unter vier Augen mit einem unserer [Team-Mitglieder](%{base_url}/about) reden möchtest, antworte einfach auf diese Nachricht.) signup: + title: "Konto bestätigen nach Anmeldung" subject_template: "[%{site_name}] Bestätige deinen neuen Account" text_body_template: | Willkommen bei %{site_name}! @@ -2239,6 +2317,7 @@ de: too_large: "Entschuldigung, die Datei die du hochladen möchtest, ist zu groß (maximale Dateigröße ist %{max_size_kb}KB)." images: too_large: "Entschuldigung, das Bild das du hochladen möchtest, ist zu groß (maximale Dateigröße ist %{max_size_kb}KB). Bitte verkleinere es und versuche es erneut." + larger_than_x_megapixels: "Entschuldige, das Bild, das du versucht hast hochzuladen, ist zu groß (maximale Auflösung beträgt %{max_image_megapixels} Megapixel), bitte verkleinere es und versuche es erneut." size_not_found: "Entschuldige, aber wir konnten die Größe des Bildes nicht bestimmen. Vielleicht ist das Bild defekt?" avatar: missing: "Hoppla, wir können kein Profilbild für diese E-Mail-Adresse finden. Kannst du versuchen es erneut hochzuladen?" @@ -2872,11 +2951,11 @@ de: fields: welcome: label: "Willkommen-Thema" - description: "

Wie würdest du deine Community einem Fremden im Fahrstuhl in ungefähr 1 Minute beschreiben?

  • Für wen sind diese Diskussionen?
  • Was kann ich hier finden?
  • Warum sollte ich vorbeikommen?

Dein Willkommensthema ist die erste Sache, die neue Besucher sehen werden. Betrachte es als dein 'Fahrstuhl-Vorstellungsgespräch' oder als 'Leitbild'.

" + description: "

Wie würdest du deine Community einem Fremden im Fahrstuhl in etwa 1 Minute beschreiben?

  • An wen richten sich die Diskussionen?
  • Was kann ich hier finden?
  • Warum lohnt es sich, vorbeizuschauen?

Dein Willkommen-Thema ist die erste Sache, die neue Besucher sehen werden. Betrachte es als dein 'Fahrstuhl-Vorstellungsgespräch' oder als 'Leitbild'.

" one_paragraph: "Bitte begrenze deine Willkommensnachricht auf einen Absatz." privacy: title: "Zugriff" - description: "

Ist deine Community offen für alle oder beschränkt durch Mitgliedschaft, Einladung oder Genehmigung? Wenn du dies bevorzugst, kannst du alles zunächst privat einrichten und dann später auf öffentlich umschalten.

Bitte denke daran, dass du Einladungen auch immer aus Themen oder von deiner Benutzerprofilseite aus schicken kannst.

" + description: "

Ist deine Community offen für alle oder beschränkt durch Mitgliedschaft, Einladung oder Genehmigung? Wenn du dies bevorzugst, kannst du alles zunächst privat einrichten und dann später auf öffentlich umschalten.

Bitte denke daran, dass du Einladungen auch immer aus Themen oder von deiner Benutzerprofil-Seite aus schicken kannst.

" fields: privacy: choices: diff --git a/config/locales/server.es.yml b/config/locales/server.es.yml index 8494bd92fb..e3cef5ecd7 100644 --- a/config/locales/server.es.yml +++ b/config/locales/server.es.yml @@ -32,6 +32,7 @@ es: purge_reason: "Cuenta eliminada automáticamente al detectarse como abandonada, desactivada" disable_remote_images_download_reason: "La descarga de imágenes remotas se desactivó porque no había suficiente espacio disponible en disco." anonymous: "Anónimos" + remove_posts_deleted_by_author: "Eliminado por su autor" emails: incoming: default_subject: "Email entrante desde %{email}" @@ -72,6 +73,8 @@ es: inclusion: no está incluido en la lista invalid: no es válido is_invalid: "parece poco claro, es una oración completa?" + contains_censored_words: "incluye una o más palabras censuradas: %{censored_words}" + matches_censored_pattern: "coincide con la siguiente expresión regular censurada: %{censored_pattern}" less_than: debe ser menor que %{count} less_than_or_equal_to: debe ser menor o igual que %{count} not_a_number: no es un número @@ -1072,6 +1075,7 @@ es: max_attachment_size_kb: "El tamaño máximo, en kB, para adjuntar archivos. Debe ser configurado también en nginx (client_max_body_size) / apache o proxy." authorized_extensions: "Una lista de las extensiones de archivo permitidas para subir (usa \"*\" para habilitar todos los tipos de archivo)" max_similar_results: "Cuántos temas similares se mostrarán encima del editor cuando estés creando un nuevo tema. La comparación se basa en el título y el cuerpo del tema." + max_image_megapixels: "Máximo de megapíxeles permitidos por una imagen." title_prettify: "Prevenir errores comunes en el título, incluyendo \"todo mayúsculas\", primera letra minúscula, multiples signos ! o ?, . extra al final, etc." topic_views_heat_low: "Después de este número de vistas, el campo vistas será ligeramente resaltado." topic_views_heat_medium: "Después de este número de visitas, el campo visitas será moderadamente resaltado." @@ -1479,36 +1483,8 @@ es: Esta invitación viene de un usuario en el que confiamos, por lo que podrás responder inmediatamente. invite_forum_mailer: subject_template: "%{invitee_name} te invitó a unirte a %{site_domain_name}" - text_body_template: | - %{invitee_name} te ha invitado a unirte a - - > **%{site_title}** - > - > %{site_description} - - Si estás interesado, haz clic en el botón debajo: - - %{invite_link} - - Esta invitación viene de un usuario en el que confiamos, por lo que se te creará una cuenta automáticamente. custom_invite_forum_mailer: subject_template: "%{invitee_name} te ha invitado a %{site_domain_name}" - text_body_template: | - %{invitee_name} te ha invitado a - - > **%{site_title}** - > - > %{site_description} - - Mensaje de %{invitee_name}: - - %{user_custom_message} - - Si estás interesado en unirte, haz clic en el enlace debajo: - - %{invite_link} - - Esta invitación viene de un usuario en el que confiamos, por lo que se te creará una cuenta automáticamente. invite_password_instructions: subject_template: "Asigna una contraseña para tu cuenta en %{site_name}" text_body_template: | @@ -1602,26 +1578,6 @@ es: (Si necesitas comunicarte con [algún miembro del staff](%{base_url}/about) como nuevo usuario, puedes responder a este mensaje.) welcome_invite: subject_template: "¡Bienvenido a %{site_name}!" - text_body_template: | - Gracias por aceptar tu invitación a %{site_name} -- ¡Te damos la bienvenida! - - Hemos creado automáticamente una nueva cuenta para ti: **%{username}**. Puedes cambiar tu nombre de usuario en cualquier momento visitando [tu perfil][prefs]. - - Para iniciar sesión en adelante: - - 1. Usa siempre la **misma dirección de correo** en la que recibiste tu invitación original. ¡De otra manera no seremos capaces de reconocer que eres tú! - - 2. Crea una contraseña unica para [tu perfil de usuario][prefs], y úsala para iniciar sesión. - - %{new_user_tips} - - Creemos en una comunidad con un [comportamiento civilizado](%{base_url}/guidelines). - - ¡Disfruta de tu estancia! - - (Si necesitas comunicarte por privado con [algún miembro del staff](%{base_url}/about) como nuevo usuario, puedes responder a este mensaje.) - - [prefs]: %{user_preferences_url} backup_succeeded: subject_template: "La copia de seguridad se completo exitosamente" text_body_template: |+ @@ -1869,6 +1825,7 @@ es: > %{site_title} -- %{site_description} user_invited_to_private_message_pm: + title: "Usuario invitado a MP" subject_template: "[%{site_name}] %{username} te ha invitado a un hilo de mensajes '%{topic_title}'" text_body_template: | %{header_instructions} @@ -1877,6 +1834,7 @@ es: %{respond_instructions} user_invited_to_private_message_pm_staged: + title: "Usuario invitado a MP provisional" subject_template: "[%{site_name}] %{username} te ha invitado a un mensaje '%{topic_title}'" text_body_template: | %{header_instructions} @@ -1885,6 +1843,7 @@ es: %{respond_instructions} user_invited_to_topic: + title: "Usuario invitado a tema" subject_template: "[%{site_name}] %{username} te invitó a '%{topic_title}'" text_body_template: | %{header_instructions} @@ -1893,6 +1852,7 @@ es: %{respond_instructions} user_replied: + title: "Usuario respondió" subject_template: "[%{site_name}] %{topic_title}" text_body_template: | %{header_instructions} @@ -1903,6 +1863,7 @@ es: %{respond_instructions} user_replied_pm: + title: "Usuario respondió por MP" subject_template: "[%{site_name}] [MP] %{topic_title}" text_body_template: | %{header_instructions} @@ -1913,6 +1874,7 @@ es: %{respond_instructions} user_quoted: + title: "Usuario citado" subject_template: "[%{site_name}] %{topic_title}" text_body_template: | %{header_instructions} @@ -1923,6 +1885,7 @@ es: %{respond_instructions} user_linked: + title: "Usuario enlazado" subject_template: "[%{site_name}] %{topic_title}" text_body_template: | %{header_instructions} @@ -1933,6 +1896,7 @@ es: %{respond_instructions} user_mentioned: + title: "Usuario mencionado" subject_template: "[%{site_name}] %{topic_title}" text_body_template: | %{header_instructions} @@ -1943,6 +1907,7 @@ es: %{respond_instructions} user_group_mentioned: + title: "Grupo del usuario mencionado" subject_template: "[%{site_name}] %{topic_title}" text_body_template: | %{header_instructions} @@ -1953,6 +1918,7 @@ es: %{respond_instructions} user_posted: + title: "Usuario publicó" subject_template: "[%{site_name}] %{subject_prefix}%{username} publicó en '%{topic_title}'" text_body_template: | %{header_instructions} @@ -2757,11 +2723,9 @@ es: fields: welcome: label: "Tema de bienvenida" - description: "

¿Cómo le describirías tu comunidad a un desconocido en alrededor de 1 minuto?

  • ¿A quién están enfocado el contenido?
  • ¿Qué puedo encontrar aquí?
  • ¿Por qué debería visitar esta página
  • Tu tema de bienvenida es la primera cosa que los nuevos visitantes verán. Piensa que es el

    párrafo

    que define tu comunidad.

    " one_paragraph: "El mensaje de bienvenida no debería ser más de un párrafo." privacy: title: "Acceso" - description: "

    ¿Es tu comunidad abierta a todo el mundo o está restringida a ciertos miembros, ya sea por invitación o aprobación? Si lo prefieres, puedes hacer que sea privada, y hacerla pública más tarde.

    Recuerda que siempre puedes enviar invitaciones desde temas, o desde tu página de perfil.

    " fields: privacy: choices: @@ -2787,7 +2751,6 @@ es: description: "Todos los mensajes privados automáticos de Discourse serán mandados desde este usuarios. Más importante, este usuario será el que envíe el mensaje de bienvenida que se manda automáticamente a todos los usuarios." corporate: title: "Organización" - description: "Estos nombres se usarán en tu Política de privacidad y Términos y condiciones, que podrás editar en todo momento en la categoría Staff. Si no tienes una empresa, puedes saltarte este paso por ahora." fields: company_short_name: label: "Nombre de la empresa (corto)" @@ -2802,7 +2765,6 @@ es: title: "Tema" fields: theme_id: - description: "¿Prefieres un tema oscuro o claro para empezar? Siempre lo puedes personalizar a través del panel del Administrador." choices: default: label: "Simple y claro" @@ -2827,7 +2789,6 @@ es: label: "Icono grande" description: "Icono usado para representar tu página en dispositivos modernos y que se ve bien para tamaños grandes. El tamaño recomendado es al menos de 144px por 144px." homepage: - description: "Recomendamos mostrar los últimos temas en tu página principal, pero siempre puedes mostrar categorías (grupos de temas) en la página principal si prefieres." title: "Página de inicio" fields: homepage_style: @@ -2838,7 +2799,6 @@ es: label: "Categorías" emoji: title: "Emoji" - description: "¿Qué estilo de Emoji prefieres para tu comunidad? Siempre puedes añadir más Emojis personalizados a trvés de Admin, Personalizar, Emoji." invites: title: "Invitar staff" description: "¡Ya casi está! Invita algunos miembros del staff para ayudar a iniciar conversaciones con temas interesantes y respuestas para dar tu comunidad por empezadas." diff --git a/config/locales/server.et.yml b/config/locales/server.et.yml index c0c3e470d4..a6959baca6 100644 --- a/config/locales/server.et.yml +++ b/config/locales/server.et.yml @@ -1022,7 +1022,6 @@ et: title: "Kujundusteema" fields: theme_id: - description: "Kas soovid kasutada heledat või tumedat kujundust? Võid kujundusseadeid alati muuta läbi Admin paneeli ja seadistuste." choices: default: label: "Lihtne hele" diff --git a/config/locales/server.fa_IR.yml b/config/locales/server.fa_IR.yml index 17f325288c..5456009bf6 100644 --- a/config/locales/server.fa_IR.yml +++ b/config/locales/server.fa_IR.yml @@ -1064,33 +1064,6 @@ fa_IR: (اگر نیاز به تماس با یکی از مدیران[staff members] را دارید(%{base_url}/about) به عنوان یک کاربر جدید٬ فقط به این پیام پاسخ دهید.) welcome_invite: subject_template: "به %{site_name} خوش آمدید!" - text_body_template: | - ممنون برای قبول دعتونامه به %{site_name} -- خوش آمدید! - - - برای شما یک حساب کاربری جدید ساختیم **%{username}** و شما الان در سیستم هستید. می توانید اسم خود را عوض کنید با مراجعه به [your user profile][prefs]. - - برای ورود بعدتر : - - - 1. همیشه برای ورود ** از ایمیل آدرسی استفاده کن که در دعوتنامه اصلی استفاده کردید**. در غیر اینصورت نمی تونیم بگوییم این شمایید! - - - 2. رمز عبور خیلی خوبی بساز برای [کاربری نمایه ات][prefs]٬ و برای ورود از آن استفاده کن. - - %{new_user_tips} - - - ما به [رفتار جامعه ای متمدن] همیشه اعتقاد داریم (%{base_url}/guidelines). - - - از بودنتان در انجمن لذت ببرید! - - - (اگر نیاز به تماس با یکی از مدیران[staff members] را دارید(%{base_url}/about) به عنوان یک کاربر جدید٬ فقط به این پیام پاسخ دهید. ) - - - [prefs]: %{user_preferences_url} backup_succeeded: subject_template: "پشتیبان گیری با موفقیت انجام شد" backup_failed: @@ -1320,6 +1293,8 @@ fa_IR: performance_report: initial_post_raw: این مطلب شامل گزارش عملکرد روزانه سایت شماست. initial_topic_title: گزارش عملکرد وب‌سایت + tags: + title: "برچسب" wizard: step: forum_title: @@ -1331,6 +1306,17 @@ fa_IR: placeholder: "name@example.com" contact_url: placeholder: "http://www.example.com/contact-us" + homepage: + title: "صفحه اصلی" + fields: + homepage_style: + choices: + latest: + label: "آخرین‌ ارسال‌ها" + categories: + label: "دسته‌بندی‌ها" + emoji: + title: "شکلک" activemodel: errors: <<: *errors diff --git a/config/locales/server.fi.yml b/config/locales/server.fi.yml index c3fc7de230..d19716f03e 100644 --- a/config/locales/server.fi.yml +++ b/config/locales/server.fi.yml @@ -32,6 +32,7 @@ fi: purge_reason: "Hylätty, aktivoimaton tili poistettiin automaattisesti" disable_remote_images_download_reason: "Linkattujen kuvien lataaminen poistettiin käytöstä vähäisen tallennustilan vuoksi." anonymous: "Anonyymejä" + remove_posts_deleted_by_author: "Kirjoittajan poistama" emails: incoming: default_subject: "Uusi sähköposti osoitteesta %{email}" @@ -72,6 +73,8 @@ fi: inclusion: ei ole listalla invalid: ei kelpaa is_invalid: "vaikuttaa epäselvältä, olihan se kokonainen virke?" + contains_censored_words: "sisältää yhden tai useamman sensuroidun sanan: %{censored_words}" + matches_censored_pattern: "täyttää sensuroidun säännöllisen lausekkeen: %{censored_pattern}" less_than: täytyy olla vähemmän kuin %{count} less_than_or_equal_to: täytyy olla yhtä suuri tai pienempi kuin %{count} not_a_number: ei ole numero @@ -355,7 +358,7 @@ fi: Voit nyt… * Muokata minkä hyvänsä ketjun otsikkoa - * Vaihtaa minkä hyvänsä ketjun toiselle alueelle + * Siirtää minkä tahansa ketjun toiselle alueelle * Lisätä linkkejä, joita hakukoneet seuraavat ([nofollow](http://en.wikipedia.org/wiki/Nofollow) on poistettu) * Päästä suljetulle Lounge-alueelle, joka näkyy vain luottamustason 3 ja korkeammille käyttäjille * Piilottaa viestin yhdellä liputuksella @@ -364,7 +367,7 @@ fi: Kiitos, että olet tämän yhteisön arvokas jäsen! - (Saadaksesi lisätietoja luottamustasoista, [katso tämä englanninkielinen ketju][trust]. Huomaa, että pysyäksesi mestarina sinun pitää täyttää vaatimukset jatkossakin. ) + (Saadaksesi lisätietoja luottamustasoista, [katso tämä englanninkielinen ketju][trust]. Huomaa, että pysyäksesi mestarina sinun pitää täyttää vaatimukset jatkossakin.) [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 category: @@ -1071,6 +1074,7 @@ fi: max_attachment_size_kb: "Liitetyn tiedoston suurin sallittu koko kilotavuissa. Tämä pitää asettaa myös nginxin (client_max_body_size) / apachen tai proxyn asetuksista." authorized_extensions: "Liitetiedostojen sallitut tiedostopäätteet (käytä '*' salliaksesi kaikki tiedostotyypit)" max_similar_results: "Kuinka monta samankaltaista ketjua näytetään viestikentän yläpuolella uutta ketjua luotaessa. Vertailu perustuu sekä otsikkoon että leipätekstiin." + max_image_megapixels: "Kuvan enimmäiskoko megapikseleinä." title_prettify: "Estä yleiset kirjoitusvirheet otsikossa, kuten pelkät isot kirjaimet, pieni ensimmäinen kirjain, useat !- ja ?-merkit ym." topic_views_heat_low: "Näin monen katselun jälkeen katselut-saraketta korostetaan hieman." topic_views_heat_medium: "Näin monen katselun jälkeen katselut-saraketta korostetaan kohtalaisesti." @@ -1475,7 +1479,7 @@ fi: invite_forum_mailer: subject_template: "%{invitee_name} kutsui sinut sivustolle %{site_domain_name}" text_body_template: | - %{invitee_name} kutsui sinut sivustolle + %{invitee_name} kutsui sinut liittymään sivustolle > **%{site_title}** > @@ -1485,25 +1489,24 @@ fi: %{invite_link} - Tämän kutsun lähetti luotettu käyttäjä, joten sinulle luodaan tili automaattisesti. + Tämän kutsun lähetti luotettu käyttäjä, joten kun klikkaat, sinulle luodaan tämän sähköpostiosoitteen alainen käyttäjätili automaattisesti. custom_invite_forum_mailer: subject_template: "%{invitee_name} kutsui sinut sivustolle %{site_domain_name}" text_body_template: | - %{invitee_name} kutsui sinut sivustolle + %{invitee_name} kutsui sinut liittymään sivustolle > **%{site_title}** > > %{site_description} - Viesti käyttäjältä %{invitee_name}: - + Viesti käyttäjältä %{invitee_name} sinulle: %{user_custom_message} Jos kiinnostuit, klikkaa alla olevaa linkkiä: %{invite_link} - Tämän kutsun lähetti luotettu käyttäjä, joten sinun ei tarvitse kirjautua sisään. + Tämän kutsun lähetti luotettu käyttäjä, joten kun klikkaat, sinulle luodaan tämän sähköpostiosoitteen alainen käyttäjätili automaattisesti. invite_password_instructions: subject_template: "Aseta salasana %{site_name} -tunnuksellesi" text_body_template: | @@ -1643,26 +1646,23 @@ fi: welcome_invite: subject_template: "Tervetuloa sivustolle %{site_name}!" text_body_template: | - Kiitos kutsun hyväksymisestä sivustolle %{site_name} -- tervetuloa! + Kiitos kun hyväksyit kutsun sivustolle %{site_name} -- tervetuloa! - Olemme luoneet sinulle uuden käyttäjätunnuksen: **%{username}** ja olet nyt kirjautuneena sisään. Voit vaihtaa nimeäsi [käyttäjäprofiilistasi][prefs]. + - Loimme sinulle käyttäjätilin **%{username}**. [Käyttäjäasetuksissa][prefs] voit muuttaa nimeäsi ja salasanaasi. - Kirjautuaksesi uudestaan sisään myöhemmin: - - 1. Käytä aina **samaa sähköpostiosoitetta, jonne vastaanotit alkuperäisen kutsun**. Muuten emme voi tietää, että olet sinä! - - 2. Luo salasana [käyttäjäprofiilissasi][prefs], ja käytä sitä kirjautumiseen. + - Kun kirjaudut sisään, **käytä samaa sähköpostiosoitetta kuin johon kutsu saapui** — muuten emme voi tietää oletko se sinä! %{new_user_tips} - Me uskomme [sivistyneeseen kanssakäymiseen](%{base_url}/guidelines). + Uskomme [sivistyneeseen yhteisökäyttäytymiseen](%{base_url}/guidelines) aina. Toivottavasti viihdyt! - (Jos haluat keskustella [henkilökunnan jäsenten](%{base_url}/about) kanssa, vastaa vain tähän viestiin) + (Jos sinulla on asiaa [henkilökunnalle](%{base_url}/about) uutena käyttäjänä, vastaa vain tähän viestiin.) [prefs]: %{user_preferences_url} backup_succeeded: + title: "Varmuuskopiointi onnistui" subject_template: "Varmuuskopiointi suoritettu onnistuneesti" text_body_template: | Varmuuskopiointi onnistui. @@ -1675,6 +1675,7 @@ fi: %{logs} ``` backup_failed: + title: "Varmuuskopiointi epäonnistui" subject_template: "Varmmuskopiointi epäonnistui" text_body_template: | Varmuuskopiointi epäonnistui. @@ -1685,6 +1686,7 @@ fi: %{logs} ``` restore_succeeded: + title: "Palautus onnistui" subject_template: "Palauttaminen suoritettu onnistuneesti" text_body_template: | Palauttaminen onnistui. @@ -1695,6 +1697,7 @@ fi: %{logs} ``` restore_failed: + title: "Palautus epäonnistui" subject_template: "Palauttaminen epäonnistui" text_body_template: | Palauttaminen epäonnistui. @@ -1705,9 +1708,11 @@ fi: %{logs} ``` bulk_invite_succeeded: + title: "Massakutsun lähetys onnistui" subject_template: "Massakutsun käsittely onnistui." text_body_template: "Massakutsutiedostosi on käsitelty, %{sent} kutsua lähetetty." bulk_invite_failed: + title: "Massakutsun lähetys epäonnistui" subject_template: "Massakutsun käsittelyssä tapahtui virhe" text_body_template: | Massakutsutiedostosi on käsitelty, %{sent} kutsua lähetettiin joista %{failed} virhe(ttä). @@ -1718,6 +1723,7 @@ fi: %{logs} ``` csv_export_succeeded: + title: "CSV:n vienti onnistui" subject_template: "Datan vieminen on tehty" text_body_template: | Datan vienti onnistui. @@ -1726,21 +1732,25 @@ fi: Linkki tiedostoon on voimassa 48 tuntia. csv_export_failed: + title: "CSV:n vienti epäonnistui" subject_template: "Datan vienti epäonnistui" text_body_template: "Pahoittelemme, mutta datan vientisi epäonnistui. Tarkasta lokit tai ota yhteyttä henkilökuntaan." email_reject_insufficient_trust_level: + title: "Sähköposti hylätty - riittämätön luottamustaso" subject_template: "[%{site_name}] Sähköpostiongelma -- Riittämätön luottamustaso" text_body_template: | Pahoittelut, sähköpostiviestiäsi tänne: %{destination} (otsikolla %{former_title}) ei voitu toimittaa. Tilisi luottamustaso ei ole riittävä, jotta saisit lähettää uusia ketjuja tähän sähköpostiosoitteeseen. Jos uskot, että tämä johtuu virheestä, ota yhteyttä henkilökuntaan. email_reject_user_not_found: + title: "Sähköposti hylätty - käyttäjää ei löytynyt" subject_template: "[%{site_name}] Sähköpostiongelma -- Käyttäjää ei löytynyt" text_body_template: | Pahoittelemme, mutta sähköpostin lähettäminen tänne %{destination} (otsikolla %{former_title}) ei onnistunut. Vastauksesi lähetettiin tuntemattomasta sähköpostiosoitteesta. Yritä lähettää viesti toisesta osoitteesta, tai ota yhteyttä henkilökuntaan. email_reject_screened_email: + title: "Sähköposti hylätty - estetty sähköpostiosoite" subject_template: "[%{site_name}] Sähköpostiongelma-- Estetty sähköpostiosoite" text_body_template: |+ Pahoittelemme, mutta sähköpostin lähettäminen tänne %{destination} (otsikolla %{former_title}) ei onnistunut. @@ -1748,30 +1758,35 @@ fi: Viestisi lähetettiin estetystä sähköpostiosoitteesta. Yritä lähettää viesti toisesta sähköpostiosoitteesta tai ota yhteyttä henkilökuntaan. email_reject_inactive_user: + title: "Sähköposti hylätty - aktivoimaton käyttäjä" subject_template: "[%{site_name}] Sähköpostiongelma -- Aktivoimaton käyttäjä" text_body_template: | Pahoittelemme, mutta sähköpostin lähettäminen tänne %{destination} (otsikolla %{former_title}) ei onnistunut. Käyttäjätiliä tällä sähköpostiosoitteella ei ole aktivoitu. Aktivoi käyttäjätili ennen sähköpostien lähettämistä. email_reject_blocked_user: + title: "Sähköposti hylätty - estetty käyttäjä" subject_template: "[%{site_name}] Sähköpostiongelma-- Estetty käyttäjä" text_body_template: | Pahoittelemme, mutta sähköpostiviesetisi tänne %{destination} (otsikolla %{former_title}) ei onnistunut. Käyttäjätili tällä sähköpostiosoitteella on estetty. email_reject_reply_user_not_matching: + title: "Sähköposti hylätty - käyttäjä ei täsmää" subject_template: "[%{site_name}] Sähköpostiongelma -- Odottamaton vastausosoite" text_body_template: | Pahoittelut, sähköpostiviestisi lähetys kohteeseen %{destination} (titled %{former_title}) ei onnistunut. Viestisi ei saapunut siitä sähköpostiosoitteesta josta odotimme, joten emme voineet olla varmoja lähettäjästä. Kokeile lähettää viestisi toisesta sähköpostiosoitteesta tai ota yhteyttä henkilökuntaan. email_reject_no_account: + title: "Sähköposti hylätty - ei käyttäjätiliä" subject_template: "[%{site_name}] Sähköpostiongelma -- Tuntematon tili" text_body_template: | Pahoittelut, sähköpostiviestisi lähetys kohteeseen %{destination} (titled %{former_title}) ei onnistunut. Sähköpostiosoitteesi ei vastaa yhtäkään käyttäjistä. Kokeile lähettää viestisi toisesta sähköpostiosoitteesta tai ota yhteyttä henkilökuntaan. email_reject_empty: + title: "Sähköposti hylätty - tyhjä" subject_template: "[%{site_name}] Sähköpostiongelma -- Ei sisältöä" text_body_template: |+ Pahoittelemme, mutta sähköpostin lähettäminen tänne %{destination} (otsikolla %{former_title}) ei onnistunut. @@ -1781,30 +1796,35 @@ fi: Jos saat tämän viestin ja viestisi _sisälsi_ sisältöä, yritä uudestaan yksinkertaisemmalla muotoilulla. email_reject_parsing: + title: "Sähköposti hylätty - jäsennys" subject_template: "[%{site_name}] Sähköpostiongelma -- Sisältöä ei tunnistettu" text_body_template: | Pahoittelemme, mutta sähköpostin lähettäminen tänne %{destination} (otsikolla %{former_title}) ei onnistunut. Emme tunnistaneet sähköpostiviestistäsi sisältöä. **Varmista, että kirjoitit viestisi sähköpostiviestin alkuun** - emme pysty käsittelemään lainausten sekaan kirjoitettuja vastauksia. email_reject_invalid_access: + title: "Sähköposti hylätty - pääsy estetty" subject_template: "[%{site_name}] Sähköpostiongelma -- Pääsy estetty" text_body_template: | Pahoittelut, sähköpostiviestiäsi tänne: %{destination} (otsikolla %{former_title}) ei voitu toimittaa. Tilisi luottamustaso ei ole riittävä, jotta saisit luoda uusia ketjuja tälle alueelle. Jos uskot, että tämä johtuu virheestä, ota yhteyttä henkilökuntaan. email_reject_strangers_not_allowed: + title: "Sähköposti hylätty - vierailla ei pääsyä" subject_template: "[%{site_name}] Sähköpostiongelma -- Pääsy estetty" text_body_template: | Pahoittelut, sähköpostiviestisi lähetys kohteeseen %{destination} (otsikolla %{former_title}) ei onnistunut. Alueelle jolle lähetit viestin voivat kirjoittaa ne, joilla on käypä käyttäjätunnus ja sähköpostiosoite. Jos uskot tämän olevan virhe, ota yhteyttä henkilökuntaan. email_reject_invalid_post: + title: "Sähköposti hylätty - viesti ei kelpaa" subject_template: "[%{site_name}] Sähköpostiongelma -- Lähetysvirhe" text_body_template: | Pahoittelemme: sähköpostiviestisi kohteeseen %{destination} (titled %{former_title}) ei toiminut odotetusti. - Mahdollisia syitä ovat muuan muassa: ei-tuettu muotoilu, liian suuri viesti, liian pieni viesti. Ole hyvä ja yritä uudelleen; voit myös lähettää viestisi sivuston kautta, jos tämä ongelma ei vaikuta poistuvan. + Mahdollisia syitä ovat ainakin: ei-tuettu muotoilu, liian suuri viesti, liian pieni viesti. Ole hyvä ja yritä uudelleen; voit myös lähettää viestisi sivuston kautta, jos tämä ongelma ei vaikuta poistuvan. email_reject_invalid_post_specified: + title: "Sähköposti hylätty - viesti ei kelpaa, tarkennettu" subject_template: "[%{site_name}] Sähköpostiongelma -- Lähetysvirhe" text_body_template: | Pahoittelemme, mutta sähköpostin lähettäminen tänne %{destination} (otsikolla %{former_title}) ei onnistunut. @@ -1815,36 +1835,42 @@ fi: Jos voit korjata ongelman, yritä uudelleen. email_reject_invalid_post_action: + title: "Sähköposti hylätty - kielletty viestitoiminto" subject_template: "[%{site_name}] Sähköpostiongelma -- Kielletty viestitoiminto" text_body_template: | Pahoittelemme, mutta sähköpostin lähettäminen tänne %{destination} (otsikolla %{former_title}) ei onnistunut. Toimintoa ei tunnistettu. Yritä uudelleen tai lähetä viesti nettisivun kautta, jos ongelma jatkuu. email_reject_reply_key: + title: "Sähköposti hylätty - vastausavain" subject_template: "[%{site_name}] Sähköpostiongelma -- Tuntematon vastausavain" text_body_template: | Pahoittelut, sähköpostiviestisi lähetys kohteeseen %{destination} (titled %{former_title}) ei onnistunut. Sähköpostiviestin vastaustunniste, engl. 'reply key', ei ole kelvollinen, minkä vuoksi ei tiedetä, mihin asiaan viestisi oli tarkoitus vastata. Ota yhteyttä henkilökuntaan. email_reject_bad_destination_address: + title: "Sähköposti hylätty - tuntematon vastaanottajaosoite" subject_template: "[%{site_name}] Sähköpostiongelma -- Tuntematon Vastaanottaja: -osoite" text_body_template: | Pahoittelut, sähköpostiviestisi lähetys kohteeseen %{destination} (titled %{former_title}) ei onnistunut. Viestisi kohdesähköpostiosoitteet olivat tuntemattomia. Ole hyvä ja varmistu, että lähetit viestin oikeaan osoitteeseen. email_reject_topic_not_found: + title: "Sähköposti hylätty - ketjua ei löytynyt" subject_template: "[%{site_name}] Sähköpostiongelma -- Ketjua ei löytynyt" text_body_template: | Pahoittelut, sähköpostiviestisi lähetys kohteeseen %{destination} (otsikolla %{former_title}) ei onnistunut. Ketjua johon yritit kirjoittaa ei ole enää olemassa -- ehkä se poistettiin? Jos uskot tämän olevan virhe, ota yhteyttä henkilökuntaan. email_reject_topic_closed: + title: "Sähköposti hylätty - ketju suljettu" subject_template: "[%{site_name}] Sähköpostiongelma -- Suljettu ketju" text_body_template: | Pahoittelut, sähköpostiviestiäsi tänne: %{destination} (otsikolla %{former_title}) ei voitu toimittaa. Ketju, johon yritit vastata on tällä hetkellä suljettu, eikä siihen voi vastata. Jos uskot, että on tapahtunut virhe, ota yhteyttä palstan henkilökuntaan. email_reject_auto_generated: + title: "Sähköposti hylätty - automaattivastaus" subject_template: "[%{site_name}] Sähköpostiongelma -- Automaattivastaus" text_body_template: | Pahoittelut, sähköpostiviestisi lähetys kohteeseen %{destination} (otsikolla %{former_title}) ei onnistunut. @@ -2236,6 +2262,7 @@ fi: too_large: "Pahoittelut, tiedosto jonka latausta yritit on liian suuri ( suurin tiedostokoko on %{max_size_kb}KB)." images: too_large: "Pahoittelut, kuva jonka yritit ladata on liian suuri (suurin sallittu kuvakoko on %{max_size_kb}KB), pienennä kuvaa ja yritä uudestaan." + larger_than_x_megapixels: "Pahoittelut, kuva jota yrität lähettää on liian suuri (maksimikoko on %{max_image_megapixels} megapikseliä). Muuta kuvan kokoa ja yritä uudelleen." size_not_found: "Pahoittelut, mutta emme pystyneet selvittämään kuvan kokoa. Ehkä kuvatiedosto on vahingoittunut?" avatar: missing: "Pahoittelut, emme löydä profiilikuvaa, joka olisi yhdistetty tähän sähköpostiosoitteeseen. Voitko yrittää ladata sen uudestaan?" @@ -2652,11 +2679,11 @@ fi: fields: welcome: label: "Tervetuloa-ketju" - description: "

    Kuinka kuvailisit yhteisöä hississä ventovieraalle, jos sinulla olisi minuutti aikaa?

    • Keille nämä keskustelut on suunnattu?
    • Mistä täällä puhutaan?
    • Miksi täällä kannattaa käydä?

    Tervetuloa-ketju on ensimmäinen asia, jonka palstalle saapunut näkee. Ajattele sitä yhden kappaleen mittaisena \"hissipuheena\" tai \"perimmäisenä tavoitteena\".

    " + description: "

    How Kuinka kuvailisit yhteisöä hississä ventovieraalle, jos sinulla olisi minuutti aikaa?

    • Keille nämä keskustelut on suunnattu?
    • Mistä täällä puhutaan?
    • Miksi täällä kannattaa käydä?

    Tervetuloa-ketju on ensimmäinen asia, jonka palstalle saapunut näkee. Ajattele sitä yhden kappaleen mittaisena \"hissipuheena\" tai \"perimmäisenä tavoitteena\".

    " one_paragraph: "Pidä tervetuloviesti yhden kappaleen mittaisena." privacy: title: "Käyttöoikeudet" - description: "

    Onko yhteisö avoin kaikille vai onko pääsy riippuvainen jäsenyydestä, kutsusta tai hyväksynnästä? Jos haluat, voit laittaa kaiken alulle yksityisesti ja muuttaa foorumin julkiseksi myöhemmin.

    Muista, että voit aina lähettää kutsuja ketjujen alalaidasta kuin myös omalta käyttäjäsivultasikin.

    " + description: "

    Onko yhteisö avoin kaikille vai onko pääsy riippuvainen jäsenyydestä, kutsusta tai hyväksynnästä? Jos haluat, voit laittaa kaiken alulle yksityisesti ja muuttaa foorumin julkiseksi myöhemmin.

    Voit aina lähettää kutsuja ketjujen alalaidasta kuin myös omalta käyttäjäsivultasikin.

    " fields: privacy: choices: @@ -2682,7 +2709,7 @@ fi: description: "Tämän käyttäjän nimissä Discourse lähettää kaikki automaattiset yksityisviestit käyttäjälle. Tärkeimpänä, käyttäjä on uudelle käyttäjälle lähetettävän tervetuloviestin lähettäjä." corporate: title: "Organisaatio" - description: "Nämä nimet näkyvät rekisteriselosteen and käyttöehtojen yhteydessä, joita voit milloin vain muokata henkilökunta-alueella. Jos taustalla ei ole yritystä, voit hypätä tämän vaiheen yli toistaiseksi." + description: "Nämä nimet näkyvät rekisteriselosteen ja käyttöehtojen yhteydessä, joita voit milloin vain muokata henkilökunta-alueella. Jos taustalla ei ole yritystä, voit hypätä tämän vaiheen yli toistaiseksi." fields: company_short_name: label: "Yrityksen nimi (lyhyesti)" diff --git a/config/locales/server.fr.yml b/config/locales/server.fr.yml index dcb93acbe9..10270963be 100644 --- a/config/locales/server.fr.yml +++ b/config/locales/server.fr.yml @@ -32,6 +32,7 @@ fr: purge_reason: "Supprimé automatiquement comme compte abandonné et non activé" disable_remote_images_download_reason: "Le téléchargement des images externes a été désactivé faute de place suffisante sur le disque." anonymous: "Anonyme" + remove_posts_deleted_by_author: "Supprimé par l'auteur" emails: incoming: default_subject: "Courriel entrant de %{email}" @@ -1404,6 +1405,8 @@ fr: user: no_accounts_associated: "Aucun compte associé" deactivated: "A été désactivé à cause de trop de courriels rejetés vers '%{email}'." + deactivated_by_staff: "Désactivé par un responsable" + activated_by_staff: "Activé par un responsable" username: short: "doit être d'au moins %{min} caractères" long: "ne doit pas être supérieur à %{max} caractères" @@ -1482,36 +1485,8 @@ fr: Cette invitation provient d'un utilisateur de confiance, vous pouvez donc répondre immédiatement. invite_forum_mailer: subject_template: "%{invitee_name} vous a invité(e) à rejoindre %{site_domain_name}" - text_body_template: | - %{invitee_name} vous a invité(e) à rejoindre - - > **%{site_title}** - > - > %{site_description} - - Si cela vous intéresse, cliquez sur le lien ci-dessous : - - %{invite_link} - - Cette invitation provient d'un utilisateur de confiance, un compte sera automatiquement créé pour vous. custom_invite_forum_mailer: subject_template: "%{invitee_name} vous a invité(e) à rejoindre %{site_domain_name}" - text_body_template: | - %{invitee_name} vous a invité(e) à rejoindre - - > **%{site_title}** - > - > %{site_description} - - Message de %{invitee_name} : - - %{user_custom_message} - - Si cela vous intéresse, cliquez sur le lien ci-dessous : - - %{invite_link} - - Cette invitation provient d'un utilisateur de confiance, un compte sera automatiquement créé pour vous. invite_password_instructions: subject_template: "Renseignez le mot de passe pour votre compte utilisateur %{site_name} " text_body_template: | @@ -1647,26 +1622,6 @@ fr: (Si, en tant que nouvel utilisateur, vous avez besoin de communiquer avec un [responsable](%{base_url}/about), répondez simplement à ce message.) welcome_invite: subject_template: "Bienvenue sur %{site_name} !" - text_body_template: | - Merci d'avoir accepté votre invitation sur %{site_name} et bienvenue ! - - Nous avons créé un nouveau compte : **%{username}**, et vous y êtes connecté. Vous pouvez changer votre pseudo en allant sur [votre profil][prefs]. - - Pour vous reconnecter : - - 1. Toujours **utiliser la même adresse de courriel que celle de l'invitation** que vous avez reçue. Autrement, nous ne pourrons pas vous reconnaître. - - 2. Créer un mot de passe unique sur votre [sur votre profil][prefs] et connectez-vous avec. - - %{new_user_tips} - - Nous croyons au [comportement communautaire civilisé](%{base_url}/guidelines) en tous temps. - - Amusez-vous bien ! - - (Si, en tant que nouvel utilisateur, vous avez besoin de communiquer avec un [responsable](%{base_url}/about), répondez simplement à ce message). - - [prefs]: %{user_preferences_url} backup_succeeded: subject_template: "Sauvegarde terminée avec succès" text_body_template: | @@ -2734,11 +2689,9 @@ fr: fields: welcome: label: "Sujet de bienvenue" - description: "

    Comment décririez-vous votre communauté à un inconnu en environ 1 minute ?

    • Pour qui sont destinées ces discussions ?
    • Que puis-je trouver ici ?
    • Pourquoi dois-je la visiter ?

    Votre sujet de bienvenue est la première chose que les nouveaux visiteurs vont voir. Voyez le comme votre unique paragraphe qui définit votre mission et différence.

    " one_paragraph: "Veuillez restreindre votre message de bienvenue à un paragraphe." privacy: title: "Accès" - description: "

    Votre communauté est-elle ouverte à tous ou restreinte par adhésion, invitation et approbation ? Si vous préférez, vous pouvez préparer le site en mode privé puis passer en public par la suite.

    Rappelez-vous aussi que vous pouvez toujours envoyer des invitations depuis les sujets ou votre page de profil utilisateur.

    " fields: privacy: choices: @@ -2764,7 +2717,6 @@ fr: description: "Tous les messages privés automatiques de Discourse seront envoyés par cet utilisateur. Plus important, cet utilisateur sera l'envoyeur désigné de tous les messages de bienvenue à destination des nouveaux utilisateurs." corporate: title: "Organisation" - description: "Ces noms seront renseignés dans les pages Politique de confidentialité et Conditions générales d'utilisation que vous pouvez modifier à tout moment depuis la catégorie Staff. Si vous n'avez pas de société, vous pouvez ignorer cette étape pour le moment." fields: company_short_name: label: "Nom de société (court)" @@ -2779,7 +2731,6 @@ fr: title: "Thème" fields: theme_id: - description: "Préférez-vous une palette de couleurs claires ou sombres pour commencer ? Vous pouvez toujours personnaliser l'aspect du site dans Administration, Personaliser." choices: default: label: "Clair" @@ -2804,7 +2755,6 @@ fr: label: "Grande icône" description: "Icône utilisée pour représenter le site sur les appareils modernes et que rend bien à des tailles plus grandes. La taille minimale conseillée est de 144px par 144px." homepage: - description: "Nous recommandons d'afficher les sujets récents sur votre page d'accueil mais vous pouvez choisir d'y afficher les catégories (groupes de sujets) si vous préférez." title: "Page d'accueil" fields: homepage_style: @@ -2815,7 +2765,6 @@ fr: label: "Catégories" emoji: title: "Emoji" - description: "Quel style d'Emoji préférez-vous pour votre communauté ? Vous pouvez toujours ajouter des Emoji supplémentaires dans Administration, Personnaliser, Emoji." invites: title: "Inviter des responsables" description: "Vous avez presque fini ! Invitons quelques responsables pour aider à entamer les discussions avec des sujets et réponses intéressantes pour lancer la communauté." diff --git a/config/locales/server.he.yml b/config/locales/server.he.yml index 37f229f03b..c338080665 100644 --- a/config/locales/server.he.yml +++ b/config/locales/server.he.yml @@ -32,6 +32,7 @@ he: purge_reason: "נמחק אוטומטית כחשבון נטוש ולא פעיל" disable_remote_images_download_reason: "הורדת תמונות מרחוק נחסמה בשל היעדר מספיק שטח אחסון פנוי." anonymous: "אנונימי" + remove_posts_deleted_by_author: "נמחק על ידי הכותב" emails: incoming: default_subject: "התקבל מייל מ %{email}" @@ -72,6 +73,8 @@ he: inclusion: לא נכלל ברשימה invalid: לא תקין is_invalid: "נראה לא ברור, האם זה משפט שלם?" + contains_censored_words: "כולל אחת או יותר מהמילים המצונזרות הבאות: %{censored_words}" + matches_censored_pattern: "מתאים לביטוי הרגולרי המצונזר: %{censored_pattern}" less_than: חייב להיות פחות מ-%{count} less_than_or_equal_to: חייב להיות פחות או שווה ל-%{count} not_a_number: אינו מספר @@ -1069,6 +1072,7 @@ he: max_attachment_size_kb: "הגודל המקסימלי בקילו-בתים (kBs) של קבצים להעלאה. הגדרה זו חייבת להיות מוגדרת ב-nginx (client_max_body_size) / apache או בפרוקסי." authorized_extensions: "רשימה של סיומות מותרות להעלאה (השתמשו ב '*' כדי לאפשר את כל סוגי הקבצים)" max_similar_results: "כמה נושאים דומים להציג מעל לעורך כאשר מחברים נושא חדש. ההשוואה מבוססת על הכותרת וגוף הפוסט." + max_image_megapixels: "מספר מקסימלי מותר של מגה-פיקסלים לתמונה." title_prettify: "מניעת טעויות נפוצות בכותרת, בכללן טעויות עם אותיות גדולות באנגלית, מספר ! ו ?, נקודה מיותרת בסוף, וכד׳" topic_views_heat_low: "לאחר כמות זו של צפיות, שדה הצפיות יהיה קצת יותר בהיר." topic_views_heat_medium: "לאחר כמות צפיות זו, שדה הצפיות יודגש באופן בינוני." @@ -1401,6 +1405,8 @@ he: user: no_accounts_associated: "אין חשבונות מקושרים." deactivated: "הושבת בעקבות מיילים רבים מידי שהוחזרו ל '%{email}'." + deactivated_by_staff: "נוטרל על ידי הצוות" + activated_by_staff: "הופעל על ידי הצוות" username: short: "חייבים להיות לפחות %{min} תווים" long: "נדרשים לא יותר מ-%{max} תווים" @@ -1428,6 +1434,7 @@ he: one: "דגל אחד ממתין לטיפול" other: "%{count} דגלים ממתינים לטיפול" unsubscribe_mailer: + title: "שולח-מיילים לביטול מנוי" subject_template: "אשרו שאינכם מעוניינים יותר לקבל עדכוני דוא\"ל מ%{site_title}" text_body_template: | מישהו (כנראה אתם?) ביקש לא לקבל יותר עדכוני מייל מ %{site_domain_name} לכתובת זו. @@ -1438,6 +1445,7 @@ he: אם אתם מעוניינים להמשיך לקבל עדכונים במייל, אתם יכולים להתעלם ממייל זה. invite_mailer: + title: "שולח-מיילים להזמנה" subject_template: "הוזמנת על ידי %{invitee_name} ל '%{topic_title}' ב%{site_domain_name}" text_body_template: | %{invitee_name} הזמין/הזמינה אותך לדיון @@ -1456,6 +1464,7 @@ he: הזמנה זו נשלחה על ידי משתמש/ת מוכר/ת ולכן אתם יכולים להשיב לדיון הנ"ל באופן מיידי. custom_invite_mailer: + title: "שולח-מיילים מותאם-אישית להזמנה" subject_template: "%{invitee_name} הזמין/הזמינה אותך לדיון '%{topic_title}' באתר %{site_domain_name}" text_body_template: | %{invitee_name} הזמין/הזמינה אותך לדיון @@ -1477,6 +1486,7 @@ he: הזמנה זו נשלחה על ידי משתמש מוכר, כך שתוכלו להגיב לדיון מיידית. invite_forum_mailer: + title: "שולח-מיילים להזמנה לפורום" subject_template: "%{invitee_name} הזמינ/ה אתכם להצטרף ל%{site_domain_name}" text_body_template: | %{invitee_name} הזמין/ה אתכם להצטרף ל @@ -1489,8 +1499,9 @@ he: %{invite_link} - הזמנה זו נשלחה ממשתמש/ת מוכר/ת באתר. החשבון יווצר עבורכם באופן אוטומטי. + הזמנה זו נשלחה ממשתמש/ת מוכר/ת באתר, כך שהחשבון יווצר עבורכם באופן אוטומטי עם כתובת מייל זו. custom_invite_forum_mailer: + title: "שולח-מיילים להזמנה לפורום" subject_template: "%{invitee_name} הזמין/ה אתכם להצטרף ל %{site_domain_name}" text_body_template: | %{invitee_name} הזמינו אתכם להצטרף ל @@ -1507,14 +1518,16 @@ he: %{invite_link} - הזמנה זו נשלחה ממשתמשים מוכרים באתר, כך שהחשבון שלכם יווצר באופן אוטומטי. + הזמנה זו נשלחה ממשתמשים מוכרים באתר, כך שהחשבון שלכם יווצר באופן אוטומטי עבור כתובת מייל זו. invite_password_instructions: + title: "הנחיות סיסמה למוזמנים" subject_template: "צרו סיסמה עבור חשבון ה-%{site_name} שלכם." text_body_template: | תודה שקיבלתם את ההזמנה שלכם ל %{site_name} -- ברוכים הבאים! לחצו על הקישור בשביל לבחור סיסמה: %{base_url}/users/password-reset/%{email_token} (אם הקישור פג תוקף, בחרו ב"שכחתי את הסיסמה שלי" בהתחברות.) test_mailer: + title: "שולח-מיילים לבדיקה" subject_template: "[%{site_name}] מייל בדיקת שליחתיות" text_body_template: | זהו מייל בדיקה מ @@ -1558,6 +1571,7 @@ he: [mj]: https://www.mailjet.com/pricing [mt]: http://www.mail-tester.com/ new_version_mailer: + title: "שולח-מיילים של גרסה חדשה" subject_template: "[%{site_name}] גרסת Discourse חדשה, עדכון זמין." text_body_template: | יש! יצאה גרסה חדשה של [Discourse](http://www.discourse.org) @@ -1571,6 +1585,7 @@ he: - בקרו את [meta.discourse.org](https://meta.discourse.org) לחדשות, דיונים, ותמיכה ב Discourse new_version_mailer_with_notes: + title: "שולח-מיילים של גרסה חדשה עם הערות" subject_template: "[%{site_name}] עדכון זמין" text_body_template: | יש! יצאה גרסה חדשה של [Discourse](http://www.discourse.org) @@ -1588,6 +1603,7 @@ he: %{notes} queued_posts_reminder: + title: "תזכורת פוסטים בתור" subject_template: one: "[%{site_name}] פוסט 1 מחכה לסקירה" other: "[%{site_name}] %{count} פוסטים ממתינים לסקירה" @@ -1609,6 +1625,7 @@ he: temporarily_closed_due_to_flags: "נושא זה סגור באופן זמני בעקבות מספר רב של דגלים של הקהילה. " system_messages: post_hidden: + title: "פוסט חבוי" subject_template: "פוסט הוסתר על ידי דגלים של הקהילה" text_body_template: | שלום, @@ -1630,6 +1647,7 @@ he: ככל שתשתתפו כאן, נכיר אתכם, ומגבלות זמניות על משתמשים חדשים יוסרו. במהלך הזמן תצבעו [דרגות אמון](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) שכוללות יכולות לסייע לנו לנהל את הקהילה שלנו ביחד. welcome_user: + title: "ברוכים הבאים למשתמש/ת" subject_template: "ברוכים הבאים ל %{site_name}!" text_body_template: | תודה שהצטרפתם ל %{site_name}! @@ -1642,17 +1660,14 @@ he: (אם ברצונכם לתקשר עם [מנהל האתר](%{base_url}/about) כמשתמשים חדשים, השיבו להודעה הזו.) welcome_invite: + title: "הזמנת ברוכים הבאים" subject_template: "ברוכים הבאים ל %{site_name}!" text_body_template: | - תודה שקיבלתם את ההזמנה שלכם ל %{site_name} - ברוכים הבאים! + תודה שקיבלתם את ההזמנה שלכם ל %{site_name} -- ברוכים הבאים! - יצרנו חשבון חדש **%{username}** בשבילכם, ואתם מחוברים. תוכלו תמיד לשנות את שמכם באמצעות ביקור [בפרופיל שלכם][prefs]. + - יצרנו חשבון חדש **%{username}** בשבילכם. שנו את שימכם או את הסיסמה על ידי ביקור ב[פרופיל שלכם][prefs]. - על מנת להתחבר שוב: - - 1. השתמשו תמיד **באותו חשבון מייל מההזמנה המקורית** בעת ההתחברות. אחרת לא נוכל לדעת שאלו אתם! - - 2. צרו סיסמה ייחודית עבור [הפרופיל שלכם] [prefs] והשתמשו בה בשביל להתחבר. + - כאשר אתם מתחברים, אנא **השתמשו באותו חשבון מייל מההזמנה המקורית** — אחרת לא נוכל לדעת שאלו אתם! %{new_user_tips} @@ -1664,6 +1679,7 @@ he: [prefs]: %{user_preferences_url} backup_succeeded: + title: "גיבוי הצליח" subject_template: "הגיבוי הושלם בהצלחה." text_body_template: | הגיבוי הצליח. @@ -1676,6 +1692,7 @@ he: %{logs} ``` backup_failed: + title: "גיבוי נכשל" subject_template: "הגיבוי נכשל." text_body_template: | הגיבוי נכשל. @@ -1686,6 +1703,7 @@ he: %{logs} ``` restore_succeeded: + title: "שחזור הצליח" subject_template: "השחזור הסתיים בהצלחה." text_body_template: | השחזור הצליח. @@ -1696,6 +1714,7 @@ he: %{logs} ``` restore_failed: + title: "שחזור נכשל" subject_template: "השחזור נכשל" text_body_template: | השחזור נכשל. @@ -1706,9 +1725,11 @@ he: %{logs} ``` bulk_invite_succeeded: + title: "הזמנה קבוצתית הצליחה" subject_template: "ההזמנה הקבוצתית עובדה בהצלחה" text_body_template: "ההזמנה המרוכזת שלכם עובדה, %{sent} הזמנות נשלחו." bulk_invite_failed: + title: "הזמנה קבוצתית נכשלה" subject_template: "ההזמנה המרוכזת עובדה עם שגיאות" text_body_template: | ההזמנה הקבוצתית שלך עובדה, %{sent} הזמנות נשלחו עם %{failed} תקלה/ות. @@ -1721,6 +1742,7 @@ he: %{logs} ``` csv_export_succeeded: + title: "יצוא CSV הצליח" subject_template: "יצוא הנתונים הושלם" text_body_template: | הנתונים שלך יוצאו בהצלחה! :dvd: @@ -1729,51 +1751,60 @@ he: לינק ההורדה יהיה זמין במשך 48 שעות. csv_export_failed: + title: "יצוא CSV נכשל" subject_template: "ייצוא הנתונים נכשל" text_body_template: "צר לנו, אך ייצוא הנתונים שלכם נכשל. אנא בדקו את רישומי המערכת או צרו קשר עם איש/אשת צוות." email_reject_insufficient_trust_level: + title: "מייל נדחה, רמת אמון לא מספיקה" subject_template: "[%{site_name}] בעיית מייל -- רמת אמון לא מספיקה" text_body_template: | אנחנו מצטערים, אך הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. לחשבון שלכם אין את רמת האמון הנדרשת כדי לפרסם נושאים חדשים לכתובת מייל זו. אם אתם חושבים שזו טעות, אנא פנו לחבר צוות. email_reject_user_not_found: + title: "מייל נדחה, משתמש לא נמצא" subject_template: "[%{site_name}] בעיית מייל -- משתמש לא נמצא" text_body_template: | אנחנו מצטערים, אבל הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. התגובה שלכם נשלחה מכתובת מייל לא ידועה. נסו לשלוח מכתובת מייל אחרת, או ליצור קשר עם חבר צוות. email_reject_screened_email: + title: "מייל נדחה, מייל מסונן" subject_template: "[%{site_name}] בעיית מייל -- מייל חסום" text_body_template: | אנחנו מצטערים, אך הודעת המייל ל %{destination} (עם הכותרת %{former_title}) לא עבדה. התשובה שלכם נשלחה מכתובת מייל חסומה. נסו לשלוח מכתובת מייל אחרת, או צרו קשר עם חבר צוות. email_reject_inactive_user: + title: "מייל נדחה, משתמש לא פעיל" subject_template: "[%{site_name}] בעיית מייל -- משתמש לא-פעיל" text_body_template: | אנחנו מצטערים, אך הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. החשבון שלכם שמקושר לכתובת המייל הזו לא הופעל. אנא הפעילו את החשבון שלכם לפני שאתם שולחים מיילים למערכת. email_reject_blocked_user: + title: "מייל נדחה, משתמש חסום" subject_template: "[%{site_name}] בעיית מייל -- משתמש חסום" text_body_template: | אנחנו מצטערים, אך הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. חשבונכם שקשור לכתובת מייל זו נחסם. email_reject_reply_user_not_matching: + title: "דחיית מייל משתמש/ת לא מתאימים" subject_template: "[%{site_name}] בעיית מייל -- נמען לא תואם" text_body_template: | אנחנו מצטערים, אך הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. התשובה שלכם נשלחה מכתובת מייל שונה מזו שציפינו לה, אז אנחנו לא בטוחים אם זה אותו אדם. נסו לשלוח מכתובת מייל אחרת, או ליצור קשר עם חבר צוות. email_reject_no_account: + title: "מייל נדחה, אין חשבון" subject_template: "[%{site_name}] בעיית מייל -- חשבון לא מזוהה" text_body_template: | אנחנו מצטערים, אך הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. אנחנו לא מוצאים חשבונות שמתאימים לכתובת המייל שלכם. נסו לשלוח מכתובת מייל אחרת, או צרו קשר עם חבר צוות. email_reject_empty: + title: "מייל נדחה, ריק" subject_template: "[%{site_name}] בעיית מייל -- ללא תוכן" text_body_template: | אנחנו מצטערים, אך הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. @@ -1782,30 +1813,35 @@ he: אם אתם מקבלים את ההודעה הזו ו_כן_ כללתם תגובה, נסו שוב עם סיגנון פשוט יותר. email_reject_parsing: + title: "מייל נדחה, פענוח" subject_template: "[%{site_name}] בעיית מייל -- תוכן לא זוהה." text_body_template: | אנחנו מצטערים, אך הודעת המייל שלכם ל- %{destination} (עם הכותרת %{former_title}) לא עבדה. לא מצאנו תוכן במייל שלכם. **אנא ודאו שהתגובה שלכם בראש המייל** -- אנחנו לא יכולים לעבד תגובות בין השורות. email_reject_invalid_access: + title: "דחיית מייל גישה לא-מורשית" subject_template: "[%{site_name}] בעיית מייל -- גישה לא תקינה" text_body_template: | אנחנו מצטערים, אבל הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. לחשבון שלכם אין מספיק הרשאות כדי לפרסם נושאים חדשים בקטגוריה זו. אם אתם מאמינים שזו טעות, צרו קשר עם חבר צוות. email_reject_strangers_not_allowed: + title: "דחיית מייל זרים לא מורשים" subject_template: "[%{site_name}] בעיית מייל -- גישה לא נכונה" text_body_template: | אנחנו מצטערים, אבל הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. הקטגוריה ששלחתם אליה את המייל הזה מאפשרת רק תגובות ממשתמשים עם חשבונות תקינים וכתובות מייל ידועות. אם אתם מאמינים שזו טעות, אנא פנו לחבר צוות. email_reject_invalid_post: + title: "דחיית מייל פוסט לא-תקין" subject_template: "[%{site_name}] בעיית מייל -- תקלה בפרסום" text_body_template: | אנחנו מצטערים, אך הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. גורמים אפשריים: עיצוב מורכב, הודעה ארוכה מידי, הודעה קצרה מידי. אנא נסו שוב, או פרסמו דרך האתר אם התקלה חוזרת. email_reject_invalid_post_specified: + title: "דחיית מייל הוגדר פוסט לא-תקני" subject_template: "[%{site_name}] בעיית מייל -- תקלה בפרסום" text_body_template: | אנחנו מצטערים, אך הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. @@ -1816,42 +1852,49 @@ he: אם תוכלו לתקן את הבעיה, אנא נסו שוב. email_reject_invalid_post_action: + title: "דחיית מייל פעולת פוסט לא-תקנית" subject_template: "[%{site_name}] בעיית מייל -- פעולה לא-תקנית" text_body_template: | אנחנו מצטערים, אך הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. הפעולה לא זוהתה. אנא נסו שוב, או פרסמו דרך האתר אם התקלה נמשכת. email_reject_reply_key: + title: "דחיית מייל מפתח תגובה" subject_template: "[%{site_name}] בעיית מייל -- תו תגובה לא מוכר" text_body_template: | אנחנו מצטערים, אך הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. מפתח התגובה במייל לא תקין או לא ידוע, אז לא יכולנו להבין למה המייל הזה מגיב. אנא פנו לחבר צוות. email_reject_bad_destination_address: + title: "דחיית מייל כתובת יעד לא-נכונה" subject_template: "[%{site_name}] בעיית מייל -- כתובת To: לא ידועה" text_body_template: | אנחנו מצטערים, אבל הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. אף אחד מייעדי המייל לא זוהה. אנא וודאו שאתם שולחים לכתובת המייל הנכונה שניתנה על-ידי הצוות. email_reject_topic_not_found: + title: "דחיית מייל נושא לא נמצא" subject_template: "[%{site_name}] בעיית מייל -- לא נמצא נושא" text_body_template: | אנחנו מצטערים, אך הודעת המייל ל %{destination} (עם הכותרת %{former_title}) לא עבדה. הנושא שאתם מנסים להגיב אליו כבר לא קיים -- אולי הוא נמחק? אם אתם מאמינים שזו טעות, אנא פנו לחבר צוות. email_reject_topic_closed: + title: "דחיית מייל נושא סגור" subject_template: "[%{site_name}] בעיית מייל -- נושא נסגר" text_body_template: | אנחנו מצטערים, אך הודעת המייל ל %{destination} (עם הכותרת %{former_title}) לא עבדה. הנושא שאתם מגיבים אליו סגור כרגע ולא מקבל יותר תגובות. אם אתם מאמינים שזו טעות, אנא פנו לחבר צוות. email_reject_auto_generated: + title: "דחיית מייל נוצר אוטומטית" subject_template: "[%{site_name}] בעיית מייל -- תגובה נוצרה אוטומטית" text_body_template: | אנחנו מצטערים, אבל משהו לא עבד עם הודעת הדוא"ל שלך, שנשלחה אל %{destination} (titled %{former_title}). המייל ששלחת סומן כ"נכתב אוטומטית", מה שאומר שהוא נכתב על ידי מחשב ולא הוקלד על ידי אדם; איננו יכולים לקבל מיילים שכאלה. אם אתם מאמינים שזוהי תקלה, אנא צרו קשר עם איש/אשת צוות. email_error_notification: + title: "התראת בעיית מייל" subject_template: "[%{site_name}] בעיית מייל -- בעיית אימות POP" text_body_template: | למרבה הצער, ארעה תקלה בזמן תשאול מיילים משרת ה POP. @@ -1860,6 +1903,7 @@ he: אם יש ממשק ווב לחשבון ה POP, ייתכן ותצטרכו להתחבר לאתר וקבוע את ההגדרות שלכם שם. too_many_spam_flags: + title: "יותר מידי דיגלי ספאם" subject_template: "חשבון חדש בהשהיה" text_body_template: | שלום, @@ -1870,6 +1914,7 @@ he: להנחיות נוספות, אנא פנו ל[הנחיות הקהילה](%{base_url}/guidelines). too_many_tl3_flags: + title: "יותר מידי דגלי רמת-אמון 3" subject_template: "חשבון חדש בהשהיה" text_body_template: | שלום, @@ -1880,6 +1925,7 @@ he: לפרטים נוספים, אנא פנו ל[הנחיות הקהילה](%{base_url}/guidelines). blocked_by_staff: + title: "נחסם על ידי הצוות" subject_template: "חשבון זמנית בהשהיה" text_body_template: | שלום, @@ -1890,6 +1936,7 @@ he: להנחיות נוספות, אנא פנו ל[הנחיות הקהילה](%{base_url}/guidelines). user_automatically_blocked: + title: "משתמש נחסם אוטומטית" subject_template: "המשתמש החדש %{username} נחסם על ידי דגלים של הקהילה" text_body_template: | זוהי הודעה אוטומטית. @@ -1900,6 +1947,7 @@ he: סף זה ניתן לשינוי באמצעות הגדרת האתר `block_new_user`. spam_post_blocked: + title: "פוסט ספאם נחסם" subject_template: "פוסים של המשתמש/ת החדש/ה %{username} נחסמו בשל קישורים חוזרים." text_body_template: | זוהי הודעה אוטומטית. @@ -1910,6 +1958,7 @@ he: ניתן לכוון זאת בהגדרות האתר `newuser_spam_host_threshold` ו`white_listed_spam_host_domains`. unblocked: + title: "לא-חסום" subject_template: "החשבון כבר לא מושהה" text_body_template: | שלום, @@ -1918,6 +1967,7 @@ he: אתם יכולים עכשיו ליצור נושאים חדשים, ושוב להגיב לנושאים קיימים. תודה על הסבלנות. pending_users_reminder: + title: "תזכורת משתמשים ממתינים" subject_template: one: "משתמש 1 ממתין לאישורכם" other: "%{count} משתמשים ממתינים לאישורכם" @@ -1926,9 +1976,11 @@ he: [אנא סיקרו אותם באזור הניהול](%{base_url}/admin/users/list/pending). download_remote_images_disabled: + title: "הורדת תמונות מרוחקות מנוטרלת" subject_template: "הורדת תמונות מרחוק מנוטרלת" text_body_template: "האפשרות \"הורדת תמונות מרוחקות\" נוטרלה בגלל שכל שטח האכסון שמוקצה ל\"תמונות שהורדו מרחוק\" נוצל." dashboard_problems: + title: "בעיות בלוח המכוונים" subject_template: "נמצאו בעיות" text_body_template: | כמה בעיות מדווחות ללוח המכוונים של האדמיניסטרטור. @@ -1980,6 +2032,7 @@ he: > %{site_title} -- %{site_description} user_invited_to_private_message_pm: + title: "משתמש/ת הוזמן/ה להודעה פרטית" subject_template: "[%{site_name}] %{username} הזמין אותך להודעה '%{topic_title}'" text_body_template: | %{header_instructions} @@ -1988,6 +2041,7 @@ he: %{respond_instructions} user_invited_to_private_message_pm_staged: + title: "משתמש/ת הוזמן/ה להודעה פרטית מדורגת" subject_template: "הוזמנת לדיון '%{topic_title}' על ידי [%{site_name}] %{username}" text_body_template: | %{header_instructions} @@ -1996,6 +2050,7 @@ he: %{respond_instructions} user_invited_to_topic: + title: "משתמש/ת הוזמן/ה לנושא" subject_template: "הוזמנת לדיון שכותרתו '%{topic_title}' על ידי [%{site_name}] %{username}" text_body_template: | %{header_instructions} @@ -2004,6 +2059,7 @@ he: %{respond_instructions} user_replied: + title: "משתמש/ת הגיב" subject_template: "[%{site_name}] %{topic_title}" text_body_template: | %{header_instructions} @@ -2014,6 +2070,7 @@ he: %{respond_instructions} user_replied_pm: + title: "משתמש/ת הגיב/ה בהודעה פרטית" subject_template: "[%{site_name}] [PM] %{topic_title}" text_body_template: | %{header_instructions} @@ -2024,6 +2081,7 @@ he: %{respond_instructions} user_quoted: + title: "משתמש/ת צוטט/ה" subject_template: "[%{site_name}] %{topic_title}" text_body_template: | %{header_instructions} @@ -2034,6 +2092,7 @@ he: %{respond_instructions} user_linked: + title: "משתמש/ת קושר/ה" subject_template: "[%{site_name}] %{topic_title}" text_body_template: | %{header_instructions} @@ -2044,6 +2103,7 @@ he: %{respond_instructions} user_mentioned: + title: "משתמש/ת הוזכר/ה" subject_template: "[%{site_name}] %{topic_title}" text_body_template: | %{header_instructions} @@ -2054,6 +2114,7 @@ he: %{respond_instructions} user_group_mentioned: + title: "קבוצת משתמש הוזכרה" subject_template: "[%{site_name}] %{topic_title}" text_body_template: | %{header_instructions} @@ -2064,6 +2125,7 @@ he: %{respond_instructions} user_posted: + title: "משתמש/ה פרסם/ה" subject_template: "[%{site_name}] %{topic_title}" text_body_template: | %{header_instructions} @@ -2074,6 +2136,7 @@ he: %{respond_instructions} user_watching_first_post: + title: "משתמש/ת צופה בפוסט ראשון" subject_template: "[%{site_name}] %{topic_title}" text_body_template: | %{header_instructions} @@ -2084,6 +2147,7 @@ he: %{respond_instructions} user_posted_pm: + title: "משתמש/ת פרסם/ה הודעה פרטית" subject_template: "[%{site_name}] [PM] %{topic_title}" text_body_template: | %{header_instructions} @@ -2094,6 +2158,7 @@ he: %{respond_instructions} user_posted_pm_staged: + title: "משתמש/ת פרסם/ה הודעה פרטית מדורגת" subject_template: "%{optional_re}%{topic_title}" text_body_template: |2 @@ -2128,6 +2193,7 @@ he: view_this_topic: "צפו בנושא זה" back_to_top: "חזרה למעלה" forgot_password: + title: "שכח/ה סיסמה" subject_template: "[%{site_name}] איפוס סיסמה" text_body_template: | מישהו ביקש לאפס את הסיסמה שלכם ב [%{site_name}](%{base_url}). @@ -2137,6 +2203,7 @@ he: לחצו על הקישור הבא כדי לבחור סיסמה חדשה: %{base_url}/users/password-reset/%{email_token} set_password: + title: "קביעת סיסמה" subject_template: "[%{site_name}] קביעת סיסמה" text_body_template: | מישהו ביקש להוסיף סיסמה לחשבון שלכם ב [%{site_name}](%{base_url}). לחילופין, תוכלו להתחבר באמצעות כל שירות נתמך (גוגל, פייסבוק, וכד׳) שמקושר לכתובת מייל תקינה. @@ -2146,6 +2213,7 @@ he: לחצו על הלינק הבא כדי לבחור סיסמה: %{base_url}/users/password-reset/%{email_token} admin_login: + title: "התחברות אדמיניסטרטור" subject_template: "[%{site_name}] התחברות" text_body_template: | מישהו ביקש להתחבר לחשבונכם ב [%{site_name}](%{base_url}). @@ -2153,6 +2221,7 @@ he: לחצו על הקישור הבא להתחבר: %{base_url}/users/admin-login/%{email_token} account_created: + title: "חשבון נוצר" subject_template: "[%{site_name}] החשבון החדש שלך" text_body_template: | חשבון חדש נוצר עבורך ב%{site_name} @@ -2160,12 +2229,14 @@ he: הקישו על הקישור המצורף כדי להגדיר סיסמה לחשבונכם החדש: %{base_url}/users/password-reset/%{email_token} confirm_new_email: + title: "אישור מייל חדש" subject_template: "[%{site_name}] אשרו את כתובת המייל החדשה שלכם" text_body_template: | אשרו את כתובת המייל החדשה שלכם עבור %{site_name} על ידי לחיצה על הקישור הבא: %{base_url}/users/authorize-email/%{email_token} confirm_old_email: + title: "אישור מייל ישן" subject_template: "[%{site_name}] אשרו את כתובת המייל הנוכחית שלכם" text_body_template: | לפני שתוכלו להחליף את כתובת המייל שלכם, אנחנו צריכים שתאשרו שאתם שולטים @@ -2176,6 +2247,7 @@ he: %{base_url}/users/authorize-email/%{email_token} notify_old_email: + title: "התראת מייל ישן" subject_template: "[%{site_name}] כתובת המייל שלכם שונתה" text_body_template: | זוהי הודעה אוטומטית כדי ליידע אתכם שכתובת המייל שלכם עבור %{site_name} שונתה. אם זה נעשה בטעות, אנא צרו קשר עם מנהל האתר. @@ -2184,6 +2256,7 @@ he: %{new_email} signup_after_approval: + title: "הרשמה אחרי אישור" subject_template: "אושרתם באתר %{site_name}!" text_body_template: | ברוכים הבאים ל%{site_name}! @@ -2203,6 +2276,7 @@ he: (אם אתם צריכים ליצור קשר עם [חברי צוות](%{base_url}/about) כחברים חדשים, רק השיבו להודעה זאת.) signup: + title: "הרשמה" subject_template: "[%{site_name}] אשרו את חשבונכם החדש" text_body_template: | ברוכים הבאים ל %{site_name}! @@ -2236,6 +2310,7 @@ he: too_large: "מצטערים, הקובץ שאתם מנסים להעלות גדול מידי (הגודל המקסימלי המותר הוא %{max_size_kb}KB)." images: too_large: "סליחה, אך התמונה שאתם מנסים להעלות גדולה מידי. (הגודל המקסימלי הוא %{max_size_kb}KB), אנא שנו את הגודל ונסו שנית." + larger_than_x_megapixels: "מצטערים, התמונה שאתם מנסים להעלות היא גדולמה מידי (הגודל המירבי הוא %{max_image_megapixels}-מגה-פיקסלים), אנא שנו את גודלה ונסו שוב." size_not_found: "מצטערים, אבל לא יכולנו לקבוע את גודל התמונה. אולי יש בעיה טכנית בתמונה?" avatar: missing: "מצטערים, אנחנו לא יכולים למצוא אף דמות שמקושרת לכתובת מייל זו. תוכלו להעלות זאת שוב?" @@ -2874,7 +2949,7 @@ he: fields: welcome: label: "נושא ברוכים-הבאים" - description: "

    כיצד הייתם מתארים את הקהילה שלכם לאדם זר במעלית אם יש לכם רק דקה אחת?

    • עבור מי נועדו דיונים אלו?
    • מה אוכל למצוא פה?
    • למה כדאי לי לבקר?

    נושא הברוכים-הבאים שלכם הוא הדבר הראשון שמבקרים חדשים יראו. חישבו עליו כפסקה אחת של ׳נאום המעלית׳ או ׳הצהרת הכוונות׳ שלכם.

    " + description: "

    כיצד הייתם מתארים את הקהילה שלכם לאדם זר במעלית אם יש לכם רק דקה 1?

    • עבור מי נועדו דיונים אלו?
    • מה אוכל למצוא פה?
    • למה כדאי לי לבקר?

    נושא הברוכים-הבאים שלכם הוא הדבר הראשון שמבקרים חדשים יקראו. חישבו עליו כפסקה אחת של ׳נאום המעלית׳ או ׳הצהרת הכוונות׳ שלכם.

    " one_paragraph: "אנא הגבילו את הודעת הברוכים-הבאים שלכם לפסקה אחת." privacy: title: "גישה" @@ -2919,7 +2994,7 @@ he: title: "תמה" fields: theme_id: - description: "האם אתם מעדיפים להתחיל עם סכמת צבעים בהירה או כהה? תמיד תוכלו להמשיך ולהתאים את המראה של האתר שלכם באמצעות ״ניהול״ > ״התאמה-אישית״." + description: "האם אתם מעדיפים להתחיל עם סכמת צבעים בהירה או כהה? תוכלו בהמשך להתאים אישית את הנראות של האתר שלכם תחת ניהול, התאמה-אישית." choices: default: label: "בהיר פשוט" @@ -2944,7 +3019,7 @@ he: label: "אייקון גדול" description: "תמונה שמשמשת לייצוג האתר שלכם במכשירים מודרניים ונראית טוב בגדלים גדולים יותר. הגודל המומלץ הוא לפחות 144 על 144 פיקסלים." homepage: - description: "אנחנו ממליצים להציג את הנושאים האחרונים בדף הבית שלכם, אבל אתם יכולים לבחור להראות קטגוריות (קבוצות של נושאים) על דף הבית אם אתם מעדיפים." + description: "אנחנו ממליצים להציג את הנושאים האחרונים בדף הבית שלכם, אבל אתם יכולים גם להציג קטגוריות (קבוצות נושאים) בדף הבית אם תעדיפו." title: "דף הבית" fields: homepage_style: @@ -2955,7 +3030,7 @@ he: label: "קטגוריות" emoji: title: "אמוג׳י" - description: "איזה סגנון אמוג׳י אתם מעדיפים עבור הקהילה שלכם? תמיד תוכלו להוסיף עוד אמוג׳י בהמשך באמצעות ״ניהול״ > ״התאמה״ > ״אמוג׳י״." + description: "איזה סגנון אמוג׳יז תעדיפו לקהילה שלכם? אתם יכולים להוסיף עוד אמוג׳יז מותאמים אישית תחת ניהול, התאמה אישית, אמוג׳י." invites: title: "הזמינו צוות" description: "כמעט סיימתם! בואו נזמין כמ חברי צוות כדי לסייע לזרוע את הדיונים עם נושאים מעניינים ותגובות שיניעו קדימה את הקהילה שלכם." diff --git a/config/locales/server.ja.yml b/config/locales/server.ja.yml index 0aa38c8f51..cf4ba71ae6 100644 --- a/config/locales/server.ja.yml +++ b/config/locales/server.ja.yml @@ -1041,25 +1041,6 @@ ja: (もし[スタッフメンバー](%{base_url}/about) に新規ユーザーとして連絡する必要がある場合、このメッセージに返信してください) welcome_invite: subject_template: "%{site_name}へようこそ!" - text_body_template: | - %{site_name}へようこそ! - アカウント **%{username}** を作成し、ログインしています。 - - 名前の変更は [自分のユーザプロフィール][prefs] より行ってください。 - - 次回からログインする際は、 - - 1. 招待時に使用したメールアドレスを使用してください。 - - 2.[自分のユーザプロフィール][prefs]からパスワードを設定して、ログインのときは設定したパスワードを使用してください。 - - %{new_user_tips} [civilized community behavior](%{base_url}/guidelines)をお守りいただき、健全なコミュニティとなるよう皆様のご協力をお願いいたします。 - - それではお楽しみください! - - (もし、[スタッフ](%{base_url}/about) と連絡を取る必要がある場合はこのメッセージに返信してください) - - [prefs]: %{user_preferences_url} backup_succeeded: subject_template: "バックアップは正常に完了しました" backup_failed: diff --git a/config/locales/server.ko.yml b/config/locales/server.ko.yml index ae26f88e02..c260046624 100644 --- a/config/locales/server.ko.yml +++ b/config/locales/server.ko.yml @@ -1012,26 +1012,6 @@ ko: (할 말이 있을 땐 새 사용자로서 [스태프](%{base_url}/about)들에게 이야기 주세요, 이 메세지에 답글로 주시면 바로 올라갑니다.) welcome_invite: subject_template: "%{site_name} 사이트에 오신것을 환영합니다!" - text_body_template: | - %{site_name}의 초대에 응해주셔서 감사합니다 반갑습니다! - - **%{username}**로 새 사용자를 만들었고 로그인된 상태입니다. [사용자 정보][prefs]에 들어가 이름을 바꿀 수 있습니다. - - 나중에 다시 로그인하려면: - - 1. 항상 **초대 받은 이메일 주소를 사용해서** 로그인해주셔야지 안 그러면 같은 사람이라고 인식 못할 겁니다! - - 2. [사용자 정보][prefs],에서 유니크한 비밀번호를 만들어 사용해주세요. - - %{new_user_tips} - - 우리는 [문화시민의 커뮤니티 활동 지침](%{base_url}/guidelines)을 항상 따릅니다. - - 커뮤니티를 즐려주세요! - - (할 말이 있을 땐 새 사용자로서 [스태프](%{base_url}/about)들에게 이야기주세요, 이 메세지에 답글로 주시면 바로 올라갑니다.) - - [사용자 정보 설정]: %{user_preferences_url} backup_succeeded: subject_template: "백업 성공" backup_failed: diff --git a/config/locales/server.nb_NO.yml b/config/locales/server.nb_NO.yml index 9df2e7f128..abca0984f5 100644 --- a/config/locales/server.nb_NO.yml +++ b/config/locales/server.nb_NO.yml @@ -29,11 +29,14 @@ nb_NO: loading: "Laster" powered_by_html: 'Drevet av Discourse, best nyttet med JavaScript på' log_in: "Logg inn" + purge_reason: "Automatisk slettet som som forlatt, uaktivert konto" disable_remote_images_download_reason: "Nedlasting av bilder ble deaktivert grunnet mangel på tilgjengelig diskplass." anonymous: "Anonym" + remove_posts_deleted_by_author: "Slettet av forfatter" emails: incoming: default_subject: "Innkommende e-post fra %{email}" + show_trimmed_content: "Vis beskjært innhold" errors: no_message_id_error: "Skjer når en e-post ikke har noen «Message-Id»-header." auto_generated_email_error: "Skjer når «Precedence»-headeren er satt til list, junk, bulk eller auto_reply eller når en annen header innholder auto-submitted, auto-replied eller auto-generated." @@ -275,12 +278,16 @@ nb_NO: common: "er et av de 10000 mest vanlige passordene. Venligst benytt et mer sikkert passord." same_as_username: "er det somme som brukernavnet ditt. Benytt et sikrere passord." same_as_email: "er det samme som din e-mail. Benytt et sikrere passord." + same_as_current: "er det samme som nåværende passord." ip_address: signup_not_allowed: "Registrering er ikke tillatt fra denne kontoen." color_scheme_color: attributes: hex: invalid: "er ikke en gyldig farge" + post_reply: + base: + different_topic: "Innlegg og svar må tilhøre samme kategori." web_hook: attributes: payload_url: @@ -1183,8 +1190,6 @@ nb_NO: contact_email: label: "E-post" placeholder: "navn@example.com" - corporate: - description: "Disse navnene vil bli satt inn i din Personvernerklæring og dine Bruksvilkår, som du kan endre når som helst i stab-kategorien. Hvis du ikke har et firma, kan du gjerne hoppe over dette steget." logos: title: "Logoer" fields: diff --git a/config/locales/server.nl.yml b/config/locales/server.nl.yml index 729964e5eb..43c687ff00 100644 --- a/config/locales/server.nl.yml +++ b/config/locales/server.nl.yml @@ -32,6 +32,7 @@ nl: purge_reason: "Automatisch verwijderd, account gedeactiveerd." disable_remote_images_download_reason: "Het downloaden van plaatjes is uitgeschakeld omdat er niet genoeg schijfruimte beschikbaar is." anonymous: "Anoniem" + remove_posts_deleted_by_author: "Verwijderd door gebruiker" emails: incoming: default_subject: "Inkomende e-mail van %{email}" @@ -125,6 +126,8 @@ nl: embed: start_discussion: "Reageer" continue: "Ga verder met de discussie" + error: "Fout bij embedden" + configure: "Configureer Embedden" more_replies: one: "Nog 1 reactie" other: "Nog %{count} reacties" @@ -1253,21 +1256,43 @@ nl: welcome_invite: subject_template: "Welkom bij %{site_name}!" backup_succeeded: + title: "Backup Geslaagd" subject_template: "Backup succesvol uitgevoerd" backup_failed: + title: "Backup Mislukt" subject_template: "Backup mislukt" restore_succeeded: + title: "Terugzetten van backup geslaagd" subject_template: "Het terugzetten van de backup is geslaagd." restore_failed: + title: "Terugzetten van backup mislukt" subject_template: "Terugzetten van backup is mislukt" bulk_invite_succeeded: + title: "Bulk Uitnodiging Geslaagd" subject_template: "Massale uitnodiging aan gebruikers met succes verwerkt" text_body_template: "Je bestand voor een massale uitnodiging aan gebruikers is verwerkt. Er zijn %{sent} uitnodigingen verstuurd." bulk_invite_failed: + title: "Groepsuitnodiging Mislukt" subject_template: "Massale uitnodiging aan gebruikers verwerkt, met fouten" + text_body_template: | + Je bestand met gebruikers uitnodigingen is verwerkt, %{sent} uitnodigingen zijn verzonden met %{failed} fout(en). + + Verslag: + + ``` + %{logs} + ``` csv_export_succeeded: + title: "CSV Export Geslaagd" subject_template: "Export succesvol afgerond." + text_body_template: | + Data export was succesvol!:dvd: + + %{file_name} (%{file_size}) + + Bovenstaande download link is 48 uur geldig. csv_export_failed: + title: "CSV Export Mislukt" subject_template: "Export mislukt" text_body_template: "Het spijt ons, maar de export is mislukt. Bekijk de logbestanden of neem contact op met de staf." email_reject_insufficient_trust_level: @@ -1356,8 +1381,23 @@ nl: subject_template: "[%{site_name}] E-mailprobleem -- Automatisch gegenereerde reactie" email_error_notification: subject_template: "[%{site_name}] Email probleem -- POP authenticatie fout" + blocked_by_staff: + subject_template: "Account tijdelijk geblokkeerd" + user_automatically_blocked: + title: "Gebruiker Automatisch Geblokkeerd" + subject_template: "Nieuwe gebruiker %{username} geblokkeerd wegens meldingen van andere gebruikers" spam_post_blocked: + title: "Spam bericht geblokkeerd" subject_template: "Berichten van nieuwe gebruiker %{username} geblokkeerd vanwege herhaalde links" + unblocked: + title: "Gedeblokkeerd" + subject_template: "Account niet langer geblokkeerd" + text_body_template: | + Hallo, + + Dit is een automatisch bericht van %{site_name} om je te informeren dat de staff naar je account hebben gekeken en je account is nu niet langer geblokkeerd. + + Je kan weer nieuwe topics beginnen en reageren op bestaande topics. Bedankt voor je geduld. pending_users_reminder: subject_template: one: "1 gebruiker wacht op goedkeuring" @@ -1368,6 +1408,8 @@ nl: [Beoordeel deze gebruikers in het admingedeelte](/admin/users/list/pending). download_remote_images_disabled: subject_template: "Het downloaden van externe afbeeldingen is uitgeschakeld" + dashboard_problems: + title: "Dashboard Problemen" subject_re: "Re:" subject_pm: "[PM]" user_notifications: diff --git a/config/locales/server.pl_PL.yml b/config/locales/server.pl_PL.yml index 15420b3d85..b18d5fd7e4 100644 --- a/config/locales/server.pl_PL.yml +++ b/config/locales/server.pl_PL.yml @@ -32,6 +32,7 @@ pl_PL: purge_reason: "Automatycznie usunięte jako porzucone, dezaktywowane konto." disable_remote_images_download_reason: "Pobieranie zewnętrznych grafik zostało wyłączone z uwagi na niską ilość wolnego miejsca na dysku." anonymous: "Anonim" + remove_posts_deleted_by_author: "Usunięte przez autora" emails: incoming: default_subject: "Przychodzący email od %{email}" @@ -342,6 +343,7 @@ pl_PL: few: "Nie można usunąć tej kategorii ponieważ zawiera %{count} tematy. Najstarszy z nich: %{topic_link}." other: "Nie można usunąć tej kategorii ponieważ zawiera %{count} tematów. Najstarszy z nich: %{topic_link}." topic_exists_no_oldest: "Nie można usunąć tej kategorii z uwagi na liczbę tematów: %{count}." + uncategorized_description: "Tematy które nie potrzebują kategorii, albo nie nadają się do żadnej innej." trust_levels: newuser: title: "nowy" diff --git a/config/locales/server.pt.yml b/config/locales/server.pt.yml index 09c0e398d4..bffebe7ea0 100644 --- a/config/locales/server.pt.yml +++ b/config/locales/server.pt.yml @@ -1452,36 +1452,8 @@ pt: Este convite é de um utilizador confiável, por isso pode responder ao debate imediatamente. invite_forum_mailer: subject_template: "%{invitee_name} convidou-o a juntar-se a %{site_domain_name}" - text_body_template: | - %{invitee_name} convidou-o para - - > **%{site_title}** - > - > %{site_description} - - Se está interessado, clique na ligação abaixo: - - %{invite_link} - - Este convite é de um utilizador confiável, por isso uma conta será criada para si automaticamente. custom_invite_forum_mailer: subject_template: "%{invitee_name} convidou-o para %{site_domain_name}" - text_body_template: | - %{invitee_name} convidou-o para - - > **%{site_title}** - > - > %{site_description} - - Mensagem de %{invitee_name}: - - %{user_custom_message} - - Se está interessado, clique na ligação abaixo: - - %{invite_link} - - Este convite é de um utilizador confiável, por isso uma conta será criada para si automaticamente. invite_password_instructions: subject_template: "Configurar a palavra-passe para a sua conta %{site_name}" text_body_template: | @@ -1615,26 +1587,6 @@ pt: (Se precisar de comunicar com [membros do pessoal](%{base_url}/about) como um novo utilizador, simplesmente responda a esta mensagem.) welcome_invite: subject_template: "Bem-vindo a %{site_name}!" - text_body_template: | - Obrigado por ter aceitado o convite para %{site_name} -- bem-vindo! - - Criámos uma nova conta **%{username}** para si, e neste momento encontra-se com sessão iniciada. Pode mudar o seu nome ao visitar [o seu perfil de utilizador][prefs]. - - Para iniciar sessão novamente mais tarde: - - 1. Use sempre **o mesmo endereço de email do convite original** quando iniciar sessão. De outra forma não saberemos que é você! - - 2. Crie uma palavra-passe única para [o seu perfil de utilizador][prefs], e use-o para iniciar sessão. - - %{new_user_tips} - - Nós acreditamos num [comportamento civilizado da comunidade](%{base_url}/guidelines) em qualquer altura. - - Desfrute da sua estadia! - - (Se precisar de comunicar com [membros do pessoal](%{base_url}/about) como um novo utilizador, simplesmente responda a esta mensagem.) - - [prefs]: %{user_preferences_url} backup_succeeded: subject_template: "Cópia de segurança completa corretamente" text_body_template: | @@ -2846,11 +2798,9 @@ pt: fields: welcome: label: "Tópico de Boas-vindas" - description: "

    Como é que descreveria a sua comunidade a um estranho num elevador em cerca de 1 minuto?

    • Para quem são estas conversas?
    • O que posso encontrar aqui?
    • Porque devo vir cá?

    O tópico de boas-vindas é a primeira coisa que visitantes verão. Pense nele como num discurso curto ou introdução de um paragrafo.

    " one_paragraph: "Por favor limite a sua mensagem de boas-vindas a um paragrafo." privacy: title: "Acesso" - description: "

    A sua comunidade é aberta a todos, ou é restrita por inscrição, convite ou aprovação? Se preferir, pode configurar o sítio em privado, e depois torná-lo público.

    Lembre-se que pode sempre mandar convites a partir de um tópico, ou da sua página de utilizador também.

    " fields: privacy: choices: @@ -2876,7 +2826,6 @@ pt: description: "Todas as mensagens pessoais automatizadas do Discourse serão enviadas deste utilizador. Acima de tudo, este utilizador será o remetente de todas as mensagens de boas-vindas automaticamente enviadas a novos utilizadores." corporate: title: "Organização" - description: "Estes nomes serão introduzidos na sua Política de Privacidade, que pode editar a qualquer instante na categoria da Equipa de Apoio. Se não tiver uma empresa, sinta-se à vontade para saltar este passo." fields: company_short_name: label: "Nome da Empresa (curto)" @@ -2891,7 +2840,6 @@ pt: title: "Tema" fields: theme_id: - description: "Prefere um tema claro ou escuro para começar? Pode sempre personalizar a aparência do seu sítio via Administração, Personalizar." choices: default: label: "Claro Simples" @@ -2916,7 +2864,6 @@ pt: label: "Ícone Grande" description: "Imagem do ícone usado para representar o seu sítio em navegadores da internet que têm bom aspecto em tamanhos grandes como 144px por 144px." homepage: - description: "Recomendamos que mostre tópicos recentes na sua página de início, mas pode escolher mostrar categorias (grupos de tópicos) na sua página de início se preferir." title: "Página de início" fields: homepage_style: @@ -2927,7 +2874,6 @@ pt: label: "Categorias" emoji: title: "Emoji" - description: "Que estilo de Emoji prefere para a sua comunidade? Pode sempre adicionar mais Emoji personalizados via Administração, Personalizar, Emoji." invites: title: "Convidar Equipa de Apoio" description: "Está quase completo! Vamos convidar algumas pessoas para a equipa de apoio para ajudar a disseminar as suas conversas com tópicos e respostas interessantes para que a sua comunidade ganhe tração." diff --git a/config/locales/server.pt_BR.yml b/config/locales/server.pt_BR.yml index 00a5249899..b84717e1c9 100644 --- a/config/locales/server.pt_BR.yml +++ b/config/locales/server.pt_BR.yml @@ -1313,26 +1313,6 @@ pt_BR: (Se precisar se comunicar com [membros da equipe](%{base_url}/about) como um novo usuário, apenas responda a esta mensagem.) welcome_invite: subject_template: "Bem-vindo ao %{site_name}!" - text_body_template: | - Obrigado por aceitar seu convite para %{site_name} -- bem vindo! - - Nós criamos uma nova conta **%{username}** para você, e você está autenticado. Pode mudar seu nome visitando o [perfil de seu usuário][prefs]. - - Para entrar novamente depois: - - 1. Sempre **use o mesmo endereço de email de seu convite original** quando se registrou. Caso contrário não saberemos que é você! - - 2. Crie uma senha única para o [perfil de seu usuário][prefs], e use para entrar. - - %{new_user_tips} - - Nós acreditamos sempre em [comportamento comunitário civilizado](%{base_url}/guidelines). - - Aproveite sua participação! - - (Se precisar se comunicar com um [membro da equipe](%{base_url}/about) como novo usuário, apenas responda a esta mensagem.) - - [prefs]: %{user_preferences_url} backup_succeeded: subject_template: "Backup completado com sucesso" backup_failed: @@ -1955,7 +1935,6 @@ pt_BR: title: "Tema" fields: theme_id: - description: "Você prefere um esquema de cores claro ou escuro para começar? Você poderá, futuramente, trocar o esquema de cores do seu site através da Aba: Admin, Configurações." choices: default: label: "Claro Simples" @@ -1980,7 +1959,6 @@ pt_BR: label: "Ícone Largo" description: "Ícone usado para representar seu site em dispositivos modernos, que tenha boa aparência em tamanhos maiores. O tamanho recomendado é pelo menos 144px por 144px." homepage: - description: "Recomendamos mostrar os últimos tópicos na sua página inicial, mas você pode escolher mostrar categorias (grupos de tópicos) na página inicial, se preferir." title: "Página Inicial" fields: homepage_style: @@ -1991,7 +1969,6 @@ pt_BR: label: "Categorias" emoji: title: "Emoji" - description: "Qual estilo de Emoji se adequa melhor para sua comunidade? Você poderá sempre adicionar novas customizações de Emojis através da aba: Admin > Customizar > Emoji." invites: title: "Convidar um grupo" finished: diff --git a/config/locales/server.ro.yml b/config/locales/server.ro.yml index bdc1789237..de0a515946 100644 --- a/config/locales/server.ro.yml +++ b/config/locales/server.ro.yml @@ -1509,36 +1509,8 @@ ro: Această invitație este de la un utilizator verificat, deci poți răspunde de îndată ce dorești. invite_forum_mailer: subject_template: "%{invitee_name} te-a invitat să te alături pe %{site_domain_name}" - text_body_template: | - %{invitee_name} te-a invitat să te alături pe - - > **%{site_title}** - > - > %{site_description} - - Dacă te interesează, dă click pe link-ul de mai jos: - - %{invite_link} - - Această invitație vine de la un utilizator verificat, așa că ți se va crea automat un cont. custom_invite_forum_mailer: subject_template: "%{invitee_name} te-a invitat să te alături pe %{site_domain_name}" - text_body_template: | - %{invitee_name} te-a invitat să te alaturi pe - - > **%{site_title}** - > - > %{site_description} - - Mesaj de la %{invitee_name}: - - %{user_custom_message} - - Dacă te interesează, dă click pe link-ul de mai jos: - - %{invite_link} - - Această invitație vine de la un utilizator verificat, așa că ți se va crea automat un cont. invite_password_instructions: subject_template: "Setează parolă pentru contul tău %{site_name}" text_body_template: | @@ -1678,26 +1650,6 @@ ro: (Dacă ai nevoie să comunici cu [membrii echipei](%{base_url}/about) din postura de nou utilizator, pur și simplu dă reply la acest mesaj.) welcome_invite: subject_template: "Bine ai venit pe %{site_name}!" - text_body_template: | - Îți mulțumim că ai acceptat invitația pe %{site_name} -- bun venit! - - Am creat pentru tine un nou cont **%{username}**, și acum ești autentificat. Îți poți schimba numele vizitându-ți [profilul utilizator][prefs]. - - Pentru a te autentifica mai târziu: - - 1. Întotdeauna **folosește aceeași adresă de email ca cea din invitația originală** atunci când te autentifici. Altfel nu ne vom putea da seama că ești tu! - - 2. Creează o parolă unică pentru [profilul utilizator][prefs], și folosește-o la autentificare. - - %{new_user_tips} - - Noi credem într-un [comportament civilizat al comunității](%{base_url}/guidelines) indiferent de circumstanțe. - - ședere plăcută! - - (Dacă ai nevoie să comunici cu [membrii echipei](%{base_url}/about) din postura de nou utilizator, pur și simplu dă reply la acest mesaj.) - - [prefs]: %{user_preferences_url} backup_succeeded: subject_template: "Backup terminat cu succes" text_body_template: | @@ -2902,11 +2854,9 @@ ro: fields: welcome: label: "Subiect de bun venit" - description: "

    Cum ți-ai descrie comunitatea unui străin din lift, într-un minut?

    • Cui îi sunt destinate aceste discuții?
    • Ce pot găsi aici?
    • De ce să vă vizitez?

    Subiectul vostru de bun venit este primul lucru pe care îl vor vedea noii vizitatori Gândește-te la el ca laun paragraf/b> de 'agățat în lift' sau 'declarație de misiune'.

    " one_paragraph: "Te rugăm să îți restrângi mesajul de bun venit la un paragraf." privacy: title: "Acces" - description: "

    Este comunitatea voastră deschisă tuturor, sau este limită prin apartenență, invitații, sau aprobare? Dacă preferi, poți să setezi lucrurile pe privat și să comuți mai târziu pe public.

    Amintește-ți că întotdeauna poți să trimiți invitații din subiecte sau din pagina cu profilul tău de utilizator

    " fields: privacy: choices: @@ -2932,7 +2882,6 @@ ro: description: "Toate mesajele personale automate din Discourse vor fi trimite de la acest utilizator. Ce-i mai important este că acest utilizator va fi desemnat să trimită fiecare mesaj de bun venit ce se trimite automat noilor utilizatori." corporate: title: "Organizație" - description: "Aceste nume vor fi introduse în Politica de confidențialitate și Condițiile generale de utilizare, pe care le poți edita oricând în categoria Echipa. Dacă nu ai o firmă, poți sări momentan peste acest pas." fields: company_short_name: label: "Numele firmei (scurt)" @@ -2947,7 +2896,6 @@ ro: title: "Temă" fields: theme_id: - description: "Preferi o schemă de culori luminoasă sau una întunecată pentru început? Întotdeauna poți continua personalizarea aspectului site-ului via Admin, Personalizare." choices: default: label: "Luminos simplu" @@ -2972,7 +2920,6 @@ ro: label: "Iconiță mare" description: "Iconiță utilizata pentru a-ți reprezenta site-ul pe dispozitive moderne și care arată bine la dimensiuni mai mari. Dimensiunea recomandată este de 144px pe 144px." homepage: - description: "Recomandăm afișarea celor subiectelor recente pe pagina principală, dar, dacă preferi, poți să alegi afișarea categoriilor (grupuri de subiecte)." title: "Pagina principală" fields: homepage_style: @@ -2983,7 +2930,6 @@ ro: label: "Categorii" emoji: title: "Emoji" - description: "Ce stil de Emoji preferi pentru comunitatea ta? Întotdeauna poți să adaugi mai multe emoji personalizate via Admin, Personalizări, Emoji." invites: title: "Invită membrii echipei" description: "Aproape ai terminat! Hai să invităm niște membri ai echipei să dea o mână de ajutor și să presare discuțiile cu subiecte și răspunsuri interesante, pentru a lansa comunitatea." diff --git a/config/locales/server.ru.yml b/config/locales/server.ru.yml index f9ac1651f1..48ea5176e6 100644 --- a/config/locales/server.ru.yml +++ b/config/locales/server.ru.yml @@ -32,6 +32,7 @@ ru: purge_reason: "Деактивированная учетная запись будет автоматически удалена как заброшенная" disable_remote_images_download_reason: "Загрузка картинок была отключена из-за недостаточности места на диске." anonymous: "Гость" + remove_posts_deleted_by_author: "Удалено автором" emails: incoming: default_subject: "Входящее письмо от %{email}" @@ -72,6 +73,7 @@ ru: inclusion: не включен в список invalid: неверный is_invalid: "Не совсем ясно, это предложение закончено?" + contains_censored_words: "содержит одно или более нецензурных слов: %{censored_words}" less_than: должен быть меньше %{count} less_than_or_equal_to: должен быть меньше или равен %{count} not_a_number: не число @@ -109,6 +111,9 @@ ru: max_username_length_range: "Нельзя установить максимум ниже минимума." default_categories_already_selected: "Нельзя выбрать раздел, используемый в другом списке." s3_upload_bucket_is_required: "Нельзя включить загрузки на S3, пока не задана настройка 's3_upload_bucket'." + bulk_invite: + file_should_be_csv: "Загружаемый файл должен быть в csv-формате." + error: "Произошла ошибка при загрузке файла. Пожалуйста, повторите попытку позже." backup: operation_already_running: "Действие уже выполняется, поэтому невозможно начать новое действие прямо сейчас." backup_file_should_be_tar_gz: "Файл резервной копии должен быть архивом в формате .TAR.GZ." @@ -175,6 +180,7 @@ ru: spamming_host: "Извините, вы не можете разместить ссылку в этом сообщении." user_is_suspended: "Заблокированным пользователям запрещено писать." topic_not_found: "Что-то пошло не так. Возможно, эта тема была закрыта или заархивирована, пока вы ее читали?" + not_accepting_pms: "К сожалению, %{username} не принимает сообщения в данный момент." just_posted_that: "слишком схоже с уже опубликованным Вами сообщением" invalid_characters: "содержит недопустимые символы" is_invalid: "Не совсем ясно, это предложение закончено?" @@ -307,6 +313,7 @@ ru: no_user_selected: "Вы должны выбрать корректного пользователя." featured_link: invalid: "недействителен. URL должен включать http:// или https://." + invalid_category: "не может быть изменено в данной категории." user: attributes: password: @@ -405,6 +412,7 @@ ru: create_topic: "Вы создаете темы слишком быстро. Пожалуйста, подождите %{time_left}, затем повторите попытку" create_post: "Вы отвечаете слишком быстро. Пожалуйста, подождите %{time_left} слева, затем повторите попытку." delete_post: "Вы удаляете сообщения слишком быстро. Пожалуйста, подождите %{time_left} перед следующей попыткой." + public_group_membership: "Вы присоединяетесь/покидаете группы слишком часто. Пожалуйста, подождите %{time_left} перед следующей попыткой." topics_per_day: "Вы достигли лимита новых тем на сегодня. Пожалуйста, подождите %{time_left} перед следующей попыткой." pms_per_day: "Вы достигли лимита сообщений на сегодня. Пожалуйста, подождите %{time_left} перед следующей попыткой." create_like: "Вы достигли лимита симпатий на сегодня. Пожалуйста, подождите %{time_left} перед следующей попыткой." @@ -607,6 +615,11 @@ ru: title: 'Проголосовать' description: 'Проголосовать за это сообщение' long_form: 'проголосовало за это сообщение' + user_activity: + no_bookmarks: + others: "Закладок нет." + no_likes_given: + others: "Понравившихся сообщений нет." topic_flag_types: spam: title: 'Спам' @@ -640,14 +653,21 @@ ru: stop_watching_topic: "Прекратить наблюдение за этой темой, %{link}" mute_topic: "Отключение всех уведомлений по этой теме, %{link}" unwatch_category: "Прекратить наблюдение за всеми темами раздела %{category}" + mailing_list_mode: "Отключить почтовую рассылку" + all: "Не отправлять мне почту с %{sitename}" log_out: "Выйти" user_api_key: + title: "Разрешить доступ к приложению" read: "чтение" read_write: "чтение/запись" - description: "\"% {Application_name}\" запрашивает следующий доступ к вашей учетной записи:" + description: "\"%{application_name}\" запрашивает следующий доступ к Вашей учетной записи:" no_trust_level: "К сожалению, вы не обладаете необходимым уровнем доверия для доступа к API" scopes: message_bus: "Текущие обновления" + notifications: "Прочитать и стереть уведомления" + session_info: "Прочитать информацию о сеансе пользователя" + read: "Прочитать всё" + write: "Написать всё" reports: visits: title: "Визиты форумчан" @@ -740,6 +760,7 @@ ru: page_view_total_reqs: title: "Всего" xaxis: "Дата" + yaxis: "Всего Просмотров Страниц" page_view_logged_in_mobile_reqs: xaxis: "Дата" page_view_anon_mobile_reqs: @@ -802,6 +823,7 @@ ru: min_first_post_length: "Минимально допустимое количество символов в первом сообщении (или теле темы)" min_private_message_post_length: "Минимально допустимое количество символов в сообщении в беседе." max_post_length: "Максимально допустимое количество символов в одном сообщении." + topic_featured_link_enabled: "Разрешить публиковать ссылку с темами." min_topic_title_length: "Минимально допустимое количество символов в названии темы." max_topic_title_length: "Максимально допустимое количество символов в названии темы." min_private_message_title_length: "Минимально допустимое количество символов в заголовке сообщения в беседе." @@ -845,6 +867,8 @@ ru: anon_polling_interval: "Как часто следует анонимным клиентам опрашивать сервер, в миллисекундах" background_polling_interval: "Как часто следует клиентам опрашивать сервер, в миллисекундах (когда окно находится в фоновом режиме)" cooldown_minutes_after_hiding_posts: "Количество минут, которое должен подождать пользователь перед редактированием сообщения скрытого по жалобам" + max_topics_in_first_day: "Максимальное количество тем, которое пользователь может создать в течение 24 часов с момента создания своего первого сообщения" + max_replies_in_first_day: "Максимальное количество ответов, которое пользователь может сделать в течение 24 часов с момента создания своего первого сообщения" tl2_additional_likes_per_day_multiplier: "Увеличить лимит лайков в день для tl2 (member) до" tl3_additional_likes_per_day_multiplier: "Увеличить лимит лайков в день для tl3 (member) до" tl4_additional_likes_per_day_multiplier: "Увеличить лимит лайков в день для tl4 (leader) до" @@ -913,6 +937,7 @@ ru: enable_github_logins: "Разрешить идентификацию с Github, требует github_client_id и github_client_secret" github_client_id: "Клиентский id для идентификации с Github, зарегистрированный на https://github.com/settings/applications" github_client_secret: "Клиентский секрет для идентификации с Github, зарегистрированный на https://github.com/settings/applications" + readonly_mode_during_backup: "Включить режим \"только для чтения\" во время выполнения резервного копирования" allow_restore: "Позволить импорт, который может заменить ВСЕ данные сайта. Оставьте выключенным, если не планируете восстанавливать резервную копию" maximum_backups: "Максимальное количество резервных копий к сохранению. Более старые резервные копии будут автоматически удалены." backup_frequency: "Как часто создавать резервные копии форума, в днях" @@ -933,8 +958,12 @@ ru: max_private_messages_per_day: "Максимальное количество тем, которые пользователь может создать за один день." max_invites_per_day: "Максимальное количество приглашений, которое может отправить пользователь за один день." max_topic_invitations_per_day: "Максимальное количество приглашений в тему, которое может отправить пользователь в течении дня." + alert_admins_if_errors_per_minute: "Количество ошибок в минуту для предупреждения администратора. Значение 0 отключает эту опцию. ВНИМАНИЕ: требуется перезагрузка." + alert_admins_if_errors_per_hour: "Количество ошибок в час для предупреждения администратора. Значение 0 отключает эту опцию. ВНИМАНИЕ: требуется перезагрузка." + categories_topics: "Количество тем, отображаемых на странице разделов." suggested_topics: "Количество рекомендованных тем, отображаемых внизу текущей темы." limit_suggested_to_category: "Показыать только темы из текущего раздела в списке рекомендованых тем." + suggested_topics_max_days_old: "Предлагаемые темы не должны быть старше n дней." clean_up_uploads: "Удалить неиспользуемые загрузки для предотвращения хранения нелегального контента. ВНИМАНИЕ: рекомендуется сделать резервную копию директории /uploads перед включением данной настройки." clean_orphan_uploads_grace_period_hours: "Период (в часах) после которого неопубликованные вложения удаляются." purge_deleted_uploads_grace_period_days: "Период (в днях) после которого удаленные вложения очищаются." @@ -947,6 +976,8 @@ ru: s3_region: "Географический регион Amazon S3, который будет использоваться для хранения изображений" avatar_sizes: "Список автоматически сгенерированных размеров аватар." default_opengraph_image_url: "URL картинки opengraph по-умолчанию." + allow_all_attachments_for_group_messages: "Разрешить все почтовые вложения для групповых сообщений." + convert_pasted_images_quality: "Качество сконвертированного JPG файла (1 самое низкое качество, 100 наилучшее качество)." enable_flash_video_onebox: "Разрешить умную вставку ссылок sqf и flv (Adobe Flash). ВНИМАНИЕ: повышает риски безопасности сайта." default_invitee_trust_level: "Уровень доверия приглашенных пользователей по-умолчанию (от 0 до 4)." default_trust_level: "Уровень доверия по умолчанию для всех новых пользователей (0-4). ВНИМАНИЕ! Повышая уровень доверия для новых пользователей, Вы можете столкнуться с большим колличеством спама." @@ -960,12 +991,17 @@ ru: tl2_requires_likes_received: "Сколько симпатий пользователь должен получить для продвижения до уровня доверия 2." tl2_requires_likes_given: "Сколько симпатий пользователь должен выразить для продвижения до уровня доверия 2." tl2_requires_topic_reply_count: "В скольких темах пользователь должен ответить для продвижения до уровня доверия 2." + tl3_requires_topics_viewed: "Какой процент созданных тем за последние (tl3 time period) дней должен иметь пользователь для повышения уровня доверия до 3. (от 0 до 100)" + tl3_requires_posts_read: "Какой процент созданных сообщений за последние (tl3 time period) дней должен иметь пользователь для повышения уровня доверия до 3. (от 0 до 100)" tl3_requires_topics_viewed_all_time: "Сколько сообщений пользователь должен прочитать для поднятия уровня доверия до 3." tl3_requires_posts_read_all_time: "Сколько сообщений пользователь должен прочитать для поднятия уровня доверия до 3." tl3_promotion_min_duration: "Минимальное количество дней , в течении которых пользователь с уровнем доверия 3 не может быть понижен до урованя доверия 2." tl3_links_no_follow: "Не удалять rel=nofollow из ссылок от пользователей с уровнем доверия 3." min_trust_to_create_topic: "Минимальный уровень доверия для создания новой темы." min_trust_to_edit_wiki_post: "Минимальный уровень доверия, требуемый для редактирования вики-сообщения." + min_trust_to_edit_post: "Минимальный уровень доверия, требуемый для редактирования сообщений." + min_trust_to_allow_self_wiki: "Минимальный уровень доверия, требуемый для создания своего вики-сообщений." + min_trust_to_send_messages: "Минимальный уровень доверия, требуемый для создания личных сообщений." newuser_max_links: "Сколько ссылок новый пользователь может вставлять в сообщение." newuser_max_images: "Сколько изображений новый пользователь может вставлять в одно сообщение." newuser_max_attachments: "Максимальное количество вложений, которое новый пользователь может прикрепить к одному сообщению." @@ -1019,6 +1055,9 @@ ru: disable_emails: "Запретить форуму отсылать какие-либо письма." strip_images_from_short_emails: "Удалять картинки из писем размером менее 2800 байт" short_email_length: "Какие письма считать короткими, в байтах" + delete_email_logs_after_days: "Удалять журнал e-mail спустя (N) дней. 0, чтобы хранить неограниченное количество времени" + max_emails_per_day_per_user: "Максимальное количество e-mail, отправляемых пользователю в течение дня. 0, чтобы отключить это ограничение" + block_auto_generated_emails: "Блокировать входящие e-mail, которые идентифицированы как автосгенерированные." pop3_polling_enabled: "Загружать ответы в форум в виде писем с учетной записи POP3." pop3_polling_ssl: "Использовать SSL при подключениик POP3 серверу. (Рекомендовано)" pop3_polling_period_mins: "Периодичность загрузки e-mail учетной записи POP3. ВНИМАНИЕ: требует перезапуска." @@ -1037,9 +1076,12 @@ ru: username_change_period: "Количество дней после регистрации, когда пользователь сможет изменить свой псевдоним (0 - запретить изменение псевдонима)." email_editable: "Позволять пользователям изменять свой адрес электронной почты после регистрации." allow_uploaded_avatars: "Разрешить пользователям загружать свои собственные картинки профиля." + allow_animated_avatars: "Разрешить пользователям использовать анимированные GIF картинки в своём профиле. ВНИМАНИЕ: после изменения данной настройки запустите avatars:refresh rake-задачу." allow_animated_thumbnails: "Генерировать анимированные миниатюры gif-картинок." default_avatars: "URL для аватара, который будет использован по умолчанию для новых пользователей, пока они не изменят его." automatically_download_gravatars: "Скачивать аватарку Gravatar пользователя во время создания учетной записи или изменения e-mail." + email_accent_bg_color: "Акцентирующий цвет для использования в качестве фона некоторых элементов в HTML писем. Введите название цвета ('red') или hex значение ('#FF000'). " + email_link_color: "Цвет ссылок в HTML письмах. Введите название цвета ('blue') или hex значение ('#0000FF')." detect_custom_avatars: "Проверять ли, что пользователи загрузили свои собственные картинки профиля (аватарки)." max_daily_gravatar_crawls: "Максимальное количество загрузок аватаорок с Gravatar за один день" public_user_custom_fields: "Список разрешенных дополнительных полей пользователей, которые могут быть отображены публично." @@ -1081,6 +1123,28 @@ ru: emoji_set: "Какую коллекцию Emoji использовать?" enforce_square_emoji: "Принудительно использовать квадратные пропорции для смайликов." approve_unless_trust_level: "Сообщения для пользователей ниже этого уровня доверия подлежат проверки" + default_email_private_messages: "По умолчанию присылать почтовое уведомление, когда кто-то оставляет пользователю личное сообщение." + default_email_mailing_list_mode: "По умолчанию присылать почтовое уведомление, когда появляется новое сообщение." + default_other_external_links_in_new_tab: "По умолчанию открывать внешние ссылки в новой вкладке." + default_other_dynamic_favicon: "Показывать количество новых/обновлённых тем на иконке веб-браузера по умолчанию." + default_topics_automatic_unpin: "Автоматически откреплять темы, которые прочёл пользователь, по умолчанию." + default_categories_watching: "Список просматриваемых разделов по умолчанию." + default_categories_tracking: "Список отслеживаемых разделов по умолчанию." + tagging_enabled: "Включить теги для тем?" + min_trust_to_create_tag: "Минимальный уровень доверия для создания тега." + max_tags_per_topic: "Максимальное количество тегов, которое может быть применено к теме." + max_tag_length: "Максимальное количество символов, которое может быть использовано в теге." + max_tag_search_results: "Максимальное количество строк для отображения результатов поиска тегов." + show_filter_by_tag: "Показывать выпадающий список для фильтра списка тем по тегу." + max_tags_in_filter_list: "Максимальное количество тегов для отображения в выпадающем списке фильтрации. Будут показаны самые часто используемые теги." + tags_sort_alphabetically: "Отображать теги в алфавитном порядке. По умолчанию теги отображаются в порядке популярности." + tag_style: "Стиль отображения для значков тегов." + staff_tags: "Список тегов, который может применяться только к персоналу." + min_trust_level_to_tag_topics: "Минимальный уровень доверия для отметки тем тегами." + suppress_overlapping_tags_in_list: "Не отображать тег, если он полностью совпадают с заголовком темы" + company_short_name: "Наименование Компании (кратко)" + company_full_name: "Наименование Компании (полное)" + company_domain: "Домен Компании" errors: invalid_email: "Неправильный адрес электронной почты." invalid_username: "Пользователя с таким ником не найдено." @@ -1095,6 +1159,13 @@ ru: invalid_string_min: "Требуется хотя бы %{min} знаков." invalid_string_max: "Допустимо не более %{max} знаков." invalid_reply_by_email_address: "Значение должно содержать '%{reply_key}' и должно отличаться от письма уведомления." + invalid_alternative_reply_by_email_addresses: "Все значения должны содержать '%{reply_key}' и должны отличаться от письма уведомления." + pop3_polling_host_is_empty: "Вы должны установить 'pop3 polling host' перед включением POP3 polling." + pop3_polling_username_is_empty: "Вы должны установить 'pop3 polling username' перед включением POP3 polling." + pop3_polling_password_is_empty: "Вы должны установить 'pop3 polling password' перед включением POP3 polling." + reply_by_email_address_is_empty: "Вы должны установить 'reply by email address' перед включением возможности ответа по e-mail." + user_locale_not_enabled: "Перед включением данной настройки необходимо включить 'allow user locale'." + invalid_regex: "Регулярное выражение недействительно или не разрешено." search: within_post: "#%{post_number} от %{username}" types: @@ -1105,6 +1176,7 @@ ru: not_found: "Мы не можем найти вашу учетную запись. Пожалуйста, свяжитесь с администратором сайта." account_not_approved: "Ваша учетная запись ожидает подтверждения. Вы получите уведомление по электронной почте, когда она будет подтверждена." unknown_error: "Произошла проблема с учетной записью. Пожалуйста, свяжитесь с администратором сайта." + timeout_expired: "Время входа в учётную запись истекло, пожалуйста, попробуйте войти снова." original_poster: "Автор" most_posts: "Большинство сообщений" most_recent_poster: "Последний автор" @@ -1112,6 +1184,15 @@ ru: redirected_to_top_reasons: new_user: "Добро пожаловать в наше сообщество! Вот самые популярные недавние темы." not_seen_in_a_month: "С возвращением! Т.к. вас не было какое-то время, мы собрали список популярных тем за время вашего отсутсвия. Вот они." + merge_posts: + edit_reason: + one: "Сообщение было объединено пользователем %{username}" + few: "%{count} сообщений было объединено пользователем %{username}" + many: "%{count} сообщений было объединено пользователем %{username}" + other: "%{count} сообщений было объединено пользователем %{username}" + errors: + different_topics: "Сообщения, принадлежащие другой теме, не могут быть объединены." + different_users: "Сообщения, принадлежащие разным пользователям, не могут быть объединены." move_posts: new_topic_moderator_post: one: "Сообщение перенесено в новую тему: %{topic_link}" @@ -1135,6 +1216,16 @@ ru: archived_disabled: "Эта тема разархивирована. Она более не заморожена, и может быть изменена." closed_enabled: "Эта тема закрыта. В ней больше нельзя отвечать." closed_disabled: "Эта тема открыта. В ней можно отвечать." + autoclosed_message_max_posts: + one: "Это сообщение было автоматически закрыто, когда количество ответов достигло максимума: 1." + few: "Это сообщение было автоматически закрыто, когда количество ответов достигло максимума: %{count}." + many: "Это сообщение было автоматически закрыто, когда количество ответов достигло максимума: %{count}." + other: "Это сообщение было автоматически закрыто, когда количество ответов достигло максимума: %{count}." + autoclosed_topic_max_posts: + one: "Эта тема была автоматически закрыта, когда количество ответов достигло максимума: 1." + few: "Эта тема была автоматически закрыта, когда количество ответов достигло максимума: %{count}." + many: "Эта тема была автоматически закрыта, когда количество ответов достигло максимума: %{count}." + other: "Эта тема была автоматически закрыта, когда количество ответов достигло максимума: %{count}." autoclosed_enabled_days: one: "Эта тема была автоматически закрыта спустя 1 день. В ней больше нельзя отвечать." few: "Эта тема была автоматически закрыта спустя %{count} дня. В ней больше нельзя отвечать." @@ -1189,25 +1280,37 @@ ru: something_already_taken: "Что-то пошло не так, возможно, имя пользователя или электронный ящик уже используются. Попробуйте восстановить ваш пароль." omniauth_error: "Извините, невозможно авторизовать вашу учетную запись. Возможно, вы не подтвердили авторизацию?" omniauth_error_unknown: "В процессе входа на сайт произошла ошибка. Пожалуйста, повторите попытку." + authenticator_error_no_valid_email: "Нет разрешённых e-mail адресов, связанных с учётной записью %{account}. Вам необходимо настроить учётную запись с помощью другого e-mail адреса." new_registrations_disabled: "Новые регистрации сейчас ограничены." password_too_long: "Максимальная длина пароля - 200 символов." + email_too_long: "E-mail, который Вы указали, слишком длинный. Имя почтового ящика должно быть не длиннее 254 символов, а доменное имя не более 253 символов." reserved_username: "Такой псевдоним не разрешен." missing_user_field: "Вы не заполнили все поля пользователя" close_window: "Аутентификация выполнена. Закройте это окно для продолжения." + already_logged_in: "Ой, кажется, Вы пытаетесь принять приглашение для другого пользователя. Если Вы не %{current_user}, пожалуйста, выйдите из учётной записи и попробуйте снова." user: no_accounts_associated: "Нет ассоциированных учетных записей" + deactivated_by_staff: "Выключено персоналом" + activated_by_staff: "Включено персоналом" username: short: "минимум %{min} знаков" long: "должно быть более %{max} знаков" characters: "должно состоять только из цифр и латинских букв" unique: "должно быть уникально" blank: "необходимо заполнить" + must_begin_with_alphanumeric_or_underscore: "должно начинаться с буквы, цифры или нижнего подчёркивания" + must_end_with_alphanumeric: "должно заканчиваться буквой или цифрой" + must_not_contain_two_special_chars_in_seq: "не должно содержать последовательность 2 и более специальных символов (.-_)" + must_not_end_with_confusing_suffix: "не должно заканчиваться на .json или .png и т.д., которые могут ввести в заблуждение" email: not_allowed: "недопустимый почтовый домен. Пожалуйста, используйте другой адрес." blocked: "не разрешено." + revoked: "Отправка e-mail на '%{email}' не будет осуществляться до %{date}." ip_address: blocked: "Новые регистрации запрещены с вашего IP-адреса." max_new_accounts_per_registration_ip: "Новые регистрации запрещены с вашего IP-адреса (достигнут лимит регистраций). Свяжитесь с администрацией." + website: + domain_not_allowed: "Сайт недействителен. Допустимые домены: %{domains}" flags_reminder: subject_template: one: "1 жалоба ожидает рассмотрения" @@ -1234,6 +1337,8 @@ ru: %{invite_link} Это персональное приглашение от зарегистрированного пользователя, поэтому вы смело можете сразу же приступать к обсуждению. + custom_invite_mailer: + subject_template: "%{invitee_name} приглашает Вас присоединиться к '%{topic_title}' на сайте %{site_domain_name}" invite_forum_mailer: subject_template: "%{invitee_name} приглашает вас присоединиться к %{site_domain_name}" invite_password_instructions: @@ -1270,7 +1375,10 @@ ru: deferred_and_deleted: "Спасибо за информацию. Сообщение удалено." temporarily_closed_due_to_flags: "Эта тема временно закрыта из-за большого количества жалоб." system_messages: + post_hidden: + title: "Сообщение Скрыто" welcome_user: + title: "Приветствие Пользователя" subject_template: "Добро пожаловать на %{site_name}!" text_body_template: | Спасибо, что зарегистрировались на сайте %{site_name} и добро пожаловать! @@ -1284,33 +1392,17 @@ ru: Приятного времяпровождения! welcome_invite: subject_template: "Добро пожаловать на %{site_name}!" - text_body_template: | - Спасибо, что приняли приглашение присоединиться к сайту %{site_name} и добро пожаловать! - - Мы автоматически дали вам имя пользователя: **%{username}**, но вы можете изменить его в любое время в [вашем профиле][prefs]. - - Чтобы снова зайти на сайт: - - 1. Используйте учетную запись Facebook, Google, Twitter, или одну из множества других поддерживаемых – но она должна быть зарегистрирована на **тот же адрес электронной почты**, на который вы получили приглашение. Иначе мы не можем быть уверены, что это вы. - - 2. Придумайте уникальный пароль в [вашем профиле][prefs], затем войдите на сайт, используя его. - - %{new_user_tips} - - Мы верим в [культурное сообщество](%{base_url}/guidelines) - - Наслаждайтесь общением! - - (если ва понадобиться помощь [staff members](%{base_url}/about) вы можите задать свой вопрос, просто ответив на это сообщение.) - - [prefs]: %{user_preferences_url} backup_succeeded: + title: "Успешное Резервное Копирование" subject_template: "Резервное копирование успешно завершено" backup_failed: + title: "Неудачное Резервное Копирование" subject_template: "Резервное копирование не удалось" restore_succeeded: + title: "Успешное Восстановление Данных" subject_template: "Восстановление данных успешно завершено" restore_failed: + title: "Неудачное Восстановление Данных" subject_template: "Восстановление данных не удалось" bulk_invite_succeeded: subject_template: "Массовое приглашение пользователей успешно выполнено" @@ -1326,6 +1418,7 @@ ru: %{logs} ``` csv_export_succeeded: + title: "Успешный Экспорт CSV" subject_template: "Экспорт завершен" text_body_template: | Экспорт данных прошел успешно. @@ -1334,6 +1427,7 @@ ru: Ссылка будет действать только 48 часов. csv_export_failed: + title: "Неудачный Экспорт CSV" subject_template: "Экспорт не удался" text_body_template: "Мы сожалеем, но возникли неполадки с экспортом ваших данных. Свяжитесь с администратором сайта." email_reject_inactive_user: @@ -1361,8 +1455,16 @@ ru: subject_template: "[%{site_name}] системное сообщение - Автоматически сгенерирован ответ" email_error_notification: subject_template: "[%{site_name}] Системное сообщение -- ошибка POP аутентификации" + blocked_by_staff: + title: "Заблокировано Персоналом" + subject_template: "Учётная запись временно заблокирована" + user_automatically_blocked: + title: "Автоматическая Блокировка Пользователя" spam_post_blocked: subject_template: "Сообщения нового пользователя %{username} заблокированы из-за повторяющихся ссылок" + unblocked: + title: "Разблокировано" + subject_template: "Учётная запись больше не заблокирована" pending_users_reminder: subject_template: one: "1 пользователь ожидает рассмотрение" @@ -1416,8 +1518,28 @@ ru: subject_template: "%{optional_re}%{topic_title}" digest: why: "Сводка обсуждений на сайте %{site_link} с момента вашего последнего визита %{last_seen_at}" + since_last_visit: "С Вашего последнего посещения" + new_topics: "Новые Темы" + unread_messages: "Непрочитанные Сообщения" + unread_notifications: "Непрочитанные Уведомления" + liked_received: "Получено Симпатий" + new_posts: "Новые Сообщения" + new_users: "Новые Пользователи" + popular_topics: "Популярные Темы" + follow_topic: "Следить за этой темой" + join_the_discussion: "Читать Далее" + popular_posts: "Популярные Сообщения" + from_topic_label: "От" + more_new: "Новое для Вас" click_here: "нажмите здесь" + mailing_list: + why: "Вся активность на сайте %{site_link} за %{date}" + new_topics: "Новые темы" + topic_updates: "Обновления темы" + view_this_topic: "Посмотреть эту тему" + back_to_top: "Наверх" forgot_password: + title: "Забыл Пароль" subject_template: "[%{site_name}] Сброс пароля" text_body_template: | Кто-то запросил смену вашего пароля на сайте [%{site_name}](%{base_url}). @@ -1427,6 +1549,7 @@ ru: Пройдите по следующей ссылке, чтобы задать новый пароль: %{base_url}/users/password-reset/%{email_token} set_password: + title: "Установить Пароль" subject_template: "[%{site_name}] Установить пароль" text_body_template: | Кто-то попросил добавить пароль в вашу учётную запись на сайте [%{site_name}](%{base_url}). Вы так же можете войти на сайт используя любой поддерживаемый онлайн-сервис (такие как Google, Facebook и другие), которые связанны с вашим электронным адресом. @@ -1445,6 +1568,7 @@ ru: Ссылка для входа: %{base_url}/users/admin-login/%{email_token} account_created: + title: "Учётная Запись Создана" subject_template: "[%{site_name}] Ваша новая учетная запись" text_body_template: | Для вас была создана новая учетная запись на сайте %{site_name} @@ -1452,6 +1576,7 @@ ru: Чтобы установить пароль, пройдите по следующей ссылке: %{base_url}/users/password-reset/%{email_token} confirm_new_email: + title: "Подтвердить Новый E-mail" subject_template: "[%{site_name}] Подтвердите новый адрес электронной почты" text_body_template: | Подтвердите ваш новый адрес электронной почты для сайта %{site_name}, перейдя по следующей ссылке: @@ -1514,7 +1639,13 @@ ru: too_large: "Файл, который вы пытаетесь загрузить, слишком большой (максимальный разрешенный размер %{max_size_kb}%kb)." images: too_large: "Изображение, которое вы пытаетесь загрузить, слишком большое (максимальный разрешенный размер %{max_size_kb}%kb), пожалуйста, уменьшите размер изображения и повторите попытку." + larger_than_x_megapixels: "Изображение, которое вы пытаетесь загрузить, слишком большое (максимально допустимый размер %{max_image_megapixels}-мегапикселей), пожалуйста, уменьшите размер изображения и повторите попытку." size_not_found: "Извините, мы не можем определить размер изображения. Возможно, изображение повреждено?" + avatar: + missing: "К сожалению, нам не удалось найти ни одного аватара, связанного с этим электронным адресом. Попытаетесь загрузить аватар снова?" + flag_reason: + sockpuppet: "Новый пользователь создал тему, а другой новый пользователь ответил с этого же IP адреса (%{ip_address}). Смотрите параметр `flag_sockpuppets` сайта." + spam_hosts: "Этот новый пользователь пытался создать множество сообщений с ссылками на один и тот же домен (%{domain}). Смотрите параметр `newuser_spam_host_threshold` сайта." email_log: no_user: "Не найти пользователя с id %{user_id}" anonymous_user: "Гость" @@ -1548,10 +1679,124 @@ ru: privacy_topic: title: "Политика конфиденциальности" badges: + editor: + name: Редактор + description: Первое редактирование сообщения + long_description: | + Эта награда даруется, когда Вы впервые редактируете одно из своих сообщений. Хотя Вы не можете править ваши сообщения постоянно, редактирование - неизменно хорошая идея - вы можете улучшать Ваши сообщения, исправлять небольшие ошибки или добавлять что-то, что Вы пропустили ранее. Редактируйте, чтобы сделать Ваши сообщения ещё лучше! + basic_user: + name: Новичок + member: + name: Участник + long_description: | + Эта награда даруется, когда Вы достигаете уровня доверия 2. Благодарим за участие на протяжении недель, чтобы действительно присоединиться к нашему сообществу. Теперь Вы можете отправлять приглашения со своей пользовательской страницы или отдельных тем, создавать групповые личные беседы и иметь немного больше симпатий ежедневно. + regular: + name: Постоялец + leader: + name: Лидер + welcome: + name: Добро пожаловать + description: Получил симпатию + autobiographer: + name: Автобиограф + description: Заполнил информацию в профиле + anniversary: + name: Годовщина + nice_post: + name: Славный Ответ + description: Получил 10 симпатий за ответ + good_post: + name: Хороший Ответ + description: Получил 25 симпатий за ответ + great_post: + name: Отличный Ответ + description: Получил 50 симпатий за ответ + nice_topic: + name: Славная Тема + good_topic: + name: Хорошая Тема + description: Получил 25 симпатий за тему + great_topic: + name: Отличная Тема + description: Получил 50 симпатий за тему + nice_share: + name: Славный Пиар + description: Поделился сообщением с 25 уникальными посетителями + good_share: + name: Хороший Пиар + description: Поделился сообщением с 300 уникальными посетителями + great_share: + name: Отличный Пиар + description: Поделился сообщением с 1000 уникальными посетителями + first_like: + name: Первая Симпатия + description: Понравилось сообщение + first_flag: + name: Первая Жалоба + description: Оставил жалобу на сообщение + promoter: + name: Промоутер + description: Пригласил нового пользователя + campaigner: + name: Активист + description: Пригласил 3 новичков + champion: + name: Чемпион + description: Пригласил 5 участников + first_share: + name: Первый Пиар + description: Поделился сообщением + first_link: + name: Первая Ссылка + description: Добавил ссылку на другую тему + first_quote: + name: Первая Цитата + description: Процитировал сообщение + reader: + name: Читатель + description: Прочитал каждый ответ в теме с более чем 100 ответами + popular_link: + name: Популярная Ссылка + description: Оставил внешнюю ссылку, которую открыли более 50 раз + hot_link: + name: Горячая Ссылка + description: Оставил внешнюю ссылку, которую открыли более 300 раз + famous_link: + name: Легендарная Ссылка + description: Оставил внешнюю ссылку, которую открыли более 1000 раз + appreciated: + name: Оценённый + description: Получил 1 симпатию, отправив 20 сообщений + respected: + name: Уважаемый + description: Получил 2 симпатии, отправив 100 сообщений + admired: + name: Почитаемый + description: Получил 5 симпатий, отправив 300 сообщений + out_of_love: + name: За Любовь + description: Использовал 50 симпатий за день + higher_love: + name: Высшая Любовь + crazy_in_love: + name: Безумная Любовь + thank_you: + name: Благодарный + gives_back: + name: Взаимная Симпатия + empathetic: + name: Чуткий + first_emoji: + name: Первый Смайлик + description: Использовал Смайлик в Сообщении first_mention: name: Первое обращение description: Упомянул другого пользователя в сообщении long_description: Эта награда выдается, когда вы впервые вставляете чей-то @псевдоним в свое сообщение. Каждое такое обращение отправит уведомление этому человеку, чтобы они были в курсе вашего сообщения. Чтобы вставить обращение к человеку по его псевдониму, или к целой группе по ее названию (если это разрешено), начните с символа @ - это удобный способ привлечь их внимание. + first_onebox: + name: Первая Умная Вставка + first_reply_by_email: + name: Первый Ответ По Почте admin_login: success: "письмо отправлено" error: "Ошибка!" @@ -1562,24 +1807,62 @@ ru: performance_report: initial_post_raw: Эта тема содержит ежедневные отчеты активности форума. initial_topic_title: Отчеты активности форума + topic_invite: + user_exists: "К сожалению, этот пользователь уже был приглашён. Вы можете пригласить пользователя в тему только один раз." + tags: + title: "Теги" + staff_tag_disallowed: "Тег \"%{tag}\" может быть применён только персоналом." + staff_tag_remove_disallowed: "Тег \"%{tag}\" может быть удалён только персоналом." + rss_by_tag: "Темы, отмеченные тегом %{tag}" finish_installation: + congratulations: "Поздравляем, Вы установили Discourse!" + register: + button: "Зарегистрироваться" + title: "Зарегистрировать Учётную Запись Администратора" + help: "зарегистрируйте новую учётную запись, чтобы начать" confirm_email: title: "Подтвердите адрес вашей электронной почты" resend_email: title: "Отправить письмо для активации повторно" + safe_mode: + title: "Войти в Безопасный Режим" + description: "Безопасный режим позволяет Вам проверить работу Вашего сайта без загрузки плагинов и настроек сайта." + no_customizations: "Отключить все настройки сайта" + only_official: "Отключить неофициальные плагины" + no_plugins: "Отключить все плагины" + enter: "Войти в Безопасный Режим" wizard: title: "Настройка Discourse" step: + locale: + title: "Добро пожаловать в Ваш Discourse!" + fields: + default_locale: + description: "Язык по умолчанию для Вашего сообщества?" forum_title: title: "Наименование" + fields: + site_description: + label: "Опишите Ваше сообщество одним коротким предложением" introduction: title: "Введение" fields: welcome: label: "Приветственная тема" + one_paragraph: "Пожалуйста, ограничьте Ваше приветственное сообщение одним абзацем." privacy: title: "Доступ" + fields: + privacy: + choices: + open: + label: "Открытое" + description: "Любой может получить доступ к этому сообществу и зарегистрировать учётную запись" + restricted: + label: "Частное" + description: "Только люди, которые приглашены или одобрены мной, могут иметь доступ к этому сообществу" contact: + title: "Контакты" fields: contact_email: placeholder: "name@example.com" @@ -1602,19 +1885,20 @@ ru: title: "Цветовая схема" fields: theme_id: - description: "Вы предпочитаете начать со светлой или темной цветовой схеме? Вы всегда сможете настроить внешний вид вашего сайта с помощью инструментов администратора." choices: default: label: "Светлая" dark: label: "Тёмная" logos: + title: "Логотипы" fields: logo_url: label: "Основная иконка" logo_small_url: label: "Компактная иконка" icons: + title: "Иконки" fields: favicon_url: label: "Маленькая иконка" diff --git a/config/locales/server.sq.yml b/config/locales/server.sq.yml index 070be4c701..b3049632a4 100644 --- a/config/locales/server.sq.yml +++ b/config/locales/server.sq.yml @@ -1021,32 +1021,8 @@ sq: invite_forum_mailer: subject_template: "%{invitee_name} ju ka ftuar të bëheni pjesë e %{site_domain_name}" - text_body_template: | - %{invitee_name} ju ka ftuar të bëheni pjesë e - > **%{site_title}** - > - > %{site_description} - - Nëse jeni i interesuar, klikoni lidhjen e mëposhtme: - %{invite_link} - - Kjo ftesë vjen nga një përdorues i besuar, si rrjedhojë një llogari do të krijohet automatikisht për ju. custom_invite_forum_mailer: subject_template: "%{invitee_name} ju ka ftuar të bëheni pjesë e %{site_domain_name}" - text_body_template: | - %{invitee_name} ju ka ftuar të bëheni pjesë e - > **%{site_title}** - > - > %{site_description} - - Mesazhi nga %{invitee_name}: - - %{user_custom_message} - - Nëse jeni i interesuar, klikoni lidhjen e mëposhtme: - %{invite_link} - - Kjo ftesë vjen nga një përdorues i besuar, si rrjedhojë një llogari do të krijohet automatikisht për ju. invite_password_instructions: subject_template: "Vendos fjalëkalimin për llogarinë tek %{site_name}" text_body_template: |+ @@ -1110,26 +1086,6 @@ sq: (Nëse ju duhet të komunikoni me [anëtarët e stafit](%{base_url}/about) si një anëtar i ri, thjesht përgjigjuni këtij mesazhi.) welcome_invite: subject_template: "Mirë se vini tek %{site_name}!" - text_body_template: | - Thanks for accepting your invitation to %{site_name} -- welcome! - - We've created a new account **%{username}** for you, and you are logged in. You can change your name by visiting [your user profile][prefs]. - - To log in again later: - - 1. Always **use the same email address from your original invitation** when logging in. Otherwise we won't be able to tell it's you! - - 2. Create a unique password for [your user profile][prefs], and use it to log in. - - %{new_user_tips} - - We believe in [civilized community behavior](%{base_url}/guidelines) at all times. - - Enjoy your stay! - - (If you need to communicate with [staff members](%{base_url}/about) as a new user, just reply to this message.) - - [prefs]: %{user_preferences_url} backup_succeeded: subject_template: "Backup completed successfully" backup_failed: diff --git a/config/locales/server.sv.yml b/config/locales/server.sv.yml index 80fbd7386b..e2677e06f1 100644 --- a/config/locales/server.sv.yml +++ b/config/locales/server.sv.yml @@ -1356,36 +1356,8 @@ sv: Denna inbjudan är från en betrodd användare, så du kan direkt delta och svara i diskussionen. invite_forum_mailer: subject_template: "%{invitee_name} har bjudit in dig till %{site_domain_name}" - text_body_template: | - %{invitee_name} har bjudit in dig till - - > **%{site_title}** - > - > %{site_description} - - Om du är intresserad, klicka på länken nedan: - - %{invite_link} - - Denna inbjudan kommer från en betrodd användare, så ett konto kommer att skapas åt dig automatiskt. custom_invite_forum_mailer: subject_template: "%{invitee_name} har bjudit in dig till %{site_domain_name}" - text_body_template: | - %{invitee_name} har bjudit in dig till - - > **%{site_title}** - > - > %{site_description} - - Meddelande från %{invitee_name}: - - %{user_custom_message} - - Om du är intresserad, klicka på länken nedan: - - %{invite_link} - - Denna inbjudan kommer från en betrodd användare, så ett konto kommer att skapas åt dig automatiskt. invite_password_instructions: subject_template: "Ange lösenord för ditt konto på %{site_name}" text_body_template: | @@ -1452,26 +1424,6 @@ sv: (Om du som ny användare behöver komma i kontakt med vår [personal](%{base_url}/about), svara bara på detta meddelande) welcome_invite: subject_template: "Välkommen till %{site_name}!" - text_body_template: | - Tack för att du accepterade din inbjudan till %{site_name} -- välkommen! - - Vi har skapat ett nytt konto **%{username}** till dig och du är inloggad. Du kan byta namn genom att besöka [din användarprofil][prefs]. - - För att logga in senare: - - 1. Använda alltid **samma e-postadress som från din ursprungliga inbjudan** när du loggar in. Annars vet vi inte att det är du! - - 2. Skapa ett unikt lösenord för [din användarprofil][prefs], och använd det för att logga in. - - %{new_user_tips} - - Vi tror på ett [civiliserat beteende](%{base_url}/guidelines) vid alla tillfällen. - - Njut av din vistelse! - - (Om du som ny användare behöver komma i kontakt med vår [personal](%{base_url}/about), svara bara på detta meddelande.) - - [prefs]: %{user_preferences_url} backup_succeeded: subject_template: "Säkerhetskopia skapades utan problem" backup_failed: diff --git a/config/locales/server.tr_TR.yml b/config/locales/server.tr_TR.yml index 05b7544426..4b0f8ae389 100644 --- a/config/locales/server.tr_TR.yml +++ b/config/locales/server.tr_TR.yml @@ -1260,36 +1260,8 @@ tr_TR: Bu davet güvenilir bir kullanıcı tarafından gönderilmiştir, cevap yazarak tartışmaya hemen katılabilirsiniz. invite_forum_mailer: subject_template: "%{invitee_name} sizi %{site_domain_name} sitesine katılmanız için davet etti" - text_body_template: | - %{invitee_name} sizi foruma katılmaya davet ediyor - - > **%{site_title}** - > - > %{site_description} - - Eğer ilgileniyorsanız, aşağıdaki bağlantıya tıklayın: - - %{invite_link} - - Bu davet güvenilir bir üyeden gönderildi, bu nedenle hesabınız sizin için otomatik olarak oluşturulacak. custom_invite_forum_mailer: subject_template: "%{invitee_name} sizi %{site_domain_name} sitesine katılmaya davet etti" - text_body_template: | - %{invitee_name} sizi foruma katılmaya davet ediyor - - > **%{site_title}** - > - > %{site_description} - - %{invitee_name} diyor ki: - - %{user_custom_message} - - Eğer ilgileniyorsanız, aşağıdaki bağlantıya tıklayın: - - %{invite_link} - - Bu davet güvenilir bir üyeden gönderildi, bu nedenle hesabınız sizin için otomatik olarak oluşturulacak. invite_password_instructions: subject_template: "%{site_name} hesabınız için parola oluşturun" text_body_template: | @@ -1363,26 +1335,6 @@ tr_TR: (Eğer yeni bir kullanıcı olarak [görevlilerle](%{base_url}/about) iletişim kurmak isterseniz, bu iletiyi cevaplamanız yeterli.) welcome_invite: subject_template: "%{site_name} topluluğuna hoş geldiniz!" - text_body_template: | - %{site_name} davetiyenizi onayladığınız için teşekkürler -- hoş geldiniz! - - Sizin için yeni bir hesap oluşturduk: **%{username}**, ve sisteme girişiniz yapıldı. [Kullanıcı profilinizi][prefs] ziyaret ederek kullanıcı adınızı değiştirebilirsiniz. - - Daha sonra tekrar giriş yapmak için: - - 1. Giriş yaparken her zaman **ilk davetiyenizdeki ile aynı e-posta adresini kullanın**. Yoksa sizin olduğunuzu anlayamayız! - - 2. [Kullanıcı profiliniz][prefs] için yeni bir parola oluşturun ve o parola ile giriş yapın. - - %{new_user_tips} - - Biz her zaman [topluluk yönergelerimize](%{base_url}/guidelines) inanıyoruz. - - Ziyaretinizin keyfini çıkarın! - - (Eğer yeni bir kullanıcı olarak [görevlilerle](%{base_url}/about) iletişim kurmak isterseniz, bu iletiyi cevaplamanız yeterli.) - - [prefs]: %{user_preferences_url} backup_succeeded: subject_template: "Yedekleme başarıyla tamamlandı" text_body_template: | @@ -2140,11 +2092,9 @@ tr_TR: fields: welcome: label: "Hoş geldiniz Konusu" - description: "

    Bir çay evindeki birine topluluğunuzu 1 dakikada nasıl anlatırsınız?

    • Bu tartışmalar kimler için?
    • Burada ne bulabilirim?
    • Neden ziyaret etmeliyim?

    Hoş geldiniz konusu yeni ziyaretçilerin ilk göreceği şeydir. Bunu sizin tek nefeslik 'çay konunuz' veya 'ısmarlama çayınız' olarak görebilirsiniz.

    " one_paragraph: "Lütfen hoş geldiniz iletinizi bir paragraf kadar uzunlukta tutun." privacy: title: "Erişim" - description: "

    Topluluğunuz herkese açık mı yoksa üyelik, davet veya onaylama ile kısıtlı mı? Dilerseniz bu seçeneği daha sonra değiştirebilirsiniz.

    Kullanıcı sayfanızdan ve konulardan davetiye gönderebileceğini unutmayın.

    " fields: privacy: choices: @@ -2167,7 +2117,6 @@ tr_TR: label: "Otomatik İletiler" description: "Discourse tarafından gönderilen tüm otomatik kişisel iletiler bu kullanıcı tarafından gönderilecek. Daha da önemlisi, kullanıcılara gidecek olan hoş geldiniz mesajları da bu kullanıcı tarafından gönderilecek." corporate: - description: "Bu isimler sonradan düzenleyebileceğiniz Gizlilik Politikası ve Hizmet Şartları metinlerinde kullanılacak. Eğer bir şirket söz konusu değilse bu adımı geçebilirsiniz." fields: company_short_name: label: "Firma İsmi (kısa)" @@ -2182,7 +2131,6 @@ tr_TR: title: "Tema" fields: theme_id: - description: "Başlamak için renk düzeni olarak karanlık mı yoksa aydınlık mı istersiniz? Dilediğiniz zaman daha fazla seçeneği Yönetici, Özelleştir alanında bulabilirsiniz." choices: default: label: "Basit Aydınlık" diff --git a/config/locales/server.ur.yml b/config/locales/server.ur.yml index 1c6b25a7f1..ffdc57e427 100644 --- a/config/locales/server.ur.yml +++ b/config/locales/server.ur.yml @@ -6,6 +6,7 @@ # https://www.transifex.com/projects/p/discourse-org/ ur: + title: "ڈسکورس" errors: &errors messages: empty: ھالی نہیں ھو سکتا diff --git a/config/locales/server.vi.yml b/config/locales/server.vi.yml index 34d5f1db02..7d9ad03935 100644 --- a/config/locales/server.vi.yml +++ b/config/locales/server.vi.yml @@ -1231,26 +1231,6 @@ vi: (Nếu bạn cần giao tiếp với BQT [thành viên quản trị](%{base_url}/about), bạn có thể gửi trả lời email này). welcome_invite: subject_template: "Chào mừng đến với %{site_name}!" - text_body_template: | - Chào mừng bạn gia nhập %{site_name}! - - Chúng tôi đã tạo một tài khoản mới **%{username}** cho bạn, bạn có thể thay đổi tên của mình bằng cách truy cập [your user profile][prefs]. - - Cho lần đăng nhập sau: - - 1. Luôn **sử dụng cùng một địa chỉ email từ lời mời ban đầu của bạn** khi đăng nhập. Nếu không chúng ta sẽ không thể biết đó là bạn! - - 2. Tạo một mật khẩu cho [your user profile][prefs], và sử dụng nó để đăng nhập. - - %{new_user_tips} - - Chúng tôi tin rằng bạn sẽ cùng chúng tôi phát triển một cộng đồng văn minh [hành vi ứng xử](%{base_url}/guidelines). - - Chúc vui vẻ! - - (Nếu bạn cần giao tiếp với BQT [thành viên quản trị](%{base_url}/about), bạn có thể gửi trả lời email này). - - [prefs]: %{user_preferences_url} backup_succeeded: subject_template: "Sản sao lưu hoàn tất thành công" backup_failed: diff --git a/config/locales/server.zh_CN.yml b/config/locales/server.zh_CN.yml index 95e6ec5f61..85ff3f2459 100644 --- a/config/locales/server.zh_CN.yml +++ b/config/locales/server.zh_CN.yml @@ -71,7 +71,7 @@ zh_CN: has_already_been_used: "不能和其他%{attribute}重复" inclusion: 不包括在列表中 invalid: 无效 - is_invalid: "這句似乎不清晰,这是个完整的句子吗?" + is_invalid: "似乎不清楚,这是一个完整的句子?" less_than: 必须小于 %{count} less_than_or_equal_to: 必须小于等于 %{count} not_a_number: 不是数字 @@ -154,7 +154,7 @@ zh_CN: not_accepting_pms: "对不起,%{username} 目前不接收讯息。" just_posted_that: "太类似于你最近发表的内容" invalid_characters: "包含无效字符" - is_invalid: "似乎不清晰,这是个完整的句子吗?" + is_invalid: "似乎不清楚,这是一个完整的句子? " next_page: "下一页 →" prev_page: "← 上一页" page_num: "第%{num}页" @@ -1429,36 +1429,8 @@ zh_CN: 这封邀请发自受信任的用户,所以你可以立即回复主题。 invite_forum_mailer: subject_template: "%{invitee_name} 邀请你加入 %{site_domain_name}" - text_body_template: | - %{invitee_name} 邀请你加入 - - > **%{site_title}** - > - > %{site_description} - - 如果你感兴趣,点击下面的链接: - - %{invite_link} - - 这封邀请发自受信任的用户,所以你的帐户将被自动创建。 custom_invite_forum_mailer: subject_template: "%{invitee_name}邀请你加入%{site_domain_name}" - text_body_template: | - %{invitee_name}邀请你加入 - - > **%{site_title}** - > - > %{site_description} - - %{invitee_name}的留言: - - %{user_custom_message} - - 如果你感兴趣,点击下面的链接: - - %{invite_link} - - 这封邀请发自受信任的用户,所以你的帐户将被自动创建。 invite_password_instructions: subject_template: "为 %{site_name} 账户设置密码" text_body_template: | @@ -1593,26 +1565,6 @@ zh_CN: (如果你在新用户级别需要和[管理人员](%{base_url}/about)沟通的话,直接回复这个消息。) welcome_invite: subject_template: "欢迎来到 %{site_name}!" - text_body_template: | - 感谢你接受邀请加入%{site_name} —— 欢迎! - - 我们为你创建了账号:**%{username}**,同时你已经登录了。你可以在任何时候访问[你的用户设置][prefs]来修改它。 - - 要再次登入,或者: - - 1. 永远 **使用收到邀请的邮箱地址**登录。否则我们就无法分辨是不是你本人! - - 2. 在 [你的用户设置][prefs]页面创建一个密码,然后使用该密码来登入。 - - %{new_user_tips} - - 我们始终相信[讨论应该文明](%{base_url}/guidelines)。 - - 好好享受你在论坛的时光吧! - - ( 如果你在新用户级别需要和[管理人员](%{base_url}/about)沟通的话,直接回复这个消息。) - - [prefs]: %{user_preferences_url} backup_succeeded: subject_template: "备份成功完成" text_body_template: | @@ -2815,11 +2767,9 @@ zh_CN: fields: welcome: label: "欢迎主题" - description: "

    你将怎么在一分钟内向陌生人描述你的社群?

    • 谁会对这些讨论感兴趣?
    • 我能获得什么?
    • 为什么我应该访问?

    你的欢迎主题是新访客将先看到的东西。把它想象为一段“电梯宣传”或者“使命声明”。

    " one_paragraph: "请限制你的欢迎消息至一段话。" privacy: title: "访问" - description: "

    你的社群对所有人可见或者需要限制为会员许可、邀请许可或者审核许可?如果你愿意,你可以将其设为私密,然后再切换至公开。

    记住你永远可以在主题中邀请别人,或者从你的用户页面里也行。

    " fields: privacy: choices: @@ -2845,7 +2795,6 @@ zh_CN: description: "所有自动发送自 Discourse 的私人消息将以该用户的名义发送。最重要的是,这个用户将被指定为发送给每个新用户的欢迎消息的发送人。" corporate: title: "组织" - description: "这些名字将显示于隐私策略服务条款中,你可以随时在工作人员分类中编辑他们。如果你没有公司,你可以跳过这个步骤。" fields: company_short_name: label: "公司名(短)" @@ -2860,7 +2809,6 @@ zh_CN: title: "主题" fields: theme_id: - description: "你喜欢亮色还是暗色的颜色方案?你永远可以在管理-自定义中修改站点的观感。" choices: default: label: "简洁亮" @@ -2885,7 +2833,6 @@ zh_CN: label: "大图标" description: "现代设备中你站点显示的图标,要在大一点尺寸的情况下表现出色。推荐的尺寸至少要达到144px X 144px。" homepage: - description: "我们推荐在你的主页显示最新主题,但是如果你喜欢,你也可以选择显示分类(一组主题)。" title: "主页" fields: homepage_style: @@ -2896,7 +2843,6 @@ zh_CN: label: "分类" emoji: title: "Emoji" - description: "你喜欢你的社群使用哪一种 Emoji 样式?你永远可以在管理-自定义-Emoji中增加更多的定制 Emoji。" invites: title: "邀请工作人员" description: "你快做完啦!让我们邀请一些工作人员来帮助你创建一些讨论主题以方便你发布社群。" diff --git a/config/locales/server.zh_TW.yml b/config/locales/server.zh_TW.yml index 65ada8f36d..c0ca38caa7 100644 --- a/config/locales/server.zh_TW.yml +++ b/config/locales/server.zh_TW.yml @@ -20,8 +20,8 @@ zh_TW: month_names: [null, 一月, 二月, 三月, 四月, 五月, 六月, 七月, 八月, 九月, 十月, 十一月, 十二月] <<: *datetime_formats time: - am: "AM" - pm: "PM" + am: "上午" + pm: "下午" <<: *datetime_formats title: "論壇" topics: "討論話題" @@ -29,27 +29,28 @@ zh_TW: loading: "載入中" powered_by_html: 'Powered by Discourse, 請啟用 Javascript 以獲得最佳瀏覽效果' log_in: "登入" - purge_reason: "自動當成遺棄、未啟動的帳號刪除" + purge_reason: "自動當成遺棄、未啟動的帳戶刪除" disable_remote_images_download_reason: "磁盤空間不足,圖像下載已被禁用。" anonymous: "匿名" + remove_posts_deleted_by_author: "已由作者刪除" emails: incoming: - default_subject: "收入email從%{email}" - show_trimmed_content: "顯示之前刪除的內容" + default_subject: "來自 %{email} 的電子郵件" + show_trimmed_content: "顯示刪減後的內容" maximum_staged_user_per_email_reached: "以達成分期使用者能創造的最大數量信件" errors: - empty_email_error: "當收到的未加工訊息是空白時發生" - no_message_id_error: "當信件沒有訊息名稱時發生" + empty_email_error: "當我們收到的原生郵件空白時發生。" + no_message_id_error: "當郵件沒有「Message-Id」標頭訊息時發生。" auto_generated_email_error: "郵件頭部的“precedence”為:list、junk、bulk 或 auto_reply,或者頭部包含了:auto-submitted、auto-replied 或 auto-generated。" no_body_detected_error: "無法解析正文並且沒有附件。" - inactive_user_error: "當寄件者不是主動時發生" - blocked_user_error: "當寄件者被阻擋時發生" + inactive_user_error: "當寄件者處於非啟動狀態時發生。" + blocked_user_error: "當寄件者已被封鎖時發生。" bad_destination_address: "發至/抄送/密送欄中的所有郵件都不匹配進站郵件地址。" - strangers_not_allowed_error: "當使用者想在不屬於他的分類中開創一個新的主題時發生" + strangers_not_allowed_error: "當用戶試圖在尚未晉身為成員之一的分類中新建討論話題時發生。" insufficient_trust_level_error: "用戶嘗試在用戶等級不滿足分類要求時發帖。" reply_user_not_matching_error: "回覆郵箱地址與通知發送至的郵件地址不同。" - topic_not_found_error: "當得到回應,但相關主題已經被刪除時發生" - topic_closed_error: "當得到回應,但相關主題已經被關閉時發生" + topic_not_found_error: "當得到回應,但相關討論話題已經刪除時發生。" + topic_closed_error: "當得到回應,但相關討論話題已經關閉時發生。" bounced_email_error: "郵件是投遞失敗的錯誤報告。" screened_email_error: "發件人郵箱已經被封禁。" errors: &errors @@ -71,7 +72,7 @@ zh_TW: has_already_been_used: "已經被使用" inclusion: 不包括在這列表中 invalid: 無效的 - is_invalid: "似乎不清楚,這是個完整的句子嗎?" + is_invalid: "似乎不清楚,這是完整的句子嗎?" less_than: 必須少於 %{count} less_than_or_equal_to: 必須少於或等於 %{count} not_a_number: 不是數字 @@ -102,7 +103,7 @@ zh_TW: default_categories_already_selected: "不能選擇一個已經用於另一個列表的分類。" s3_upload_bucket_is_required: "你沒有填寫“s3_upload_bucket”,不能開啟上傳至 S3。" bulk_invite: - file_should_be_csv: "上傳檔必須是CSV的格式" + file_should_be_csv: "上傳的檔案必須是 CSV 格式。" error: "上傳檔案有錯誤,請再試一次。" backup: operation_already_running: "%{operation} 操作正在運行。 目前無法執行新的 %{operation} 操作。" @@ -113,17 +114,17 @@ zh_TW: not_found: "所請求的URL或資源無法找到。" invalid_access: "你不允許查看所請求的資源。" read_only_mode_enabled: "這個網站目前在唯讀模式,無法進行互動功能。" - reading_time: "看時間" - likes: "讚" + reading_time: "閱讀時間" + likes: "個讚" too_many_replies: other: "我們非常抱歉,新用戶被臨時限制在同一個主題上,只能回覆 %{count} 次" embed: start_discussion: "開始討論" continue: "繼續討論" - error: "錯誤嵌入" - referer: "引薦" - mismatch: "引薦來源與下列任何主機不符" - no_hosts: "未設置嵌入的主機" + error: "嵌入時遭遇錯誤" + referer: "Referer:" + mismatch: "referer 來源與下列任何主機不符:" + no_hosts: "未設置內嵌用的主機。" configure: "配置嵌入" more_replies: other: "%{count} 個更多回覆" @@ -133,28 +134,28 @@ zh_TW: in_reply_to: "▶ %{username}" replies: other: "%{count} 個回覆" - no_mentions_allowed: "抱歉,你不能提及其他使用者" + no_mentions_allowed: "抱歉,您無法提及其他用戶。" too_many_mentions: - other: "抱歉,你只能提及帖子中%{count} 的使用者" - no_mentions_allowed_newuser: "抱歉,新使用者不能提及其他使用者" + other: "抱歉,您的貼文中只能提及 %{count} 位用戶。" + no_mentions_allowed_newuser: "抱歉,新用戶不能提及其他用戶。" too_many_mentions_newuser: - other: "抱歉,新使用者只能提及帖子中%{count}的使用者。" - no_images_allowed: "抱歉,新使用者不能在帖子中發布圖片" + other: "抱歉,新用戶只能在貼文中提及 %{count} 位用戶。" + no_images_allowed: "抱歉,新用戶不能在貼文中放置圖片。" too_many_images: - other: "抱歉,新者用者只能在帖子裡放%{count}張圖片" - no_attachments_allowed: "抱歉,新使用者不能在帖子中發布附件" + other: "抱歉,新者用者只能在貼文中放置 %{count} 張圖片。" + no_attachments_allowed: "抱歉,新用戶不能在貼文中放置附件。" too_many_attachments: - other: "抱歉,新使用者只能在帖子裡發布%{count} 個附件" - no_links_allowed: "抱歉,新使用者不能在帖子裡放置連結" + other: "抱歉,新用戶只能在貼文中放置 %{count} 個附件。" + no_links_allowed: "抱歉,新用戶不能在貼文中放置連結。" too_many_links: - other: "抱歉,新使用者只能在帖子裡放置%{count}個連結" + other: "抱歉,新用戶只能在貼文中放置 %{count} 個連結。" spamming_host: "抱歉,你不能張貼該網站之連結。" user_is_suspended: "被停權的用戶無法張貼文章。" topic_not_found: "出現問題。也許這個話題被關閉或刪除。" not_accepting_pms: "對不起,%{username} 目前不接收訊息。" just_posted_that: "與你最近發表的內容太相似" invalid_characters: "包含無效字詞" - is_invalid: "似乎不清楚,這是個完整的句子嗎?" + is_invalid: "似乎不清楚,這是完整的句子嗎?" next_page: "下一頁 →" prev_page: "← 上一頁" page_num: "%{num} 頁" @@ -170,16 +171,16 @@ zh_TW: rss_description: latest: "最新討論話題" hot: "熱門討論話題" - top: "熱門話題" + top: "熱門討論話題" posts: " 最近文章" - private_posts: "最近的私人訊息" - group_posts: "%{group_name}發布的最新帖子" - group_mentions: "%{group_name}最近提及的事物" - user_posts: "@%{username}發布的最新公告" - user_topics: "@%{username}發布的最新主題" + private_posts: "最新的私人訊息" + group_posts: "%{group_name} 的最新貼文" + group_mentions: "%{group_name} 的最近提及" + user_posts: "@%{username} 的最新貼文" + user_topics: "@%{username} 的的最新討論話題" tag: "主題標籤" too_late_to_edit: "這文章建立很久了,它已經無法被編輯或刪除" - revert_version_same: "你試圖回復的版本和當前版本相同。" + revert_version_same: "您試圖回復的版本和當前版本相同。" excerpt_image: "圖片" queue: delete_reason: "通過帖子審核隊列刪除" @@ -188,9 +189,9 @@ zh_TW: can_not_modify_automatic: "你不能修改自動組" member_already_exist: "'%{username}' 已經是群組成員了。" invalid_domain: "'%{domain}' 不是有效的域名." - invalid_incoming_email: "'%{email}'不是有效的電子郵件位址" - email_already_used_in_group: "'%{email}' 已經被組織'%{group_name}'使用" - email_already_used_in_category: "'%{email}'已經被分類 '%{category_name}'使用" + invalid_incoming_email: "「%{email}」不是有效的電子郵件位址。" + email_already_used_in_group: "「%{email}」已經被「%{group_name}」群組使用。" + email_already_used_in_category: "「%{email}」已經被「%{category_name}」類別使用。" default_names: everyone: "所有人" admins: "管理員" @@ -264,7 +265,7 @@ zh_TW: name: "分類名稱" topic: title: '標題' - featured_link: '有特色的連結' + featured_link: '特選連結' post: raw: "內容" user_profile: @@ -280,14 +281,14 @@ zh_TW: no_user_selected: "你必須選擇有效用戶。" featured_link: invalid: "不合法。URL 應包括 http:// 或 https://。" - invalid_category: "在這個分類中無法編輯" + invalid_category: "無法在這個類別中編輯。" user: attributes: password: common: "這個密碼是 10000 個最常用密碼之一,請使用一個更安全的密碼" - same_as_username: "與你的使用者名稱相同。請使用其他更安全的密碼。" + same_as_username: "與你的用戶名稱相同。請使用其他更安全的密碼。" same_as_email: "與你的電郵相同。請使用其他更安全的密碼。" - same_as_current: "與你當前的密碼相同" + same_as_current: "與您目前的密碼相同。" ip_address: signup_not_allowed: "不能使用這個帳戶進行登入" color_scheme_color: @@ -296,7 +297,7 @@ zh_TW: invalid: "不是一個有效顏色" post_reply: base: - different_topic: "帖子和回復必須都是回在相同的主題" + different_topic: "貼文和回覆都必須處在相同的討論話題下。" web_hook: attributes: payload_url: @@ -314,7 +315,7 @@ zh_TW: assets_topic_title: "站點設計資料" assets_topic_body: "這是一個永久主題,僅對管理人員可見,用於存儲論壇設計使用的圖像和檔案。不要刪除它!\n\n\n詳細教程:\n\n\n1. 回覆到這個主題。\n2. 上傳你想用作站點標誌、表徵圖和其他所有圖片到這兒。(使用帖子編輯器工具欄中的上傳表徵圖,或者拖拽或者粘貼圖像。)\n3. 提交你的回覆添加帖子。\n4. 在你的新帖子裡右鍵點擊圖片獲得這些已上傳圖片的連結,或者點擊編輯按鈕來編輯帖子,獲得到圖片的相對地址。複製這些相對地址。\n5. 粘貼這些圖像的路徑到[基礎設置](/admin/site_settings/category/required)。\n\n\n如果你需要運行額外的上傳檔案類型,在[檔案設置](/admin/site_settings/category/files)中編輯 `authorized_extensions`。" discourse_welcome_topic: - title: "歡迎來到Discourse" + title: "歡迎來到 Discourse" body: |2 置頂主題的第一段是訪客在主頁看到的歡迎消息。這很重要! @@ -360,9 +361,9 @@ zh_TW: uncategorized_parent: "未分類不能有一個父分類" self_parent: "一個子分類的上層不能是自己" depth: "你不能在子分類下再包含子分類" - invalid_email_in: "'%{email}'不是有效的電子郵件位址" - email_already_used_in_group: "%{email}' 已經被組織'%{group_name}'使用" - email_already_used_in_category: "%{email}'已經被分類 '%{category_name}'使用" + invalid_email_in: "「%{email}」不是有效的電子郵件位址。" + email_already_used_in_group: "「%{email}」已被「%{group_name}」群組數用。" + email_already_used_in_category: "「%{email}」已被「%{category_name}」類別使用。" cannot_delete: uncategorized: "不能刪除該分類" has_subcategories: "不能刪除該分類,因為它有子分類" @@ -383,21 +384,21 @@ zh_TW: title: "資深" change_failed_explanation: "你嘗試將%{user_name}降至%{new_trust_level}。然而他們的信任等級已經是%{current_trust_level}。%{user_name}將仍處于%{current_trust_level}——如果你想要降級用戶,先鎖定信任等級。" rate_limiter: - slow_down: "你重複這個行動太多次了,請稍後再試" + slow_down: "您這個動作重複太多次,請稍後再試。" too_many_requests: "你的瀏覽速度過於頻繁,請等待 %{time_left} 後再試。" by_type: first_day_replies_per_day: "你回帖的數量已經超出身為新用戶當天允許的上限,請等待%{time_left}之後再試。" first_day_topics_per_day: "你創建新主題的數量已經超出身為新用戶當天允許的上限,請等待%{time_left}之後再試。" - create_topic: "你創建主題過於快速。請等待 %{time_left}再行嘗試" + create_topic: "您創建討論話題過於倉猝。請稍等 %{time_left} 再試一次。" create_post: "你的回覆過快。請等待%{time_left}再重試。" - delete_post: "你刪除主題過於快速。請等待 %{time_left}再行嘗試" - public_group_membership: "你加入/離開團隊過於頻繁。請等待 %{time_left}再行嘗試" - topics_per_day: "你今天發布的主題已經達到上限次數。請等待%{time_left}再行嘗試。" - pms_per_day: "你今天發表的訊息已經達到上限次數。請等待%{time_left}再行嘗試。" - create_like: "你今天發表讚的次數已經達到上限。請等待%{time_left}再行嘗試。" - create_bookmark: "你今天存取的書籤已經達到上限次數。請等待%{time_left}再行嘗試。" - edit_post: "你今天編輯的次數已經達到上限。請等待%{time_left}再行嘗試。" - live_post_counts: "你要求即時帖子過於快速。請等待%{time_left}再行嘗試。" + delete_post: "您刪除討論話題過於倉猝。請稍待 %{time_left} 後再試一次。" + public_group_membership: "您加入/離開群組過於頻繁。請稍等 %{time_left} 後再試一次。" + topics_per_day: "您今天新發佈的討論話題已經達到上限。請稍待 %{time_left} 後再試一次。" + pms_per_day: "您今天發表的訊息數已經達到上限。請等待 %{time_left} 後再行嘗試。" + create_like: "您今天給予讚的次數已經達到上限。請等待 %{time_left} 再行嘗試。" + create_bookmark: "您今天加入書籤的數目已經達到上限。請等待 %{time_left} 再行嘗試。" + edit_post: "您今天編輯的次數已達到上限。請等待 %{time_left} 再行嘗試。" + live_post_counts: "您要求的即時文章計數過於快速。請等待 %{time_left} 再行嘗試。" unsubscribe_via_email: "你已經達到了今日用郵件解除訂閲的最大數量限制。請等待%{time_left}之後再試。" topic_invitations_per_day: "你已經達到了今日主題邀請的最大數量限制。請等待%{time_left}之後再試。" hours: @@ -499,8 +500,8 @@ zh_TW: long_form: '投訴為不當內容' notify_user: title: '給 @{{username}} 送出一則訊息' - description: '我想要直接且隱密的和那個人討論這個帖子' - long_form: '訊息使用者' + description: '我想要直接且私下地和這位朋友討論其文章。' + long_form: '傳訊給用戶' email_title: '你的文章在"%{title}"' email_body: "%{link}\n\n%{message}" notify_moderators: @@ -524,9 +525,9 @@ zh_TW: user_activity: no_bookmarks: self: "你沒有收藏帖子,收藏帖子能讓你之後輕鬆找到他們。" - others: "沒有書籤" + others: "沒有書籤。" no_likes_given: - self: "你沒有喜歡任何帖子" + self: "你沒有對任何文章按讚。" others: "沒有被讚的帖子。" topic_flag_types: spam: @@ -560,7 +561,7 @@ zh_TW: topic_description: "點擊連結 %{link} 重新訂閲,或是使用主題底部或右側的通知控制。" unsubscribe: title: "退訂" - stop_watching_topic: "停止觀看這個主題, %{link}" + stop_watching_topic: "停止關注這個討論話題,%{link}" mute_topic: "關閉此主題的所有通知,%{link}" unwatch_category: "停止監看%{category}分類中的所有主題" mailing_list_mode: "停用郵件列表模式" @@ -1032,6 +1033,7 @@ zh_TW: max_attachment_size_kb: "允許用戶上傳的最大文件大小(以kB為單位)。確保也在nginx(client_max_body_size),apache 或代理中進行限制文件大小的設定。" authorized_extensions: "允許上傳文件的副檔名列表('*' 表示允許所有文件類型)" max_similar_results: "當用戶撰寫新主題時,顯示多少類似主題給用戶。比較根據標題和內容進行。" + max_image_megapixels: "圖像所允許的最大百萬畫素數質。" title_prettify: "防止常見標題裡的錯別字和錯誤,包括全部大寫,首字小寫,多個!和?,結尾多餘的. 等等。" topic_views_heat_low: "多少次瀏覽後,該視圖將稍稍高亮。" topic_views_heat_medium: "多少次瀏覽後,該視圖將明顯高亮。" @@ -1353,6 +1355,8 @@ zh_TW: user: no_accounts_associated: "無關聯的帳戶" deactivated: "因發送至“%{email}”的郵件被多次退信,取消激活" + deactivated_by_staff: "已由管理員撤銷" + activated_by_staff: "已由管理員啟動" username: short: "必須至少 %{min} 個字" long: "不能超過 %{max} 個字" @@ -1378,6 +1382,7 @@ zh_TW: subject_template: other: "%{count} 個標記需要被處理" unsubscribe_mailer: + title: "取消訂閱 Mailer" subject_template: "確認你不想要收到%{site_title}的電子郵件更新" text_body_template: | 有人(可能是你?)請求不再接受來自%{site_domain_name}的郵件更新。 @@ -1388,6 +1393,7 @@ zh_TW: 如果你想要繼續接受郵件更新,你可以忽略這封郵件。 invite_mailer: + title: "邀請 Mailer" subject_template: "%{invitee_name} 邀請你參與在 %{site_domain_name} 討論的話題 '%{topic_title}'" text_body_template: | %{invitee_name} 邀請你參與討論 @@ -1406,6 +1412,7 @@ zh_TW: 這封邀請來組于受信任的用戶,所以你可以立即回覆。 custom_invite_mailer: + title: "客製邀請 Mailer" subject_template: "%{invitee_name}邀請你'%{topic_title}'在%{site_domain_name}" text_body_template: | %{invitee_name}邀請你參與 @@ -1428,38 +1435,13 @@ zh_TW: 這封邀請發自受信任的用戶,所以你可以立即回覆主題。 invite_forum_mailer: + title: "邀請論壇 Mailer" subject_template: "%{invitee_name} 邀請你加入 %{site_domain_name}" - text_body_template: | - %{invitee_name} 邀請你加入 - - > **%{site_title}** - > - > %{site_description} - - 如果你感興趣,點擊下面的連結: - - %{invite_link} - - 這封邀請發自受信任的用戶,所以你的帳戶將被自動創建。 custom_invite_forum_mailer: + title: "邀請論壇 Mailer" subject_template: "%{invitee_name}邀請你加入%{site_domain_name}" - text_body_template: | - %{invitee_name}邀請你加入 - - > **%{site_title}** - > - > %{site_description} - - %{invitee_name}的留言: - - %{user_custom_message} - - 如果你感興趣,點擊下面的連結: - - %{invite_link} - - 這封邀請發自受信任的用戶,所以你的帳戶將被自動創建。 invite_password_instructions: + title: "邀請密碼的說明" subject_template: "為 %{site_name} 的帳戶設置密碼" text_body_template: | 感謝你接受來自%{site_name}的邀請——歡迎! @@ -1469,6 +1451,7 @@ zh_TW: (如果連結已經過期,在登錄時用,選擇“我忘記了密碼”,再次輸入你的郵箱即可。) test_mailer: + title: "測試 Mailer" subject_template: "[%{site_name}] 電子郵件發送測試" text_body_template: | 這是一封測試電子郵件,發自: @@ -1512,6 +1495,7 @@ zh_TW: [mj]: https://www.mailjet.com/pricing [mt]: http://www.mail-tester.com/ new_version_mailer: + title: "新版本 Mailer" subject_template: "[%{site_name}] 有可用的新版 Discourse 更新" text_body_template: | 哇哦,有新版本的 [Discourse](http://www.discourse.org) 可以升級! @@ -1525,6 +1509,7 @@ zh_TW: - 訪問 [meta.discourse.org(英文)](https://meta.discourse.org) 獲取 Discourse 的最新資訊、討論和支持。也可訪問 [meta.discoursecn.org 非官方的中文支持論壇](https://meta.discoursecn.org) 獲得支持。 new_version_mailer_with_notes: + title: "包含提醒的新版本 Mailer" subject_template: "[%{site_name}] 可以升級" text_body_template: | 哇哦,有新版本的 [Discourse](http://www.discourse.org) 可以升級! @@ -1542,6 +1527,7 @@ zh_TW: %{notes} queued_posts_reminder: + title: "排定中的文章提醒" subject_template: other: "[%{site_name}] %{count} 個帖子等待審核" text_body_template: | @@ -1562,6 +1548,7 @@ zh_TW: temporarily_closed_due_to_flags: "主題因為大量的社群標記暫時關閉" system_messages: post_hidden: + title: "文章已隱藏" subject_template: "帖子因社群標記隱藏" text_body_template: | 你好, @@ -1580,6 +1567,7 @@ zh_TW: usage_tips: text_body_template: "要查看給新用戶的簡要技巧,[(英文)看看這篇博客文章](http://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/)。\n\n只要你參與,我們將更瞭解你,並且新用戶的臨時限制將被移除。\b隨着時間,你將獲得[信任等級](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924),這將提供一些特殊功能來幫助我們更好地管理社群。\n" welcome_user: + title: "歡迎使用者" subject_template: "歡迎來到 %{site_name}!" text_body_template: |+ 感謝你加入%{site_name},歡迎討論! @@ -1591,30 +1579,10 @@ zh_TW: (如果身為新的使用者你需要聯絡[工作人員](%{base_url}/about),請直接回覆本訊息) welcome_invite: + title: "歡迎邀請" subject_template: "歡迎來到 %{site_name}!" - text_body_template: |+ - 歡迎你接受邀請加入 %{site_name} 的 Discourse。 - - 你已經登入你的新帳號 **%{username}** 。你可以在[你的個人檔案][prefs]更改你的使用者名稱。 - - 之後要再登入: - - 1. 永遠 **使用當初註冊的 email ** 登入,不然我們不知道是你! - - 2. 為[你的個人檔案][prefs]創立一個獨立的密碼,用它登入。 - - %{new_user_tips} - - 我們相信[公民社群守則](%{base_url}/guidelines)。 - - 享受你在 Discourse 上的時光! - - (如果身為新的使用者你需要聯絡[工作人員](%{base_url}/about) ,請直接回覆此訊息。 - - [prefs]: %{user_preferences_url} - - backup_succeeded: + title: "備份成功" subject_template: "備份成功完成" text_body_template: | 備份成功。 @@ -1627,6 +1595,7 @@ zh_TW: %{logs} ``` backup_failed: + title: "備份失敗" subject_template: "備份失敗" text_body_template: | 備份已經失敗了。 @@ -1637,6 +1606,7 @@ zh_TW: %{logs} ``` restore_succeeded: + title: "復原成功" subject_template: "恢復成功完成" text_body_template: | 恢復成功。 @@ -1647,6 +1617,7 @@ zh_TW: %{logs} ``` restore_failed: + title: "復原失敗" subject_template: "復原失敗" text_body_template: | 恢復失敗。 @@ -1660,6 +1631,7 @@ zh_TW: subject_template: "批次用戶邀請已完成處理" text_body_template: "你的批量邀請用戶已經完成,發送了 %{sent} 個邀請。" bulk_invite_failed: + title: "批量邀請失敗" subject_template: "批次使用者邀請處理已經完成,發生了些錯誤" text_body_template: | 批量邀請已經完成,發出了 %{sent} 個邀請並且 %{failed} 個失敗。 @@ -1670,6 +1642,7 @@ zh_TW: %{logs} ``` csv_export_succeeded: + title: "CSV 檔匯出成功" subject_template: "資料匯出完成" text_body_template: | 數據成功導出!:dvd: @@ -1678,51 +1651,60 @@ zh_TW: 以上的下載連結將在 48 小時後失效。 csv_export_failed: + title: "CSV 檔匯出失敗" subject_template: "資料匯出失敗" text_body_template: "我們很抱歉,但是你的數據導出請求失敗了。請檢查日誌或聯繫一位管理人員。" email_reject_insufficient_trust_level: + title: "電子郵件拒絕 信任等級不足" subject_template: "[%{site_name}] 電子郵件錯誤 -- 信任等級不足" text_body_template: | 我們很抱歉,但是你發送至%{destination}(名為 %{former_title})的郵件出問題了。 你的賬戶沒有足夠的信任等級以該郵件地址發佈新主題。如果你有異議,聯繫管理人員。 email_reject_user_not_found: + title: "電子郵件拒絕 找不到用戶" subject_template: "[%{site_name}] 郵件問題 -- 用戶未找到" text_body_template: | 我們非常抱歉,但是你發送至 %{destination}(名為%{former_title}) 的郵件出問題了。 你發送回覆的郵件地址是未知的郵件地址。試試從另外一個郵件地址發送,或者聯繫管理人員。 email_reject_screened_email: + title: "電子郵件拒絕 屏蔽的電子郵件地址" subject_template: "[%{site_name}] 電子郵件錯誤 -- 被封禁的郵件地址" text_body_template: | 我們非常抱歉,但是你發送至%{destination}(名為%{former_title})的郵件出問題了。 你發送回覆的郵件地址是已被封禁的郵件地址。試試從另外一個郵件地址發送,或者聯繫管理人員。 email_reject_inactive_user: + title: "電子郵件拒絕 用戶尚未啟動" subject_template: "[%{site_name}] 電子郵件錯誤 -- 未激活用戶" text_body_template: | 我們非常抱歉,但是你發送至 %{destination}(名為%{former_title}) 的郵件出問題了。 與你賬戶關聯的郵件地址沒有激活,請先激活你的賬號再發送郵件。 email_reject_blocked_user: + title: "電子郵件拒絕 已封鎖的用戶" subject_template: "[%{site_name}] 電子郵件錯誤 -- 被封禁的用戶" text_body_template: | 我們非常抱歉,但是你發送至 %{destination}(名為%{former_title}) 的郵件出問題了。 與你賬戶關聯的郵件地址已經被封禁。 email_reject_reply_user_not_matching: + title: "點子郵件拒絕 未找到符合的用戶" subject_template: "[%{site_name}] 電子郵件錯誤 -- 未預期的回覆地址" text_body_template: | 我們非常抱歉,但是你發送至 %{destination}(名為%{former_title}) 的郵件出問題了。 你發送回覆的郵件地址與我們等待的地址不同,所以我們不確定你是不是同一個人。試試從另外一個郵件地址發送,或者聯繫管理人員。 email_reject_no_account: + title: "電子郵件拒絕 沒有帳號" subject_template: "[%{site_name}] 電子郵件錯誤 -- 未知賬戶" text_body_template: | 我們非常抱歉,但是你發送至 %{destination}(名為%{former_title}) 的郵件出問題了。 我們找不到匹配你郵件地址的賬號。試試從另外一個郵件地址發送,或者聯繫管理人員。 email_reject_empty: + title: "電子郵件拒絕 空白" subject_template: "[%{site_name}] 電子郵件錯誤 -- 無內容" text_body_template: | 我們很抱歉,但是你發送至 %{destination}(名為 %{former_title})的郵件沒有成功。 @@ -1731,18 +1713,21 @@ zh_TW: 如果你**確定**你的郵件中有回覆內容,試試用更簡單的格式。 email_reject_parsing: + title: "電子郵件拒絕 分析" subject_template: "[%{site_name}] 電子郵件錯誤 -- 內容無法識別" text_body_template: | 我們很抱歉,但是你發送至 %{destination}(名為 %{former_title})的郵件無法發送。 我們不能找到你郵件中的回覆。**請確認將你的回覆置於郵件頂端**——我們不能處理行內回覆。 email_reject_invalid_access: + title: "電子郵件拒絕 無效存取" subject_template: "[%{site_name}] 電子郵件錯誤 -- 無權限" text_body_template: | 我們很抱歉,但是你發送至%{destination}(名為 %{former_title})的郵件出問題了。 你的賬戶沒有達到足夠的信任等級在該分類發佈新主題。如果你有異議,聯繫管理人員。 email_reject_strangers_not_allowed: + title: "電子郵件拒絕 陌生人禁止" subject_template: "[%{site_name}] 電子郵件錯誤 -- 無權限" text_body_template: |+ 我們非常抱歉,但是你發送至%{destination}(名為%{former_title})的郵件出問題了。 @@ -1750,6 +1735,7 @@ zh_TW: 郵件發至的分類只接受來自合法帳戶且郵件地址已確認的用戶的有郵件。如果你有異議,聯繫管理人員。 email_reject_invalid_post: + title: "電子郵件拒絕 無效貼文" subject_template: "[%{site_name}] 郵件問題 -- 發佈時錯誤" text_body_template: | 我們非常抱歉,但是你發送至%{destination}(名為%{former_title})的郵件出問題了。 @@ -1766,42 +1752,49 @@ zh_TW: 如果你能解決錯誤,請再試一次。 email_reject_invalid_post_action: + title: "電子郵件拒絕 無效貼文動作" subject_template: "[%{site_name}] 電子郵件錯誤 -- 無發表權限" text_body_template: | 我們非常抱歉,但是你發送至%{destination}(名為%{former_title})的郵件出問題了。 發送的命令無法被識別。請再試一次,如果還有問題,使用網站發表。 email_reject_reply_key: + title: "電子郵件拒絕 復原金鑰" subject_template: "[%{site_name}] 電子郵件錯誤 -- 未知回覆指紋" text_body_template: | 我們非常抱歉,但是你發送至%{destination}(名為%{former_title})的郵件出問題了。 郵件中的回覆信令是無效或者未知的,所以我們不知道這封郵件回覆給誰了。請聯繫管理人員。 email_reject_bad_destination_address: + title: "電子郵件拒絕 不良目的地位址" subject_template: "[%{site_name}] 電子郵件錯誤 -- 未知的回覆至地址" text_body_template: | 我們非常抱歉,但是你發送至%{destination}(名為%{former_title}) 郵件出問題了。 目標郵件地址無法識別。請確保你在向管理人員提供的郵件地址發信。 email_reject_topic_not_found: + title: "電子郵件拒絕 未找到討論話題" subject_template: "[%{site_name}] 郵件問題 -- 主題未找到" text_body_template: | 我們很抱歉,但是你發送至%{destination}(名為 %{former_title})的郵件出問題了。 你回覆的主題不存在——可能已經被刪除了?如果你有異議,聯繫管理人員。 email_reject_topic_closed: + title: "電子郵件拒絕 討論話題已關閉" subject_template: "[%{site_name}] 郵件問題 -- 主題已關閉" text_body_template: | 我們很抱歉,但是你發送至 %{destination} ( 名為 %{former_title} )的郵件出問題了。 你回覆的主題已經被關閉,不允許回覆。如果你有異議,聯繫管理人員。 email_reject_auto_generated: + title: "電子郵件拒絕 自動生成" subject_template: "[%{site_name}] 郵件問題 -- 自動生成的回覆" text_body_template: | 我們很抱歉,但是你發送至%{destination}(名為 %{former_title})的郵件出問題了。 系統覺得你的郵件是“自動生成”的,即電腦生成了該郵件而不是由你輸入的;我們不能接受這樣的郵件。如果你有異議,聯繫管理人員。 email_error_notification: + title: "電子郵件錯誤通知" subject_template: "[%{site_name}] 電子郵件錯誤 -- POP 驗證錯誤" text_body_template: | 不幸的是,從 POP 伺服器查詢郵件時遇到了驗證錯誤。 @@ -1810,6 +1803,7 @@ zh_TW: 如果 POP 郵件賬號有圖形界面,你可以登錄後查看郵箱設置。 too_many_spam_flags: + title: "過多垃圾文章投訴" subject_template: "新賬戶被暫時封禁" text_body_template: | 你好, @@ -1820,6 +1814,7 @@ zh_TW: 要查看更多指引,請參考我們的[社群指引](%{base_url}/guidelines)。 too_many_tl3_flags: + title: "過多 TL3 投訴" subject_template: "新賬戶被暫時封禁" text_body_template: | 你好, @@ -1830,6 +1825,7 @@ zh_TW: 要查看更多指引,請參考我們的[社群指引](%{base_url}/guidelines)。 blocked_by_staff: + title: "被管理員封鎖" subject_template: "賬戶被暫時封禁" text_body_template: | 你好, @@ -1840,6 +1836,7 @@ zh_TW: 要查看更多指引,請參考我們的[社群指引](%{base_url}/guidelines)。 user_automatically_blocked: + title: "用戶自動封鎖" subject_template: "新用戶%{username}因社群標記而被封禁" text_body_template: | 這是自動發出的郵件。 @@ -1850,6 +1847,7 @@ zh_TW: 該閾值可以通過站點設置中的 `block_new_user` 更改。 spam_post_blocked: + title: "因垃圾貼文而被封鎖" subject_template: "新用戶 %{username} 由於重複貼連結,文章已被封鎖" text_body_template: | 這是自動發出的郵件。 @@ -1860,6 +1858,7 @@ zh_TW: 該閾值可以通過站點設置中的 `newuser_spam_host_threshold` 和 `white_listed_spam_host_domains` 更改。 unblocked: + title: "解除封鎖" subject_template: "賬戶已解除封禁" text_body_template: | 你好, @@ -1875,9 +1874,11 @@ zh_TW: [請在管理欄目中審核他們](%{base_url}/admin/users/list/pending)。 download_remote_images_disabled: + title: "停用遠端圖片下載" subject_template: "停用下載遠端圖片" text_body_template: "`download_remote_images_to_local` 設定已被禁用,因為已經達到 ``download_remote_images_threshold` 設定中的磁碟空間限制。" dashboard_problems: + title: "控制台問題" subject_template: "發現問題了" text_body_template: | 系統在管理員面板中報告了發現的問題。 @@ -1928,6 +1929,7 @@ zh_TW: > %{site_title} -- %{site_description} user_invited_to_private_message_pm: + title: "用戶被邀請至私人訊息" subject_template: "[%{site_name}] %{username} 邀請你參與討論 '%{topic_title}'" text_body_template: | %{header_instructions} @@ -1936,6 +1938,7 @@ zh_TW: %{respond_instructions} user_invited_to_private_message_pm_staged: + title: "用戶被邀請至私人訊息狀態" subject_template: "[%{site_name}] %{username} 邀請你加入消息交流:'%{topic_title}'" text_body_template: | %{header_instructions} @@ -1944,6 +1947,7 @@ zh_TW: %{respond_instructions} user_invited_to_topic: + title: "用戶被邀請至討論話題" subject_template: "[%{site_name}] %{username}邀請你參與“%{topic_title}”" text_body_template: | %{header_instructions} @@ -1952,6 +1956,7 @@ zh_TW: %{respond_instructions} user_replied: + title: "用戶回覆" subject_template: "[%{site_name}] %{username} 在 '%{topic_title}' 討論話題回覆了你的文章" text_body_template: | %{header_instructions} @@ -1962,6 +1967,7 @@ zh_TW: %{respond_instructions} user_replied_pm: + title: "用戶回復私人訊息" subject_template: "[%{site_name}] [PM] %{topic_title}" text_body_template: | %{header_instructions} @@ -1972,6 +1978,7 @@ zh_TW: %{respond_instructions} user_quoted: + title: "用戶引述" subject_template: "[%{site_name}] %{username} 在 '%{topic_title}' 討論話題引用了你的內容" text_body_template: | %{header_instructions} @@ -1982,6 +1989,7 @@ zh_TW: %{respond_instructions} user_linked: + title: "用戶連結" subject_template: "[%{site_name}] %{topic_title}" text_body_template: | %{header_instructions} @@ -1992,6 +2000,7 @@ zh_TW: %{respond_instructions} user_mentioned: + title: "用戶提及" subject_template: "[%{site_name}] %{username} 在 '%{topic_title}' 討論話題提及了你" text_body_template: | %{header_instructions} @@ -2002,6 +2011,7 @@ zh_TW: %{respond_instructions} user_group_mentioned: + title: "用戶群組提及" subject_template: "[%{site_name}] %{topic_title}" text_body_template: | %{header_instructions} @@ -2012,6 +2022,7 @@ zh_TW: %{respond_instructions} user_posted: + title: "用戶貼文" subject_template: "[%{site_name}] %{subject_prefix}%{username} 在 '%{topic_title}' 討論話題發表了文章" text_body_template: | %{header_instructions} @@ -2022,6 +2033,7 @@ zh_TW: %{respond_instructions} user_watching_first_post: + title: "用戶觀看第一個主題" subject_template: "[%{site_name}] %{topic_title}" text_body_template: | %{header_instructions} @@ -2032,6 +2044,7 @@ zh_TW: %{respond_instructions} user_posted_pm: + title: "用戶發表私人訊息" subject_template: "[%{site_name}] [PM] %{topic_title}" text_body_template: | %{header_instructions} @@ -2042,6 +2055,7 @@ zh_TW: %{respond_instructions} user_posted_pm_staged: + title: "用戶發表私人訊息後備" subject_template: "%{optional_re}%{topic_title}" text_body_template: |2 @@ -2076,6 +2090,7 @@ zh_TW: view_this_topic: "查看此主題" back_to_top: "回到頂部" forgot_password: + title: "忘記密碼" subject_template: "[%{site_name}] 密碼重設" text_body_template: | 有人請求重設你在 [%{site_name}](%{base_url}) 上的密碼。 @@ -2085,6 +2100,7 @@ zh_TW: 點擊下面的連結來選擇一個新密碼: %{base_url}/users/password-reset/%{email_token} set_password: + title: "設定密碼" subject_template: "[%{site_name}] 設定密碼" text_body_template: | 有人請求添加你在 [%{site_name}](%{base_url}) 的密碼。除此之外,你可以通過已驗證過你郵件地址的在綫服務商登錄。 @@ -2094,6 +2110,7 @@ zh_TW: 點擊下面的連結來選擇一個新密碼: %{base_url}/users/password-reset/%{email_token} admin_login: + title: "管理員登入" subject_template: "[%{site_name}]登錄" text_body_template: | 有人嘗試登錄你在[%{site_name}](%{base_url})的賬戶。 @@ -2103,6 +2120,7 @@ zh_TW: 點擊下面的連結登錄: %{base_url}/users/admin-login/%{email_token} account_created: + title: "建立用戶" subject_template: "[%{site_name}] 你的新帳號" text_body_template: | 你在 %{site_name} 上建立了一個新賬號 @@ -2110,12 +2128,14 @@ zh_TW: 點擊下面的連結來為新賬戶設置密碼: %{base_url}/users/password-reset/%{email_token} confirm_new_email: + title: "確認新郵件" subject_template: "[%{site_name}] 確認你的電子郵件位址" text_body_template: | 點擊以下連結確認你在[%{site_name}]上的新電子郵件: %{base_url}/users/authorize-email/%{email_token} confirm_old_email: + title: "確認舊郵件" subject_template: "[%{site_name}] 確認你的新電子郵箱地址" text_body_template: | 在我們修改你的郵箱地址前,我們需要你確認你擁有當前的郵件賬號。在你完成這步之後,我們將確認你的新郵件地址。 @@ -2124,6 +2144,7 @@ zh_TW: %{base_url}/users/authorize-email/%{email_token} notify_old_email: + title: "通知舊的郵件" subject_template: "[%{site_name}] 你的郵箱地址已經修改成功" text_body_template: | 這是%{site_name}自動發出的郵件,以告知你的郵箱地址已經被修改了。如果這是一個錯誤,請聯繫站點管理人員。 @@ -2132,6 +2153,7 @@ zh_TW: %{new_email} signup_after_approval: + title: "在同意之後註冊" subject_template: "你已受到 %{site_name} 的認可!" text_body_template: | 歡迎加入%{site_name}! @@ -2151,6 +2173,7 @@ zh_TW: (如果你在新用戶級別需要和[管理人員](%{base_url/about)溝通的話,直接回覆這個消息。) signup: + title: "註冊" subject_template: "[%{site_name}] 確認你的新賬戶" text_body_template: | 歡迎來到 %{site_name}! @@ -2184,6 +2207,7 @@ zh_TW: too_large: "抱歉,你試圖上傳的檔案太大了(最大限製為%{max_size_kb}%KB)。" images: too_large: "抱歉,你試圖上傳的圖片太大了(最大限製為%{max_size_kb}%KB),請裁剪它並重試。" + larger_than_x_megapixels: "對不起,您試圖上傳的影像太大了(最大限制是%{max_image_megapixels} 百萬畫素),請調整大小後重試。" size_not_found: "抱歉,我們無法獲取圖片大小,請檢查你的圖片是否已損壞。" avatar: missing: "抱歉,我們沒法找到與你郵件地址關聯的頭像。你能再上傳一次試試嗎?" @@ -2816,11 +2840,9 @@ zh_TW: fields: welcome: label: "歡迎主題" - description: "

    你將怎麼在一分鐘內向陌生人描述你的社群?

    • 誰會對這些討論感興趣?
    • 我能獲得什麼?
    • 為什麼我應該訪問?

    你的歡迎主題是新訪客將先看到的東西。把它想象為一段“電梯宣傳”或者“使命聲明”。

    " one_paragraph: "請限制你的歡迎消息至一段話。" privacy: title: "訪問" - description: "

    你的社群對所有人可見或者需要限製為會員許可、邀請許可或者審核許可?如果你願意,你可以將其設為私密,然後再切換至公開。

    記住你永遠可以在主題中邀請別人,或者從你的用戶頁面裡也行。

    " fields: privacy: choices: @@ -2846,7 +2868,6 @@ zh_TW: description: "所有自動發送自 Discourse 的私人消息將以該用戶的名義發送。最重要的是,這個用戶將被指定為發送給每個新用戶的歡迎消息的發送人。" corporate: title: "組織" - description: "這些名字將顯示于隱私策略服務條款中,你可以隨時在工作人員分類中編輯他們。如果你沒有公司,你可以跳過這個步驟。" fields: company_short_name: label: "公司名(短)" @@ -2861,7 +2882,6 @@ zh_TW: title: "主題" fields: theme_id: - description: "你喜歡亮色還是暗色的顏色方案?你永遠可以在管理-自定義中修改站點的觀感。" choices: default: label: "簡潔亮" @@ -2886,7 +2906,6 @@ zh_TW: label: "大表徵圖" description: "現代設備中你站點顯示的表徵圖,要在大一點尺寸的情況下表現出色。推薦的尺寸至少要達到144px X 144px。" homepage: - description: "我們推薦在你的主頁顯示最新主題,但是如果你喜歡,你也可以選擇顯示分類(一組主題)。" title: "主頁" fields: homepage_style: @@ -2897,10 +2916,9 @@ zh_TW: label: "分類" emoji: title: "Emoji" - description: "你喜歡你的社群使用哪一種 Emoji 樣式?你永遠可以在管理-自定義-Emoji中增加更多的定製 Emoji。" invites: title: "邀請工作人員" - description: "你快做完啦!讓我們邀請一些工作人員來幫助你創建一些討論主題以方便你發佈社群。" + description: "您就快完成啦!讓我們邀請一些工作人員來幫您創建一些種子討論話題,好讓您的社群朋友產生興趣並開始回覆。" finished: title: "你的 Discourse 已經準備就緒!" description: | diff --git a/plugins/poll/config/locales/server.nl.yml b/plugins/poll/config/locales/server.nl.yml index 735e14eb8d..c451e42c33 100644 --- a/plugins/poll/config/locales/server.nl.yml +++ b/plugins/poll/config/locales/server.nl.yml @@ -30,8 +30,8 @@ nl: named_cannot_be_made_public: "De poll genaamd %{name} heeft stemmen die niet openbaar gemaakt kunnen worden" edit_window_expired: cannot_change_polls: "Je kunt na %{minutes} minuten geen polls meer toevoegen, verwijderen of hernoemen." - op_cannot_edit_options: "Je kunt na %{minutes} minuten geen polls meer toevoegen, verwijderen of hernoemen. Neem contact op met een moderator als je een poll optie wilt wijzigen." - staff_cannot_add_or_remove_options: "Je kunt na %{minutes} minuten geen polls meer toevoegen, verwijderen of hernoemen. Sluit deze topic en maak een nieuwe." + op_cannot_edit_options: "Je kunt na %{minutes} minuten geen poll opties meer toevoegen of verwijderen. Neem contact op met een moderator als je een poll optie wilt wijzigen." + staff_cannot_add_or_remove_options: "Je kunt na %{minutes} minuten geen poll opties meer toevoegen of verwijderen. Je kan dit topic sluiten en een nieuw topic maken." no_polls_associated_with_this_post: "Er bestaan geen polls voor dit bericht." no_poll_with_this_name: "Er bestaat geen poll met de naam %{name} voor dit bericht." post_is_deleted: "Dit kan niet bij een verwijderd bericht." diff --git a/public/503.ur.html b/public/503.ur.html index d9a0dbe7ed..c6b8726fc9 100644 --- a/public/503.ur.html +++ b/public/503.ur.html @@ -1,11 +1,11 @@ -Site Is Undergoing Maintenance - Discourse.org +ویب سائٹ کی محافظت ہو رہی ہے - Discourse.org -

    We are currently down for planned site maintenance

    -

    Please check back in a few minutes.

    -

    Sorry for the inconvenience!

    +

    ویب سائٹ ابھی وقتی محافظت کے لیے ڈاون ہے۔

    +

    کچھ منٹ بعد چیک کریں۔

    +

    تکلیف کے لئے معذرت!

    From 222125de10c60bcd7bffdaef2873b9f14f13a2a5 Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Wed, 18 Jan 2017 12:13:45 -0500 Subject: [PATCH 0048/1355] oops here's the test --- .../widgets/topic-participant-test.js.es6 | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 test/javascripts/widgets/topic-participant-test.js.es6 diff --git a/test/javascripts/widgets/topic-participant-test.js.es6 b/test/javascripts/widgets/topic-participant-test.js.es6 new file mode 100644 index 0000000000..fe43652456 --- /dev/null +++ b/test/javascripts/widgets/topic-participant-test.js.es6 @@ -0,0 +1,43 @@ +import { moduleForWidget, widgetTest } from 'helpers/widget-test'; + +moduleForWidget('topic-participant'); + +widgetTest('one post', { + template: '{{mount-widget widget="topic-participant" args=args}}', + + setup() { + this.set('args', { + username: 'test', + avatar_template: 'stubbed', + post_count: 1 + }); + }, + + test(assert) { + assert.ok(exists('a.poster.trigger-user-card')); + assert.ok(!exists('span.post-count'), "don't show count for only 1 post"); + assert.ok(!exists('.avatar-flair'), "no avatar flair"); + } +}); + +widgetTest('many posts, a primary group with flair', { + template: '{{mount-widget widget="topic-participant" args=args}}', + + setup() { + this.set('args', { + username: 'test', + avatar_template: 'stubbed', + post_count: 5, + primary_group_name: 'devs', + primary_group_flair_url: "http://devs.example.com/img/devs.png", + primary_group_flair_bg_color: "222" + }); + }, + + test(assert) { + assert.ok(exists('a.poster.trigger-user-card')); + assert.ok(exists('span.post-count'), "show count for many posts"); + assert.ok(exists('.group-devs a.poster'), "add class for the group outside the link"); + assert.ok(exists('.avatar-flair.avatar-flair-devs'), "show flair with group class"); + } +}); From f1c242f61d6a8f586aec2fd5f0d923100a612975 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 17 Jan 2017 17:08:45 -0500 Subject: [PATCH 0049/1355] A generic JSON importer that can be used for simple imports --- script/import_scripts/json_generic.rb | 96 +++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100755 script/import_scripts/json_generic.rb diff --git a/script/import_scripts/json_generic.rb b/script/import_scripts/json_generic.rb new file mode 100755 index 0000000000..55b2152f21 --- /dev/null +++ b/script/import_scripts/json_generic.rb @@ -0,0 +1,96 @@ +require "csv" +require File.expand_path(File.dirname(__FILE__) + "/base.rb") + +# Edit the constants and initialize method for your import data. + +class ImportScripts::JsonGeneric < ImportScripts::Base + + JSON_FILE_PATH = ENV['JSON_FILE'] + BATCH_SIZE ||= 1000 + + def initialize + super + + @imported_json = load_json + end + + def execute + puts "", "Importing from JSON file..." + + import_users + import_discussions + + puts "", "Done" + end + + def load_json + JSON.parse(File.read(JSON_FILE_PATH)) + end + + def import_users + puts '', "Importing users" + + users = [] + @imported_json['topics'].each do |t| + t['posts'].each do |p| + users << p['author'] + end + end + users.uniq! + + create_users(users) do |u| + { + id: u, + email: "#{u}@example.com", + created_at: Time.now + } + end + end + + + def import_discussions + puts "", "Importing discussions" + + topics = 0 + posts = 0 + + @imported_json['topics'].each do |t| + first_post = t['posts'][0] + next unless first_post + + topic = { + id: t["id"], + user_id: user_id_from_imported_user_id(first_post["author"]) || -1, + raw: first_post["body"], + created_at: Time.zone.parse(first_post["date"]), + cook_method: Post.cook_methods[:raw_html], + title: t['title'], + category: ENV['CATEGORY_ID'], + custom_fields: { import_id: "pid:#{first_post['id']}" } + } + + topic[:pinned_at] = Time.zone.parse(first_post["date"]) if t['pinned'] + topics += 1 + parent_post = create_post(topic, topic[:id]) + + t['posts'][1..-1].each do |p| + create_post({ + id: p["id"], + topic_id: parent_post.topic_id, + user_id: user_id_from_imported_user_id(p["author"]) || -1, + raw: p["body"], + created_at: Time.zone.parse(p["date"]), + cook_method: Post.cook_methods[:raw_html], + custom_fields: { import_id: "pid:#{p['id']}" } + }, p['id']) + posts += 1 + end + end + + puts "", "Imported #{topics} topics with #{topics + posts} posts." + end +end + +if __FILE__==$0 + ImportScripts::JsonGeneric.new.perform +end From 775b70227d39d7f9d7f67740fbc4be5541221fa9 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Wed, 18 Jan 2017 13:22:32 -0500 Subject: [PATCH 0050/1355] FIX: Better standardizing on username --- script/import_scripts/json_generic.rb | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/script/import_scripts/json_generic.rb b/script/import_scripts/json_generic.rb index 55b2152f21..d0b0dc4219 100755 --- a/script/import_scripts/json_generic.rb +++ b/script/import_scripts/json_generic.rb @@ -27,20 +27,26 @@ class ImportScripts::JsonGeneric < ImportScripts::Base JSON.parse(File.read(JSON_FILE_PATH)) end + def username_for(name) + name.downcase.gsub(/[^a-z0-9\-\_]/, '') + end + def import_users puts '', "Importing users" users = [] @imported_json['topics'].each do |t| t['posts'].each do |p| - users << p['author'] + users << p['author'].scrub end end users.uniq! create_users(users) do |u| { - id: u, + id: username_for(u), + username: username_for(u), + name: u, email: "#{u}@example.com", created_at: Time.now } @@ -60,7 +66,7 @@ class ImportScripts::JsonGeneric < ImportScripts::Base topic = { id: t["id"], - user_id: user_id_from_imported_user_id(first_post["author"]) || -1, + user_id: user_id_from_imported_user_id(username_for(first_post["author"])) || -1, raw: first_post["body"], created_at: Time.zone.parse(first_post["date"]), cook_method: Post.cook_methods[:raw_html], @@ -77,7 +83,7 @@ class ImportScripts::JsonGeneric < ImportScripts::Base create_post({ id: p["id"], topic_id: parent_post.topic_id, - user_id: user_id_from_imported_user_id(p["author"]) || -1, + user_id: user_id_from_imported_user_id(username_for(p["author"])) || -1, raw: p["body"], created_at: Time.zone.parse(p["date"]), cook_method: Post.cook_methods[:raw_html], From 8d4cff642edc7770fb728f011e3d8a7891ea1b2a Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Wed, 18 Jan 2017 14:23:23 -0500 Subject: [PATCH 0051/1355] FIX: Use the username scrubber when generating the emails --- script/import_scripts/json_generic.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/import_scripts/json_generic.rb b/script/import_scripts/json_generic.rb index d0b0dc4219..4126c47447 100755 --- a/script/import_scripts/json_generic.rb +++ b/script/import_scripts/json_generic.rb @@ -47,7 +47,7 @@ class ImportScripts::JsonGeneric < ImportScripts::Base id: username_for(u), username: username_for(u), name: u, - email: "#{u}@example.com", + email: "#{username_for(u)}@example.com", created_at: Time.now } end From fffa285dbf2e71cee69d78069d2e4be1998beb33 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Wed, 18 Jan 2017 18:05:56 -0500 Subject: [PATCH 0052/1355] Insert middleware in production mode if enabled --- lib/plugin/instance.rb | 5 ----- lib/plugin/theme.rb | 14 ++++++-------- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/lib/plugin/instance.rb b/lib/plugin/instance.rb index 043ae45416..af1174aab2 100644 --- a/lib/plugin/instance.rb +++ b/lib/plugin/instance.rb @@ -263,11 +263,6 @@ class Plugin::Instance themes << theme end - # def register_public - # return unless enabled? - # - # end - def automatic_assets css = styles.join("\n") js = javascripts.join("\n") diff --git a/lib/plugin/theme.rb b/lib/plugin/theme.rb index 15cb38c8d0..c0f1f634c8 100644 --- a/lib/plugin/theme.rb +++ b/lib/plugin/theme.rb @@ -17,14 +17,12 @@ class Plugin::Theme def register_public public_dir = "#{@plugin.directory}/public" if File.exist?(public_dir) - if Rails.env.development? - Rails.application.config.before_initialize do |app| - app.middleware.insert_before( - ::ActionDispatch::Static, - ::ActionDispatch::Static, - public_dir - ) - end + Rails.application.config.before_initialize do |app| + app.middleware.insert_before( + ::ActionDispatch::Static, + ::ActionDispatch::Static, + public_dir + ) end end end From 9c9e0f5eca36b6a0814e06cf7237618f64738c2e Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Wed, 18 Jan 2017 18:22:03 -0500 Subject: [PATCH 0053/1355] FIX: Move the middleware --- lib/plugin/theme.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/plugin/theme.rb b/lib/plugin/theme.rb index c0f1f634c8..04128d6f35 100644 --- a/lib/plugin/theme.rb +++ b/lib/plugin/theme.rb @@ -19,7 +19,7 @@ class Plugin::Theme if File.exist?(public_dir) Rails.application.config.before_initialize do |app| app.middleware.insert_before( - ::ActionDispatch::Static, + ::Rack::Runtime, ::ActionDispatch::Static, public_dir ) From 07660ecedba66e90fb972ae70370c019b2ed8cdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Thu, 19 Jan 2017 00:28:37 +0100 Subject: [PATCH 0054/1355] bump onebox --- Gemfile.lock | 3 ++- .../onebox/engine/discourse_local_onebox_spec.rb | 16 +++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 4f5eb6b58f..e52d40fe86 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -208,13 +208,14 @@ GEM omniauth-twitter (1.3.0) omniauth-oauth (~> 1.1) rack - onebox (1.7.3) + onebox (1.7.4) fast_blank (>= 1.0.0) htmlentities (~> 4.3.4) moneta (~> 0.8) multi_json (~> 1.11) mustache nokogiri (~> 1.6.6) + sanitize openid-redis-store (0.0.2) redis ruby-openid diff --git a/spec/components/onebox/engine/discourse_local_onebox_spec.rb b/spec/components/onebox/engine/discourse_local_onebox_spec.rb index 3a6d0862ce..752eebc6e8 100644 --- a/spec/components/onebox/engine/discourse_local_onebox_spec.rb +++ b/spec/components/onebox/engine/discourse_local_onebox_spec.rb @@ -10,19 +10,19 @@ describe Onebox::Engine::DiscourseLocalOnebox do it "returns a link if post isn't found" do url = "#{Discourse.base_url}/t/not-exist/3/2" - expect(Onebox.preview(url).to_s).to eq("#{url}") + expect(Onebox.preview(url).to_s).to eq(%|#{url}|) end it "returns a link if not allowed to see the post" do url = "#{Discourse.base_url}#{post2.url}" Guardian.any_instance.expects(:can_see_post?).returns(false) - expect(Onebox.preview(url).to_s).to eq("#{url}") + expect(Onebox.preview(url).to_s).to eq(%|#{url}|) end it "returns a link if post is hidden" do hidden_post = Fabricate(:post, topic: post.topic, post_number: 2, hidden: true, hidden_reason_id: Post.hidden_reasons[:flag_threshold_reached]) url = "#{Discourse.base_url}#{hidden_post.url}" - expect(Onebox.preview(url).to_s).to eq("#{url}") + expect(Onebox.preview(url).to_s).to eq(%|#{url}|) end it "returns some onebox goodness if post exists and can be seen" do @@ -43,13 +43,13 @@ describe Onebox::Engine::DiscourseLocalOnebox do it "returns a link if topic isn't found" do url = "#{Discourse.base_url}/t/not-found/123" - expect(Onebox.preview(url).to_s).to eq("#{url}") + expect(Onebox.preview(url).to_s).to eq(%|#{url}|) end it "returns a link if not allowed to see the topic" do url = topic.url Guardian.any_instance.expects(:can_see_topic?).returns(false) - expect(Onebox.preview(url).to_s).to eq("#{url}") + expect(Onebox.preview(url).to_s).to eq(%|#{url}|) end it "replaces emoji in the title" do @@ -78,13 +78,15 @@ describe Onebox::Engine::DiscourseLocalOnebox do it "returns some onebox goodness for audio file" do url = "#{Discourse.base_url}#{path}.MP3" html = Onebox.preview(url).to_s - expect(html).to eq("") + # will be removed by the browser + # need to fix https://github.com/rubys/nokogumbo/issues/14 + expect(html).to eq(%||) end it "returns some onebox goodness for video file" do url = "#{Discourse.base_url}#{path}.mov" html = Onebox.preview(url).to_s - expect(html).to eq("") + expect(html).to eq(%||) end end From 0791c2c96636e9af5992d5d0ea6f991018cf4ef6 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Thu, 19 Jan 2017 10:52:24 +0530 Subject: [PATCH 0055/1355] FIX: sso_overrides_avatar should override previously set avatar --- app/models/discourse_single_sign_on.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/discourse_single_sign_on.rb b/app/models/discourse_single_sign_on.rb index a4c1fd151b..daf64826fa 100644 --- a/app/models/discourse_single_sign_on.rb +++ b/app/models/discourse_single_sign_on.rb @@ -146,7 +146,7 @@ class DiscourseSingleSignOn < SingleSignOn sso_record.last_payload = unsigned_payload sso_record.external_id = external_id else - Jobs.enqueue(:download_avatar_from_url, url: avatar_url, user_id: user.id) if avatar_url.present? + Jobs.enqueue(:download_avatar_from_url, url: avatar_url, user_id: user.id, override_gravatar: SiteSetting.sso_overrides_avatar) if avatar_url.present? user.create_single_sign_on_record( last_payload: unsigned_payload, external_id: external_id, @@ -180,7 +180,7 @@ class DiscourseSingleSignOn < SingleSignOn avatar_changed = sso_record.external_avatar_url != avatar_url if avatar_force_update || avatar_changed || avatar_missing - Jobs.enqueue(:download_avatar_from_url, url: avatar_url, user_id: user.id) + Jobs.enqueue(:download_avatar_from_url, url: avatar_url, user_id: user.id, override_gravatar: SiteSetting.sso_overrides_avatar) end end From e63faffdb2fe41ac0067259c9352f384b0555d55 Mon Sep 17 00:00:00 2001 From: Ryan Mulligan Date: Thu, 19 Jan 2017 09:33:49 -0800 Subject: [PATCH 0056/1355] Revert "Revert "FEATURE: make discourse remap optionally do regex_replace (#4367)"" This reverts commit 277e7383f342fc841591fece93f2ed8b22862c39. --- script/discourse | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/script/discourse b/script/discourse index d5d800a331..a9ed089a40 100755 --- a/script/discourse +++ b/script/discourse @@ -6,27 +6,31 @@ class DiscourseCLI < Thor class_option :verbose, default: false, aliases: :v desc "remap", "Remap a string sequence accross all tables" - def remap(from, to, global=nil) + option :global, :type => :boolean + option :regex, :type => :boolean + def remap(from, to) load_rails - global = global == "--global" - - puts "Rewriting all occurences of #{from} to #{to}" + if options[:regex] + puts "Rewriting all occurences of #{from} to #{to} using regexp_replace" + else + puts "Rewriting all occurences of #{from} to #{to}" + end puts "THIS TASK WILL REWRITE DATA, ARE YOU SURE (type YES)" - puts "WILL RUN ON ALL #{RailsMultisite::ConnectionManagement.all_dbs.length} DBS" if global + puts "WILL RUN ON ALL #{RailsMultisite::ConnectionManagement.all_dbs.length} DBS" if options[:global] text = STDIN.gets if text.strip != "YES" puts "aborting." exit end - if global + if options[:global] RailsMultisite::ConnectionManagement.each_connection do |db| puts "","Remapping tables on #{db}...","" - do_remap(from, to) + do_remap(from, to, options[:regex]) end else - do_remap(from, to) + do_remap(from, to, options[:regex]) end end @@ -199,7 +203,7 @@ class DiscourseCLI < Thor require File.expand_path(File.dirname(__FILE__) + "/../lib/import_export/import_export") end - def do_remap(from, to) + def do_remap(from, to, regex=false) sql = "SELECT table_name, column_name FROM information_schema.columns WHERE table_schema='public' and (data_type like 'char%' or data_type like 'text%') and is_updatable = 'YES'" @@ -213,10 +217,17 @@ WHERE table_schema='public' and (data_type like 'char%' or data_type like 'text% column_name = result["column_name"] puts "Remapping #{table_name} #{column_name}" begin - result = cnn.async_exec("UPDATE #{table_name} - SET #{column_name} = replace(#{column_name}, $1, $2) - WHERE NOT #{column_name} IS NULL - AND #{column_name} <> replace(#{column_name}, $1, $2)", [from, to]) + result = if regex + cnn.async_exec("UPDATE #{table_name} + SET #{column_name} = regexp_replace(#{column_name}, $1, $2, 'g') + WHERE NOT #{column_name} IS NULL + AND #{column_name} <> regexp_replace(#{column_name}, $1, $2, 'g')", [from, to]) + else + cnn.async_exec("UPDATE #{table_name} + SET #{column_name} = replace(#{column_name}, $1, $2) + WHERE NOT #{column_name} IS NULL + AND #{column_name} <> replace(#{column_name}, $1, $2)", [from, to]) + end puts "#{result.cmd_tuples} rows affected!" rescue => ex puts "Error: #{ex}" From e4ad88019bfbd8d8e0dc0d944dc9dbaf312e3856 Mon Sep 17 00:00:00 2001 From: Leo McArdle Date: Thu, 19 Jan 2017 17:35:22 +0000 Subject: [PATCH 0057/1355] add category-navigation plugin outlet --- .../javascripts/discourse/templates/navigation/category.hbs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/assets/javascripts/discourse/templates/navigation/category.hbs b/app/assets/javascripts/discourse/templates/navigation/category.hbs index 64cca24cbc..2e9579cbf2 100644 --- a/app/assets/javascripts/discourse/templates/navigation/category.hbs +++ b/app/assets/javascripts/discourse/templates/navigation/category.hbs @@ -33,4 +33,6 @@ {{#if canEditCategory}} {{d-button class="btn-default edit-category" action="editCategory" actionParam=category icon="wrench" label="category.edit_long"}} {{/if}} + + {{plugin-outlet name="category-navigation" args=(hash category=category)}}
From b741adb364e92d018d88849c1eea10b45f649585 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Fri, 20 Jan 2017 00:54:25 +0530 Subject: [PATCH 0058/1355] bump onebox version --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index e52d40fe86..ade43f5986 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -208,7 +208,7 @@ GEM omniauth-twitter (1.3.0) omniauth-oauth (~> 1.1) rack - onebox (1.7.4) + onebox (1.7.5) fast_blank (>= 1.0.0) htmlentities (~> 4.3.4) moneta (~> 0.8) From 4ed46a45ed5dc370875c1ae62ab7e2d73594b7d9 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Thu, 19 Jan 2017 14:31:35 -0500 Subject: [PATCH 0059/1355] FIX: In the case of a blank name, use a SHA1 --- script/import_scripts/json_generic.rb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/script/import_scripts/json_generic.rb b/script/import_scripts/json_generic.rb index 4126c47447..c6474b2667 100755 --- a/script/import_scripts/json_generic.rb +++ b/script/import_scripts/json_generic.rb @@ -28,7 +28,13 @@ class ImportScripts::JsonGeneric < ImportScripts::Base end def username_for(name) - name.downcase.gsub(/[^a-z0-9\-\_]/, '') + result = name.downcase.gsub(/[^a-z0-9\-\_]/, '') + + if result.blank? + result = Digest::SHA1.hexdigest(name)[0...10] + end + + result end def import_users From 99f9adaf50a106f247f46b2775415b15d9f2d134 Mon Sep 17 00:00:00 2001 From: Jeff Atwood Date: Thu, 19 Jan 2017 12:48:15 -0800 Subject: [PATCH 0060/1355] improve copy for export your own posts PM --- config/locales/server.en.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 461bb46c96..116bf0ae26 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -1991,6 +1991,8 @@ en: The above download link will be valid for 48 hours. + The data is compressed as a gzip archive. If the archive does not extract itself when you open it, use the tools recommended here: http://www.gzip.org/#faq4 + csv_export_failed: title: "CSV Export Failed" subject_template: "Data export failed" From 6b93b094040aa14d2053802b3a591a4e9599c1f9 Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Thu, 19 Jan 2017 15:56:14 -0500 Subject: [PATCH 0061/1355] FIX: when blocking a user results in hiding their posts, only hide posts made in the last 24 hours --- app/services/user_blocker.rb | 4 ++-- spec/services/user_blocker_spec.rb | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/app/services/user_blocker.rb b/app/services/user_blocker.rb index cda62083c9..01b5896e88 100644 --- a/app/services/user_blocker.rb +++ b/app/services/user_blocker.rb @@ -31,8 +31,8 @@ class UserBlocker def hide_posts return unless @user.trust_level == TrustLevel[0] - Post.where(user_id: @user.id).update_all(["hidden = true, hidden_reason_id = COALESCE(hidden_reason_id, ?)", Post.hidden_reasons[:new_user_spam_threshold_reached]]) - topic_ids = Post.where(user_id: @user.id, post_number: 1).pluck(:topic_id) + Post.where(user_id: @user.id).where("created_at > ?", 24.hours.ago).update_all(["hidden = true, hidden_reason_id = COALESCE(hidden_reason_id, ?)", Post.hidden_reasons[:new_user_spam_threshold_reached]]) + topic_ids = Post.where(user_id: @user.id, post_number: 1).where("created_at > ?", 24.hours.ago).pluck(:topic_id) Topic.where(id: topic_ids).update_all(visible: false) unless topic_ids.empty? end diff --git a/spec/services/user_blocker_spec.rb b/spec/services/user_blocker_spec.rb index 6761c44b3d..34c0b99fbd 100644 --- a/spec/services/user_blocker_spec.rb +++ b/spec/services/user_blocker_spec.rb @@ -118,6 +118,16 @@ describe UserBlocker do expect(post.reload).to_not be_hidden expect(post.topic.reload).to be_visible end + + it "only hides posts from the past 24 hours" do + old_post = Fabricate(:post, user: user, created_at: 2.days.ago) + subject.block + expect(post.reload).to be_hidden + expect(post.topic.reload).to_not be_visible + old_post.reload + expect(old_post).to_not be_hidden + expect(old_post.topic).to be_visible + end end end From c421b0d89263ddb31427dae097122dffa02d8de5 Mon Sep 17 00:00:00 2001 From: Jeff Atwood Date: Thu, 19 Jan 2017 12:57:27 -0800 Subject: [PATCH 0062/1355] default email title shouldn't expose addr --- config/locales/server.en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 116bf0ae26..3366915212 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -57,7 +57,7 @@ en: emails: incoming: - default_subject: "Incoming email from %{email}" + default_subject: "This topic needs a title" show_trimmed_content: "Show trimmed content" maximum_staged_user_per_email_reached: "Reached maximum number of staged users created per email." errors: From 521ced38c5c8a78c5c95f65a53b1d7c76c842bed Mon Sep 17 00:00:00 2001 From: Jeff Atwood Date: Thu, 19 Jan 2017 14:01:51 -0800 Subject: [PATCH 0063/1355] fix spec for default email title --- spec/components/email/receiver_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/components/email/receiver_spec.rb b/spec/components/email/receiver_spec.rb index 47c7c4a1da..3019c5a780 100644 --- a/spec/components/email/receiver_spec.rb +++ b/spec/components/email/receiver_spec.rb @@ -341,7 +341,7 @@ describe Email::Receiver do it "handles email with no subject" do expect { process(:no_subject) }.to change(Topic, :count) - expect(Topic.last.title).to eq("Incoming email from some@one.com") + expect(Topic.last.title).to eq("This topic needs a title") end it "invites everyone in the chain but emails configured as 'incoming' (via reply, group or category)" do From 27124736c73090465d8b626d9564ec76c77462b3 Mon Sep 17 00:00:00 2001 From: Jeff Atwood Date: Thu, 19 Jan 2017 17:07:55 -0800 Subject: [PATCH 0064/1355] change /about "New Users" to "Users" --- config/locales/client.en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index b65332aa71..d502aa3a1e 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -248,7 +248,7 @@ en: like_count: "Likes" topic_count: "Topics" post_count: "Posts" - user_count: "New Users" + user_count: "Users" active_user_count: "Active Users" contact: "Contact Us" contact_info: "In the event of a critical issue or urgent matter affecting this site, please contact us at %{contact_info}." From 32846aad2a511d631b3845cf1f72dea7ec689522 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Fri, 20 Jan 2017 14:37:22 +0800 Subject: [PATCH 0065/1355] FIX: Toggling post's wiki status should not create a new version. --- .../javascripts/discourse/models/post.js.es6 | 1 - .../widgets/post-edits-indicator.js.es6 | 23 +++++++++++++++---- .../javascripts/discourse/widgets/post.js.es6 | 2 +- app/controllers/posts_controller.rb | 2 +- app/models/post.rb | 3 ++- config/locales/client.en.yml | 3 +++ spec/controllers/posts_controller_spec.rb | 14 +++++++++++ test/javascripts/widgets/post-test.js.es6 | 14 +++++++++++ 8 files changed, 53 insertions(+), 9 deletions(-) diff --git a/app/assets/javascripts/discourse/models/post.js.es6 b/app/assets/javascripts/discourse/models/post.js.es6 index b15683ca4a..127b81f861 100644 --- a/app/assets/javascripts/discourse/models/post.js.es6 +++ b/app/assets/javascripts/discourse/models/post.js.es6 @@ -70,7 +70,6 @@ const Post = RestModel.extend({ return ajax(`/posts/${this.get('id')}/${field}`, { type: 'PUT', data }).then(() => { this.set(field, value); - this.incrementProperty("version"); }).catch(popupAjaxError); }, diff --git a/app/assets/javascripts/discourse/widgets/post-edits-indicator.js.es6 b/app/assets/javascripts/discourse/widgets/post-edits-indicator.js.es6 index f0d3cc1141..531e439685 100644 --- a/app/assets/javascripts/discourse/widgets/post-edits-indicator.js.es6 +++ b/app/assets/javascripts/discourse/widgets/post-edits-indicator.js.es6 @@ -23,19 +23,30 @@ export default createWidget('post-edits-indicator', { html(attrs) { let icon = 'pencil'; - let titleKey = 'post.last_edited_on'; const updatedAt = new Date(attrs.updated_at); let className = this.historyHeat(updatedAt); + const date = longDate(updatedAt); + let title; if (attrs.wiki) { icon = 'pencil-square-o'; - titleKey = 'post.wiki_last_edited_on'; className = `${className} wiki`; + + if (attrs.version > 1) { + title = `${I18n.t('post.last_edited_on')} ${date}`; + } else { + title = I18n.t('post.wiki.about'); + } + } else { + title = `${I18n.t('post.last_edited_on')} ${date}`; } - const contents = [attrs.version - 1, ' ', iconNode(icon)]; + const contents = [ + attrs.version > 1 ? attrs.version - 1 : '', + ' ', + iconNode(icon) + ]; - const title = `${I18n.t(titleKey)} ${longDate(updatedAt)}`; return h('a', { className, attributes: { title } @@ -43,7 +54,9 @@ export default createWidget('post-edits-indicator', { }, click() { - if (this.attrs.canViewEditHistory) { + if (this.attrs.wiki && this.attrs.version === 1) { + this.sendWidgetAction('editPost'); + } else if (this.attrs.canViewEditHistory) { this.sendWidgetAction('showHistory'); } } diff --git a/app/assets/javascripts/discourse/widgets/post.js.es6 b/app/assets/javascripts/discourse/widgets/post.js.es6 index f92dd1d954..5309768e58 100644 --- a/app/assets/javascripts/discourse/widgets/post.js.es6 +++ b/app/assets/javascripts/discourse/widgets/post.js.es6 @@ -167,7 +167,7 @@ createWidget('post-meta-data', { result.push(this.attach('post-email-indicator', attrs)); } - if (attrs.version > 1) { + if (attrs.version > 1 || attrs.wiki) { result.push(this.attach('post-edits-indicator', attrs)); } diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index 52618c5caf..054310d393 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -394,7 +394,7 @@ class PostsController < ApplicationController post = find_post_from_params guardian.ensure_can_wiki!(post) - post.revise(current_user, { wiki: params[:wiki] }) + post.revise(current_user, { wiki: params[:wiki] }, { skip_revision: true }) render nothing: true end diff --git a/app/models/post.rb b/app/models/post.rb index 51ac444211..4667f93cfd 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -132,7 +132,8 @@ class Post < ActiveRecord::Base updated_at: Time.now, user_id: user_id, last_editor_id: last_editor_id, - type: type + type: type, + version: version }.merge(options) if Topic.visible_post_types.include?(post_type) diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index b65332aa71..2cfe27e79f 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -1753,6 +1753,9 @@ en: via_auto_generated_email: "this post arrived via an auto generated email" whisper: "this post is a private whisper for moderators" + wiki: + about: "this post is a wiki" + archetypes: save: 'Save Options' diff --git a/spec/controllers/posts_controller_spec.rb b/spec/controllers/posts_controller_spec.rb index c2071de4f4..41916d4d0e 100644 --- a/spec/controllers/posts_controller_spec.rb +++ b/spec/controllers/posts_controller_spec.rb @@ -465,6 +465,20 @@ describe PostsController do expect(response).to be_forbidden end + it "toggle wiki status should not create a new version" do + admin = log_in(:admin) + another_user = Fabricate(:user) + another_post = Fabricate(:post, user: another_user) + + expect { xhr :put, :wiki, post_id: another_post.id, wiki: 'true' } + .to_not change { another_post.reload.version } + + another_admin = log_in(:admin) + + expect { xhr :put, :wiki, post_id: another_post.id, wiki: 'false' } + .to_not change { another_post.reload.version } + end + it "can wiki a post" do Guardian.any_instance.expects(:can_wiki?).with(post).returns(true) diff --git a/test/javascripts/widgets/post-test.js.es6 b/test/javascripts/widgets/post-test.js.es6 index 559ac87960..80b97b548a 100644 --- a/test/javascripts/widgets/post-test.js.es6 +++ b/test/javascripts/widgets/post-test.js.es6 @@ -30,6 +30,20 @@ widgetTest('wiki', { } }); +widgetTest('wiki without revision', { + template: '{{mount-widget widget="post" args=args editPost="editPost"}}', + setup() { + this.set('args', { wiki: true, version: 1, canViewEditHistory: true }); + this.on('editPost', () => this.editPostCalled = true); + }, + test(assert) { + click('.post-info .wiki'); + andThen(() => { + assert.ok(this.editPostCalled, 'clicking wiki icon edits the post'); + }); + } +}); + widgetTest('via-email', { template: '{{mount-widget widget="post" args=args showRawEmail="showRawEmail"}}', setup() { From 1a45fe94a284d7809abc9a64f371e58b80ec50f8 Mon Sep 17 00:00:00 2001 From: Sam Saffron Date: Fri, 20 Jan 2017 08:11:36 -0500 Subject: [PATCH 0066/1355] drop thin, it is no longer supported --- Gemfile | 1 - Gemfile.lock | 7 ------- 2 files changed, 8 deletions(-) diff --git a/Gemfile b/Gemfile index 25fcaa8662..3d49f0dc3a 100644 --- a/Gemfile +++ b/Gemfile @@ -105,7 +105,6 @@ gem 'sidekiq-statistic' gem 'sinatra', require: false gem 'execjs', require: false gem 'mini_racer' -gem 'thin', require: false gem 'highline', require: false gem 'rack-protection' # security diff --git a/Gemfile.lock b/Gemfile.lock index ade43f5986..257959b86f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -71,7 +71,6 @@ GEM concurrent-ruby (1.0.2) connection_pool (2.2.0) crass (1.0.2) - daemons (1.2.4) debug_inspector (0.0.2) diff-lcs (1.2.5) discourse-qunit-rails (0.0.9) @@ -94,7 +93,6 @@ GEM railties (>= 3.1) ember-source (2.10.0) erubis (2.7.0) - eventmachine (1.2.0.1) excon (0.53.0) execjs (2.7.0) exifr (1.2.4) @@ -361,10 +359,6 @@ GEM activesupport (>= 4.0) sprockets (>= 3.0.0) stackprof (0.2.10) - thin (1.7.0) - daemons (~> 1.0, >= 1.0.9) - eventmachine (~> 1.0, >= 1.0.4) - rack (>= 1, < 3) thor (0.19.1) thread_safe (0.3.5) tilt (2.0.5) @@ -476,7 +470,6 @@ DEPENDENCIES sinatra spork-rails stackprof - thin timecop uglifier unf From 60c2787e64d36bc4e33a114c399b0d6e52cd42f8 Mon Sep 17 00:00:00 2001 From: Joe Buhlig Date: Fri, 20 Jan 2017 07:15:07 -0600 Subject: [PATCH 0067/1355] FEATURE: Add user-main-nav plugin outlet --- app/assets/javascripts/discourse/templates/user.hbs | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/javascripts/discourse/templates/user.hbs b/app/assets/javascripts/discourse/templates/user.hbs index 1f91c19993..1c1b821640 100644 --- a/app/assets/javascripts/discourse/templates/user.hbs +++ b/app/assets/javascripts/discourse/templates/user.hbs @@ -179,6 +179,7 @@ {{#if showBadges}}
  • {{#link-to 'user.badges'}}{{fa-icon "certificate"}}{{i18n 'badges.title'}}{{/link-to}}
  • {{/if}} + {{plugin-outlet name="user-main-nav" connectorTagName='li' args=(hash model=model)}}
  • {{#link-to 'user.summary'}}{{i18n 'user.summary.title'}}{{/link-to}}
  • {{#if model.can_edit}}
  • {{#link-to 'preferences'}}{{fa-icon "cog"}}{{i18n 'user.preferences'}}{{/link-to}}
  • From 6832b06a800583dcb76e89f2407cab39c530b0ea Mon Sep 17 00:00:00 2001 From: gotens1211 Date: Sun, 22 Jan 2017 19:27:49 +0530 Subject: [PATCH 0068/1355] FIX: Embedded Youtube videos lacking margin at bottom Changed the cook function arguments for yotube videos. --- app/models/post_analyzer.rb | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/app/models/post_analyzer.rb b/app/models/post_analyzer.rb index 09f7cd9932..0b8d590b1c 100644 --- a/app/models/post_analyzer.rb +++ b/app/models/post_analyzer.rb @@ -12,8 +12,34 @@ class PostAnalyzer @found_oneboxes end +#to add margin between youtube links +def newlinereplace(*args) + sp = args[0].split(/\n+/) + a = 0 + x = 0 + replacem = [] + while a 0 + replacem[x] =sp[a] + x+=1 + end + if a!= sp.length-1 + replacem[x]="\n" + x+=1 + end + a+=1 + end + args[0]=replacem.join() + return *args +end + # What we use to cook posts def cook(*args) + yt_string = args[0] + if yt_string.include? "www.youtube" + *args = newlinereplace(*args) + end + cooked = PrettyText.cook(*args) result = Oneboxer.apply(cooked, topic_id: @topic_id) do |url, _| @@ -21,7 +47,6 @@ class PostAnalyzer Oneboxer.invalidate(url) if args.last[:invalidate_oneboxes] Oneboxer.cached_onebox(url) end - cooked = result.to_html if result.changed? cooked end From ff508ed75ffec97dd5239787c7ed3340568142f4 Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Mon, 23 Jan 2017 14:34:06 -0500 Subject: [PATCH 0069/1355] UX: red notification of flags or pending approvals opens hamburger menu instead of linking to flags page --- app/assets/javascripts/discourse/widgets/header.js.es6 | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/app/assets/javascripts/discourse/widgets/header.js.es6 b/app/assets/javascripts/discourse/widgets/header.js.es6 index fe6ea451dd..8dbb00349a 100644 --- a/app/assets/javascripts/discourse/widgets/header.js.es6 +++ b/app/assets/javascripts/discourse/widgets/header.js.es6 @@ -114,12 +114,9 @@ createWidget('header-icons', { action: 'toggleHamburger', contents() { if (!attrs.flagCount) { return; } - return this.attach('link', { - href: Discourse.getURL('/admin/flags/active'), - title: 'notifications.total_flagged', - rawLabel: attrs.flagCount, - className: 'badge-notification flagged-posts' - }); + return h('div.badge-notification.flagged-posts', { attributes: { + title: I18n.t('notifications.total_flagged') + } }, attrs.flagCount); } }); From ce07da1d8bc12467ceede077ba60123be7a9c02d Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Tue, 24 Jan 2017 13:11:05 +0800 Subject: [PATCH 0070/1355] UX: Only display the words that fails censored words validations. --- config/locales/server.en.yml | 4 ++-- lib/validators/censored_words_validator.rb | 21 +++++++++++++++++---- spec/models/topic_spec.rb | 15 ++++++++------- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 3366915212..6c751415b7 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -96,8 +96,8 @@ en: inclusion: is not included in the list invalid: is invalid is_invalid: "seems unclear, is it a complete sentence?" - contains_censored_words: "includes one or more of the censored words: %{censored_words}" - matches_censored_pattern: "matches the following censored Regex: %{censored_pattern}" + contains_censored_words: "contains the following censored words: %{censored_words}" + matches_censored_pattern: "contains the following words that matches the site's censored regexp: %{censored_words}" less_than: must be less than %{count} less_than_or_equal_to: must be less than or equal to %{count} not_a_number: is not a number diff --git a/lib/validators/censored_words_validator.rb b/lib/validators/censored_words_validator.rb index 3d3c368526..5ebd448dcb 100644 --- a/lib/validators/censored_words_validator.rb +++ b/lib/validators/censored_words_validator.rb @@ -1,15 +1,28 @@ class CensoredWordsValidator < ActiveModel::EachValidator def validate_each(record, attribute, value) - if !SiteSetting.censored_words.blank? && value =~ /#{SiteSetting.censored_words}/i + if !SiteSetting.censored_words.blank? && + !(censored_words = value.scan(/#{SiteSetting.censored_words}/i)).empty? + record.errors.add( attribute, :contains_censored_words, - censored_words: SiteSetting.censored_words + censored_words: join_censored_words(censored_words) ) - elsif !SiteSetting.censored_pattern.blank? && value =~ /#{SiteSetting.censored_pattern}/i + elsif !SiteSetting.censored_pattern.blank? && + !(censored_words = value.scan(/#{SiteSetting.censored_pattern}/i)).empty? + + byebug record.errors.add( attribute, :matches_censored_pattern, - censored_pattern: SiteSetting.censored_pattern + censored_words: join_censored_words(censored_words) ) end end + + private + + def join_censored_words(censored_words) + censored_words.map!(&:downcase) + censored_words.uniq! + censored_words.join(", ") + end end diff --git a/spec/models/topic_spec.rb b/spec/models/topic_spec.rb index 809f795429..bcf49caceb 100644 --- a/spec/models/topic_spec.rb +++ b/spec/models/topic_spec.rb @@ -14,29 +14,30 @@ describe Topic do it { is_expected.to validate_presence_of :title } describe 'censored words' do - site_setting(:censored_words, 'pineapple|pen') - site_setting(:censored_pattern, 'orange.*') - describe 'when title contains censored words' do + site_setting(:censored_words, 'pineapple|pen') + it 'should not be valid' do - topic.title = 'I have a Pineapple' + topic.title = 'pen PinEapple apple pen ' expect(topic).to_not be_valid expect(topic.errors.full_messages.first).to include(I18n.t( - 'errors.messages.contains_censored_words', censored_words: SiteSetting.censored_words + 'errors.messages.contains_censored_words', censored_words: 'pen, pineapple' )) end end describe 'when title matches censored pattern' do + site_setting(:censored_pattern, 'orange.*') + it 'should not be valid' do - topic.title = 'I have orangEjuice' + topic.title = 'I have orangEjuice orange monkey orange stuff' expect(topic).to_not be_valid expect(topic.errors.full_messages.first).to include(I18n.t( - 'errors.messages.matches_censored_pattern', censored_pattern: SiteSetting.censored_pattern + 'errors.messages.matches_censored_pattern', censored_words: 'orange monkey orange stuff' )) end end From eafd0a7497b780330431b5573387fa654997097c Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Tue, 24 Jan 2017 14:07:55 +0800 Subject: [PATCH 0071/1355] Bye bye bygbug. --- lib/validators/censored_words_validator.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/validators/censored_words_validator.rb b/lib/validators/censored_words_validator.rb index 5ebd448dcb..58abb9a6cd 100644 --- a/lib/validators/censored_words_validator.rb +++ b/lib/validators/censored_words_validator.rb @@ -10,7 +10,6 @@ class CensoredWordsValidator < ActiveModel::EachValidator elsif !SiteSetting.censored_pattern.blank? && !(censored_words = value.scan(/#{SiteSetting.censored_pattern}/i)).empty? - byebug record.errors.add( attribute, :matches_censored_pattern, censored_words: join_censored_words(censored_words) From e27ca3019bd4ab324acbc96330fbb0b7173f3fc1 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Tue, 24 Jan 2017 12:00:57 +0530 Subject: [PATCH 0072/1355] FEATURE: posts:remap task now supports removing all occurences of a word --- lib/tasks/posts.rake | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/tasks/posts.rake b/lib/tasks/posts.rake index 7c9c3407c2..53e2706adc 100644 --- a/lib/tasks/posts.rake +++ b/lib/tasks/posts.rake @@ -118,11 +118,16 @@ end desc 'Remap all posts matching specific string' task 'posts:remap', [:find, :replace] => [:environment] do |_,args| + require 'highline/import' + find = args[:find] replace = args[:replace] - if !find || !replace + if !find puts "ERROR: Expecting rake posts:remap[find,replace]" exit 1 + elsif !replace + confirm_replace = ask("Are you sure you want to remove all occurences of '#{find}'? (Y/n) ") + exit 1 unless (confirm_replace == "" || confirm_replace.downcase == 'y') end puts "Remapping" From 80e573e7949fc1684bba48ea193d6a7d196635e4 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Tue, 24 Jan 2017 12:52:38 +0530 Subject: [PATCH 0073/1355] FIX: support removing all occurences of a word/string --- lib/tasks/posts.rake | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/tasks/posts.rake b/lib/tasks/posts.rake index 53e2706adc..8eb22e5afa 100644 --- a/lib/tasks/posts.rake +++ b/lib/tasks/posts.rake @@ -128,6 +128,7 @@ task 'posts:remap', [:find, :replace] => [:environment] do |_,args| elsif !replace confirm_replace = ask("Are you sure you want to remove all occurences of '#{find}'? (Y/n) ") exit 1 unless (confirm_replace == "" || confirm_replace.downcase == 'y') + replace = "" end puts "Remapping" From ba21ef34e5b386cc1c87fc38a97fb610bd3dcd9a Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Tue, 24 Jan 2017 16:11:20 +0800 Subject: [PATCH 0074/1355] Fix broken emojis. --- lib/tasks/emoji.rake | 22 ++++++++++++------ public/images/emoji/apple/hash.png | Bin 0 -> 1035 bytes public/images/emoji/apple/keycap_star.png | Bin 0 -> 1108 bytes public/images/emoji/apple/zero.png | Bin 0 -> 988 bytes public/images/emoji/emoji_one/hash.png | Bin 0 -> 593 bytes public/images/emoji/emoji_one/keycap_star.png | Bin 0 -> 625 bytes public/images/emoji/emoji_one/zero.png | Bin 0 -> 562 bytes public/images/emoji/google/hash.png | Bin 0 -> 597 bytes public/images/emoji/google/keycap_star.png | Bin 0 -> 2243 bytes public/images/emoji/google/zero.png | Bin 0 -> 1974 bytes public/images/emoji/twitter/hash.png | Bin 0 -> 503 bytes public/images/emoji/twitter/keycap_star.png | Bin 0 -> 414 bytes public/images/emoji/twitter/zero.png | Bin 0 -> 497 bytes public/images/emoji/win10/eight.png | Bin 820 -> 454 bytes public/images/emoji/win10/five.png | Bin 660 -> 426 bytes public/images/emoji/win10/four.png | Bin 701 -> 365 bytes public/images/emoji/win10/hash.png | Bin 0 -> 464 bytes public/images/emoji/win10/nine.png | Bin 718 -> 435 bytes public/images/emoji/win10/one.png | Bin 561 -> 240 bytes public/images/emoji/win10/seven.png | Bin 638 -> 369 bytes public/images/emoji/win10/six.png | Bin 740 -> 451 bytes public/images/emoji/win10/three.png | Bin 689 -> 460 bytes public/images/emoji/win10/two.png | Bin 726 -> 434 bytes public/images/emoji/win10/zero.png | Bin 0 -> 458 bytes 24 files changed, 15 insertions(+), 7 deletions(-) diff --git a/lib/tasks/emoji.rake b/lib/tasks/emoji.rake index 14190b74eb..6ea15b77f3 100644 --- a/lib/tasks/emoji.rake +++ b/lib/tasks/emoji.rake @@ -40,7 +40,10 @@ task "emoji:update" => :environment do code = cells[1].at_css("a")["name"] - next unless emojis[code] + unless emojis[code] + code = code.gsub(/_fe0f/, "") + next unless emojis[code] + end apple = cell_to_image(cells[4]) google = cell_to_image(cells[5]) @@ -50,7 +53,7 @@ task "emoji:update" => :environment do if WINDOWS_FLAGS.include?(code) windows = custom_windows_flag(code) else - windows = cell_to_image(cells[9]) + windows = cell_to_image(cells[11]) end if apple.blank? || google.blank? || twitter.blank? || one.blank? || windows.blank? @@ -94,13 +97,16 @@ def custom_windows_flag(code) end def write_emojis(emojis, aliases, style, folder) - path = "public/images/emoji/#{folder}/" + path = "public/images/emoji/#{folder}" - FileUtils.rm_f Dir.glob("#{path}/*") + # Uncomment to recreate all emojis + # FileUtils.rm_f Dir.glob("#{path}/*") puts folder emojis.values.each do |emoji| + next if emoji[style].nil? + write_emoji("#{path}/#{emoji[:name]}.png", emoji[style]) if aliases[emoji[:name]] aliases[emoji[:name]].each do |new_name| @@ -113,7 +119,9 @@ def write_emojis(emojis, aliases, style, folder) end def write_emoji(path, emoji) - open(path, "wb") { |f| f << emoji } - `pngout #{path}` - putc "." + open(path, "wb") { |f| f << emoji } + `pngout #{path}` + putc "." +ensure + raise "Failed to write emoji: #{path}" if File.exists?(path) && !File.size?(path) end diff --git a/public/images/emoji/apple/hash.png b/public/images/emoji/apple/hash.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..64f9f559649fa54bdb5074eadf32533ec064d4db 100644 GIT binary patch literal 1035 zcmV+m1oZofP)Vq2=IUat8W^{uAC{b!+Csw zcWevOPv;R!j*rOV5|eqHQ_WMAb7mUZ<5T=El4q0N(@;G*<{Y06H4V}jdoT;JzV9DH zOx)Z6;3)qAasUJ05I2?+2kd?ORQMoz2h%8>QL1Ep-#!L!NO~KB^O*hwdKZS*1dT`+ zc>8pq^roVXr0?6OBaw+NAeqOt(Nsj1h}2Cbwd;e6s1cEXJhA^k=JetdQR5r zqNg)aV9_>Y+D?nmUH(+3`8K=sugiR_a*kxmPK&T2F* z44S1)2Nt~pv?j&Q7E)`LjT#ioSJ9-R)==ZIp0!Op|)ggxsL}qRt_kkiVqE?Qe zctB8W{&&&2B@uL#1(0=PTz@wTtt3w?5V|%KyHRakud&ddj@~puclSY@^~_&B>!m~i zx**Be%>+O`Ygu7V5hOXh8x(YR9Yg47mfS;P)+l4vXAz5827#1f+o#;bG4lh6tH_RW zgoYilxQqls&CQ#^3J$MKOC6*<;c-}FzDB`O1qY&ylt)Ty%uK3UOLs@KzwBy(0;rdU zAw3Z~Yo%0uKw@VFy*)P6OL=Tb-B6iRdVo@!5Y*?q{UcNWb-9tSQfrJPqC{_C$RSCc zf%U%#4%I49pvAAGl{YeAYAabCs5=6NcBpo;ZYg~}`~`$5$r*(}@Vo#3002ovPDHLk FV1lDt6;N$=Q z|5{00005bW%=J043T_nzEw6%K!ia!bwCyRCr#bm5Y+AFbIaXRv>pTegAho z5+E8~&$Qj&xWoj${fW->XV>F74j*ZJK7Ov+D6i>5y*Abf^B6Y@Z32R~L{%GW>|8yE zjRJr!ejta;n}%o40dOIekCcJ~IFg=>!I;a($`Ki*q{l#jn95fQh(Lp!(>MXTP_n4J zJ47WoglUw<05RmR6%eJlkpO+le6bRbw{A^O9)U(aA#N=FLEPN%sGa#Q2^#s7p3+(P zN=aj^y$ysehCeAfq~T`(27QH!`qw)I1vUBe)VI+s_G%!{2)-ohOoCVGW0z$aJ7|*- zIO>pjT2#sJtCnVQ2i+^L>pHKS@_p70x+l4?s=|Mg4xl@fi^`e9U6L~pVI`g9EzSz^ zvZ$fYM0LcV%O#-$$%u8U4!Iaa;^^We%*m#UfEL}vG^eX?Fh}Ov{BPA+$wfd#AM?ia z%CKOL0NqKcdWa~MEa76T{?a)g;RNarcnKQ`gMd<<%f=kv17WsT&ec)ou^x|Zq&rYY z!pQk{#HjW>N|S1-uMp70pmy0g7%Ac+#M5$Df-p5lY^nzIMLbx00!rOt@vTHb>Zs>? zF22{2JQpydb7ZaYu!u3wzf zD{4p_5$x3+3LqXxa|FO%Rs&?9Uj_Un^zZykdIJP<-q(|cPe1?|i(z_HiFoM{1oR@_ z0lqYVyZMmp&B30FbdY+lVO~00$sI}nc90kW?b2kzn^=akR9BtNve`nKtqV7w?mYS9IJE|!`vIG#L^~#g`}i93-rb#sKy{nD>@65 z)GZ3iikCAa-VnnY_cQe{u7T9aa$XRE1k2fYgsZ)~>d|OSGB!7r-qIL1hIK!y9oC&6 aAHD&!7|O>9OBHPZ0000VPi1;VE%9WcZw7e%l~l)DiH0K)|#0I_a{ zs-tnY872s(^cTEmIfYqh349Sa8%e!6W#fDi(HEQ zn~ffjVI3)ESh5=<5?ZI6%c5!r{Z=Be6_J;Jt~sSF6JJat@VELqKpIWG)v%r@)WUs? zfxlABaED6XMAs>-X9?z5!X+6g5L_a`-+BJfnC9FSy$@iwpo ziNLYx3>Eu8{2p+8E+{V~x5SM>ov&;w5s93$5y29wS_5YO^Whi1pSz^Q09xz-0000< KMNUMnLSTX+4Z6nw literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/hash.png b/public/images/emoji/emoji_one/hash.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..1efc8cc6e355e44c6606256e42a268c168cca61c 100644 GIT binary patch literal 593 zcmV-X0oR#Hf z?QrK$W;RNDso5npTcQpOXx(Py-Kc^!>&AR}nRzy<8lwtP%TsbqRF5axCJHpvCORHZ zwQ7Gzi5aVC&^}Q^M`uKNJ5r#dwjHWW6za$)Ix#3my#zEDE3zpa_u9kRhNhq7YCA%zqd>Yf%tA;a>&O)Pi)9MkI@pHX>XU zM6f9TG7v1vrHW)h*tCXxA{tH_5d;w}fZR8NAotxOXsDxZids6l7UUSpCyR1&Pir@I zEkP8hW83?#Oyhh$X5^j(RcKD?_M&ztZ?AlJiuUo~jCnlFAF3`78ds|FG;*Y{=p)Ph fT>D!Rv!wh2;MO3`I-~@R00000NkvXXu0mjf+}8`t literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/keycap_star.png b/public/images/emoji/emoji_one/keycap_star.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..8ed4edab8fc0e522865cd42e62bbc6935e37178e 100644 GIT binary patch literal 625 zcmV-%0*?KOP)q$gGRCr#!*0FBWKpY0}4yigLG2{UlcmPr*or;jEjFtKb zFl5XtfD!t;SS(p`*kv|fap$@&6N?QbJ83qSlDq`}yQ>`u-Ty4nsNaxe`02Z|?wq@w z?PmAY^GD7+K00p93lj6JRxcU6FC4jKwQtQHn@BlRvKkvS;vOaB@~&#PPgF@LCJOYd zI<`ozI%IT06w0V1>e(sfGKz`bF&fHK;v__G8Fh)&J&_`M!|3V%pyIk6eFx54(bd)v z5BH@NeFQ%HP@>T%;ExZTt~Y3wx={>-N}U0}`1cCA6LCjYsR=Mp>VW&4=nBAEO?BTK zz_}A0fHTmDA&`kp$bJCV3mGLJv`PW9E7wVP?PR9+OD z2fGM;Xu1N7ieyxx$x=Y}*)qTkdE-WN=oEl0T+3^>jDdXaU%S-o0^?I@KV9T%qEWn( z_ET)0>C9}p86Yh1B31SFRi~M9qiMBy5t8s8@15`lOXvarRbrxCKtdiIB{lM%Ee#4~ zG;L5Mqq0F%$y2hZ%P8^`(d#=zxj1cmlnqIz_~}SNH5ySso&@H2J)xHL7}{Y_^%dkJ<;nB5f-H00000 LNkvXXu0mjf(<3NW literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/zero.png b/public/images/emoji/emoji_one/zero.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..8123d5e090e8f9dcb6e348082edd7b0d6fa241f0 100644 GIT binary patch literal 562 zcmV-20?qx2P)<&*t+!;t9`ZpAOnK!&$GPAPWteqZg zBxW;z^kWV|%#Kqh1TNYM`6QKLvrcA!iRqFm#i&SiP{<2FHSQ=2U?t=MRHCj{xsY5c zN9Y)!CZl(NG`D1B4M;;kc zRz)2Xr>P;|j1ws6#-X8tS_Jl=`8*Nr8FPo&Gv-!7RO6lxm61oNhImEDiip2uE227~ zfG=WKM6MY^LlIrm6N%7>`WI1Wf*$?=wI-;!Z1n%Xj&Gdbm_?o)qhJ=Q&+|St2!;G% zMdb52e5!=_s`=t&)T0`Mt|7YUKiG4~DhOL_9#KKARH!0+i_9152)#IqP)i{sWT4*ZJz06 z>;pYJ=7Am(>3j5|Wg?NjM=v6ePGsL|5t)A39wmE6gq8M!P!s{cWkS)c?!zh)p_@PW zA_~49&H?KoijtypfICD%Qq%^VH=i%Uj3ZHA)1E=V z9kvJ^?D#_jg=6jWaz&=7>~hu+&DzsL!H8I@$SOsDz6ksV3H)5vgx>*VXD!5y!vrxy zljdS3w6n&|zPp_LrbsdSOc68tK3o(@XCH#3h(tcN2QOX}iBJA?uP9_9P*K>STXlKO z7NPT*=ILuM0CGhEW`^dYQ;U>E|3&mJA^~K4^Dc78&l+yT=J5-TW;m~rnKi+CpDVgJ ze4w5En?;VBeS#5Pe_2C8(K#TJD6vKIlb zish@n*A}brkjO66+loD{sNU^+5s)<`B99JJ?@NoZ)T6?T)T7~LdP_YDIx~zt_ j&v-Ud_fqapw|Ra5pzaE&EMBr@00000NkvXXu0mjfLzfpG literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/keycap_star.png b/public/images/emoji/google/keycap_star.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..bc41c667b2ceed0363100ee0e6fd2c7ae20e4aa9 100644 GIT binary patch literal 2243 zcmV;!2t4(HMeg#0bQcpdeuXl4yg{M9?4& zMoCRghzY3iA0#mvd{DqBRiLjeZK3UUx83*7%+Acc=aV`2j~m9>$0Td^E;GO6WRjUb zZt^?leCPYVb4LLDXV(Dafa`%T0q+MoXf7s!=YU`0=~H$fQ%rsCHB2anZs3045n!j2 z(|mLQJDr2F*#q=W@8668a=>n27tlqsW2Gw?O7F5G$-R=a-HC8paSM>7C5PaA8hbHi zfE&msUQ7Ttzh&jL@c%%P z7V#7fB&LE)25EmMv~NdJtH7iQ<@iv(h?dTwQ-@&s4Hkh#7Ni#Gy8(0Qw;|C5;{EUM z_~_KDX#c(F)V~)z8YqBDOki|rBQ35)B8cKuA zh8B)P<-+XS&*VaZX#54C7RhbJY<&oG<$h${?T}hoC&&u;qiEp>v!RnOK~Myw_Bk%V zo3*!MwmpKZx;aV{;wwlYxeVEGH?rbWNY^!(OYg>Peh_Kf25M^rO`-WCGtay&LjD!d zO6?CwZZl@n1IUJZkmWlum)?c+>;#RqAdueABHbS$^57vo*CAUUMtZIVBocx`{$&XA z)TK0t7W$+3g93tde-zpF6J*6FK@vC;UC5eSAiWB(aTKJGUXAp90ZfWor2QS3&3lnm zH-gCk3S!XwQK*bk4=tUA(zz&(nH;kEE0`^NT?Sr@bX<+}eg=>@3L;!7ZC5Y@Zg$Ov z-I(=vLZTbgLS+~&zD8Z9{u6F9wJwgCjrX}hs*k#e=LChnYn%irBzlnEPlHJ@D~S$d z?bk7zz7M%g5KO`3zv>2itqM{f>3A1r(+>#)ah6$d6C_<90F9F%Riyn&q;1E1%V;;# zX3LL|&i8~TnJx1cDnn2_>Eev3#;@fc1M%il!nmM~NylsjWjBGBr2(8Av*jVA{c7;X zY7*_?P~zqvKyC|-AniLKwF1z%2ofkBcfqz{vKx`rUk;1b2qb&C3&)S3k{3 z_HxX+JD~52Xmv}C{wX{N3jMXKXsHOYpbB0V$*hOA?MU~v(7pr7ZUmE|VZ?J~id09> zbx=Cvww;dt8J+ltJG}@BfPe@f@eR_Fy$qIpsJc>I@#v~+NwA=#*CN%i{1Z?*i%z|S zj{XImcoC-0fXxFYW`bOycs*wQF37BJOp00%Q}4UE<6CAOQXR`b9u~f%&tlK)gTm1` zDfb3+111x*c88e8GG9Oo$FL{A z2SKrZc7Enj^y1Tv*Hq~>AYPmV36zJ>@#mN?I`L2R*f-I_(eOm8CA}I@?1|mz`Co(j z%$sW9wxyT}3i9aCQ}ZcUUH?b>?{h&_a$6wLS$E60u3_oCTV;Cw3D632;mVH-zl&F~ z>JSede;yrvdJZ`+Vf()mHpB3sZ5w!P)TJuOq`)7+p4x*w``BE!u`Z!>Hz8tT*t8Fd z=((Rmp?}5}YAELrh*ZV6It_$+xRfD%2@Zb@J^c{&?9XPFR6L12_jt6uVkgKo;SXca z?h6yQ2v?8U*S_m=7BGN9vI}PGVW(DxlGFkQYyo}a$Jo~&27kQviaLC5{xFD%_syyf z{T4m<3peZ7lDj(AYOr-d+~81<^g6_?kQqpHhTTLFqF7gOr<*8(uQbrx~B> zb9s`MFMvqx$@zADKS;sLL1Njwu5rS)h&Is+RAStfvX1?A?iZ*kV=h@lq*-3#j52R~ zdM{Eq9$r@`m$_IIqTw-K8Lq}LSF?d>9zjw4Hh`Y_DQYrc(%}dRlR;Yq>qmJ_a|wz9 zIa-FGIwm4{4vFM6ryy#DEW&f=#?Y*k1+^_fGotwf1kw^z{|#G%9ZfFa77GMBmP9K8 zvc%<-48cIgNm`g79SFf-8atds+5)_lWh57Xrz{y1u!0smg25Czl~|xt%vR+@e}L7= z1b)%OwEIZbf+$M?wE{&CoAXLc=5)mE#ba1_MmaBB!}AY7KC( zC8s`;&?5%e4~*ByX(1FbJZga75Xj@fVA{6igdiX(`=qq_zcN7KO)-0PJaGUhLTlwn z${rwN@6w7H6@c;+m!np?HSgVsm1ESoDDq5fq6iNju5-OD-QdJOy z2Y9Ja0ToaQDo~KPmy40Gf$4>awb{ZV|hPm zv@iRz-~Q)6|M~wp0ucXs2S5dQFYpoIO+XhLi#gya;QIvnGdo(Y6>mC?N#)Q3d=Yp6 zxZcUxcys~RI|q?D3T&$%JAeTyz!BgsU=tf1E1Qyu(p~m^;cHT`Jz=`6xE(0amP0aD z!k#M{-~%j#e+z-zmPAfl4k!Q}Snf2y8@ZIW9EZko&@4&FZ8?{UGlnI!0aF4gf`pgIu%I#6I@kzA zS{m$9Ns!G=bi9-&K^7DUyOHW^pn5gZc@WBbk>b`Rf>a}DjKShbbpALx_YbJQ2(|%Y zS`t~NJ5KXZBD@@O@ieb1zvvZ8{YdZIk*)7Ss)wM^>m6;{7>3zr(aB$+vrj`(ccQL{ zrVtNyqLEq42vRU5r1v^x$L&bhwIBsDApuf;C0u-D%MIw%@3AA_g@xx^kf+vk7qc!( z%$~b32fm7Qzro45BEn5b|IGvkA3(Of8zcnu^0x++wGw2Zv=g)MK4izo-4AOil>?al zUq-gy=A^H)2vP{QVD{XD^t}%xWJM_SxagFD4+4@0LH;?%?79=_dk-M2C}B5d_otEG zw*s1fL8v0VHz3FT~RIdTGc@(5jdIf1x4#?aeoA?(Pv(W%EE8pC0V(6JXYa0@bUE0{9ANblQV^cXCj0x@}sAcdgQRm+$n zzUbm0cJLl_^m`DUB?Yh%%pb=NeFZ!G4X`!5Dep$QUzfKfrpQantLqxPN#@bvucI@6 z1&n)^Ab}I3BM+jJkK&Dl$mYXfN;wjw3SEbwumxXq`U&*hZ+UqH;#qX`m|K3{RIhSH zBxp_qAxP&T|9?#*bn;g&ia`GF?xge2qv!vKFH-13DhEJq9t5TNhw?5!Jaf+}bnc(t z-^bR`nJ2+EysPW9Xw;kt3cH{*fHw=rT~hYmWkg`%g#R*=z~w|F%z+>UOh<Yn!tq-G((M-n=OcBtvk01#;kg&(UJ9s%opf(|kps<>g2yz&Z&|47E1fbb>%4i&K z!d{RuMpMAv+4%#G9ZaKb3TLl$A&GR4B%HBLb#O4#;Z+87OQeJL2jaZ<&fMo9XP}+?*$pUDS2SEZ!9gU~`i@3_GKqO-^x(P~scoR*4Mu4ob zAd&P;6-{Is*${O3CsMWUY$e6*_@a$5u#LP#(1k1=Ko>z$+3$at6a!t?x)Zt=wg!!} zIZD#Di7x&JH1=2Zd<2ogbSgXrQA-cyFLYlEz3*N#J%ibc62fn!0NV==$CxTp9&pe4g z;wBJg@8{EAl3FJOjnhvt=@4Mw7a+?ZAfAEQXF!v@O*LXSu95AxKw+DI|G58VO!X>s z^4IAy)yPGa^c;4tx=qQhhB_z1m4mF(3h% zv5}jt5zpmN5Tpg;#81-MRH2t_$Q8FI^un_)iV?}_SxgL?z9t7Kt4chBo_z?SNg$_! z95%v^e8;_XxoT*Pj{Y#6e2C=yG%v=DlXd7Q)X%W;D0=>J?8t+l5s(8xUI}~lDeUPl zL1ScP$-jy-}saR>Iy{m`6h zft);CW)b6BB0BbC^!y*(`_j_$7U+IGQtSs)0aIEU3F$ozi09Gz5IX%Aca(8evaN#z zEyy{N6G09E5%;g_x!<^*hp-#z*bAi{>7h03K?KxBuC5`Pa7#!VXVXrBCLn=(T0$hK z#jzH5HT>^z;GX5Bl0L1*PLxPS^K;v0Spln#fYuCly3oQTod|ZOfHnn$^^1Tu49RF2 zts8s@edHwLCG1oI=}ZXvBBYW)psX7du!1fIB;!SNK5Wr0W>Y!o1z6Czkhm6Lsxi`G zL6r4?T7g=CT?il+vfz?*=G(!_`b5Y~m{pEL*f1Di&O^?|#HcmE(``A+waxXU0geH) zm&j=&)G&P006!;@hm!G$dRIbn6kZFn`T-7 zqDS_lR(fOV07*qo IM6N<$f@dn7od5s; literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/hash.png b/public/images/emoji/twitter/hash.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..5309b3d0c973d660393e300c3d86c9700718c151 100644 GIT binary patch literal 503 zcmV9D!~g&Prpe@rx!lO!?{TTruZn#@U&$OnFC@c;k-26R$R zQvj091}iOgWtfxz00DDJL_t(|UftF|PC`Kt2JkUnz(nH_sPzao_BQqsGV(_#9YnCi z=LOJbVF{i93wyD##l{+A;vpnovW0w^-3=vEO!NKn@{*ZsMnq038ma1@EbCAcwJWk+ zNulb2Y-zG~qbx;s1-vYZp2Z2 ziO{cN2yxTw+C_*5su$=ELVTloZg%OS5PzDzxd`!C^#$EQA-*>ox+uiAW+Mmv6h$#H zdoGF@`V%8<&+LEo7mVt*S|dhHLc=w`)LH$fo-)!_Sw1c!^ln*}Q$p?%FhYzah#pXNqT$_Tj t&XBx=<~WUNSw~jZxt4eMi5w+Q$UprAGelA=EpY$<002ovPDHLkV1kFa+ynps literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/keycap_star.png b/public/images/emoji/twitter/keycap_star.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..2bfefce2bec98cf4d9672b4c7caf5ac88b623200 100644 GIT binary patch literal 414 zcmV;P0b%}$P)CWGYhXiIivUEj4|eHmVcq_#CRR$M8_VwV9<5Eh+K8fp(}IB zp-VI4P-b$4{uuNOJWyx=EQR3pv!MCwA#~RzpdRf$G@+7EF~D{^Xg&a=fNlVkV}uF^ zU@4#;UiT4N1-259Lr}YgCIpoNS|iAI;q->mH{D{RG8_&Yy~q+g;e(n~#rs31PPS#? z_L=fA-Me?c(U5?It>*J7SV=9>*8BLI3~&07*qo IM6N<$f~v!^NB{r; literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/zero.png b/public/images/emoji/twitter/zero.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..f4244918d5b143d7e0f4c73467e838c6314533e9 100644 GIT binary patch literal 497 zcmVFE!#anZa{h(YPbRgJwc4H7uR-((~=;l z9U5A5gM|}dilj9{%3;W^kzZuZ{>TzYnaYwsWi)x&%?KfmkH}Hy`(j;Z z&cISG-7QD!WgR`7Ye(Enu5tTLrf7=3NTjr}^nf*5y+hS8Y*fe zpfOP;5iHpY&wr!*kQ|i@*C_y^c9?6s$)*93<)_YWD~sfbU3#lkvPhiRsh4zjS)_YW z&V2H+D1W@j@JTZua-Cv_B1Tdc)lNrbK3A{jsGI`Xh))55OvF64NKM2fK;(#I9MZI& zL_E~}s*pgbA2it7mycRD6*^Jc$md9%D(=yq&HoLLV%>M(c z_-fMqujKp1>iXaD`H$TD`uzQW*!-X1`!qZ}jsO4v3v^OWQ-1)DazXvk@ZqVy8V}wQ zA^-paYDq*vR9M61nA?)8AP_~pUjj-iD5L-Xp+^KFI$R9SL#obB9!#oO)oi*OBuTzj zd6uPV+6c96TkfiDs+5pW)u#CglWzY5*))(rs|#x&fKYQ_UNu5Q{NH`5p*xXE$%zu# zCa7nZZ_l8k8Gk||@*@QxoYEmR=%Gpls-J=?1*)EckOHCq5(Jd92{X2IkIW_v|0v;! zMuT7x82p1bi3c7Df(c)=#DSO`%@#^2pZ8~o0nvTv3TAjT0J4<`>@gg+bbE9TQ0)QH z%Rmwf;$onYJj*%2`=H%w=0g20Dn}vJc82_Is@{8h~bIKaT;v3 zr8BYR*mdVjC=NtqMuM6po*@#XNO+R*;O@pQ(mJ}4S^gBogSPB>qd0m5(mn?`H$XC> z@dOV+oi^wph#X!|i;va%4-u*`v>1s6u~QxyefL8URXziMM>cm6AT_alJ{|Yxr5D6c z1A(frhJQ~%aIJV)-L>lj(cd%S&h6F*+N*4~)Qc@7AIMf>;OZwH5V5Y2YfoxIAYw~V z?gphU5ZFNM4?v-*r8lQW@aG^jTXKfEwn-m||IQhiqqd`s24&8sX7pHCuyrLv5y=A) zo)!^&D*l(l6m)kvkAviy55 b`xgEI#vI72BPb-a00000NkvXXu0mjfx72oi diff --git a/public/images/emoji/win10/five.png b/public/images/emoji/win10/five.png index f8b21706dafc88efbb4754bffa421e3882838f3f..1e284bf610a8344dddb116cb9374c826f3cdff3f 100644 GIT binary patch delta 400 zcmV;B0dM}41*!v(B!4zgOjJbx0001Z*Ho9wY^Ks+p3X;)$IjvK|NsBz@c4MG*0$2= z!rJVe#NpcM^o6zBk-XjW`1`5L<$gpHUjP6BFG)l}RCodH*9CgSAP|P(4)zm#?|;}j ztCM{?kb1rYyfGv^?0qbn>`R~>+99Q{Gb507xXmweD1gmKA%6?LD1{dAIVqI3f*kmQ z6w2V!QV4v7Mj@Zhs*0qLUU|9WP@05Nhw4_4o`hnD)Fk9Ow4~^q3)Kul4cFx|1cAvZ zIi$eVj2O~bk)%)opSMCNVWq?L9rct9vKg<1g@{bRsU(BQh6W$h?Ys8^h^d|=D~I@z zuIC_!-ZBRz{(o)HKxGb!TfHMc2{EgI5G`bHl^CMbrRfz&9^^5nd$g~qw z1W-oLS4E@}&awgscM2rGBQ{0ycf^%Q0$GohoNyO04Q$y8AyN)Z(GKji#p9}02hSo) u#96-DiPMoz?zKZzzwf-ZLp!v0w0)+jl1C#}jB!2{FK}|sb0I`n?{9y$E0004VQb$4nuFf3k0000;P)t-sM{rC4 zw*LdF_W-s30kr-Aw*LXQ{{XiC0=NGLqVfQ?{{XiC@b>yq&HoLLz&YSSK-+%pC#sFmF0005gNklGX$Au^7ddBOT2^_{v;d5xApn|}s7&_|6O+rX)Azz!bI!H#E~fI#3q*hM6*S%(}{c$;Jq@A70JB@6)W1^4`M}2&0Hl?cS=oN^wgHk zfE|d62+!f09U@}3a9N5-xLRkg`sa`$Qu7JY-;X4uh=zdkY9c(%H^Mfm|+n-bVBqYUGN#M|fk~Wkm0hhJKMykH$1j-+M!rM?LligvM=< zxzLIp^$R0-6C@K-A|n*5LDU>%EJ&|U+kH&NsVM1?>WmB!4qdOjJbx0001Z*KDTJ!rJWf`1}9=|IXp?g|*tY(&^gi^hb}! zoy6f(m&>Wk<>&DDk-Xh_t=0)1bz%Sj0QE^kK~#7F?blUy1R)fJ;lNNA9ohe8<5ThE zo-X42@BJOD?ZVe8h%IPAUkJrr0$^E%3ht{-f;s?70yOZby?+4h@Tk-_LlIAkn<2xK z`c^1o5_FgZ9We)L33nw8;#oA)AfCl2LghT5ph1xX5+UP&6zIu-B#39R1`W!%FKZCb z;vr~I=YTY5JQYTN+NNP)t-sM{rC8 zsPzE0{{gZ50k{7Ew*LUO{{XiC0=NGFwf+FL{{XiC@b>yp&HoLK)1FQIO)BGsG z{|BJ(tK<8}>-ve?{Qds^-|_iGZFcnl000YgQchC<@MYTYiGQNF;Lb9;(JJ!*00H?) zL_t(o!{wN5lSLpD$1Tc3C6cc1|4FyHb`c%vHh1pM{&|7XZ_bm{$+C}Cnl`ME)O0QL0h|n?D{8IwSxos!1{dXr?sKHyFeWCxvUug2WwA z?e}a7%32M9M7U=#XmCB_A`T=CXWoHT6v!I1sUlNU>;hDrm9-Nh0aa(cPT8IiaR+=c zLpI(ja=^Y~XaLaU3{+0Yf>1Rw>1s&J5mvVR-IBS72<_5@`g0=bn~e;7nk#fZGgqH448dlyKi0x@XHz5^mkGLi%YDmkeA z7!b-5?M3qp__2kmAJ>+K{zk@b?Bg(9_ZuR!W9vJkaqK-B%{lJWjdo1elT8Q7m=q`N zNWN=CStD;#bbRXE>5So`?5*)%2NhP&ZkcVIRUX(1A(XeD+wA)W2rI?m@$FW;00000 LNkvXXu0mjfz^gp9 diff --git a/public/images/emoji/win10/hash.png b/public/images/emoji/win10/hash.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..7d06801e1f5114fd0b907561eec77b6d54fc4357 100644 GIT binary patch literal 464 zcmV;>0WbcEP)M)J8%T=oJbBAu;D}_ zotsLC=R{(79y}>gOUQO^KXC_A4jW)$L~{F*36VTHRxEH?!!x>mO(b4xVIKEBPLPR=-#}jsbP1HuxQkO(-t!cU_5+e2+*(K2&s>tgim<*a3 z&&r;ROl522m0ybV?vo_X&|4cHlsWl;qaZr;b5N5 zY^KtMwc1CI$Mg96c&*m9(&?$oI7vi7RCodH*9CTkFc5{|#)eD`-u@R` zZ|~EbNv2-@;{iV0?)F3(Z9DWu&<fKyYLd zAc2F{F{lQ*QL{r3)6KRK$Wo^?05PFhaxRh3HUKSH%)N{hj5IlvuoS<{B z2uVaiR9M61*xPc0AP@#%G1dbp3X3tm|BIG`n4n?;GM&uy_olVuH_HN{G0VO-d08Ta zilV4h8k5Q&tWz~8cNir9090qNY2Rm{fN}9;ZjzzuejA#hb)?2PQK52xc67P?8EiGf zL7bb^TqXdjQ-8Lk0$)tCK-E>KN(JEs!v7Q+1Se$T3@$Yr*hKCogk69%Lrm`E5etDJ zPFN%a+&nMTZh{BrKm~8Zp~Vr;Cc`Ah3BiyVmvHXLp0}Y8-8n#rZ|=^ZSvlO9LVw3k zpoe~n?r7Kk0OGrc41EqY`zg~84f}$~90r+I?>n@)xqtnH+(T?T3OZeY*k*N#1duk& zTBlbaVSarJ)yK<-JG*X%7zke0Bh!7J=u%i1gqN+)m{_KZ+5rbb&*>(%o;b+vh-F_; z91USQujR1UxjcgEGe{Pt4k9jEcTq$@$Ezy^#J>}Q6Q~G*Z~};=gr)=#ct89DA-X*> zVcn7=H)@0001DGedO%001*kOjJbx0001Z*GG@XY^Kswm&=8<+VlAP z|NsBa;qZ8^*23EC=kWNQ#NoEm>0qADk-Xih%jFeg?JfWS0C-76K~#7F?bp=-Lm>b| z(c<=O|7Gj$Ee^Q@obP1yU5I!F2v7=$vP;|p5>j2I>A#Rsw^`YLA*b%*e?sa$mK$=R zpdl1Q#!wKMhHaxCbcq211PBlyK!5)7y000DMK}|sb0I`n?{9y$E0004VQb$4nuFf3k z0000mP)t-sM{rC5wEhLA^Z>U10kr-Aw*LaQ{{XfB0Ji_|_WDoF{|%4iFvS0I)cv91 z`^D<};?4P-00008bW%=J0Nehkz<=;Mio8%n0004tNklZ zp;YG^M95M}-6M2x6r|QsM1rFZ?h*x`l(ep%i>nEO;F>RxgovwxI*U-cIyiW_zDO@G zca&KCkI9d_2kz~Wq+D~-+*Z|kqr6cmk5kok{Se@wH8eXA20`E?#)BF)$B+UB>Wrdg z%gI7;M2rk6=zq=$!Y~9n-yCqVNKk=?_6RER&?!L+(;(|j0NMD9i|#SL;uZdc`KXKe z$chYG6N_vC)TRc1#8F|gqJ9i9YuCZ}`x4{l>;-=R1U@1$1<`Fj$QMK&7unMxO?0IB z$xkmB!(Sn7wj*ir3uDH}{)foV6EXWK;fgjBQIU6~rhi58yC4B|b3+|2>h!`0S;1=t z^6@BMI$^V|ha7~d)~@8uLiHBlt-&{l*tGl@al z5NTII=?1yyw4o^}u8WXCvWg7!8$}^M+=mN_iiVq!K}peksRY5&uoIKl_J=d9l&evz mR%wvbRUK7bZ?^Jn41WNm`KH@bo~Dxk0000GY|~<*buO&;S4c_DMuRRCodH*9UTfPyj{I{NBH^|HYc# zlRM9`m$!g37Z8w#`?Q%IcZcrKp&{%3ncoTuG5x#jb;u@KEPpao6RycnW+?9qiZaw0 z>M|4<8Zu-WIn(Hn@vHV@>t7cQAXu3nL1ibXLeMslPY|R-9K;X>?ErNQ(jmt|I+Qtx zAw5WkI7o*E2kB7!fEJ@e6qLLUVNf-@Kr0TCp)xs0h8hPkqz5si2kDSc93(@PgBa3- z7}A4u$a0VlWls*0A%{T#=|KQ-P&T_j>rcq3(2hY2H9bg$vXLSFHCi3Q`(xSpqh@(= oa@iR&ezX?uAAWb}Vj delta 613 zcmV-r0-F8t0{#S$B!2{FK}|sb0I`n?{9y$E0004VQb$4nuFf3k0000yP)t-sM{rC4 zw*LUL{{XiC0Ji@Ew*LUO{{giA1*Y@>wg2z+`cTdP4UgnI$NwI_|J(5T{Qdrs-Tb=f z`*GC$6v57w0000AbW%=J06`l6necPl{<`jjJSzYI0m?~4L4Qghl8Ycp4x-*unl}88sFRdd zWa$7CJ5C2saQ7b}z_5ZCoD|b5yE=Tw><#NDtawGCM%X1MfT?cFj3>E(Bo_n=2>wAg z%|@-fwa%F&XMe3%SPoLoj6a_mtttcIc&vaj`Uy~!ak?Nib3q#28R+1MppEYOa7GbV zi$lY*DJK3|Qz;_F2AyzFxx>nrgXY2`8+2B%QqYA#WgvIB zqu)V8mg7@mnhlzpfdw|mT~w?DG$-bP4KkNb!}d5b5P!Df*%m4Q;dp*Fia_~*XrMVD z18k7b2Sfvzd_XHmWKX^4gVLrRkqsi$o(7^=O#(TB)f7;!e~>|nlobBOs!N-COo|ff_Do z9cpkvZC*uwWV=ug&{S*L`l;`4QTl1x4Oto)eh2kIu&m`e))d#G9(EI?7}8Dc9GZLE z9a6NTtKTMLqLc3l$T$ewW@5u8@lsoV@38L|i#t+_+&Ch@00000NkvXXu0mjf_pThM diff --git a/public/images/emoji/win10/six.png b/public/images/emoji/win10/six.png index 8e4b23b3ba0f5e024901a855f81b92be9de06001..8e8a805e87dec3d970a6bd0c9608fcbd36a0b106 100644 GIT binary patch delta 425 zcmV;a0apIx1;Yc7B!4+jOjJbx0001Z*KDTJ+UfNF|Npkq=~S1?oy6hu`1@d<&gby> zM~}yawc2>C*3RMZk-Xih%jLq_>^q3VvT~~C0003+NklP6ouhRKC&3% z{qOZ*t5fpKm2bKJ2SZ;h3Ve`tXO!L04gFfkZh+hMkjHBwYJVYz_fpnCbbz9QJZ4@4 z6)?>eS+Gqp*?XX)S+%@@S;anbf(ep9Rpt;9Opr4Qs7V|FROmFLfHDWRWew!Gfp(*S zB4*u>=6ubUAkH*<*b9&aVquaI0os+PpADSW%?gwgPHIL1 zu^5B{JAqjJz7x$FbaGAGZp0AF4ovs+*gCKP)t-sM{rC4 zw*LUO{{XZ90JZ-CxBmdP{{*P^0JZ-DwEY0K|L^trQO*Ajj^jzo|E%QuH^%>T)%+E_ z|Hte437hSY-2310`C!le{Qmyey!W*L000VfQchC+!bu32Ec;m%d8LH38mIP5 zr4`mHo2uAhD)qZyN>8IsKVdzYz!<$Tj}~LrrD;cM(m5Sd3v{b1)Mw#V@(haUKV~Jg zQ!XTgfod(Ng@1xd3o4-?Y(eZCpSRAQ=@<7}UiD6b8|llx;wb&*~+h5raWI zqNo=&0T7L|ItUUmyCVi?7Z!uR%FbbzWxEF-trVM9Bbv z;7b$7wSReU0s)YXfQ8c^0@>S<*!8+D0c72^td!0 z$S`PsDtUWt69%a*C&TAR6i974PN}4nhmWHi`rg-U-m-rK z!1$4^X{-C8PNCF8->+UPlgheR8ira4tH-NBKSfUcq8e`|NIIl6sfFabLDUlDU5K`$ yEe?}0)Ryn)jrJokGc7}?K~{Q{mKVP}?E3>}g0)T#uQH(k0000}7g;A(rzeHmY;ixhO1uUg%vE;^}3E#7`Qi=??JOuHAe*FdJ5r~hqBR*&{C~o${ zN+8}OtvDxyRI9bN?Ir>@$0OezeKC~TL6bwxIB-=-p_Z_Ol%-I_))7GkSaMm3A>ZHn zB!&#ST$VxseSawnA+lRZ1Su*GU3MJeW^EFA354%i-np102fJ=0vf%V}Xabi)R4SH)CAtn}oMc9> zY>&fI9D!oOQF`p|Zznr81Sx&u4BoT}+lplHCxca0Ix8K;j`H)Jmzq}UN0X+%?S1Wm c9_YNMS1+m~)Q zAPhyv!8?MW_Wysi+^n#a2*j?=LyykW=w2a`1LXDkVD(+sHAZivA)?yX(DVVMt6M_2 z7UL{KoDed2oLW&BEs{c2KBo|))mRYu2Ymv_ zl?x8Ug&cQnlz*3l)^Ys$(YS~N(B*{Wqc4S8c^ODY6l!5*AeEy{P?c)2Esn&CKmpU` z91Bt|V}oL75D{QV86aXpS|Weu_|axU;&_mNlJtilcxY7$$W|~xgKX(ZJjjkrph0$K zM~f{PrFfMB+hwiP>!? z$k{E!gTzyy$0AxE0y#g(`)W*{YMrmq9f<=C*L#LVuq!j5*&tmH(ro_p_HXwTs6>W% zJ)CsCw0{907gFNR)`8y8VisuQBp;;gY)iF&7-VJv6=IW83IU!*oM$)aW7cD!{y6vJ zw0BpqoV|g7KKR#1Z)Be5LdZPLd#-ho=4qO4VY9x?wQJJyx-~kasZ^x(T2XyfNK!#o zUC`2cw4W^?d`z&=OpyX-ZJT00000NkvXXu0mjfUL`_{ diff --git a/public/images/emoji/win10/two.png b/public/images/emoji/win10/two.png index 5a7e4819477bb5776e1a04cd8d8734dcbff7cdb9..da3eb230b73147b18dfad24c29fadc0196f963a8 100644 GIT binary patch delta 408 zcmV;J0cZZ!1+oK>B!4zgOjJbx0001Z*GG@Xg|*tY(&^gi^#A|=!rJVSyxmln%bmpG z^Z5Hjm3 zcZVF-hDn|OXq)82?ccS`{AXrD6Z#}bNTuN^+ANj<3FiT$!ha~Vc(_d*gA{bpVgNF& zfD#!}u$f4O7T8ImLBj7rnFcw)lzgLF5`;h1&ux(nwNRjh)p;GJfRds>uIt-~okW4m zS|P0C5S06A!-N8}MhaWjP0%qT>Yvl7Oj~ zag1w?gmxy5L#aC!sZc+Gv>1o1?*^U<^%E#C?vNQUF*PAV3ije11*&imM}W!^P)t-sM{rC4 zxBmdN{{XiC0JQ%Awf+FN{{XiC0JZ-FsrLZ2{{XiC@Adgn&HoLK_4xaCuk;=O000YgQchCrCJ0i%%`urJ%6^%rpB)@C{liY{%(r4tuRka z*WsTpjmu+A(^bWr(l#{!=h8;3FUWm%Tj zVt5p)FAmMaM`r1TDnDdCp+WNuNb2=W#nw5A8Eqw#0pWZgj;?UmK#>Dob=A-zZhJ?E zT$2PHQX9nRkk}wahuF6ul>n9Lkf1~M=96TI+q=zk^nb?Vhy}0g8;}lNMmHc9>{&YG z?leV)?AQ;I3dtedpk!!{%(SVHiZy759w{R>%s_;s9WgD55O+^F21Lk23zP<_c!822 z7JJ4fLheco7CHrT0~RSz97-Cn6ljht9a15a?CelO7 zrLU%LSAV0<-!nW5m)SPB=yspofj|%5m|GC@Iu|!g2m)!Y8+EmC4?=69)H|kUC3xV1 ze1;#6`)_<6y|SO=pIHv7z6G^pXy0C;I{OAf+G^C79-uk)M*6AGbf&T2mym0b`f(hm zsqaJI3wXFcGOfYW#?x*M&XL!SZ}b5N4M}*uPGnZ k=N?<-(q5);`SrcNe}9k4*HdM;zyJUM07*qoM6N<$f)MXbWdHyG diff --git a/public/images/emoji/win10/zero.png b/public/images/emoji/win10/zero.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..e5b08a12679d6c5f6aab36fe4844d361e752e51f 100644 GIT binary patch literal 458 zcmV;*0X6=KP)kfl?5IG7OcapaK&W87Neks0I;;2F%82 z$)y*7=z(f`ywS*wAOJNyz)Kc7BxwOC9SuQa6Cb1ob`Wb78-$i!@aE<1W@Cde89UzW zn3QY~Mw{Nnd|-pde#HoIL1;vzw<8)X2KjNeb3y(Z$o~+KJ^|_s*ReoF4*J>7)*l7x zwD?gMaYDLlCE~P*nsIBFOJ#8@Kp%ATEB90my2 zG+f@+Ko99t3C4#re@Df~C;75}{5I$pfwmaB2RN-JvglugFaQ7m07*qoM6N<$f(Q`F A8UO$Q literal 0 HcmV?d00001 From 29947f6e95d0d49297b37c410ade204270baf202 Mon Sep 17 00:00:00 2001 From: gotens1211 Date: Tue, 24 Jan 2017 22:27:37 +0530 Subject: [PATCH 0075/1355] Added margin to the video container in lazyYt plugin --- app/models/post_analyzer.rb | 26 -------------------- plugins/lazyYT/assets/stylesheets/lazyYT.css | 1 + 2 files changed, 1 insertion(+), 26 deletions(-) diff --git a/app/models/post_analyzer.rb b/app/models/post_analyzer.rb index 0b8d590b1c..913b5a81eb 100644 --- a/app/models/post_analyzer.rb +++ b/app/models/post_analyzer.rb @@ -12,36 +12,10 @@ class PostAnalyzer @found_oneboxes end -#to add margin between youtube links -def newlinereplace(*args) - sp = args[0].split(/\n+/) - a = 0 - x = 0 - replacem = [] - while a 0 - replacem[x] =sp[a] - x+=1 - end - if a!= sp.length-1 - replacem[x]="\n" - x+=1 - end - a+=1 - end - args[0]=replacem.join() - return *args -end - # What we use to cook posts def cook(*args) - yt_string = args[0] - if yt_string.include? "www.youtube" - *args = newlinereplace(*args) - end cooked = PrettyText.cook(*args) - result = Oneboxer.apply(cooked, topic_id: @topic_id) do |url, _| @found_oneboxes = true Oneboxer.invalidate(url) if args.last[:invalidate_oneboxes] diff --git a/plugins/lazyYT/assets/stylesheets/lazyYT.css b/plugins/lazyYT/assets/stylesheets/lazyYT.css index 732735138a..38d6bbff69 100644 --- a/plugins/lazyYT/assets/stylesheets/lazyYT.css +++ b/plugins/lazyYT/assets/stylesheets/lazyYT.css @@ -13,6 +13,7 @@ padding: 0 0 56.25% 0; overflow: hidden; background-color: #000000; + margin-bottom: 12px; } .lazyYT-container iframe { From 7518854ac2730d1924614072d9c240460bef19b4 Mon Sep 17 00:00:00 2001 From: gotens1211 Date: Tue, 24 Jan 2017 23:22:10 +0530 Subject: [PATCH 0076/1355] Cosmetic chnages removed --- app/models/post_analyzer.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/models/post_analyzer.rb b/app/models/post_analyzer.rb index 913b5a81eb..09f7cd9932 100644 --- a/app/models/post_analyzer.rb +++ b/app/models/post_analyzer.rb @@ -14,13 +14,14 @@ class PostAnalyzer # What we use to cook posts def cook(*args) - cooked = PrettyText.cook(*args) + result = Oneboxer.apply(cooked, topic_id: @topic_id) do |url, _| @found_oneboxes = true Oneboxer.invalidate(url) if args.last[:invalidate_oneboxes] Oneboxer.cached_onebox(url) end + cooked = result.to_html if result.changed? cooked end From 1da6fc8e3c539629e57750c45effa75e60c4095f Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Wed, 25 Jan 2017 11:56:39 +0800 Subject: [PATCH 0077/1355] UX: Highlight user's vote in polls. --- .../poll/assets/javascripts/widgets/discourse-poll.js.es6 | 5 +++-- plugins/poll/assets/stylesheets/common/poll.scss | 6 +++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6 b/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6 index 843278f700..60fc833e39 100644 --- a/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6 +++ b/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6 @@ -160,8 +160,9 @@ createWidget('discourse-poll-standard-results', { return ordered.map((option, idx) => { const contents = []; - const per = rounded[idx].toString(); + const chosen = attrs.vote.includes(option.id); + contents.push(h('div.option', h('p', [ h('span.percentage', `${per}%`), optionHtml(option) ]) )); @@ -178,7 +179,7 @@ createWidget('discourse-poll-standard-results', { })); } - return h('li', contents); + return h('li', { className: `${chosen ? 'chosen' : ''}` }, contents); }); } } diff --git a/plugins/poll/assets/stylesheets/common/poll.scss b/plugins/poll/assets/stylesheets/common/poll.scss index 8eba8781a8..d52c6e1429 100644 --- a/plugins/poll/assets/stylesheets/common/poll.scss +++ b/plugins/poll/assets/stylesheets/common/poll.scss @@ -107,7 +107,11 @@ div.poll { .bar { height: 10px; - background: $primary; + background: dark-light-diff($primary, $secondary, 50%, -25%);; + } + + .chosen .bar { + background: $tertiary; } } From d354a6f7a40e9746c957badb0d9ef5cf9a1287d5 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Wed, 25 Jan 2017 13:09:08 +0800 Subject: [PATCH 0078/1355] FIX: Incorrect parameter being passed to component. --- .../javascripts/discourse/templates/modal/history.hbs | 4 ++-- .../discourse/widgets/post-edits-indicator.js.es6 | 7 +------ app/controllers/posts_controller.rb | 2 +- config/locales/client.en.yml | 3 --- 4 files changed, 4 insertions(+), 12 deletions(-) diff --git a/app/assets/javascripts/discourse/templates/modal/history.hbs b/app/assets/javascripts/discourse/templates/modal/history.hbs index 9714e00409..4bd8c65e53 100644 --- a/app/assets/javascripts/discourse/templates/modal/history.hbs +++ b/app/assets/javascripts/discourse/templates/modal/history.hbs @@ -34,7 +34,7 @@ → {{bound-avatar-template model.user_changes.current.avatar_template "small"}} {{model.user_changes.current.username}} {{/if}} {{#if model.wiki_changes}} - — {{disabled-icon icon="pencil-square-o" secondary=wikiDisabled}} + — {{disabled-icon icon="pencil-square-o" disabled=wikiDisabled}} {{/if}} {{#if model.post_type_changes}} — {{disabled-icon icon="shield" disabled=postTypeDisabled}} @@ -59,7 +59,7 @@ {{/if}} {{#if model.wiki_changes}}
    - {{disabled-icon icon="pencil-square-o" secondary=wikiDisabled}} + {{disabled-icon icon="pencil-square-o" disabled=wikiDisabled}}
    {{/if}} {{#if model.post_type_changes}} diff --git a/app/assets/javascripts/discourse/widgets/post-edits-indicator.js.es6 b/app/assets/javascripts/discourse/widgets/post-edits-indicator.js.es6 index 531e439685..c4646ffc70 100644 --- a/app/assets/javascripts/discourse/widgets/post-edits-indicator.js.es6 +++ b/app/assets/javascripts/discourse/widgets/post-edits-indicator.js.es6 @@ -31,12 +31,7 @@ export default createWidget('post-edits-indicator', { if (attrs.wiki) { icon = 'pencil-square-o'; className = `${className} wiki`; - - if (attrs.version > 1) { - title = `${I18n.t('post.last_edited_on')} ${date}`; - } else { - title = I18n.t('post.wiki.about'); - } + title = `${I18n.t('post.last_edited_on')} ${date}`; } else { title = `${I18n.t('post.last_edited_on')} ${date}`; } diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index 054310d393..52618c5caf 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -394,7 +394,7 @@ class PostsController < ApplicationController post = find_post_from_params guardian.ensure_can_wiki!(post) - post.revise(current_user, { wiki: params[:wiki] }, { skip_revision: true }) + post.revise(current_user, { wiki: params[:wiki] }) render nothing: true end diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index ebdaee2776..d502aa3a1e 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -1753,9 +1753,6 @@ en: via_auto_generated_email: "this post arrived via an auto generated email" whisper: "this post is a private whisper for moderators" - wiki: - about: "this post is a wiki" - archetypes: save: 'Save Options' From 0a25df67bc44f0b5a08889dfc08ceae3c6e74164 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Wed, 25 Jan 2017 13:12:24 +0800 Subject: [PATCH 0079/1355] Revert "FIX: Incorrect parameter being passed to component." This reverts commit d354a6f7a40e9746c957badb0d9ef5cf9a1287d5. --- .../javascripts/discourse/templates/modal/history.hbs | 4 ++-- .../discourse/widgets/post-edits-indicator.js.es6 | 7 ++++++- app/controllers/posts_controller.rb | 2 +- config/locales/client.en.yml | 3 +++ 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/discourse/templates/modal/history.hbs b/app/assets/javascripts/discourse/templates/modal/history.hbs index 4bd8c65e53..9714e00409 100644 --- a/app/assets/javascripts/discourse/templates/modal/history.hbs +++ b/app/assets/javascripts/discourse/templates/modal/history.hbs @@ -34,7 +34,7 @@ → {{bound-avatar-template model.user_changes.current.avatar_template "small"}} {{model.user_changes.current.username}} {{/if}} {{#if model.wiki_changes}} - — {{disabled-icon icon="pencil-square-o" disabled=wikiDisabled}} + — {{disabled-icon icon="pencil-square-o" secondary=wikiDisabled}} {{/if}} {{#if model.post_type_changes}} — {{disabled-icon icon="shield" disabled=postTypeDisabled}} @@ -59,7 +59,7 @@ {{/if}} {{#if model.wiki_changes}}
    - {{disabled-icon icon="pencil-square-o" disabled=wikiDisabled}} + {{disabled-icon icon="pencil-square-o" secondary=wikiDisabled}}
    {{/if}} {{#if model.post_type_changes}} diff --git a/app/assets/javascripts/discourse/widgets/post-edits-indicator.js.es6 b/app/assets/javascripts/discourse/widgets/post-edits-indicator.js.es6 index c4646ffc70..531e439685 100644 --- a/app/assets/javascripts/discourse/widgets/post-edits-indicator.js.es6 +++ b/app/assets/javascripts/discourse/widgets/post-edits-indicator.js.es6 @@ -31,7 +31,12 @@ export default createWidget('post-edits-indicator', { if (attrs.wiki) { icon = 'pencil-square-o'; className = `${className} wiki`; - title = `${I18n.t('post.last_edited_on')} ${date}`; + + if (attrs.version > 1) { + title = `${I18n.t('post.last_edited_on')} ${date}`; + } else { + title = I18n.t('post.wiki.about'); + } } else { title = `${I18n.t('post.last_edited_on')} ${date}`; } diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index 52618c5caf..054310d393 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -394,7 +394,7 @@ class PostsController < ApplicationController post = find_post_from_params guardian.ensure_can_wiki!(post) - post.revise(current_user, { wiki: params[:wiki] }) + post.revise(current_user, { wiki: params[:wiki] }, { skip_revision: true }) render nothing: true end diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index d502aa3a1e..ebdaee2776 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -1753,6 +1753,9 @@ en: via_auto_generated_email: "this post arrived via an auto generated email" whisper: "this post is a private whisper for moderators" + wiki: + about: "this post is a wiki" + archetypes: save: 'Save Options' From efc21366aebc0309febbd8fdc9ab9321b1db7b98 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Wed, 25 Jan 2017 13:12:38 +0800 Subject: [PATCH 0080/1355] FIX: Incorrect parameter being passed to component. --- app/assets/javascripts/discourse/templates/modal/history.hbs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/discourse/templates/modal/history.hbs b/app/assets/javascripts/discourse/templates/modal/history.hbs index 9714e00409..4bd8c65e53 100644 --- a/app/assets/javascripts/discourse/templates/modal/history.hbs +++ b/app/assets/javascripts/discourse/templates/modal/history.hbs @@ -34,7 +34,7 @@ → {{bound-avatar-template model.user_changes.current.avatar_template "small"}} {{model.user_changes.current.username}} {{/if}} {{#if model.wiki_changes}} - — {{disabled-icon icon="pencil-square-o" secondary=wikiDisabled}} + — {{disabled-icon icon="pencil-square-o" disabled=wikiDisabled}} {{/if}} {{#if model.post_type_changes}} — {{disabled-icon icon="shield" disabled=postTypeDisabled}} @@ -59,7 +59,7 @@ {{/if}} {{#if model.wiki_changes}}
    - {{disabled-icon icon="pencil-square-o" secondary=wikiDisabled}} + {{disabled-icon icon="pencil-square-o" disabled=wikiDisabled}}
    {{/if}} {{#if model.post_type_changes}} From 781d83a46f2469c0e055c6c535822fa285870dce Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Wed, 25 Jan 2017 13:34:55 +0800 Subject: [PATCH 0081/1355] FIX: Toggling a post's wiki status should not skip revision. --- app/controllers/posts_controller.rb | 2 +- spec/controllers/posts_controller_spec.rb | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index 054310d393..52618c5caf 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -394,7 +394,7 @@ class PostsController < ApplicationController post = find_post_from_params guardian.ensure_can_wiki!(post) - post.revise(current_user, { wiki: params[:wiki] }, { skip_revision: true }) + post.revise(current_user, { wiki: params[:wiki] }) render nothing: true end diff --git a/spec/controllers/posts_controller_spec.rb b/spec/controllers/posts_controller_spec.rb index 41916d4d0e..8c8ba76a89 100644 --- a/spec/controllers/posts_controller_spec.rb +++ b/spec/controllers/posts_controller_spec.rb @@ -465,18 +465,21 @@ describe PostsController do expect(response).to be_forbidden end - it "toggle wiki status should not create a new version" do + it "toggle wiki status should create a new version" do admin = log_in(:admin) another_user = Fabricate(:user) another_post = Fabricate(:post, user: another_user) expect { xhr :put, :wiki, post_id: another_post.id, wiki: 'true' } - .to_not change { another_post.reload.version } + .to change { another_post.reload.version }.by(1) + + expect { xhr :put, :wiki, post_id: another_post.id, wiki: 'false' } + .to change { another_post.reload.version }.by(-1) another_admin = log_in(:admin) - expect { xhr :put, :wiki, post_id: another_post.id, wiki: 'false' } - .to_not change { another_post.reload.version } + expect { xhr :put, :wiki, post_id: another_post.id, wiki: 'true' } + .to change { another_post.reload.version }.by(1) end it "can wiki a post" do From ee396edd9c90bcdaac85547625bd576ce30cdb0f Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Wed, 25 Jan 2017 14:33:16 +0800 Subject: [PATCH 0082/1355] Add edit post button to post revision modal for wiki-ed posts. --- .../discourse/controllers/history.js.es6 | 10 +++++++ .../javascripts/discourse/routes/topic.js.es6 | 8 ++++-- .../discourse/templates/modal/history.hbs | 28 +++++++++++++++++-- app/serializers/post_revision_serializer.rb | 7 ++++- config/locales/client.en.yml | 7 +++-- test/javascripts/acceptance/topic-test.js.es6 | 24 ++++++++++++++++ 6 files changed, 75 insertions(+), 9 deletions(-) diff --git a/app/assets/javascripts/discourse/controllers/history.js.es6 b/app/assets/javascripts/discourse/controllers/history.js.es6 index e94852cf3e..b6e9a10377 100644 --- a/app/assets/javascripts/discourse/controllers/history.js.es6 +++ b/app/assets/javascripts/discourse/controllers/history.js.es6 @@ -109,6 +109,11 @@ export default Ember.Controller.extend(ModalFunctionality, { return !prevHidden && this.currentUser && this.currentUser.get('staff'); }, + @computed("model.wiki", "model.last_revision", "model.current_revision") + displayEdit(wiki, lastRevision, currentRevision) { + return wiki && (lastRevision === currentRevision); + }, + @computed() displayRevert() { return this.currentUser && this.currentUser.get('staff'); @@ -187,6 +192,11 @@ export default Ember.Controller.extend(ModalFunctionality, { hideVersion() { this.hide(this.get("model.post_id"), this.get("model.current_revision")); }, showVersion() { this.show(this.get("model.post_id"), this.get("model.current_revision")); }, + editWiki() { + this.get('topicController').send('editPost', this.get('post')); + this.send('closeModal'); + }, + revertToVersion() { this.revert(this.get("post"), this.get("model.current_revision")); }, displayInline() { this.set("viewMode", "inline"); }, diff --git a/app/assets/javascripts/discourse/routes/topic.js.es6 b/app/assets/javascripts/discourse/routes/topic.js.es6 index 9cda61f8d7..105d0e6ba0 100644 --- a/app/assets/javascripts/discourse/routes/topic.js.es6 +++ b/app/assets/javascripts/discourse/routes/topic.js.es6 @@ -72,8 +72,12 @@ const TopicRoute = Discourse.Route.extend({ showHistory(model) { showModal('history', { model }); - this.controllerFor('history').refresh(model.get("id"), "latest"); - this.controllerFor('history').set('post', model); + const historyController = this.controllerFor('history'); + + historyController.refresh(model.get("id"), "latest"); + historyController.set('post', model); + historyController.set('topicController', this.controllerFor('topic')); + this.controllerFor('modal').set('modalClass', 'history-modal'); }, diff --git a/app/assets/javascripts/discourse/templates/modal/history.hbs b/app/assets/javascripts/discourse/templates/modal/history.hbs index 4bd8c65e53..62e7f9b984 100644 --- a/app/assets/javascripts/discourse/templates/modal/history.hbs +++ b/app/assets/javascripts/discourse/templates/modal/history.hbs @@ -11,11 +11,25 @@ {{d-button action="loadNextVersion" icon="forward" title="post.revisions.controls.next" disabled=loadNextDisabled}} {{d-button action="loadLastVersion" icon="fast-forward" title="post.revisions.controls.last" disabled=loadLastDisabled}} +
    - {{d-button action="displayInline" label="post.revisions.displays.inline.button" title="post.revisions.displays.inline.title" class=inlineClass}} + {{d-button action="displayInline" + icon="square-o" + label="post.revisions.displays.inline.button" + title="post.revisions.displays.inline.title" + class=inlineClass}} {{#unless site.mobileView}} - {{d-button action="displaySideBySide" label="post.revisions.displays.side_by_side.button" title="post.revisions.displays.side_by_side.title" class=sideBySideClass}} - {{d-button action="displaySideBySideMarkdown" label="post.revisions.displays.side_by_side_markdown.button" title="post.revisions.displays.side_by_side_markdown.title" class=sideBySideMarkdownClass}} + {{d-button action="displaySideBySide" + icon="columns" + label="post.revisions.displays.side_by_side.button" + title="post.revisions.displays.side_by_side.title" + class=sideBySideClass}} + + {{d-button action="displaySideBySideMarkdown" + icon="columns" + label="post.revisions.displays.side_by_side_markdown.button" + title="post.revisions.displays.side_by_side_markdown.title" + class=sideBySideMarkdownClass}} {{/unless}}
    @@ -103,11 +117,19 @@ {{#if displayRevert}} {{d-button action="revertToVersion" icon="undo" label="post.revisions.controls.revert" class="btn-danger" disabled=loading}} {{/if}} + {{#if displayHide}} {{d-button action="hideVersion" icon="eye-slash" label="post.revisions.controls.hide" class="btn-danger" disabled=loading}} {{/if}} + {{#if displayShow}} {{d-button action="showVersion" icon="eye" label="post.revisions.controls.show" disabled=loading}} {{/if}} + + {{#if displayEdit}} + {{d-button action="editWiki" + icon="pencil" + label="post.revisions.controls.edit_wiki"}} + {{/if}} {{/d-modal-body}} diff --git a/app/serializers/post_revision_serializer.rb b/app/serializers/post_revision_serializer.rb index 8ff8b1826e..6fe950739d 100644 --- a/app/serializers/post_revision_serializer.rb +++ b/app/serializers/post_revision_serializer.rb @@ -23,7 +23,8 @@ class PostRevisionSerializer < ApplicationSerializer :body_changes, :title_changes, :user_changes, - :tags_changes + :tags_changes, + :wiki # Creates a field called field_name_changes with previous and @@ -95,6 +96,10 @@ class PostRevisionSerializer < ApplicationSerializer user.avatar_template end + def wiki + object.post.wiki + end + def edit_reason # only show 'edit_reason' when revisions are consecutive current["edit_reason"] if scope.can_view_hidden_post_revisions? || diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index ebdaee2776..086d188725 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -1888,17 +1888,18 @@ en: hide: "Hide revision" show: "Show revision" revert: "Revert to this revision" + edit_wiki: "Edit wiki" comparing_previous_to_current_out_of_total: "{{previous}} {{current}} / {{total}}" displays: inline: title: "Show the rendered output with additions and removals inline" - button: ' HTML' + button: 'HTML' side_by_side: title: "Show the rendered output diffs side-by-side" - button: ' HTML' + button: 'HTML' side_by_side_markdown: title: "Show the raw source diffs side-by-side" - button: ' Raw' + button: 'Raw' category: can: 'can… ' diff --git a/test/javascripts/acceptance/topic-test.js.es6 b/test/javascripts/acceptance/topic-test.js.es6 index ea8471d71c..dd9a9bdc20 100644 --- a/test/javascripts/acceptance/topic-test.js.es6 +++ b/test/javascripts/acceptance/topic-test.js.es6 @@ -48,3 +48,27 @@ test("Updating the topic title and category", () => { equal(find('.fancy-title').text().trim(), 'this is the new title', 'it displays the new title'); }); }); + +test("Marking a topic as wiki", () => { + server.put('/posts/398/wiki', () => { // eslint-disable-line no-undef + return [ + 200, + { "Content-Type": "application/json" }, + {} + ]; + }); + + visit("/t/internationalization-localization/280"); + + andThen(() => { + ok(find('a.wiki').length === 0, 'it does not show the wiki icon'); + }); + + click('.topic-post:eq(0) button.show-more-actions'); + click('.topic-post:eq(0) button.show-post-admin-menu'); + click('.btn.wiki'); + + andThen(() => { + ok(find('a.wiki').length === 1, 'it shows the wiki icon'); + }); +}); From 06c651f8c929727d6d2ea78197b1aec81506f53f Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Wed, 25 Jan 2017 17:47:13 +0800 Subject: [PATCH 0083/1355] FIX: Don't skip callbacks when rebaking posts. --- app/models/post.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/post.rb b/app/models/post.rb index 4667f93cfd..4670b6c075 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -454,7 +454,7 @@ class Post < ActiveRecord::Base new_cooked = cook(raw, topic_id: topic_id, invalidate_oneboxes: opts.fetch(:invalidate_oneboxes, false)) old_cooked = cooked - update_columns(cooked: new_cooked, baked_at: Time.new, baked_version: BAKED_VERSION) + self.update!(cooked: new_cooked, baked_at: Time.new, baked_version: BAKED_VERSION) # Extracts urls from the body TopicLink.extract_from(self) From 9dd09e453beaedefb01fe6c98ff524b7a4b074a9 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Wed, 25 Jan 2017 01:45:29 +0530 Subject: [PATCH 0084/1355] FEATURE: add explicit confirmation button to accept the invite --- app/controllers/invites_controller.rb | 16 ++++++++--- .../perform_accept_invitation.html.erb | 7 +++++ app/views/invites/show.html.erb | 6 ++++ config/locales/server.en.yml | 10 +++++-- config/routes.rb | 1 + spec/controllers/invites_controller_spec.rb | 28 +++++++++---------- 6 files changed, 46 insertions(+), 22 deletions(-) create mode 100644 app/views/invites/perform_accept_invitation.html.erb diff --git a/app/controllers/invites_controller.rb b/app/controllers/invites_controller.rb index 5b614bc3dc..7c539b46eb 100644 --- a/app/controllers/invites_controller.rb +++ b/app/controllers/invites_controller.rb @@ -7,10 +7,15 @@ class InvitesController < ApplicationController skip_before_filter :redirect_to_login_if_required before_filter :ensure_logged_in, only: [:destroy, :create, :create_invite_link, :resend_invite, :resend_all_invites, :upload_csv] - before_filter :ensure_new_registrations_allowed, only: [:show, :redeem_disposable_invite] - before_filter :ensure_not_logged_in, only: [:show, :redeem_disposable_invite] + before_filter :ensure_new_registrations_allowed, only: [:show, :perform_accept_invitation, :redeem_disposable_invite] + before_filter :ensure_not_logged_in, only: [:show, :perform_accept_invitation, :redeem_disposable_invite] def show + expires_now + render layout: 'no_ember' + end + + def perform_accept_invitation invite = Invite.find_by(invite_key: params[:id]) if invite.present? @@ -27,9 +32,12 @@ class InvitesController < ApplicationController return end end - end - redirect_to path("/") + redirect_to path("/") + else + flash.now[:error] = I18n.t('invite.not_found') + render layout: 'no_ember' + end end def create diff --git a/app/views/invites/perform_accept_invitation.html.erb b/app/views/invites/perform_accept_invitation.html.erb new file mode 100644 index 0000000000..cc4b0acc1e --- /dev/null +++ b/app/views/invites/perform_accept_invitation.html.erb @@ -0,0 +1,7 @@ +
    + <%if flash[:error]%> +
    + <%=flash[:error]%> +
    + <%end%> +
    diff --git a/app/views/invites/show.html.erb b/app/views/invites/show.html.erb index cc4b0acc1e..1fdd39e3ee 100644 --- a/app/views/invites/show.html.erb +++ b/app/views/invites/show.html.erb @@ -3,5 +3,11 @@
    <%=flash[:error]%>
    + <%else%> +

    <%= t 'activation.welcome_to', site_name: SiteSetting.title %>

    +
    + <%= button_to(perform_accept_invite_path, method: :put, class: 'btn btn-primary') do %> + <%= t 'invite.accept_invite' %> + <% end %> <%end%> diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 6c751415b7..eb2e54eed1 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -136,10 +136,17 @@ en: errors: <<: *errors + invite: + accept_invite: "Accept Invitation" + not_found: "Your invite token is invalid. Please contact the site's administrator." + bulk_invite: file_should_be_csv: "The uploaded file should be of csv format." error: "There was an error uploading that file. Please try again later." + topic_invite: + user_exists: "Sorry, that user has already been invited. You may only invite a user to a topic once." + backup: operation_already_running: "An operation is currently running. Can't start a new job right now." backup_file_should_be_tar_gz: "The backup file should be a .tar.gz archive." @@ -3243,9 +3250,6 @@ en: initial_post_raw: This topic includes daily performance reports for your site. initial_topic_title: Website performance reports - topic_invite: - user_exists: "Sorry, that user has already been invited. You may only invite a user to a topic once." - tags: title: "Tags" staff_tag_disallowed: "The tag \"%{tag}\" may only be applied by staff." diff --git a/config/routes.rb b/config/routes.rb index 11ae9d435f..3f1a5be6c7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -624,6 +624,7 @@ Discourse::Application.routes.draw do post "invites/disposable" => "invites#create_disposable_invite" get "invites/redeem/:token" => "invites#redeem_disposable_invite" delete "invites" => "invites#destroy" + put "invites/show/:id" => "invites#perform_accept_invitation", as: 'perform_accept_invite' resources :export_csv do collection do diff --git a/spec/controllers/invites_controller_spec.rb b/spec/controllers/invites_controller_spec.rb index be07bb7894..6c9ace61b2 100644 --- a/spec/controllers/invites_controller_spec.rb +++ b/spec/controllers/invites_controller_spec.rb @@ -123,15 +123,16 @@ describe InvitesController do end end - context '.show' do + context '.perform_accept_invitation' do context 'with an invalid invite id' do before do - get :show, id: "doesn't exist" + put :perform_accept_invitation, id: "doesn't exist" end it "redirects to the root" do - expect(response).to redirect_to("/") + expect(response).to be_success + expect(flash[:error]).to be_present end it "should not change the session" do @@ -144,11 +145,12 @@ describe InvitesController do let(:invite) { topic.invite_by_email(topic.user, "iceking@adventuretime.ooo") } let(:deleted_invite) { invite.destroy; invite } before do - get :show, id: deleted_invite.invite_key + put :perform_accept_invitation, id: deleted_invite.invite_key end it "redirects to the root" do - expect(response).to redirect_to("/") + expect(response).to be_success + expect(flash[:error]).to be_present end it "should not change the session" do @@ -160,10 +162,9 @@ describe InvitesController do let(:topic) { Fabricate(:topic) } let(:invite) { topic.invite_by_email(topic.user, "iceking@adventuretime.ooo") } - it 'redeems the invite' do Invite.any_instance.expects(:redeem) - get :show, id: invite.invite_key + put :perform_accept_invitation, id: invite.invite_key end context 'when redeem returns a user' do @@ -172,7 +173,7 @@ describe InvitesController do context 'success' do before do Invite.any_instance.expects(:redeem).returns(user) - get :show, id: invite.invite_key + put :perform_accept_invitation, id: invite.invite_key end it 'logs in the user' do @@ -193,18 +194,15 @@ describe InvitesController do it 'sends a welcome message if set' do user.send_welcome_message = true user.expects(:enqueue_welcome_message).with('welcome_invite') - get :show, id: invite.invite_key + put :perform_accept_invitation, id: invite.invite_key end it "doesn't send a welcome message if not set" do user.expects(:enqueue_welcome_message).with('welcome_invite').never - get :show, id: invite.invite_key + put :perform_accept_invitation, id: invite.invite_key end - end - end - end context 'new registrations are disabled' do @@ -214,7 +212,7 @@ describe InvitesController do it "doesn't redeem the invite" do Invite.any_instance.stubs(:redeem).never - get :show, id: invite.invite_key + put :perform_accept_invitation, id: invite.invite_key end end @@ -225,7 +223,7 @@ describe InvitesController do it "doesn't redeem the invite" do Invite.any_instance.stubs(:redeem).never - get :show, id: invite.invite_key + put :perform_accept_invitation, id: invite.invite_key end end end From bc4f443fdec4a70d8d3f74c03df3175ca7e46e0e Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Wed, 25 Jan 2017 21:23:25 +0530 Subject: [PATCH 0085/1355] typo --- lib/tasks/posts.rake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tasks/posts.rake b/lib/tasks/posts.rake index 8eb22e5afa..f451161d68 100644 --- a/lib/tasks/posts.rake +++ b/lib/tasks/posts.rake @@ -126,7 +126,7 @@ task 'posts:remap', [:find, :replace] => [:environment] do |_,args| puts "ERROR: Expecting rake posts:remap[find,replace]" exit 1 elsif !replace - confirm_replace = ask("Are you sure you want to remove all occurences of '#{find}'? (Y/n) ") + confirm_replace = ask("Are you sure you want to remove all occurrences of '#{find}'? (Y/n) ") exit 1 unless (confirm_replace == "" || confirm_replace.downcase == 'y') replace = "" end From 89d7ddd80372f80f47837f7fef386f194f67fd23 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Wed, 25 Jan 2017 21:50:21 +0530 Subject: [PATCH 0086/1355] FEATURE: new rake task to delete a word/string from all the posts --- lib/tasks/posts.rake | 55 ++++++++++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 17 deletions(-) diff --git a/lib/tasks/posts.rake b/lib/tasks/posts.rake index f451161d68..f0fe7f646f 100644 --- a/lib/tasks/posts.rake +++ b/lib/tasks/posts.rake @@ -116,22 +116,7 @@ task 'posts:normalize_code' => :environment do puts "#{i} posts normalized!" end -desc 'Remap all posts matching specific string' -task 'posts:remap', [:find, :replace] => [:environment] do |_,args| - require 'highline/import' - - find = args[:find] - replace = args[:replace] - if !find - puts "ERROR: Expecting rake posts:remap[find,replace]" - exit 1 - elsif !replace - confirm_replace = ask("Are you sure you want to remove all occurrences of '#{find}'? (Y/n) ") - exit 1 unless (confirm_replace == "" || confirm_replace.downcase == 'y') - replace = "" - end - - puts "Remapping" +def remap_posts(find, replace="") i = 0 Post.where("raw LIKE ?", "%#{find}%").each do |p| new_raw = p.raw.dup @@ -143,5 +128,41 @@ task 'posts:remap', [:find, :replace] => [:environment] do |_,args| i += 1 end end - puts "", "#{i} posts remapped!", "" + i +end + +desc 'Remap all posts matching specific string' +task 'posts:remap', [:find, :replace] => [:environment] do |_,args| + + find = args[:find] + replace = args[:replace] + if !find + puts "ERROR: Expecting rake posts:remap['find','replace']" + exit 1 + elsif !replace + puts "ERROR: Expecting rake posts:remap['find','replace']. Want to delete a word/string instead? Try rake posts:delete_word['word-to-delete']" + exit 1 + end + + puts "Remapping" + total = remap_posts(find, replace) + puts "", "#{total} posts remapped!", "" +end + +desc 'Delete occurrence of a word/string' +task 'posts:delete_word', [:find] => [:environment] do |_,args| + require 'highline/import' + + find = args[:find] + if !find + puts "ERROR: Expecting rake posts:delete_word['word-to-delete']" + exit 1 + else + confirm_replace = ask("Are you sure you want to remove all occurences of '#{find}'? (Y/n) ") + exit 1 unless (confirm_replace == "" || confirm_replace.downcase == 'y') + end + + puts "Processing" + total = remap_posts(find) + puts "", "#{total} posts updated!", "" end From 061c3dd6c1121492a16784cb63c82e52f578d9c3 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Wed, 25 Jan 2017 22:46:05 +0530 Subject: [PATCH 0087/1355] typo --- lib/tasks/posts.rake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tasks/posts.rake b/lib/tasks/posts.rake index f0fe7f646f..b6a696f111 100644 --- a/lib/tasks/posts.rake +++ b/lib/tasks/posts.rake @@ -158,7 +158,7 @@ task 'posts:delete_word', [:find] => [:environment] do |_,args| puts "ERROR: Expecting rake posts:delete_word['word-to-delete']" exit 1 else - confirm_replace = ask("Are you sure you want to remove all occurences of '#{find}'? (Y/n) ") + confirm_replace = ask("Are you sure you want to remove all occurrences of '#{find}'? (Y/n) ") exit 1 unless (confirm_replace == "" || confirm_replace.downcase == 'y') end From 396557bae9f5915cccdd76ad30489c66872cbbb8 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Wed, 25 Jan 2017 14:45:05 -0500 Subject: [PATCH 0088/1355] SECURITY: Prevent large onebox downloads, better timeout support --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 257959b86f..76dc704feb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -206,7 +206,7 @@ GEM omniauth-twitter (1.3.0) omniauth-oauth (~> 1.1) rack - onebox (1.7.5) + onebox (1.7.7) fast_blank (>= 1.0.0) htmlentities (~> 4.3.4) moneta (~> 0.8) From bed11dfa0e6319be5228687e78de4dacd92d3a93 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Thu, 26 Jan 2017 13:29:43 +0800 Subject: [PATCH 0089/1355] FIX: Polls permanently broken if post requires approval. --- app/models/queued_post.rb | 2 +- plugins/poll/plugin.rb | 27 ++++++++++++-- .../poll/spec/lib/new_post_manager_spec.rb | 35 +++++++++++++++++++ 3 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 plugins/poll/spec/lib/new_post_manager_spec.rb diff --git a/app/models/queued_post.rb b/app/models/queued_post.rb index 03db2e8001..e1736c8548 100644 --- a/app/models/queued_post.rb +++ b/app/models/queued_post.rb @@ -78,7 +78,7 @@ class QueuedPost < ActiveRecord::Base # Do sidekiq work outside of the transaction creator.enqueue_jobs - DiscourseEvent.trigger(:approved_post, self) + DiscourseEvent.trigger(:approved_post, self, created_post) created_post end diff --git a/plugins/poll/plugin.rb b/plugins/poll/plugin.rb index 5a193b1ace..026a229682 100644 --- a/plugins/poll/plugin.rb +++ b/plugins/poll/plugin.rb @@ -247,11 +247,11 @@ after_initialize do end end - validate(:post, :validate_polls) do + validate(:post, :validate_polls) do |force=nil| return if !SiteSetting.poll_enabled? && (self.user && !self.user.staff?) # only care when raw has changed! - return unless self.raw_changed? + return unless self.raw_changed? || force validator = DiscoursePoll::PollsValidator.new(self) return unless (polls = validator.validate_polls) @@ -268,6 +268,29 @@ after_initialize do true end + NewPostManager.add_handler(1) do |manager| + post = Post.new(raw: manager.args[:raw]) + + if !DiscoursePoll::PollsValidator.new(post).validate_polls + result = NewPostResult.new(:poll, false) + + post.errors.full_messages.each do |message| + result.errors[:base] << message + end + + result + else + manager.args["is_poll"] = true + nil + end + end + + on(:approved_post) do |queued_post, created_post| + if queued_post.post_options["is_poll"] + created_post.validate_polls(true) + end + end + Post.register_custom_field_type(DiscoursePoll::POLLS_CUSTOM_FIELD, :json) Post.register_custom_field_type(DiscoursePoll::VOTES_CUSTOM_FIELD, :json) diff --git a/plugins/poll/spec/lib/new_post_manager_spec.rb b/plugins/poll/spec/lib/new_post_manager_spec.rb new file mode 100644 index 0000000000..8f1a843d0b --- /dev/null +++ b/plugins/poll/spec/lib/new_post_manager_spec.rb @@ -0,0 +1,35 @@ +require 'rails_helper' + +describe NewPostManager do + let(:user) { Fabricate(:newuser) } + let(:admin) { Fabricate(:admin) } + + describe 'when new post containing a poll is queued for approval' do + it 'should render the poll upon approval' do + params = { + raw: "[poll]\n* 1\n* 2\n* 3\n[/poll]", + archetype: "regular", + category: "", + typing_duration_msecs: "2700", + composer_open_duration_msecs: "12556", + visible: true, + image_sizes: nil, + is_warning: false, + title: "This is a test post with a poll", + ip_address: "127.0.0.1", + user_agent: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36", + referrer: "http://localhost:3000/", + first_post_checks: true + } + + expect { NewPostManager.new(user, params).perform } + .to change { QueuedPost.count }.by(1) + + queued_post = QueuedPost.last + queued_post.approve!(admin) + + expect(Post.last.custom_fields[DiscoursePoll::POLLS_CUSTOM_FIELD]) + .to_not eq(nil) + end + end +end From 43a8a7c812f5790d023b589051d78a7778c5ecc5 Mon Sep 17 00:00:00 2001 From: Jeff Atwood Date: Thu, 26 Jan 2017 00:02:19 -0800 Subject: [PATCH 0090/1355] de-emphasize display mode buttons on revision view --- app/assets/stylesheets/desktop/history.scss | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/app/assets/stylesheets/desktop/history.scss b/app/assets/stylesheets/desktop/history.scss index 5becce0f32..bc228aa02c 100644 --- a/app/assets/stylesheets/desktop/history.scss +++ b/app/assets/stylesheets/desktop/history.scss @@ -1,10 +1,7 @@ // styles that apply to the popup that appears when you show the edit history of a post .modal.history-modal { - .btn { - // remove transitions on the buttons in the history modal - transition: none; - } + .modal-inner-container { min-width: 960px; min-height: 500px; @@ -21,6 +18,14 @@ } #display-modes { text-align: right; + .btn { + background-color:inherit; + color: dark-light-diff($primary, $secondary, 50%, -50%); + } + .btn-primary { + color: $primary; + font-weight: bold; + } } #revision-details { padding: 5px; From 8ab327665f24b61a90eebcb15d03b09a90152201 Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Thu, 26 Jan 2017 12:09:35 -0500 Subject: [PATCH 0091/1355] Update translations --- config/locales/client.bs_BA.yml | 37 ++++++++ config/locales/client.da.yml | 13 +++ config/locales/client.es.yml | 17 ++-- config/locales/client.fi.yml | 75 +++++++++-------- config/locales/client.fr.yml | 24 ++++-- config/locales/client.he.yml | 13 +-- config/locales/client.it.yml | 21 +++-- config/locales/client.ko.yml | 23 +++++ config/locales/client.pl_PL.yml | 8 +- config/locales/client.ru.yml | 20 ++++- config/locales/client.zh_TW.yml | 28 ++++--- config/locales/server.fi.yml | 84 +++++++++++-------- config/locales/server.fr.yml | 36 +++++++- config/locales/server.he.yml | 13 +-- config/locales/server.it.yml | 1 + config/locales/server.ru.yml | 44 ++++++++-- config/locales/server.zh_CN.yml | 2 +- config/locales/server.zh_TW.yml | 13 ++- plugins/poll/config/locales/client.bs_BA.yml | 24 ++++++ plugins/poll/config/locales/client.ur.yml | 63 +++++++++++++- plugins/poll/config/locales/server.ur.yml | 6 +- .../lib/discourse_imgur/locale/server.ur.yml | 6 +- 22 files changed, 436 insertions(+), 135 deletions(-) diff --git a/config/locales/client.bs_BA.yml b/config/locales/client.bs_BA.yml index c99081e1dc..440a5a3e65 100644 --- a/config/locales/client.bs_BA.yml +++ b/config/locales/client.bs_BA.yml @@ -40,6 +40,7 @@ bs_BA: long_date_with_year_without_time: "MMM D, 'YY" long_date_without_year_with_linebreak: "MMM D
    LT" long_date_with_year_with_linebreak: "MMM D, 'YY
    LT" + wrap_ago: "%{date} prije" tiny: half_a_minute: "< 1m" less_than_x_seconds: @@ -126,6 +127,7 @@ bs_BA: disabled: 'sklonjen %{when}' topic_admin_menu: "topic admin actions" emails_are_disabled: "Sve odlazeće email poruke su globalno onemogućene od strane administratora. Niti jedna notifikacija bilo kakve vrste neće biti poslana." + bootstrap_mode_disabled: "Bootstrap mod će biti ugašen u sljedećih 24 sata." edit: 'izmjeni naslov i kategoriju ove teme' not_implemented: "That feature hasn't been implemented yet, sorry!" no_value: "Ne" @@ -282,6 +284,8 @@ bs_BA: title: "Korisnici" likes_given: "Dato" likes_received: "Primljeno" + topics_entered: "Pregledano" + topics_entered_long: "Pregledano tema" time_read: "Pročitano puta" topic_count: "Teme" topic_count_long: "Kreirano Temi" @@ -296,8 +300,41 @@ bs_BA: one: "%{count} korisnik" few: "%{count} korisnika" other: "%{count} korisnika" + group_histories: + actions: + change_group_setting: "Promjeni grupne postavke" + add_user_to_group: "Dodaj korisnika" + remove_user_from_group: "Ukloni korisnika" + make_user_group_owner: "Napravi vlasnika" + remove_user_as_group_owner: "Ukloni vlasnika" groups: + logs: + title: "Logovi" + when: "Kad" + action: "Akcija" + acting_user: "Trenutni korisnik" + target_user: "Ciljani korisnik" + subject: "Subjekt" + details: "Detalji" + from: "Od" + to: "Za" + edit: + title: 'Edituj Grupu' + full_name: 'Puno ime' + add_members: "Dodaj Članove" + delete_member_confirm: "Ukloni '%{username}' iz '%{group}' grupe?" + request_membership_pm: + title: "Zahtjev za članstvom" + body: "Želio bi da apliciram u članstvo @%{groupName}." + name_placeholder: "Ime grupe, bez razmaka, ista pravila kao za korisničko ime" add: "Dodaj" + join: "Pridruži se grupi" + leave: "Napusti grupu" + request: "Zahtjevaj pristup grupi" + automatic_group: Automatska grupa + closed_group: Zatvorena grupa + is_group_user: "Vi ste član ove grupe" + membership: "Članstvo" selector_placeholder: "Dodaj članove" owner: "vlasnik" visible: "Grupa je vidljiva svim korisnicima" diff --git a/config/locales/client.da.yml b/config/locales/client.da.yml index 6ea55ddc40..df1ab54745 100644 --- a/config/locales/client.da.yml +++ b/config/locales/client.da.yml @@ -136,6 +136,7 @@ da: enabled: 'listet %{when}' disabled: 'aflistet %{when}' topic_admin_menu: "administrationshandlinger på emne" + wizard_required: "Det er tid til at konfigurere dig forum! Start Konfigurations Guiden!" emails_are_disabled: "Alle udgående emails er blevet deaktiveret globalt af en administrator. Ingen emailnotifikationer af nogen slags vil blive sendt." bootstrap_mode_enabled: "For at gøre det nemmere at lancere dit nye website, er du i bootstrap tilstand. Alle nye brugere vil blive tildelt niveau 1 og daglige email updateringer vil være slået til. Dette vil blive automatisk slået fra når total antal brugere overskrider %{min_users} brugere." bootstrap_mode_disabled: "Bootstrap tilstand vil blive deaktiveret indenfor de næste 24 timer." @@ -320,7 +321,19 @@ da: total_rows: one: "1 bruger" other: "%{count} brugere" + group_histories: + actions: + change_group_setting: "Skift gruppe indstilling" + add_user_to_group: "Tilføj bruger" + remove_user_from_group: "Fjern bruger" + make_user_group_owner: "Gør til ejer" + remove_user_as_group_owner: "Fjern ejer" groups: + logs: + title: "Logs" + when: "Når" + action: "Handling" + acting_user: "Fungerende bruger" add: "Tilføj" selector_placeholder: "Tilføj medlemmer" owner: "ejer" diff --git a/config/locales/client.es.yml b/config/locales/client.es.yml index f8596ce4d8..9ddf067614 100644 --- a/config/locales/client.es.yml +++ b/config/locales/client.es.yml @@ -271,7 +271,7 @@ es: reject: 'Rechazar' delete_user: 'Eliminar usuario' title: "Necesita aprobación" - none: "No hay posts para revisar" + none: "No hay posts para revisar." edit: "Editar" cancel: "Cancelar" view_pending: "ver posts pendientes" @@ -312,7 +312,7 @@ es: topic_count: "Temas" topic_count_long: "Temas creados" post_count: "Respuestas" - post_count_long: "Posts escritos" + post_count_long: "Respuestas publicadas" no_results: "No se encontraron resultados." days_visited: "Visitas" days_visited_long: "Días visitados" @@ -623,7 +623,7 @@ es: instructions: "Imágenes de fondo serán centrados y tendrán un ancho por default de 590px." email: title: "E-mail" - instructions: "Nunca se mostrará públicamente" + instructions: "nunca se mostrará al público" ok: "Te enviaremos un email para confirmar" invalid: "Por favor, introduce una dirección de correo válida" authenticated: "Tu dirección de correo ha sido autenticada por {{provider}}" @@ -633,13 +633,13 @@ es: other: "Sólo te enviaremos si no te hemos visto en los últimos {{count}} minutos." name: title: "Nombre" - instructions: "Tu nombre completo (opcional)" + instructions: "tu nombre completo (opcional)" instructions_required: "Tu nombre completo" too_short: "Tu nombre es demasiado corto" ok: "Tu nombre es válido" username: title: "Nombre de usuario" - instructions: "Debe ser único, sin espacios y conciso" + instructions: "único, sin espacios y corto" short_instructions: "Los demás usuarios pueden mencionarte como @{{username}}" available: "Tu nombre de usuario está disponible" global_match: "La dirección coincide con la del nombre de usuario registrado" @@ -757,7 +757,7 @@ es: same_as_username: "Tu contraseña es la misma que tu nombre de usuario." same_as_email: "Tu contraseña es la misma que tu dirección de correo electrónico." ok: "Tu contraseña es válida." - instructions: "Debe contener al menos %{count} caracteres." + instructions: "debe tener al menos %{count} caracteres" summary: title: "Resumen" stats: "Estadísticas" @@ -1530,6 +1530,7 @@ es: edit: "Editando {{link}} {{replyAvatar}} {{username}}" edit_reason: "Motivo:" post_number: "post {{number}}" + wiki_last_edited_on: "wiki editada por última vez" last_edited_on: "post editado por última ven en" reply_as_new_topic: "Responder como tema enlazado" continue_discussion: "Continuando la discusión desde {{postLink}}:" @@ -2679,7 +2680,7 @@ es: revoke_admin: "revocar administración" grant_moderation: "conceder moderación" revoke_moderation: "revocar moderación" - backup_operation: "operación de copia de seguridad de respaldo" + backup_create: "crear copia de seguridad" deleted_tag: "etiqueta eliminada" renamed_tag: "etiqueta renombrada" revoke_email: "revocar email" @@ -2688,6 +2689,8 @@ es: activate_user: "activó a un usuario" deactivate_user: "desactivó a un usuario" change_readonly_mode: "cambio a modo de sólo lectura" + backup_download: "descargar copia de seguridad" + backup_destroy: "destruir copia de seguridad" screened_emails: title: "Correos bloqueados" description: "Cuando alguien trata de crear una cuenta nueva, los siguientes correos serán revisados y el registro será bloqueado, o alguna otra acción será realizada." diff --git a/config/locales/client.fi.yml b/config/locales/client.fi.yml index a37bce8f29..74845d54a5 100644 --- a/config/locales/client.fi.yml +++ b/config/locales/client.fi.yml @@ -168,7 +168,7 @@ fi: admin_title: "Ylläpito" flags_title: "Liput" show_more: "näytä lisää" - show_help: "ohjeet" + show_help: "valinnat" links: "Linkit" links_lowercase: one: "linkki" @@ -337,6 +337,8 @@ fi: target_user: "Kohdekäyttäjä" subject: "Aihe" details: "Yksityiskohdat" + from: "Lähettäjä" + to: "Vastaanottaja" edit: title: 'Muuta ryhmää' full_name: 'Täysimittainen nimi' @@ -622,7 +624,7 @@ fi: instructions: "Taustakuvan leveys on 590 pikseliä." email: title: "Sähköposti" - instructions: "Ei tule julkiseksi" + instructions: "ei näytetä julkisesti missään" ok: "Lähetämme sinulle sähköpostin varmistukseksi." invalid: "Sähköpostiosoite ei kelpaa." authenticated: "{{provider}} on todentanut sähköpostiosoitteesi" @@ -632,13 +634,13 @@ fi: other: "Lähetämme sähköpostia vain, jos emme ole nähneet sinua edellisen {{count}} minuutin aikana." name: title: "Nimi" - instructions: "Koko nimesi (valinnainen)" + instructions: "koko nimesi (valinnainen)" instructions_required: "Koko nimesi" too_short: "Nimesi on liian lyhyt" ok: "Nimesi vaikuttaa hyvältä" username: title: "Käyttäjätunnus" - instructions: "Uniikki, lyhyt, ei välilyöntejä" + instructions: "uniikki, ei välilyöntejä, lyhyt" short_instructions: "Muut käyttäjät voivat viitata sinuun nimellä @{{username}}" available: "Käyttäjätunnus on vapaana" global_match: "Sähköposti vastaa rekisteröityä käyttäjänimeä" @@ -756,7 +758,7 @@ fi: same_as_username: "Salasanasi on sama kuin käyttäjätunnuksesi." same_as_email: "Salasanasi on sama kuin sähköpostisi." ok: "Salasana vaikuttaa hyvältä." - instructions: "Vähintään %{count} merkkiä." + instructions: "vähintään %{count} merkkiä." summary: title: "Yhteenveto" stats: "Tilastot" @@ -1322,7 +1324,7 @@ fi: other: "Ketjun viimeisin viesti on jo %{hours} tuntia vanha, joten ketju suljetaan heti." timeline: back: "Takaisin" - back_description: "Siirry takaisin viimeisimpään lukemattomaan viestiin" + back_description: "Siirry takaisin ensimmäiseen lukemattomaan viestiin" replies_short: "%{current} / %{total}" progress: title: ketjun edistyminen @@ -1529,6 +1531,7 @@ fi: edit: "Muokataan {{link}} {{replyAvatar}} {{username}}" edit_reason: "Syy:" post_number: "viesti {{number}}" + wiki_last_edited_on: "wikiä muokattiin viimeksi" last_edited_on: "viestin viimeisin muokkausaika" reply_as_new_topic: "Vastaa aihetta sivuavassa ketjussa" continue_discussion: "Jatkoa ketjulle {{postLink}}:" @@ -1586,7 +1589,7 @@ fi: undo_like: "peru tykkäys" edit: "muokkaa viestiä" edit_anonymous: "Pahoittelut, sinun täytyy ensin kirjautua sisään voidaksesi muokata tätä viestiä." - flag: "liputa tämä viesti tai lähetä käyttäjälle yksityisviesti" + flag: "liputa tämä viesti tai lähetä käyttäjälle yksityisesti siihen liittyvä huomio" delete: "poista tämä viesti" undelete: "peru viestin poistaminen" share: "jaa linkki tähän viestiin" @@ -1618,18 +1621,18 @@ fi: like: "Peru tykkäys" vote: "Peru ääni" people: - off_topic: "liputti tämän asiaan kuulumattomaksi" + off_topic: "liputti tämän eksyvän aiheesta" spam: "liputti tämän roskapostiksi" - inappropriate: "liputti tämän asiattomaksi" + inappropriate: "liputti tämän sopimattomaksi" notify_moderators: "ilmoitti valvojille" notify_user: "lähetti viestin" bookmark: "lisäsi tämän kirjanmerkkeihin" like: "tykkäsi tästä" vote: "äänesti tätä" by_you: - off_topic: "Liputit tämän asiaankuulumattomaksi" + off_topic: "Liputit tämän eksyvän aiheesta" spam: "Liputit tämän roskapostiksi" - inappropriate: "Liputit tämän asiattomaksi" + inappropriate: "Liputit tämän sopimattomaksi" notify_moderators: "Liputit tämän valvojille tiedoksi" notify_user: "Lähetit viestin tälle käyttäjälle" bookmark: "Olet lisännyt viestin kirjainmerkkeihisi" @@ -1637,39 +1640,39 @@ fi: vote: "Olet äänestänyt tätä viestiä" by_you_and_others: off_topic: - one: "Sinä ja yksi muu käyttäjä liputitte tämän asiaankuulumattomaksi" - other: "Sinä ja {{count}} muuta liputtivat tämän asiaankuulumattomaksi" + one: "Sinä ja toinen käyttäjä liputitte tämän eksyvän aiheesta" + other: "Sinä ja {{count}} muuta liputitte tämän eksyvän aiheesta" spam: - one: "Sinä ja yksi muu käyttäjä liputitte tämän roskapostiksi" - other: "Sinä ja {{count}} muuta liputtivat tämän roskapostiksi" + one: "Sinä ja toinen käyttäjä liputitte tämän roskapostiksi" + other: "Sinä ja {{count}} muuta liputitte tämän roskapostiksi" inappropriate: - one: "Sinä ja yksi muu käyttäjä liputitte tämän asiattomaksi" - other: "Sinä ja {{count}} muuta liputtivat tämän asiattomaksi" + one: "Sinä ja toinen käyttäjä liputitte tämän sopimattomaksi" + other: "Sinä ja {{count}} muuta liputitte tämän sopimattomaksi" notify_moderators: - one: "Sinä ja yksi muu käyttäjä liputitte tämän valvojille tiedoksi" - other: "Sinä ja {{count}} muuta liputtivat tämän valvojille tiedoksi" + one: "Sinä ja toinen käyttäjä liputitte tämän valvojille tiedoksi" + other: "Sinä ja {{count}} muuta liputitte tämän valvojille tiedoksi" notify_user: - one: "Sinä ja 1 muuta lähetitte tälle käyttäjälle yksityisviestin" + one: "Sinä ja toinen käyttäjä lähetitte tälle käyttäjälle yksityisviestin" other: "Sinä ja {{count}} muuta lähetitte tälle käyttäjälle viestin" bookmark: - one: "Sinä ja yksi muu käyttäjä lisäsitte tämän kirjanmerkkeihinne" - other: "Sinä ja {{count}} muuta lisäsivät tämän kirjanmerkkeihinsä" + one: "Sinä ja toinen käyttäjä lisäsitte tämän kirjanmerkkeihinne" + other: "Sinä ja {{count}} muuta lisäsitte tämän kirjanmerkkeihinne" like: - one: "Sinä ja yksi muu käyttäjä tykkäsitte tästä" - other: "Sinä ja {{count}} muuta tykkäsivät tästä" + one: "Sinä ja toinen käyttäjä tykkäsitte tästä" + other: "Sinä ja {{count}} muuta tykkäsitte tästä" vote: - one: "Sinä ja yksi muu käyttäjä äänestitte tätä viestiä" - other: "Sinä ja {{count}} muuta äänestivät tätä viestiä" + one: "Sinä ja toinen käyttäjä äänestitte tätä viestiä" + other: "Sinä ja {{count}} muuta äänestitte tätä viestiä" by_others: off_topic: - one: "Yksi käyttäjä liputti tämän asiaankuulumattomaksi" - other: "{{count}} käyttäjää liputtivat tämän asiaankuulumattomaksi" + one: "Yksi liputti tämän eksyvän aiheesta" + other: "{{count}} käyttäjää liputtivat tämän eksyvän aiheesta" spam: one: "yksi käyttäjä liputti tämän roskapostiksi" other: "{{count}} käyttäjää liputti tämän roskapostiksi" inappropriate: - one: "yksi käyttäjä liputti tämän epäasialliseksi" - other: "{{count}} käyttäjää liputti tämän epäasialliseksi" + one: "yksi liputti tämän sopimattomaksi" + other: "{{count}} käyttäjää liputti tämän sopimattomaksi" notify_moderators: one: "yksi käyttäjä liputti tämän tiedoksi valvojalle" other: "{{count}} käyttäjää liputti tämän tiedoksi valvojalle" @@ -1815,12 +1818,12 @@ fi: ip_address_missing: "-" hidden_email_address: "(piilotettu)" submit_tooltip: "Toimita lippu" - take_action_tooltip: "Saavuta liputusraja välittömästi, ennemmin kuin odota muidenkin käyttäjien liputuksia." + take_action_tooltip: "Saavuta liputusraja välittömästi; ei tarvetta odottaa muiden käyttäjien liputuksia." cant: "Pahoittelut, et pysty liputtamaan tätä viestiä tällä hetkellä." notify_staff: 'Ilmoita ylläpidolle yksityisesti' formatted_name: - off_topic: "Se on asiaankuulumaton" - inappropriate: "Se on asiaton" + off_topic: "Se eksyy aiheesta" + inappropriate: "Se on sopimaton" spam: "Se on roskapostia" custom_placeholder_notify_user: "Esitä asiasi ymmärrettäväsi, ole rakentava ja kohtelias." custom_placeholder_notify_moderators: "Kerro ymmärrettävästi ja selvästi, mistä olet huolestunut ja lisää viestiin oleelliset esimerkit ja linkit, jos mahdollista." @@ -2264,10 +2267,10 @@ fi: summary: action_type_3: one: "asiaankuulumaton" - other: "asiaankuulumaton x{{count}}" + other: "eksyy aiheesta x{{count}}" action_type_4: - one: "asiaton" - other: "asiaton x{{count}}" + one: "sopimaton" + other: "sopimaton x{{count}}" action_type_6: one: "mukautettu" other: "mukautettu x{{count}}" diff --git a/config/locales/client.fr.yml b/config/locales/client.fr.yml index 313adca253..3d3d45b7c1 100644 --- a/config/locales/client.fr.yml +++ b/config/locales/client.fr.yml @@ -623,7 +623,7 @@ fr: instructions: "Les images d'arrière-plan seront centrées avec une taille par défaut de 590 pixels." email: title: "Courriel" - instructions: "Ne sera jamais visible publiquement" + instructions: "jamais visible publiquement" ok: "Nous vous enverrons un courriel de confirmation" invalid: "Merci d'entrer une adresse de courriel valide" authenticated: "Votre adresse de courriel a été authentifiée par {{provider}}" @@ -633,13 +633,13 @@ fr: other: "Nous vous enverrons des courriels seulement si nous ne vous avons pas vu sur le site dans les dernières {{count}} minutes." name: title: "Nom d'utilisateur" - instructions: "Votre nom complet (facultatif)" + instructions: "votre nom complet (facultatif)" instructions_required: "Votre nom complet" too_short: "Votre nom est trop court" ok: "Votre nom a l'air correct" username: title: "Pseudo" - instructions: "Unique, sans espaces, court" + instructions: "unique, sans espaces, court" short_instructions: "Les gens peuvent vous mentionner avec @{{username}}" available: "Votre pseudo est disponible" global_match: "L'adresse de courriel correspond au pseudo enregistré" @@ -757,7 +757,7 @@ fr: same_as_username: "Votre mot de passe est le même que votre pseudo." same_as_email: "Votre mot de passe est le même que votre adresse mail." ok: "Votre mot de passe semble correct." - instructions: "Au moins %{count} caractères." + instructions: "au moins %{count} caractères." summary: title: "Résumé" stats: "Statistiques" @@ -1530,6 +1530,7 @@ fr: edit: "Modifier {{link}} par {{replyAvatar}} {{username}}" edit_reason: "Raison :" post_number: "message {{number}}" + wiki_last_edited_on: "Wiki dernièrement modifié le" last_edited_on: "message dernièrement modifié le" reply_as_new_topic: "Répondre par un nouveau sujet" continue_discussion: "Suite du sujet {{postLink}} :" @@ -1888,6 +1889,9 @@ fr: one: "vue" other: "vues" replies: "Réponses" + views_long: + one: "ce sujet a été vu 1 fois" + other: "ce sujet a été vu {{number}} fois" activity: "Activité" likes: "J'aime" likes_lowercase: @@ -2192,6 +2196,8 @@ fr: backups: "sauvegardes" traffic_short: "Trafic" traffic: "Requêtes Web Application" + page_views: "Pages vues" + page_views_short: "Pages vues" show_traffic_report: "Afficher le rapport de trafic détaillé" reports: today: "Aujourd'hui" @@ -2334,6 +2340,7 @@ fr: warn_local_payload_url: "Il semble que vous essayez de configurer le Webhook vers une URL locale. Les événements délivrés à une adresse locale peuvent causer des effets de bords ou des comportements inattendus. Continuer ?" secret_invalid: "La clé secrète ne doit pas contenir d'espaces." secret_too_short: "La clé secrète doit contenir au moins 12 caractères." + secret_placeholder: "Une chaîne de caractères facultative pour générer la signature" event_type_missing: "Vous devez configurer au moins un type d'évènement." content_type: "Type de contenu" secret: "Clé secrète" @@ -2673,10 +2680,17 @@ fr: revoke_admin: "révoquer les droits d'administration" grant_moderation: "Accorder les droits de modération" revoke_moderation: "Révoquer les droits de modération" - backup_operation: "sauvegarde" + backup_create: "créer une sauvegarde" deleted_tag: "tag supprimé" renamed_tag: "tag renommé" revoke_email: "révoquer le courriel" + lock_trust_level: "verrouiller le niveau de confiance " + unlock_trust_level: "déverouiller le niveau de confiance" + activate_user: "activer l'utilisateur" + deactivate_user: "désactvier l'utilisateur" + change_readonly_mode: "changer le mode de lecteur seule" + backup_download: "télécharger la sauvegarde" + backup_destroy: "détruire la sauvegarde" screened_emails: title: "Courriels affichés" description: "Lorsque quelqu'un essaye de créer un nouveau compte, les adresses de courriel suivantes seront vérifiées et l'inscription sera bloquée, ou une autre action sera réalisée." diff --git a/config/locales/client.he.yml b/config/locales/client.he.yml index 384de1961d..c347c83dee 100644 --- a/config/locales/client.he.yml +++ b/config/locales/client.he.yml @@ -623,7 +623,7 @@ he: instructions: "תמונות רקע ימורכזו ויוצגו ברוחב ברירת מחדל של 590px." email: title: "דואר אלקטרוני" - instructions: "לא נצפו מעולם" + instructions: "לעולם לא מוצג לציבור" ok: "נשלח אליכם דואר אלקטרוני לאישור" invalid: "בבקשה הכניסו כתובת דואר אלקטרוני תקינה" authenticated: "כתובת הדואר האלקטרוני שלך אושרה על ידי {{provider}}" @@ -633,13 +633,13 @@ he: other: "נשלח אליכם דוא\"ל רק אם לא ראינו אתכם ב{{count}} הדקות האחרונות." name: title: "שם" - instructions: "שמך המלא (רשות)" + instructions: "שמכם המלא (אופציונלי)" instructions_required: "שמך המלא" too_short: "השם שלך קצר מידי" ok: "השם נראה טוב" username: title: "שם משתמש/ת" - instructions: "ייחודי, ללא רווחים וקצר" + instructions: "ייחודי, ללא רווחים, קצר" short_instructions: "אנשים יכולים לאזכר אותך כ @{{username}}" available: "שם המשתמש שלך פנוי" global_match: "הדואר האלקטרוני תואם את שם המשתמש הרשום" @@ -757,7 +757,7 @@ he: same_as_username: "הסיסמה שלך זהה לשם המשתמש/ת שלך." same_as_email: "הסיסמה שלך זהה לכתובת הדוא\"ל שלך." ok: "הסיסמה שלך נראית טוב." - instructions: "לפחות %{count} תווים." + instructions: "לפחות %{count} תווים" summary: title: "סיכום" stats: "סטטיסטיקות" @@ -1532,6 +1532,7 @@ he: edit: "עורך את {{link}} {{replyAvatar}} {{username}}" edit_reason: "סיבה: " post_number: "פוסט {{number}}" + wiki_last_edited_on: "וויקי נערך לאחרונה ב" last_edited_on: "הפוסט נערך לאחרונה ב" reply_as_new_topic: "תגובה כנושא מקושר" continue_discussion: "ממשיך את הדיון מ {{postLink}}:" @@ -2681,7 +2682,7 @@ he: revoke_admin: "שללו אדמיניסטרציה" grant_moderation: "הענקת הנחיה" revoke_moderation: "שללו הנחיה" - backup_operation: "פעולת גיבוי" + backup_create: "יצירת גיבוי" deleted_tag: "תגית נמחקה" renamed_tag: "תגית שונתה" revoke_email: "שללו מייל" @@ -2690,6 +2691,8 @@ he: activate_user: "הפעלת משתמש/ת" deactivate_user: "ניטרול משתמש/ת" change_readonly_mode: "שינוי מצב קריאה בלבד" + backup_download: "הורדת גיבוי" + backup_destroy: "השמדת גיבוי" screened_emails: title: "הודעות דואר מסוננות" description: "כשמישהו מנסה ליצור חשבון חדש, כתובות הדואר האלקטרוני הבאות ייבדקו וההרשמה תחסם או שיבוצו פעולות אחרות." diff --git a/config/locales/client.it.yml b/config/locales/client.it.yml index b971589b97..5a1516c75c 100644 --- a/config/locales/client.it.yml +++ b/config/locales/client.it.yml @@ -985,12 +985,12 @@ it: similar_topics: "Il tuo argomento è simile a..." drafts_offline: "bozze offline" group_mentioned: - one: "Menzionando {{group}}, stai per notificare 1 persona – sei sicuro?" - other: "Menzionando {{group}}, stai per notificare {{count}} persone – sei sicuro?" + one: "Menzionando {{group}}, verrà notificata 1 persona – sei sicuro?" + other: "Menzionando {{group}}, verranno notificate {{count}} persone – sei sicuro?" cannot_see_mention: - category: "Hai menzionato {{username}} ma non saranno notificati perché non hanno accesso a questa categoria. Dovrai aggiungerli ad un gruppo che ha accesso a questa categoria." - private: "Hai menzionato {{username}} ma non saranno notificati perché non hanno accesso a questo messaggio personale. Dovrai invitarli a questo MP." - duplicate_link: "Sembra che il tuo link a {{domain}} sia già stato pubblicato nell'argomento di @{{username}} una risposta {{ago}} – sei sicuro di volerlo pubblicare ancora?" + category: "Hai menzionato {{username}} ma non verranno notificati perché non hanno accesso a questa categoria. Dovrai aggiungerli ad un gruppo che ha accesso a questa categoria." + private: "Hai menzionato {{username}} ma non verranno notificati perché non hanno accesso a questo messaggio personale. Dovrai invitarli a questo MP." + duplicate_link: "Sembra che il collegamento a {{domain}} sia già stato pubblicato nell'argomento di @{{username}} in una risposta {{ago}} – sei sicuro di volerlo pubblicare ancora?" error: title_missing: "Il titolo è richiesto" title_too_short: "Il titolo deve essere lungo almeno {{min}} caratteri" @@ -2612,7 +2612,7 @@ it: do_nothing: "non fare nulla" staff_actions: title: "Azioni Staff" - instructions: "Fai clic sui nomi utenti e sulle azioni per filtrare la lista. Fai clic sulle immagini del profilo per andare alle pagine utenti." + instructions: "Fai clic sul nome utente o sulle azioni per filtrare la lista. Fai clic sulle immagini del profilo per andare alla pagina utente." clear_filters: "Mostra Tutto" staff_user: "Utente" target_user: "Destinatario" @@ -2654,10 +2654,17 @@ it: revoke_admin: "revoca amministrazione" grant_moderation: "assegna moderazione" revoke_moderation: "revoca moderazione" - backup_operation: "operazione di backup" + backup_create: "crea backup" deleted_tag: "etichetta cancellata" renamed_tag: "etichetta rinominata" revoke_email: "revoca email" + lock_trust_level: "C" + unlock_trust_level: "sblocca livello di esperienza" + activate_user: "attiva utente" + deactivate_user: "disattiva utente" + change_readonly_mode: "cambia la modalità di sola lettura" + backup_download: "scarica backup" + backup_destroy: "distruggi backup" screened_emails: title: "Email Scansionate" description: "Quando qualcuno cerca di creare un nuovo account, verrando controllati i seguenti indirizzi email e la registrazione viene bloccata, o eseguita qualche altra azione." diff --git a/config/locales/client.ko.yml b/config/locales/client.ko.yml index 39797de845..7112865775 100644 --- a/config/locales/client.ko.yml +++ b/config/locales/client.ko.yml @@ -26,6 +26,7 @@ ko: millions: "{{number}}백만" dates: time: "a h:mm" + timeline_date: "YYYY MMM" long_no_year: "M D a h:mm" long_no_year_no_time: "MMM D" full_no_year_no_time: "MMMM Do" @@ -117,6 +118,7 @@ ko: enabled: '%{when} 목록에 게시' disabled: '%{when} 목록에서 감춤' topic_admin_menu: "주제 관리자 기능" + wizard_required: "포럼을 설정하세요! 설치 마법사를 시작하세요!" emails_are_disabled: "관리자가 이메일 송신을 전체 비활성화 했습니다. 어떤 종류의 이메일 알림도 보내지지 않습니다." bootstrap_mode_enabled: "쉬운 시작을 위해 부트스트랩 모드로 구동 되었습니다. 모든 새로운 사용자에게 신뢰 수준 1이 부여되고 매일 이메일 다이제스트가 보내집니다. 이 기능은 총 사용자 수가% {min_users} 를 초과 할 때 자동으로 꺼집니다." bootstrap_mode_disabled: "부트스트랩 모드는 24시간 뒤 비활성화 될 것입니다." @@ -293,7 +295,28 @@ ko: posts_read_long: "게시글 읽음" total_rows: other: "%{count} 사용자" + group_histories: + actions: + change_group_setting: "그룹 설정 변경" + add_user_to_group: "사용자 추가" + remove_user_from_group: "사용자 삭제" groups: + logs: + title: "로그" + when: "언제" + action: "액션" + subject: "주제" + from: "부터" + to: "까지" + edit: + title: '그룹 편집' + full_name: '전체 이름' + add_members: "구성원 추가" + delete_member_confirm: "'%{username}'를 '%{group}' 그룹에서 삭제하겠습니까?" + request_membership_pm: + title: "멤버십 요청" + body: "@%{groupName} 에 멤버십을 요청합니다." + name_placeholder: "그룹 이름, 공백 없이 username 규칙과 동일하게 입력하세요." add: "추가" selector_placeholder: "멤버 추가" owner: "소유자" diff --git a/config/locales/client.pl_PL.yml b/config/locales/client.pl_PL.yml index 872692909e..ebc7057fb6 100644 --- a/config/locales/client.pl_PL.yml +++ b/config/locales/client.pl_PL.yml @@ -186,7 +186,7 @@ pl_PL: admin_title: "Administracja" flags_title: "Flagi" show_more: "pokaż więcej" - show_help: "pomoc" + show_help: "opcje" links: "Odnośniki" links_lowercase: one: "link" @@ -240,7 +240,7 @@ pl_PL: contact_info: "W sprawach wymagających szybkiej reakcji lub związanych z poprawnym funkcjonowaniem serwisu, prosimy o kontakt: %{contact_info}." bookmarked: title: "Zakładka" - clear_bookmarks: "Usuń z zakładek" + clear_bookmarks: "Wyczyść zakładki" help: bookmark: "Kliknij, aby dodać pierwszy wpis tematu do zakładek" unbookmark: "Kliknij, aby usunąć wszystkie zakładki z tego tematu" @@ -359,7 +359,7 @@ pl_PL: title: "Logi" when: "Kiedy" action: "Akcja" - subject: "Kontekst" + subject: "Temat" details: "Szczegóły" from: "Od" to: "Do" @@ -769,7 +769,7 @@ pl_PL: same_as_username: "Twoje hasło jest takie samo jak nazwa użytkownika." same_as_email: "Twoje hasło jest takie samo jak twój e-mail." ok: "Twoje hasło jest poprawne." - instructions: "Co najmniej %{count} znaków." + instructions: "przynajmniej %{count} znaków" summary: title: "Podsumowanie" stats: "Statystyki" diff --git a/config/locales/client.ru.yml b/config/locales/client.ru.yml index 2b4ef33c7d..f23824d8f5 100644 --- a/config/locales/client.ru.yml +++ b/config/locales/client.ru.yml @@ -680,7 +680,7 @@ ru: instructions: "Картинки фона будут отцентрированы и по-умолчанию имеют ширину 590 пикселей." email: title: "E-mail" - instructions: "Всегда скрыт от публики" + instructions: "Не показывать" ok: "Мы вышлем вам письмо для подтверждения" invalid: "Введите действующий адрес электронной почты" authenticated: "Ваш адрес электронной почты подтвержден {{provider}}" @@ -692,7 +692,7 @@ ru: other: "Мы отправим вам письмо только в том случае, если вы не были онлайн последние {{count}} минyт." name: title: "Имя" - instructions: "Ваше полное имя (опционально)" + instructions: "ваше полное имя (опционально)" instructions_required: "Ваше полное имя" too_short: "Ваше имя слишком короткое" ok: "Допустимое имя" @@ -818,7 +818,7 @@ ru: same_as_username: "Ваш пароль такой же, как и ваше имя пользователя." same_as_email: "Ваш пароль такой же, как и ваш email." ok: "Допустимый пароль." - instructions: "Не менее %{count} символов." + instructions: "не менее %{count} символов" summary: title: "Сводка" stats: "Статистика" @@ -1648,6 +1648,7 @@ ru: edit: "Изменить {{link}} {{replyAvatar}} {{username}}" edit_reason: "Причина:" post_number: "сообщение {{number}}" + wiki_last_edited_on: "вики редактировалось" last_edited_on: "последний раз сообщение редактировалось" reply_as_new_topic: "Ответить в новой связанной теме" continue_discussion: "Продолжить обсуждение из {{postLink}}:" @@ -2896,7 +2897,7 @@ ru: revoke_admin: "отозваны права администратора" grant_moderation: "выданы права модератора" revoke_moderation: "отозваны права модератора" - backup_operation: "операции резервного копирования" + backup_create: "создать резервную копию" deleted_tag: "удаленный тег" renamed_tag: "переименованный тэг" revoke_email: "отозвать e-mail" @@ -2905,6 +2906,8 @@ ru: activate_user: "активация пользователя" deactivate_user: "деактивация пользователя" change_readonly_mode: "изменение режима \"только для чтения\"" + backup_download: "скачать резервную копию" + backup_destroy: "удалить резервную копию" screened_emails: title: "Почтовые адреса" description: "Когда кто-то создает новую учетную запись, проверяется данный почтовый адрес и регистрация блокируется или производятся другие дополнительные действия." @@ -3014,6 +3017,7 @@ ru: moderator: "Модератор?" admin: "Администратор?" blocked: "Заблокирован?" + staged: "Имитация?" show_admin_profile: "Администратор" edit_title: "Редактировать заголовок" save_title: "Сохранить заголовок" @@ -3086,11 +3090,18 @@ ru: block_failed: 'Не удалось заблокировать пользователя.' block_confirm: 'Вы уверены что хотите заблокировать этого пользователя? Он больше не сможет создавать темы и отправлять сообщения.' block_accept: 'Подтвердить блокировку' + bounce_score: "Карма" reset_bounce_score: label: "Сбросить" + title: "сбросить карму к 0" deactivate_explanation: "Дезактивированные пользователи должны заново подтвердить свой e-mail." suspended_explanation: "Замороженный пользователь не может войти." block_explanation: "Заблокированный не может отвечать и создавать новые темы." + staged_explanation: "Имитированный пользователь может отправлять сообщения только по эл.почте в определённые темы." + bounce_score_explanation: + none: "Нет возвратов полученных недавно от этой эл.почты." + some: "Несколько возвратов получено недавно от этой эл.почты." + threshold_reached: "Получено слишком много возвратов от этой эл.почты." trust_level_change_failed: "Возникла ошибка при изменении уровня доверия пользователя." suspend_modal_title: "Заморозить пользователя" trust_level_2_users: "Пользователи с уровнем доверия 2" @@ -3297,6 +3308,7 @@ ru: sample: "Используйте следующий HTML-код на своем сайте, для возможности создания связанных тем. Замените REPLACE_ME канонической ссылкой страницы, куда производится встраивание." title: "Встраивание" host: "Разрешённые Хосты" + path_whitelist: "Разрешённый Путь" edit: "изменить" category: "Опубликовать в разделе" add_host: "Добавить хост" diff --git a/config/locales/client.zh_TW.yml b/config/locales/client.zh_TW.yml index 44a835f88f..c13061512b 100644 --- a/config/locales/client.zh_TW.yml +++ b/config/locales/client.zh_TW.yml @@ -112,7 +112,7 @@ zh_TW: enabled: '於 %{when} 置頂' disabled: '於 %{when} 解除置頂' pinned_globally: - enabled: '於 %{when} 全局置頂' + enabled: '於 %{when} 全區置頂' disabled: '於 %{when} 解除置頂' visible: enabled: '於 %{when} 列出' @@ -419,7 +419,7 @@ zh_TW: apply_all: "申請" position: "位置" posts: "貼文" - topics: "標題" + topics: "主題數" latest: "最近" latest_by: "最近由" toggle_ordering: "顯示/隱藏排序控制" @@ -594,7 +594,7 @@ zh_TW: instructions: "背景會被置中,且默認寬度為850px。" email: title: "電子郵件" - instructions: "我們不會公開您的電子郵件信箱。" + instructions: "不會公開顯示" ok: "我們將寄一封確認郵件給您。" invalid: "請輸入有效的電子郵件地址。" authenticated: "你的 Email 已由 {{provider}} 驗證完成。" @@ -603,13 +603,13 @@ zh_TW: other: "我們只會在您 {{count}} 分鐘內沒有活動時,才會寄送電郵通知給您。" name: title: "名稱" - instructions: "您的全名 (選填)。" + instructions: "您的全名 (選填)" instructions_required: "您的匿稱" too_short: "你的匿稱太短。" ok: "你的匿稱符合要求。" username: title: "用戶名稱" - instructions: "獨一無二,沒有空白,夠短。" + instructions: "獨一、無空格、短的" short_instructions: "其他人可以輸入 @{{username}} 提到你。" available: "你的用戶名稱可以使用。" global_match: "電子郵件地址與註冊的用戶名稱相符。" @@ -726,7 +726,7 @@ zh_TW: same_as_username: "密碼與使用者名稱相同" same_as_email: "你的密碼與電郵相同。" ok: "你的密碼符合要求。" - instructions: "至少 %{count} 個字。" + instructions: "至少 %{count} 個字元" summary: title: "摘要" stats: "統計" @@ -769,7 +769,7 @@ zh_TW: title: "個人資料圖片" header_title: "個人頁面、消息、書籤和設置" title: - title: "用戶標題" + title: "頭銜" filters: all: "全部" stream: @@ -1470,6 +1470,7 @@ zh_TW: edit: "編輯 {{replyAvatar}} {{username}} 發表的 {{link}}" edit_reason: "原因: " post_number: "文章 {{number}}" + wiki_last_edited_on: "共筆最後編輯時間" last_edited_on: "文章最近編輯的時間" reply_as_new_topic: "回覆為關連的討論話題" continue_discussion: "繼續 {{postLink}} 的討論:" @@ -1695,7 +1696,7 @@ zh_TW: title: "關注" description: "你將自動監看這些分類中的所有主題。每一個主題的每一個新帖,將通知你,還將顯示新回覆的數量。" watching_first_post: - title: "監看頭一帖" + title: "關注新的發文" description: "在這些分類裡面,只是每一個新主題的第一帖,才會通知你。" tracking: title: "追蹤" @@ -2003,7 +2004,7 @@ zh_TW: title: "監看" description: "你將自動監看該標籤中的所有主題。新帖子和新主題會通知你,再者未讀和新帖的數量也將顯示在主題旁邊。" watching_first_post: - title: "監看頭一帖" + title: "關注新的發文" description: "在這個標籤中,只是每一個新主題的第一帖,才會通知你。" tracking: title: "跟蹤" @@ -2229,6 +2230,7 @@ zh_TW: warn_local_payload_url: "你好像將 webhook 指向了一個本地地址。把相關事件發送到本地可能產生副作用或未預期的行為。繼續嗎?" secret_invalid: "密鑰不能包含空白字元。" secret_too_short: "密鑰必須至少有 12 個字元。" + secret_placeholder: "選填的字串,用來產生簽章" event_type_missing: "你必須設置一個事件類型。" content_type: "內容格式" secret: "密鑰" @@ -2566,7 +2568,7 @@ zh_TW: revoke_admin: "撤銷管理員權限" grant_moderation: "授予板主權限" revoke_moderation: "撤銷板主權限" - backup_operation: "備份操作" + backup_create: "新增備份" deleted_tag: "刪除的標籤" renamed_tag: "重命名的標籤" revoke_email: "撤銷郵件" @@ -2575,6 +2577,8 @@ zh_TW: activate_user: "啟動使用者" deactivate_user: "撤銷使用者" change_readonly_mode: "變更唯讀模式" + backup_download: "下載備份" + backup_destroy: "刪除備份" screened_emails: title: "過濾的電子郵件地址" description: "以下的電子郵件地址將無法用來建立新用戶。" @@ -2674,8 +2678,8 @@ zh_TW: blocked: "已封鎖?" staged: "暫存?" show_admin_profile: "管理員" - edit_title: "編輯標題" - save_title: "儲存標題" + edit_title: "編輯頭銜" + save_title: "儲存頭銜" refresh_browsers: "強制瀏覽器重新整理" refresh_browsers_message: "訊息已寄出給所有用戶!" show_public_profile: "顯示公開的基本資料" diff --git a/config/locales/server.fi.yml b/config/locales/server.fi.yml index d19716f03e..47a81cf243 100644 --- a/config/locales/server.fi.yml +++ b/config/locales/server.fi.yml @@ -528,9 +528,9 @@ fi: missing_session: "Emme voineet havaita, onnistuiko tilisi luonti. Varmista, että selaimesi sallii evästeiden käytön." post_action_types: off_topic: - title: 'Asiaankuulumaton' + title: 'Se eksyy aiheesta' description: 'Tämä viesti ei ole relevantti tässä ketjussa, jonka määrittelee ketjun otsikko ja aloitusviesti, ja pitäisi todennäköisesti siirtää toiselle alueelle.' - long_form: 'liputti tämän asiaankuulumattomaksi' + long_form: 'liputti tämän eksyvän aiheesta' spam: title: 'Roskaposti' description: 'Tämä viesti on mainos. Se ei ole hyödyllinen tai relevantti tässä ketjussa, vaan luonteeltaan mainostamista.' @@ -538,9 +538,9 @@ fi: email_title: '"%{title}" liputettiin roskapostiksi' email_body: "%{link}\n\n%{message}" inappropriate: - title: 'Asiaton' + title: 'Sopimaton' description: 'Tämän viestin sisältö on loukkaava, herjaava tai ristiriidassa palstan sääntöjen kanssa.' - long_form: 'liputti tämän asiattomaksi' + long_form: 'liputti tämän sopimattomaksi' notify_user: title: 'Lähetä käyttäjälle @{{username}} viesti.' description: 'Haluan keskustella tästä viestistä kirjoittajan kanssa kahden kesken.' @@ -576,20 +576,20 @@ fi: spam: title: 'Roskaposti' description: 'Tämä ketju on mainos. Se ei ole hyödyllinen tai relevantti tällä sivustolla, vaan on luonteeltaan mainostamista.' - long_form: 'merkitsi tämän roskapostiksi' + long_form: 'liputti tämän roskapostiksi' inappropriate: - title: 'Asiaton' - description: 'Tämän ketjun sisältö on loukkaava, herjaava tai ristiriidassa palstan sääntöjen kanssa.' - long_form: 'liputti tämän asiattomaksi' + title: 'Sopimaton' + description: 'Ketjussa on loukkaavaa, herjaavaa tai palstan sääntöjen kanssa ristiriitaista sisältöä.' + long_form: 'liputti tämän sopimattomaksi' notify_moderators: title: "Jotain muuta" - description: 'Valvojan tulee huomioida tämä ketju palstan sääntöjen, palveluehtojen tai muun syyn vuoksi.' + description: 'Valvojan tulee huomioida tämä ketju palstan sääntöjen, palveluehtojen tai jonkun muun syyn vuoksi.' long_form: 'liputit tämän valvojille tiedoksi' - email_title: 'Viestiketju"%{title}" kaipaa valvojan huomiota' + email_title: 'Ketju"%{title}" kaipaa valvojan huomiota' email_body: "%{link}\n\n%{message}" flagging: - you_must_edit: '

    Viestisi on liputettu yhteisön toimesta. Käy lukemassa saapuneet viestisi.

    ' - user_must_edit: '

    Tämä viesti on liputettu ja siksi piilotettu väliaikaisesti.

    ' + you_must_edit: '

    Muu yhteisö liputti viestisi. Käy lukemassa saapuneet viestisi.

    ' + user_must_edit: '

    Tämä viesti on liputettu ja on siksi piilotettu väliaikaisesti.

    ' archetypes: regular: title: "Tavallinen ketju" @@ -876,7 +876,7 @@ fi: num_tl3_flags_to_block_new_user: "Jos uuden käyttäjän viesti saa näin monta lippua num_tl3_users_to_block_new_user eri lt3 käyttäjältä, piilota kaikki hänen viestinsä ja estä uusien viestien kirjoittaminen. 0 poistaa käytöstä." num_tl3_users_to_block_new_user: "Jos uuden käyttäjän viesti saa num_tl3_flags_to_block_new_user lippua näin monelta lt3 käyttäjältä, piilota kaikki hänen viestinsä ja estä uusien viestien kirjoittaminen. 0 poistaa käytöstä." notify_mods_when_user_blocked: "Jos käyttäjä estetään automaattisesti, lähetä viesti kaikille valvojille." - flag_sockpuppets: "Jos uusi käyttäjä vastaa toisen uuden käyttäjän luomaan ketjun samasta IP osoitteesta, liputa molemmat viestit mahdolliseksi roskapostiksi." + flag_sockpuppets: "Jos uuden käyttäjän luomaan ketjuun vastaa toinen uusi käyttäjä samasta IP-osoitteesta, liputa molemmat viestit mahdolliseksi roskapostiksi." traditional_markdown_linebreaks: "Käytä perinteisiä rivinvaihtoja Markdownissa, joka vaatii kaksi perättäistä välilyöntiä rivin vaihtoon." allow_html_tables: "Salli taulukoiden syöttäminen Markdowniin käyttäen HTML tageja. TABLE, THEAD, TD, TR, TH valkolistataan (edellyttää kaikkien taulukoita sisältävien vanhojen viestien uudelleen rakentamisen)" post_undo_action_window_mins: "Kuinka monta minuuttia käyttäjällä on aikaa perua viestiin kohdistuva toimi (tykkäys, liputus, etc)." @@ -1449,11 +1449,11 @@ fi: > %{site_title} -- %{site_description} - Jos olet kiinnostunut, klikkaa alla olevaa linkkiä: + Jos kiinnostuit, klikkaa alla olevaa linkkiä: %{invite_link} - Tämän kutsun lähetti luotettu käyttäjä, joten voit vastata ketjuun välittömästi. + Tämän kutsun lähetti luotettu käyttäjä, joten voit osallistua keskusteluun välittömästi. custom_invite_mailer: subject_template: "%{invitee_name} kutsui sinut ketjuun '%{topic_title}' sivustolla %{site_domain_name}" text_body_template: | @@ -1467,15 +1467,15 @@ fi: > %{site_title} -- %{site_description} - Viesti käyttäjältä %{invitee_name}: + tällaisin saatesanoin: - %{user_custom_message} + > %{user_custom_message} - Jos olet kiinnostunut, klikkaa alla olevaa linkkiä: + Jos kiinnostuit, klikkaa alla olevaa linkkiä: %{invite_link} - Tämän kutsun lähetti luotettu käyttäjä, joten voit vastata ketjuun välittömästi. + Tämän kutsun lähetti luotettu käyttäjä, joten voit osallistua keskusteluun välittömästi. invite_forum_mailer: subject_template: "%{invitee_name} kutsui sinut sivustolle %{site_domain_name}" text_body_template: | @@ -1499,8 +1499,9 @@ fi: > > %{site_description} - Viesti käyttäjältä %{invitee_name} sinulle: - %{user_custom_message} + tällaisin saatesanoin: + + > %{user_custom_message} Jos kiinnostuit, klikkaa alla olevaa linkkiä: @@ -1598,16 +1599,16 @@ fi: Uusilta käyttäjiltä on hyväksyntää odottavia viestejä. [Niitä voi hyväksyä tai hylätä täällä](%{base_url}/queued-posts). flag_reasons: - off_topic: "Viestisi liputettiin **asiaan kuulumattomaksi**: se ei kuulu tähän ketjuun, jonka aiheen määrittelee aloitusviesti ja otsikko." - inappropriate: "Viestisi liputettiin **asiattomaksi**: se on loukkaava, herjaava tai rikkoo [palstan sääntöjä](/guidelines)." - spam: "Viestisi liputettiin **roskapostiksi**: siinä on ilmoitus, joka on luonteeltaan mainostamista sen sijaan, että olisi hyödyllinen tai relevantti tässä keskustelussa." - notify_moderators: "Viestisi liputettiin **valvojalle tiedoksi**: siinä on jotain, johon henkilökunnan pitäisi puuttua." + off_topic: "Viestisi liputettiin **eksyvän aiheesta**: koetaan, ettei se ei kuulu ketjun aiheeseen, jonka määrittelevät sen aloitusviesti ja otsikko." + inappropriate: "Viestisi liputettiin **sopimattomaksi**: se koetaan loukkaavaksi, herjaavaksi tai [palstan sääntöjen](/guidelines) vastaiseksi." + spam: "Viestisi liputettiin **roskapostiksi**: sen koetaan olevan luonteeltaan mainostamista eikä hyödyllinen tai asiallinen lisä keskusteluun." + notify_moderators: "Viestisi liputettiin **valvojalle tiedoksi**: siinä koetaan olevan jotain, johon henkilökunnan pitäisi puuttua." flags_dispositions: agreed: "Kiitos kun toit asian tietoomme. Olemme samaa mieltä ongelmasta ja selvitämme sitä." - agreed_and_deleted: "Kiitos kun toit asian tietoomme. Olemme samaa mieltä ongelmasta ja olemme poistaneet kyseisen viestin." + agreed_and_deleted: "Kiitos kun toit asian tietoomme. Olemme samaa mieltä ongelmasta ja poistimme kyseisen viestin." disagreed: "Kiitos kun toit asian tietoomme. Selvitämme asiaa." deferred: "Kiitos kun toit asian tietoomme. Selvitämme asiaa." - deferred_and_deleted: "Kiitos kun toit asian tietoomme. Olemme poistaneet kyseisen viestin." + deferred_and_deleted: "Kiitos kun toit asian tietoomme. Poistimme kyseisen viestin." temporarily_closed_due_to_flags: "Tämä ketju on väliaikaisesti suljettu, johtuen suuresta määrästä liputuksia." system_messages: post_hidden: @@ -1885,21 +1886,23 @@ fi: Jos POP-sähköpostitilille on nettikäyttöliittymä, voit joutua kirjautumaan sinne ja tarkistamaan asetukset. too_many_spam_flags: + title: "Liian monta roskapostiliputusta" subject_template: "Uusi tili on estetty" text_body_template: | Hei, - Tämä automaattinen viesti on lähetetty sivustolta %{site_name} kertoaksemme, että viestejäsi on piilotettu yhteisön liputtamisen johdosta. + Tämä automaattinen viesti on lähetetty sivustolta %{site_name} kertoaksemme, että viestejäsi on piilotettu yhteisön liputusten perusteella. Varotoimena uudelta tilitäsi on estetty uusien ketjujen ja viestien luonti, kunnes henkilökunnan jäsen tarkastaa tilisi. Pahoittelemme tästä aiheutuvaa vaivaa. Saadaksesi lisätietoa, tutustu [yhteisön ohjeisiin](%{base_url}/guidelines). too_many_tl3_flags: + title: "Liian monta lt3-lippua" subject_template: "Uusi tili on estetty" text_body_template: | Hei, - Tämä automaattinen viesti on lähetetty sivustolta %{site_name} kertoaksemme, että viestejäsi on piilotettu yhteisön liputtamisen johdosta. + Tämä automaattinen viesti on lähetetty sivustolta %{site_name} kertoaksemme, että tilisi on jäädytetty yhteisön liputusten perusteella. Varotoimena uudelta tilitäsi on estetty uusien ketjujen ja viestien luonti, kunnes henkilökunnan jäsen tarkastaa tilisi. Pahoittelemme tästä aiheutuvaa vaivaa. @@ -1985,7 +1988,7 @@ fi: visit_link_to_respond_pm: "[Vieraile ketjussa](%{base_url}%{url}) vastataksesi." posted_by: "Käyttäjältä %{username} %{post_date}" invited_to_private_message_body: | - %{username} kutsui sinut viestiketjuun + %{username} kutsui sinut yksityiskeskusteluun > **%{topic_title}** > @@ -2005,7 +2008,8 @@ fi: > %{site_title} -- %{site_description} user_invited_to_private_message_pm: - subject_template: "[%{site_name}] %{username} kutsui sinut viestiin '%{topic_title}'" + title: "Käyttäjä kutsuttiin yksityiskeskusteluun" + subject_template: "[%{site_name}] %{username} kutsui sinut yksityiskeskusteluun '%{topic_title}'" text_body_template: | %{header_instructions} @@ -2013,7 +2017,8 @@ fi: %{respond_instructions} user_invited_to_private_message_pm_staged: - subject_template: "[%{site_name}] %{username} kutsui sinut yksityiseen keskusteluun '%{topic_title}'" + title: "Esikäyttäjä kutsuttiin yksityiskeskusteluun" + subject_template: "[%{site_name}] %{username} kutsui sinut yksityiskeskusteluun '%{topic_title}'" text_body_template: | %{header_instructions} @@ -2021,6 +2026,7 @@ fi: %{respond_instructions} user_invited_to_topic: + title: "Käyttäjä kutsuttiin ketjuun" subject_template: "[%{site_name}] %{username} kutsui sinut ketjuun '%{topic_title}'" text_body_template: | %{header_instructions} @@ -2029,6 +2035,7 @@ fi: %{respond_instructions} user_replied: + title: "Käyttäjälle vastattiin" subject_template: "[%{site_name}] %{topic_title}" text_body_template: | %{header_instructions} @@ -2039,6 +2046,7 @@ fi: %{respond_instructions} user_replied_pm: + title: "Käyttäjän yksityisviestiin vastattiin" subject_template: "[%{site_name}] [YV] %{topic_title}" text_body_template: | %{header_instructions} @@ -2049,6 +2057,7 @@ fi: %{respond_instructions} user_quoted: + title: "Käyttäjää lainattiin" subject_template: "[%{site_name}] %{topic_title}" text_body_template: | %{header_instructions} @@ -2059,6 +2068,7 @@ fi: %{respond_instructions} user_linked: + title: "Käyttäjä linkitettiin" subject_template: "[%{site_name}] %{topic_title}" text_body_template: | %{header_instructions} @@ -2069,6 +2079,7 @@ fi: %{respond_instructions} user_mentioned: + title: "Käyttäjä mainittiin" subject_template: "[%{site_name}] %{topic_title}" text_body_template: | %{header_instructions} @@ -2079,6 +2090,7 @@ fi: %{respond_instructions} user_group_mentioned: + title: "Käyttäjän ryhmä mainittiin" subject_template: "[%{site_name}] %{topic_title}" text_body_template: | %{header_instructions} @@ -2153,15 +2165,17 @@ fi: view_this_topic: "Katsele tätä ketjua" back_to_top: "Takaisin alkuun" forgot_password: + title: "Unohtunut salasana" subject_template: "[%{site_name}] Salasanan uusiminen" text_body_template: | Salasanasi uusimista pyydettiin sivustolla [%{site_name}](%{base_url}). - Jos et halua muuttaa salasanaasi, voi jättää tämän viestin huomiotta. + Jos et halua muuttaa salasanaasi, voit jättää tämän viestin huomiotta. Klikkaa alla olevaa linkkiä vaihtaaksesi salasanasi: %{base_url}/users/password-reset/%{email_token} set_password: + title: "Syötä salasana" subject_template: "[%{site_name}] Syötä salasana" text_body_template: | Joku on pyytänyt lisäämään salasanan tilillesi sivustolla [%{site_name}](%{base_url}). Vaihtoehtoisesti, voit kirjautua sisään muiden tuettujen palveluiden avulla (Google, Facebook, etc) joissa on käytössä tämä sama sähköpostiosoite. @@ -2366,7 +2380,7 @@ fi: Nämä eivät ole tarkkarajaiset säännöt — vältä kaikkea kiellettyihin asioihin edes _viittaavaa_. Jos olet epävarma, kysy itseltäsi miltä tuntuisi, jos viestisi olisi lainattuna aamun sanomalehden kanteen. - Tämä on julkinen palsta ja hakukoneet johdattavat näihin keskusteluihin. Kiinnitä huomiota kielenkäyttöön ja linkkien ja kuvien tietoturvaan for family and friends. + Tämä on julkinen palsta ja hakukoneet johdattavat näihin keskusteluihin. Kiinnitä huomiota kielenkäyttöön ja linkkien ja kuvien tietoturvaan ja soveltuvuuteen kaiken ikäisille. @@ -2398,7 +2412,7 @@ fi: ## [Käyttöehdot](#tos) - Kyllä, lakikieli on tylsää, mutta meidän on suojeltava itseämme – ja siinä sivussa sinua ja sinun tietojasi – epäsuotuisia tahoja vastaan. Palstalla on [käyttöehdot](/tos), jotka säätelevät sinun (ja meidän) toimintaa and oikeuksia sisältöön, yksityisyyteen ja lakeihin liittyen. Käyttääksesi palvelua sinun on hyväksyttävä [käyttöehdot](/tos). + Kyllä, lakikieli on tylsää, mutta meidän on suojeltava itseämme – ja siinä sivussa sinua ja sinun tietojasi – epäsuotuisia tahoja vastaan. Palstalla on [käyttöehdot](/tos), jotka säätelevät sinun (ja meidän) toimintaa ja oikeuksia sisältöön, yksityisyyteen ja lakeihin liittyen. Jotta voit käyttää palvelua, sinun on hyväksyttävä [käyttöehdot](/tos). tos_topic: title: "Käyttöehdot" privacy_topic: diff --git a/config/locales/server.fr.yml b/config/locales/server.fr.yml index 10270963be..f44ac975b5 100644 --- a/config/locales/server.fr.yml +++ b/config/locales/server.fr.yml @@ -73,6 +73,8 @@ fr: inclusion: n'est pas inclus dans la liste invalid: est invalide is_invalid: "ne semble pas clair, est-ce une phrase complète ?" + contains_censored_words: "inclut un ou plusieurs mots censurés : %{censored_words}" + matches_censored_pattern: "correspond à l'expression régulière censurée : %{censored_pattern}" less_than: doit être inférieure à %{count} less_than_or_equal_to: doit être inférieur ou égal à %{count} not_a_number: n'est pas un nombre @@ -497,8 +499,8 @@ fr: other: "il y a presque %{count} ans" password_reset: no_token: "Désolé, le lien pour le changement de mot de passe est trop ancien. Cliquez sur Connexion puis redemandez un mot de passe afin d'obtenir un nouveau lien. " - choose_new: "Veuillez choisir un nouveau mot de passe" - choose: "Veuillez choisir un mot de passe" + choose_new: "Choisir un nouveau mot de passe" + choose: "Choisir un mot de passe" update: 'Mettre à jour le mot de passe ' save: 'Définir le mot de passe' title: 'Réinitialiser le mot de passe' @@ -1073,6 +1075,7 @@ fr: max_attachment_size_kb: "La taille maximale des fichiers envoyés en Ko. Doit être configurer dans nginx (client_max_body_size) / apache ou proxy aussi." authorized_extensions: "Une liste d'extensions de fichier autorisées pour les envois sur le serveur (mettre '*' pour autoriser tous les types)" max_similar_results: "Combien de sujets similaires sont afficher lorsqu'un utilisateur est en train de créer un nouveau sujet. La comparaison se base sur le titre et le contenu." + max_image_megapixels: "Nombre maximum autorisé de mégapixels pour une image." title_prettify: "Corrige les coquilles les plus communes dans les titres (intégralité du titre en majuscule, première lettre en minuscule, de multiples ! et ?, un . inutile à la fin, etc.)" topic_views_heat_low: "Après ce nombre de vues, le champ Vues sera légèrement mis en évidence." topic_views_heat_medium: "Après ce nombre de vues, le champ Vues sera modérément mis en évidence." @@ -1592,6 +1595,7 @@ fr: temporarily_closed_due_to_flags: "Ce sujet est temporairement fermé à cause d'un grand nombre de signalements de la communauté." system_messages: post_hidden: + title: "Message caché" subject_template: "Message caché suite à des signalements de la communauté" text_body_template: |+ Bonjour, @@ -1623,6 +1627,7 @@ fr: welcome_invite: subject_template: "Bienvenue sur %{site_name} !" backup_succeeded: + title: "Sauvegarde réussie" subject_template: "Sauvegarde terminée avec succès" text_body_template: | La sauvegarde a réussi. @@ -1635,6 +1640,7 @@ fr: %{logs} ``` backup_failed: + title: "Sauvegarde échouée" subject_template: "Échec de la sauvegarde" text_body_template: | La sauvegarde a échoué. @@ -1645,6 +1651,7 @@ fr: %{logs} ``` restore_succeeded: + title: "Restauration réussie" subject_template: "Restauration terminée avec succès" text_body_template: | La restauration a réussi. @@ -1655,6 +1662,7 @@ fr: %{logs} ``` restore_failed: + title: "Restauration échouée" subject_template: "Échec de la restauration" text_body_template: | La restauration a échoué. @@ -1837,6 +1845,7 @@ fr: Pour plus d'informations, merci de vous en référer à la [charte de la communauté](%{base_url}/guidelines). blocked_by_staff: + title: "Bloqué par un responsable" subject_template: "Compte bloqué temporairement" text_body_template: | Bonjour, @@ -1847,6 +1856,7 @@ fr: Pour plus d'informations, merci de vous référer à la [charte de la communauté](%{base_url}/guidelines). user_automatically_blocked: + title: "Utilisateur bloqué automatiquement" subject_template: "Nouvel utilisateur %{username} bloqué suite à des signalements de la communauté" text_body_template: | Ceci est un message automatique @@ -1857,6 +1867,7 @@ fr: Cette limite peut être changée par le paramètre du site `block_new_user`. spam_post_blocked: + title: "Message spam bloqué" subject_template: "Les messages du nouvel utilisateur %{username} sont bloqués pour des liens répétés" text_body_template: | Ceci est un message automatique. @@ -1867,6 +1878,7 @@ fr: Ceci peut être modifier via les options `newuser_spam_host_threshold` et white_listed_spam_host_domains`. unblocked: + title: "Débloqué" subject_template: "Compte débloqué" text_body_template: | Bonjour, @@ -1875,6 +1887,7 @@ fr: Vous pouvez à nouveau créer des nouveaux messages et sujets. Merci pour votre patience. pending_users_reminder: + title: "Rappel d'utilisateurs en attente" subject_template: one: "1 utilisateur en attente d'approbation" other: "%{count} utilisateurs en attente d'approbation" @@ -1883,9 +1896,11 @@ fr: [Veuillez les examiner dans la section d'administration](%{base_url}/admin/users/list/pending). download_remote_images_disabled: + title: "Téléchargement d'images distantes désactivé" subject_template: "Téléchargement d'images distantes désactivé" text_body_template: "Le paramètre `download_remote_images_to_local` a été désactivé car la limite (`download_remote_images_threshold`) d'espace disque utilisé par les images vient d'être dépassée." dashboard_problems: + title: "Problèmes du tableau de bord" subject_template: "Des problèmes ont été trouvés" text_body_template: | Des problèmes ont été reportés dans votre panel d'administration. @@ -1937,6 +1952,7 @@ fr: > %{site_title} -- %{site_description} user_invited_to_private_message_pm: + title: "Utilisateur invité au MP" subject_template: "[%{site_name}] %{username} vous a invité dans la conversation « %{topic_title} »" text_body_template: | %{header_instructions} @@ -1953,6 +1969,7 @@ fr: %{respond_instructions} user_invited_to_topic: + title: "Utilisateur invité au sujet" subject_template: "[%{site_name}] %{username} vous a invité dans « %{topic_title} »" text_body_template: | %{header_instructions} @@ -1961,6 +1978,7 @@ fr: %{respond_instructions} user_replied: + title: "Utilisateur a répondu" subject_template: "[%{site_name}] %{topic_title}" text_body_template: | %{header_instructions} @@ -1971,6 +1989,7 @@ fr: %{respond_instructions} user_replied_pm: + title: "Utilisateur a répondu au MP" subject_template: "[%{site_name}] [MP] %{topic_title}" text_body_template: | %{header_instructions} @@ -1981,6 +2000,7 @@ fr: %{respond_instructions} user_quoted: + title: "Utilisateur a cité" subject_template: "[%{site_name}] %{topic_title}" text_body_template: | %{header_instructions} @@ -2001,6 +2021,7 @@ fr: %{respond_instructions} user_mentioned: + title: "Utilisateur a mentionné" subject_template: "[%{site_name}] %{topic_title}" text_body_template: | %{header_instructions} @@ -2085,6 +2106,7 @@ fr: view_this_topic: "Voir ce sujet" back_to_top: "Aller en haut" forgot_password: + title: "Mot de passe oublié" subject_template: "[%{site_name}] Réinitialisation du mot de passe" text_body_template: | Quelqu'un a demandé la réinitialisation de votre mot de passe sur [%{site_name}](%{base_url}). @@ -2094,6 +2116,7 @@ fr: Cliquez sur le lien ci-dessous pour choisir un nouveau mot de passe : %{base_url}/users/password-reset/%{email_token} set_password: + title: "Définir le mot de passe" subject_template: "[%{site_name}] Définir le mot de passe" text_body_template: | Quelqu'un a demandé d'ajouter un mot de passe à votre compte sur [%{site_name}](%{base_url}). Alternativement, vous pouvez vous connecter en utilisant un service en ligne pris en charge (Google, Facebook, etc) déjà associé à cette adresse de courriel validée. @@ -2145,6 +2168,7 @@ fr: %{new_email} signup_after_approval: + title: "Inscription après approbation" subject_template: "Votre compte a été approuvé sur %{site_name} !" text_body_template: | Bienvenue sur %{site_name} ! @@ -2163,6 +2187,7 @@ fr: (Si, en tant que nouvel utilisateur, vous avez besoin de communiquer avec un [responsable](%{base_url}/about), répondez simplement à ce message.) signup: + title: "Inscription" subject_template: "[%{site_name}] Confirmer votre nouveau compte" text_body_template: | Bienvenue sur %{site_name} ! @@ -2196,6 +2221,7 @@ fr: too_large: "Désolé, le fichier que vous essayez d'envoyer est trop gros (taille maximale de %{max_size_kb} Ko)." images: too_large: "Désolé, l'image que vous essayez d'envoyer est trop grande (taille maximale de %{max_size_kb} Ko), merci de le redimensionner et de réessayer." + larger_than_x_megapixels: "Désolé, l'image que vous essayez d'envoyer est trop grande (la dimension maximale est de %{max_image_megapixels} mégapixels) ; veuillez la redimensionner et réessayer." size_not_found: "Désolé, mais nous n'avons pas pu déterminer la taille de votre image. Peut-être est-elle corrompue ?" avatar: missing: "Désolé, nous ne parvenons pas à trouver un avatar associé à cette adresse mail. Pouvez-vous essayer de la télécharger à nouveau ?" @@ -2689,9 +2715,11 @@ fr: fields: welcome: label: "Sujet de bienvenue" + description: "

    Comment décririez-vous votre communauté à un inconnu en environ 1 minute ?

    • Pour qui sont destinées ces discussions ?
    • Que puis-je trouver ici ?
    • Pourquoi dois-je la visiter ?

    Votre sujet de bienvenue est la première chose que les nouveaux visiteurs vont voir. Voyez le comme votre unique paragraphe qui définit votre mission et différence.

    " one_paragraph: "Veuillez restreindre votre message de bienvenue à un paragraphe." privacy: title: "Accès" + description: "

    Votre communauté est-elle ouverte à tous ou restreinte par adhésion, invitation et approbation ? Si vous préférez, vous pouvez préparer le site en mode privé puis passer en public par la suite.

    Rappelez-vous aussi que vous pouvez toujours envoyer des invitations depuis les sujets ou votre page de profil utilisateur.

    " fields: privacy: choices: @@ -2717,6 +2745,7 @@ fr: description: "Tous les messages privés automatiques de Discourse seront envoyés par cet utilisateur. Plus important, cet utilisateur sera l'envoyeur désigné de tous les messages de bienvenue à destination des nouveaux utilisateurs." corporate: title: "Organisation" + description: "Ces noms seront renseignés dans les pages Politique de confidentialité et Conditions générales d'utilisation que vous pouvez modifier à tout moment depuis la catégorie Staff. Si vous n'avez pas de société, vous pouvez ignorer cette étape pour le moment." fields: company_short_name: label: "Nom de société (court)" @@ -2731,6 +2760,7 @@ fr: title: "Thème" fields: theme_id: + description: "Préférez-vous une palette de couleurs claires ou sombres pour commencer ? Vous pouvez personnaliser l'aspect du site dans Administration, Personaliser." choices: default: label: "Clair" @@ -2755,6 +2785,7 @@ fr: label: "Grande icône" description: "Icône utilisée pour représenter le site sur les appareils modernes et que rend bien à des tailles plus grandes. La taille minimale conseillée est de 144px par 144px." homepage: + description: "Nous recommandons d'afficher les sujets récents sur votre page d'accueil mais vous pouvez choisir d'y afficher les catégories (groupes de sujets) si vous préférez." title: "Page d'accueil" fields: homepage_style: @@ -2765,6 +2796,7 @@ fr: label: "Catégories" emoji: title: "Emoji" + description: "Quel style d'Emoji préférez-vous pour votre communauté ? Vous pouvez ajouter des Emoji supplémentaires dans Administration, Personnaliser, Emoji." invites: title: "Inviter des responsables" description: "Vous avez presque fini ! Invitons quelques responsables pour aider à entamer les discussions avec des sujets et réponses intéressantes pour lancer la communauté." diff --git a/config/locales/server.he.yml b/config/locales/server.he.yml index c338080665..4812e9b0f2 100644 --- a/config/locales/server.he.yml +++ b/config/locales/server.he.yml @@ -496,8 +496,8 @@ he: other: "לפני כמעט %{count} שנים" password_reset: no_token: "מצטערים, הקישור לשינוי הסיסמה ישן מדי. לחצו על כפתור הכניסה ובחרו ב\"שכחתי את הסיסמה שלי\" כדי לקבל קישור חדש." - choose_new: "אנא ביחרו סיסמה חדשה" - choose: "אנא בחרו סיסמה" + choose_new: "בחרו סיסמה חדשה" + choose: "בחרו סיסמה" update: 'עידכון סיסמה' save: 'שמירת סיסמה' title: 'איפוס סיסמה' @@ -1477,11 +1477,12 @@ he: > %{site_title} -- %{site_description} - מסר מ%{invitee_name}: + עם מסר זה - %{user_custom_message} + > %{user_custom_message} אם את/ה מעוניינ/ת, לחצו על הקישור: + %{invite_link} הזמנה זו נשלחה על ידי משתמש מוכר, כך שתוכלו להגיב לדיון מיידית. @@ -1510,9 +1511,9 @@ he: > > %{site_description} - הודעה מ %{invitee_name}: + עם מסר זה: - %{user_custom_message} + > %{user_custom_message} אם אתם מעוניינים, לחצו על הקישור הבא: diff --git a/config/locales/server.it.yml b/config/locales/server.it.yml index c394329c4f..c6420e181f 100644 --- a/config/locales/server.it.yml +++ b/config/locales/server.it.yml @@ -32,6 +32,7 @@ it: purge_reason: "Account cancellato automaticamente perché abbandonato o disattivato" disable_remote_images_download_reason: "Lo scaricamento delle immagini remote è stato disabilitato perché non c'è abbastanza spazio disco disponibile." anonymous: "Anonimo" + remove_posts_deleted_by_author: "Cancellato dall'autore" emails: incoming: default_subject: "Email in arrivo da %{email}" diff --git a/config/locales/server.ru.yml b/config/locales/server.ru.yml index 48ea5176e6..5132845054 100644 --- a/config/locales/server.ru.yml +++ b/config/locales/server.ru.yml @@ -74,6 +74,7 @@ ru: invalid: неверный is_invalid: "Не совсем ясно, это предложение закончено?" contains_censored_words: "содержит одно или более нецензурных слов: %{censored_words}" + matches_censored_pattern: "соответствует следующему регулярному выражению цензуры: %{censored_pattern}" less_than: должен быть меньше %{count} less_than_or_equal_to: должен быть меньше или равен %{count} not_a_number: не число @@ -133,6 +134,11 @@ ru: embed: start_discussion: "Начать обсуждение" continue: "Продолжить обсуждение" + error: "Встраивание Ошибки" + referer: "Отсылающий:" + mismatch: "Ссылающийся не совпал с каким-либо из следующих хостов:" + no_hosts: "Никаких хостов не настроено для встраивания." + configure: "Настроить Встраивание" more_replies: one: "Еще 1 ответ" few: "Еще %{count} ответа" @@ -298,6 +304,7 @@ ru: name: "Название раздела" topic: title: 'Заголовок' + featured_link: 'Показанная Ссылка' post: raw: "Текст сообщения" user_profile: @@ -551,8 +558,8 @@ ru: other: "почти %{count} лет назад" password_reset: no_token: "К сожалению, данная ссылка на изменение пароля устарела. Нажмите на кнопку \"Войти\", а затем на \"Я забыл свой пароль\", чтобы сгенерировать новую ссылку для изменения пароля." - choose_new: "Придумайте новый пароль" - choose: "Придумайте пароль" + choose_new: "Введите новый пароль" + choose: "Введите пароль" update: 'Обновить пароль' save: 'Установить пароль' title: 'Сбросить пароль' @@ -1121,7 +1128,7 @@ ru: slug_generation_method: "Выберите метод генерации URL. 'encoded' будет изпользовать русские буквы в URL закодированные через проценты. 'none' не будет использовать перегенирацию." enable_emoji: "Активировать смайлы Emoji" emoji_set: "Какую коллекцию Emoji использовать?" - enforce_square_emoji: "Принудительно использовать квадратные пропорции для смайликов." + enforce_square_emoji: "Принудительно использовать квадратные пропорции для всех эмодзи." approve_unless_trust_level: "Сообщения для пользователей ниже этого уровня доверия подлежат проверки" default_email_private_messages: "По умолчанию присылать почтовое уведомление, когда кто-то оставляет пользователю личное сообщение." default_email_mailing_list_mode: "По умолчанию присылать почтовое уведомление, когда появляется новое сообщение." @@ -1787,8 +1794,8 @@ ru: empathetic: name: Чуткий first_emoji: - name: Первый Смайлик - description: Использовал Смайлик в Сообщении + name: Первый Эмодзи + description: Использовал Эмодзи в Сообщении first_mention: name: Первое обращение description: Упомянул другого пользователя в сообщении @@ -1841,17 +1848,24 @@ ru: description: "Язык по умолчанию для Вашего сообщества?" forum_title: title: "Наименование" + description: "Ваше название - это знак видимый издалека, первая вещь которую возможные посетители подметят в вашем сообществе. Что ваше имя и название говорят о вашем сообществе?" fields: + title: + label: "Название вашего сообщества" + placeholder: "Тусовка Жени" site_description: label: "Опишите Ваше сообщество одним коротким предложением" + placeholder: "Место, где Женя и её друзья говорят о прикольных вещах" introduction: title: "Введение" fields: welcome: label: "Приветственная тема" + description: "

    Как бы Вы описали ваше сообщество незнакомцу в лифте за 1 минуту?