From 303a02b90100a70ac5bc5b0d580ec65c1eb3465c Mon Sep 17 00:00:00 2001 From: Ryan Mulligan Date: Thu, 24 Mar 2016 11:40:25 -0700 Subject: [PATCH 0001/1447] FEATURE: make discourse remap optionally do regex_replace This adds a --regex option to discourse remap to use the regexp_replace feature in PostgreSQL. Example usage: discourse remap --regex "\[\/?color(=[^\]]*)*]" "" removes all the "color" bbcodes. Also, this commit fixes the --global option, which did not work because of how Thor processes the options. --- script/discourse | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/script/discourse b/script/discourse index af03de89b3..8c892ac460 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 @@ -185,7 +189,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'" @@ -199,10 +203,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 e9db03e465998dba5520b926e75042ecae8cb9bc Mon Sep 17 00:00:00 2001 From: Acshi Haggenmiller Date: Fri, 22 Jul 2016 15:33:21 -0400 Subject: [PATCH 0002/1447] allow localhost as an embeddedable host --- app/models/embeddable_host.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/models/embeddable_host.rb b/app/models/embeddable_host.rb index ffa1005c6f..d42879ad94 100644 --- a/app/models/embeddable_host.rb +++ b/app/models/embeddable_host.rb @@ -25,7 +25,8 @@ class EmbeddableHost < ActiveRecord::Base def host_must_be_valid if host !~ /\A[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,7}(:[0-9]{1,5})?(\/.*)?\Z/i && - host !~ /\A(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\Z/ + host !~ /\A(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\Z/ && + host !~ /\A([a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.)?localhost(\:[0-9]{1,5})?(\/.*)?\Z/i errors.add(:host, I18n.t('errors.messages.invalid')) end end From afa88f68ce4e5764a947c4222892a0498bc78a08 Mon Sep 17 00:00:00 2001 From: Acshi Haggenmiller Date: Fri, 22 Jul 2016 17:12:57 -0400 Subject: [PATCH 0003/1447] added spec for localhost embeddable host validation --- spec/models/embeddable_host_spec.rb | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/spec/models/embeddable_host_spec.rb b/spec/models/embeddable_host_spec.rb index 4ee44c5608..c6596370a5 100644 --- a/spec/models/embeddable_host_spec.rb +++ b/spec/models/embeddable_host_spec.rb @@ -26,6 +26,29 @@ describe EmbeddableHost do expect(eh.host).to eq('192.168.0.1') end + it "supports localhost" do + eh = EmbeddableHost.new(host: 'localhost') + expect(eh).to be_valid + expect(eh.host).to eq('localhost') + end + + it "supports ports of localhost" do + eh = EmbeddableHost.new(host: 'localhost:8080') + expect(eh).to be_valid + expect(eh.host).to eq('localhost:8080') + end + + it "supports subdomains of localhost" do + eh = EmbeddableHost.new(host: 'discourse.localhost') + expect(eh).to be_valid + expect(eh.host).to eq('discourse.localhost') + end + + it "rejects misspellings of localhost" do + eh = EmbeddableHost.new(host: 'alocalhost') + expect(eh).not_to be_valid + end + describe "allows_embeddable_host" do let!(:host) { Fabricate(:embeddable_host) } From c2819e99f4c6bd7de90f57476de454d116b4f596 Mon Sep 17 00:00:00 2001 From: James Kiesel Date: Wed, 3 Aug 2016 12:29:38 -0400 Subject: [PATCH 0004/1447] Don't halt notification emails for those on daily mailing list mode --- app/jobs/regular/user_email.rb | 1 + spec/jobs/user_email_spec.rb | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/jobs/regular/user_email.rb b/app/jobs/regular/user_email.rb index bb6b8cc1d0..50109e2a68 100644 --- a/app/jobs/regular/user_email.rb +++ b/app/jobs/regular/user_email.rb @@ -103,6 +103,7 @@ module Jobs end if user.user_option.mailing_list_mode? && + user.user_option.mailing_list_mode_frequency == 1 && # don't catch notifications for users on daily mailing list mode (!post.try(:topic).try(:private_message?)) && NOTIFICATIONS_SENT_BY_MAILING_LIST.include?(email_args[:notification_type]) # no need to log a reason when the mail was already sent via the mailing list job diff --git a/spec/jobs/user_email_spec.rb b/spec/jobs/user_email_spec.rb index 4f4d07d22b..f99a403b4e 100644 --- a/spec/jobs/user_email_spec.rb +++ b/spec/jobs/user_email_spec.rb @@ -201,6 +201,13 @@ describe Jobs::UserEmail do Jobs::UserEmail.new.execute(type: :user_mentioned, user_id: user.id, notification_id: notification.id) end + it "does send the email if the user is using daily mailing list mode" do + Email::Sender.any_instance.expects(:send) + user.user_option.update(mailing_list_mode: true, mailing_list_mode_frequency: 0) + + Jobs::UserEmail.new.execute(type: :user_mentioned, user_id: user.id, notification_id: notification.id) + end + it "does not send notification if limit is reached" do SiteSetting.max_emails_per_day_per_user = 2 @@ -218,9 +225,9 @@ describe Jobs::UserEmail do expect(EmailLog.where(user_id: user.id, skipped: true).count).to eq(1) end - it "doesn't send the mail if the user is using mailing list mode" do + it "doesn't send the mail if the user is using individual mailing list mode" do Email::Sender.any_instance.expects(:send).never - user.user_option.update_column(:mailing_list_mode, true) + user.user_option.update(mailing_list_mode: true, mailing_list_mode_frequency: 1) # sometimes, we pass the notification_id Jobs::UserEmail.new.execute(type: :user_mentioned, user_id: user.id, notification_id: notification.id, post_id: post.id) # other times, we only pass the type of notification From 823a699d41974affe42adbd562cc9fbfd5a56ef1 Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Fri, 5 Aug 2016 15:18:19 -0400 Subject: [PATCH 0005/1447] Version bump to v1.7.0.beta1 --- lib/version.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/version.rb b/lib/version.rb index e67396474b..3c7d5a4fa0 100644 --- a/lib/version.rb +++ b/lib/version.rb @@ -3,9 +3,9 @@ module Discourse unless defined? ::Discourse::VERSION module VERSION #:nodoc: MAJOR = 1 - MINOR = 6 + MINOR = 7 TINY = 0 - PRE = 'beta12' + PRE = 'beta1' STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.') end From d8165d7cee84c1568678c7acde6f91af63908169 Mon Sep 17 00:00:00 2001 From: cpradio Date: Sat, 6 Aug 2016 11:18:10 -0400 Subject: [PATCH 0006/1447] FEATURE: Allow keyboard shortcuts for topic list to start from last viewed topic --- .../javascripts/discourse/components/topic-list-item.js.es6 | 5 +++-- .../javascripts/discourse/lib/keyboard-shortcuts.js.es6 | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/discourse/components/topic-list-item.js.es6 b/app/assets/javascripts/discourse/components/topic-list-item.js.es6 index 28c00c4345..765154cb31 100644 --- a/app/assets/javascripts/discourse/components/topic-list-item.js.es6 +++ b/app/assets/javascripts/discourse/components/topic-list-item.js.es6 @@ -113,11 +113,12 @@ export default Ember.Component.extend(StringBuffer, { } }, - highlight() { + highlight(isLastViewedTopic = false) { const $topic = this.$(); const originalCol = $topic.css('backgroundColor'); $topic .addClass('highlighted') + .attr('data-islastviewedtopic', isLastViewedTopic) .stop() .animate({ backgroundColor: originalCol }, 2500, 'swing', function() { $topic.removeClass('highlighted'); @@ -128,7 +129,7 @@ export default Ember.Component.extend(StringBuffer, { // highlight the last topic viewed if (this.session.get('lastTopicIdViewed') === this.get('topic.id')) { this.session.set('lastTopicIdViewed', null); - this.highlight(); + this.highlight(true); } else if (this.get('topic.highlight')) { // highlight new topics that have been loaded from the server or the one we just created this.set('topic.highlight', false); diff --git a/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 b/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 index 70af9c9526..5701e4b735 100644 --- a/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 +++ b/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 @@ -277,7 +277,9 @@ export default { return; } - const $selected = $articles.filter('.selected'); + const $selected = ($articles.filter('.selected').length !== 0) + ? $articles.filter('.selected') + : $articles.filter('[data-islastviewedtopic=true]'); let index = $articles.index($selected); if ($selected.length !== 0) { //boundries check From fce902ab1ede77c66cc057590d22251148b98e54 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Mon, 8 Aug 2016 07:24:09 +0800 Subject: [PATCH 0007/1447] UX: Centering Badge notification styles on mobile. --- app/assets/stylesheets/mobile/topic-list.scss | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/mobile/topic-list.scss b/app/assets/stylesheets/mobile/topic-list.scss index 660446f6f5..c2a658e32a 100644 --- a/app/assets/stylesheets/mobile/topic-list.scss +++ b/app/assets/stylesheets/mobile/topic-list.scss @@ -86,7 +86,12 @@ position: relative; top: -1px; font-size: 1.071em; - padding: 4px 6px 3px 6px; + line-height: 20px; + min-width: 14px; + height: 20px; + border-radius: 10px; + padding: 0px 3px; + i {color: $secondary;} &.new-topic::before { @@ -141,6 +146,10 @@ box-sizing: inherit; } + .topic-post-badges { + box-sizing: border-box; + } + .posts { width: 10%; vertical-align: top; @@ -149,6 +158,12 @@ .age { margin-left: 5px; } + + td.posts { + .badge-notification { + padding: 0px 6px; + } + } } tr.category-topic-link { From 8539f02b5e4345ccef6860e9bedf2ca845c459ca Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Mon, 8 Aug 2016 07:49:37 +0800 Subject: [PATCH 0008/1447] FIX: Backuper should return the full path. --- lib/backup_restore/backuper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/backup_restore/backuper.rb b/lib/backup_restore/backuper.rb index daf328c632..5c547b7545 100644 --- a/lib/backup_restore/backuper.rb +++ b/lib/backup_restore/backuper.rb @@ -52,7 +52,7 @@ module BackupRestore @success = false else @success = true - @backup_filename + File.join(@archive_directory, @backup_filename) ensure begin notify_user From 72b321b7b40b748eadb9f0b6809164e24752474f Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Mon, 8 Aug 2016 09:02:46 +0800 Subject: [PATCH 0009/1447] Revert "UX: Centering Badge notification styles on mobile." This reverts commit fce902ab1ede77c66cc057590d22251148b98e54. --- .../common/components/badges.css.scss | 9 +++------ app/assets/stylesheets/mobile/topic-list.scss | 17 +---------------- 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/app/assets/stylesheets/common/components/badges.css.scss b/app/assets/stylesheets/common/components/badges.css.scss index c81be42813..3dd2d80eb4 100644 --- a/app/assets/stylesheets/common/components/badges.css.scss +++ b/app/assets/stylesheets/common/components/badges.css.scss @@ -9,7 +9,7 @@ display: inline-block; font-weight: normal; white-space: nowrap; - @include border-radius-all(9px); + @include border-radius-all(10px); } // Category badges @@ -234,16 +234,13 @@ .badge-notification { @extend %badge; + padding: 4px 5px 2px 5px; vertical-align: middle; color: $secondary; font-size: 11px; - line-height: 18px; - min-width: 12px; - height: 18px; - padding: 0px 3px; + line-height: 1; text-align: center; background-color: dark-light-choose(scale-color($primary, $lightness: 70%), scale-color($secondary, $lightness: 70%)); - &[href] { color: $secondary; } diff --git a/app/assets/stylesheets/mobile/topic-list.scss b/app/assets/stylesheets/mobile/topic-list.scss index c2a658e32a..660446f6f5 100644 --- a/app/assets/stylesheets/mobile/topic-list.scss +++ b/app/assets/stylesheets/mobile/topic-list.scss @@ -86,12 +86,7 @@ position: relative; top: -1px; font-size: 1.071em; - line-height: 20px; - min-width: 14px; - height: 20px; - border-radius: 10px; - padding: 0px 3px; - + padding: 4px 6px 3px 6px; i {color: $secondary;} &.new-topic::before { @@ -146,10 +141,6 @@ box-sizing: inherit; } - .topic-post-badges { - box-sizing: border-box; - } - .posts { width: 10%; vertical-align: top; @@ -158,12 +149,6 @@ .age { margin-left: 5px; } - - td.posts { - .badge-notification { - padding: 0px 6px; - } - } } tr.category-topic-link { From 02d63d5bc6ffb521508d1c1a20c15a902f249d25 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Mon, 8 Aug 2016 09:33:50 +0800 Subject: [PATCH 0010/1447] FIX: Backup script with custom filename needs to include version number. --- script/discourse | 3 +++ 1 file changed, 3 insertions(+) diff --git a/script/discourse b/script/discourse index b6c14276bf..d5d800a331 100755 --- a/script/discourse +++ b/script/discourse @@ -41,6 +41,9 @@ class DiscourseCLI < Thor backup = backuper.run if filename.present? puts "Moving '#{backup}' to '#{filename}'" + puts "Including version number into '#{filename}'" + version_string = File.basename(backup)[/-#{BackupRestore::VERSION_PREFIX}\d{14}/] + filename = filename.dup.insert(filename.index('.'), version_string) FileUtils.mv(backup, filename) backup = filename end From aa561006602cb65c9b26024daf1063c3db7ddb14 Mon Sep 17 00:00:00 2001 From: Matt Palmer Date: Mon, 8 Aug 2016 16:02:23 +1000 Subject: [PATCH 0011/1447] Failover messages really aren't warnings "I'm going to do something entirely sane and reasonable" doesn't warrant a warning-level log message. It's perfectly fine and reasonable to just log that sort of thing at info level. --- lib/discourse_redis.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/discourse_redis.rb b/lib/discourse_redis.rb index 8fd9a39599..f3f4993c81 100644 --- a/lib/discourse_redis.rb +++ b/lib/discourse_redis.rb @@ -28,10 +28,10 @@ class DiscourseRedis def initiate_fallback_to_master begin slave_client = ::Redis::Client.new(@slave_config) - logger.warn "#{log_prefix}: Checking connection to master server..." + logger.info "#{log_prefix}: Checking connection to master server..." if slave_client.call([:info]).split("\r\n").include?(MASTER_LINK_STATUS) - logger.warn "#{log_prefix}: Master server is active, killing all connections to slave..." + logger.info "#{log_prefix}: Master server is active, killing all connections to slave..." CONNECTION_TYPES.each do |connection_type| slave_client.call([:client, [:kill, 'type', connection_type]]) From 90d4ea70999195750570198fe3a26b670fa4a042 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Mon, 8 Aug 2016 20:40:50 +0530 Subject: [PATCH 0012/1447] bump onebox version --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 85da258e69..33a317fb9a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -216,7 +216,7 @@ GEM omniauth-twitter (1.2.1) json (~> 1.3) omniauth-oauth (~> 1.1) - onebox (1.5.44) + onebox (1.5.45) htmlentities (~> 4.3.4) moneta (~> 0.8) multi_json (~> 1.11) From 3db020f95e57b9bb519a8740dce26f0c9f78fb92 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Mon, 8 Aug 2016 12:24:30 -0400 Subject: [PATCH 0013/1447] FIX: Display anonymous counts nicely on badges --- .../javascripts/discourse/widgets/hamburger-categories.js.es6 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/widgets/hamburger-categories.js.es6 b/app/assets/javascripts/discourse/widgets/hamburger-categories.js.es6 index 4000467e94..37bdae69fb 100644 --- a/app/assets/javascripts/discourse/widgets/hamburger-categories.js.es6 +++ b/app/assets/javascripts/discourse/widgets/hamburger-categories.js.es6 @@ -16,7 +16,7 @@ createWidget('hamburger-category', { } if (!this.currentUser) { - results.push(h('b.topics-count', c.get('topic_count').toString())); + results.push(h('b.topics-count', number(c.get('topic_count')))); } return results; From a9ae99bf82b003bc89a57bdc9e70e8fc0dff55be Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Tue, 9 Aug 2016 00:32:43 +0800 Subject: [PATCH 0014/1447] FIX: Admin dashboard problems not displaying when there is one error. --- app/assets/javascripts/admin/controllers/admin-dashboard.js.es6 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/admin/controllers/admin-dashboard.js.es6 b/app/assets/javascripts/admin/controllers/admin-dashboard.js.es6 index 82cedfee59..2e39c15880 100644 --- a/app/assets/javascripts/admin/controllers/admin-dashboard.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-dashboard.js.es6 @@ -22,7 +22,7 @@ export default Ember.Controller.extend({ @computed('problems.length') foundProblems(problemsLength) { - return this.currentUser.get('admin') && (problemsLength || 0) > 1; + return this.currentUser.get('admin') && (problemsLength || 0) > 0; }, @computed('foundProblems') From 01ced67ab39a3055cced66e58c9fcf857f4db920 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Mon, 8 Aug 2016 13:57:05 -0400 Subject: [PATCH 0015/1447] FIX: Focus on usernames if it's blank when composing a message --- app/assets/javascripts/discourse/controllers/composer.js.es6 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/controllers/composer.js.es6 b/app/assets/javascripts/discourse/controllers/composer.js.es6 index b89d61a98b..c04063ed1b 100644 --- a/app/assets/javascripts/discourse/controllers/composer.js.es6 +++ b/app/assets/javascripts/discourse/controllers/composer.js.es6 @@ -69,7 +69,9 @@ export default Ember.Controller.extend({ focusTarget(replyingToTopic, creatingPM, usernames) { if (this.capabilities.isIOS) { return "none"; } - if (creatingPM && usernames === this.currentUser.get('username')) { + // Focus on usernames if it's blank or if it's just you + usernames = usernames || ""; + if (creatingPM && usernames.length === 0 || usernames === this.currentUser.get('username')) { return 'usernames'; } From 17b51bb465bb284a8496eb89d7b29fa3835f8a94 Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Mon, 8 Aug 2016 15:14:18 -0400 Subject: [PATCH 0016/1447] FIX: topics tagged with muted tags should not be included in digest emails --- app/models/topic.rb | 7 +++++++ spec/models/topic_spec.rb | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/app/models/topic.rb b/app/models/topic.rb index ce5b9c6ae3..20745168bb 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -361,6 +361,13 @@ class Topic < ActiveRecord::Base topics = topics.where("topics.category_id NOT IN (?)", muted_category_ids) end + # Remove muted categories + muted_tag_ids = TagUser.lookup(user, :muted).pluck(:tag_id) + unless muted_tag_ids.empty? + topics = topics.joins("LEFT OUTER JOIN topic_tags ON topic_tags.topic_id = topics.id") + .where("topic_tags.tag_id NOT IN (?)", muted_tag_ids) + end + topics end diff --git a/spec/models/topic_spec.rb b/spec/models/topic_spec.rb index 36b6376b47..9bac6b9344 100644 --- a/spec/models/topic_spec.rb +++ b/spec/models/topic_spec.rb @@ -1364,6 +1364,24 @@ describe Topic do expect(Topic.for_digest(u, 1.year.ago, top_order: true)).to eq([topic]) end + it "doesn't return topics with only muted tags" do + user = Fabricate(:user) + tag = Fabricate(:tag) + TagUser.change(user.id, tag.id, TagUser.notification_levels[:muted]) + topic = Fabricate(:topic, tags: [tag]) + + expect(Topic.for_digest(user, 1.year.ago, top_order: true)).to be_blank + end + + it "returns topics with both muted and not muted tags" do + user = Fabricate(:user) + muted_tag, other_tag = Fabricate(:tag), Fabricate(:tag) + TagUser.change(user.id, muted_tag.id, TagUser.notification_levels[:muted]) + topic = Fabricate(:topic, tags: [muted_tag, other_tag]) + + expect(Topic.for_digest(user, 1.year.ago, top_order: true)).to eq([topic]) + end + end describe 'secured' do From 754e3b2287b806a97123037ce2e52bc82c3c88b7 Mon Sep 17 00:00:00 2001 From: cpradio Date: Mon, 8 Aug 2016 15:15:27 -0400 Subject: [PATCH 0017/1447] Convert boolean to opts object --- .../javascripts/discourse/components/topic-list-item.js.es6 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/discourse/components/topic-list-item.js.es6 b/app/assets/javascripts/discourse/components/topic-list-item.js.es6 index 765154cb31..4d2facadf1 100644 --- a/app/assets/javascripts/discourse/components/topic-list-item.js.es6 +++ b/app/assets/javascripts/discourse/components/topic-list-item.js.es6 @@ -113,12 +113,12 @@ export default Ember.Component.extend(StringBuffer, { } }, - highlight(isLastViewedTopic = false) { + highlight(opts = { isLastViewedTopic: false }) { const $topic = this.$(); const originalCol = $topic.css('backgroundColor'); $topic .addClass('highlighted') - .attr('data-islastviewedtopic', isLastViewedTopic) + .attr('data-islastviewedtopic', opts.isLastViewedTopic) .stop() .animate({ backgroundColor: originalCol }, 2500, 'swing', function() { $topic.removeClass('highlighted'); @@ -129,7 +129,7 @@ export default Ember.Component.extend(StringBuffer, { // highlight the last topic viewed if (this.session.get('lastTopicIdViewed') === this.get('topic.id')) { this.session.set('lastTopicIdViewed', null); - this.highlight(true); + this.highlight({ isLastViewedTopic: true }); } else if (this.get('topic.highlight')) { // highlight new topics that have been loaded from the server or the one we just created this.set('topic.highlight', false); From 5c06076b5cd4bf2957574d6d6d621b09d46dbdeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Mon, 8 Aug 2016 12:30:37 +0200 Subject: [PATCH 0018/1447] FIX: strip blacklisted attachments before checking for empty email body --- lib/email/receiver.rb | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/email/receiver.rb b/lib/email/receiver.rb index a5ff182dfb..597bc0726e 100644 --- a/lib/email/receiver.rb +++ b/lib/email/receiver.rb @@ -77,7 +77,7 @@ module Email body, @elided = select_body body ||= "" - raise NoBodyDetectedError if body.blank? && !@mail.has_attachments? + raise NoBodyDetectedError if body.blank? && attachments.empty? if is_auto_generated? @incoming_email.update_columns(is_auto_generated: true) @@ -436,15 +436,17 @@ module Email raise InvalidPostAction.new(e) end - + def attachments + # strip blacklisted attachments (mostly signatures) + @attachments ||= @mail.attachments.select do |attachment| + attachment.content_type !~ SiteSetting.attachment_content_type_blacklist_regex && + attachment.filename !~ SiteSetting.attachment_filename_blacklist_regex + end + end def create_post_with_attachments(options={}) # deal with attachments - @mail.attachments.each do |attachment| - # strip blacklisted attachments (mostly signatures) - next if attachment.content_type =~ SiteSetting.attachment_content_type_blacklist_regex - next if attachment.filename =~ SiteSetting.attachment_filename_blacklist_regex - + attachments.each do |attachment| tmp = Tempfile.new("discourse-email-attachment") begin # read attachment From 51322a46b3fabab11cfa8f29ac4f386d8227aedf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Mon, 8 Aug 2016 22:28:27 +0200 Subject: [PATCH 0019/1447] FEATURE: retry processing incoming emails on rate limit --- app/jobs/regular/process_email.rb | 16 +++++++++++++++ config/locales/server.en.yml | 7 ------- lib/email/processor.rb | 14 ++++++------- spec/components/email/processor_spec.rb | 27 +++++++++++++++++++++++++ spec/jobs/process_email_spec.rb | 12 +++++++++++ 5 files changed, 61 insertions(+), 15 deletions(-) create mode 100644 app/jobs/regular/process_email.rb create mode 100644 spec/components/email/processor_spec.rb create mode 100644 spec/jobs/process_email_spec.rb diff --git a/app/jobs/regular/process_email.rb b/app/jobs/regular/process_email.rb new file mode 100644 index 0000000000..a01e3bc07d --- /dev/null +++ b/app/jobs/regular/process_email.rb @@ -0,0 +1,16 @@ +module Jobs + + class ProcessEmail < Jobs::Base + sidekiq_options retry: 3 + + def execute(args) + Email::Processor.process!(args[:mail], false) + end + + sidekiq_retries_exhausted do |msg| + Rails.logger.warn("Incoming email could not be processed after 3 retries.\n\n#{msg["args"][:mail]}") + end + + end + +end diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 9fdcd7c71c..50188377cf 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -2054,13 +2054,6 @@ en: If you can correct the problem, please try again. - email_reject_rate_limit_specified: - subject_template: "[%{site_name}] Email issue -- Rate limited" - text_body_template: | - We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work. - - Reason: %{rate_limit_description} - email_reject_invalid_post_action: subject_template: "[%{site_name}] Email issue -- Invalid Post Action" text_body_template: | diff --git a/lib/email/processor.rb b/lib/email/processor.rb index 3005b00d75..71c9b846f7 100644 --- a/lib/email/processor.rb +++ b/lib/email/processor.rb @@ -2,18 +2,21 @@ module Email class Processor - def initialize(mail) + def initialize(mail, retry_on_rate_limit=true) @mail = mail + @retry_on_rate_limit = retry_on_rate_limit end - def self.process!(mail) - Email::Processor.new(mail).process! + def self.process!(mail, retry_on_rate_limit=true) + Email::Processor.new(mail, retry_on_rate_limit).process! end def process! begin receiver = Email::Receiver.new(@mail) receiver.process! + rescue RateLimiter::LimitExceeded + @retry_on_rate_limit ? Jobs.enqueue(:process_email, mail: @mail) : raise rescue Email::Receiver::BouncedEmailError => e # never reply to bounced emails log_email_process_failure(@mail, e) @@ -49,7 +52,6 @@ module Email when ActiveRecord::Rollback then :email_reject_invalid_post when Email::Receiver::InvalidPostAction then :email_reject_invalid_post_action when Discourse::InvalidAccess then :email_reject_invalid_access - when RateLimiter::LimitExceeded then :email_reject_rate_limit_specified end template_args = {} @@ -61,10 +63,6 @@ module Email template_args[:post_error] = e.message end - if message_template == :email_reject_rate_limit_specified - template_args[:rate_limit_description] = e.description - end - if message_template # inform the user about the rejection message = Mail::Message.new(mail_string) diff --git a/spec/components/email/processor_spec.rb b/spec/components/email/processor_spec.rb new file mode 100644 index 0000000000..c30b09ad4e --- /dev/null +++ b/spec/components/email/processor_spec.rb @@ -0,0 +1,27 @@ +require "rails_helper" +require "email/processor" + +describe Email::Processor do + + describe "rate limits" do + + let(:mail) { "From: foo@bar.com\nTo: bar@foo.com\nSubject: FOO BAR\n\nFoo foo bar bar?" } + let(:limit_exceeded) { RateLimiter::LimitExceeded.new(10) } + + before do + Email::Receiver.any_instance.expects(:process!).raises(limit_exceeded) + end + + it "enqueues a background job by default" do + Jobs.expects(:enqueue).with(:process_email, mail: mail) + Email::Processor.process!(mail) + end + + it "doesn't enqueue a background job when retry is disabled" do + Jobs.expects(:enqueue).with(:process_email, mail: mail).never + expect { Email::Processor.process!(mail, false) }.to raise_error(limit_exceeded) + end + + end + +end diff --git a/spec/jobs/process_email_spec.rb b/spec/jobs/process_email_spec.rb new file mode 100644 index 0000000000..f740a8f2b1 --- /dev/null +++ b/spec/jobs/process_email_spec.rb @@ -0,0 +1,12 @@ +require "rails_helper" + +describe Jobs::ProcessEmail do + + let(:mail) { "From: foo@bar.com\nTo: bar@foo.com\nSubject: FOO BAR\n\nFoo foo bar bar?" } + + it "process an email without retry" do + Email::Processor.expects(:process!).with(mail, false) + Jobs::ProcessEmail.new.execute(mail: mail) + end + +end From 277e7383f342fc841591fece93f2ed8b22862c39 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Mon, 8 Aug 2016 17:05:22 -0400 Subject: [PATCH 0020/1447] Revert "FEATURE: make discourse remap optionally do regex_replace (#4367)" This reverts commit f8dda198bd63e6944e71dc952363b01e62fc353e, reversing changes made to 01ced67ab39a3055cced66e58c9fcf857f4db920. --- script/discourse | 37 +++++++++++++------------------------ 1 file changed, 13 insertions(+), 24 deletions(-) diff --git a/script/discourse b/script/discourse index a9ed089a40..d5d800a331 100755 --- a/script/discourse +++ b/script/discourse @@ -6,31 +6,27 @@ class DiscourseCLI < Thor class_option :verbose, default: false, aliases: :v desc "remap", "Remap a string sequence accross all tables" - option :global, :type => :boolean - option :regex, :type => :boolean - def remap(from, to) + def remap(from, to, global=nil) load_rails - if options[:regex] - puts "Rewriting all occurences of #{from} to #{to} using regexp_replace" - else - puts "Rewriting all occurences of #{from} to #{to}" - end + global = global == "--global" + + puts "Rewriting all occurences of #{from} to #{to}" puts "THIS TASK WILL REWRITE DATA, ARE YOU SURE (type YES)" - puts "WILL RUN ON ALL #{RailsMultisite::ConnectionManagement.all_dbs.length} DBS" if options[:global] + puts "WILL RUN ON ALL #{RailsMultisite::ConnectionManagement.all_dbs.length} DBS" if global text = STDIN.gets if text.strip != "YES" puts "aborting." exit end - if options[:global] + if global RailsMultisite::ConnectionManagement.each_connection do |db| puts "","Remapping tables on #{db}...","" - do_remap(from, to, options[:regex]) + do_remap(from, to) end else - do_remap(from, to, options[:regex]) + do_remap(from, to) end end @@ -203,7 +199,7 @@ class DiscourseCLI < Thor require File.expand_path(File.dirname(__FILE__) + "/../lib/import_export/import_export") end - def do_remap(from, to, regex=false) + def do_remap(from, to) 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'" @@ -217,17 +213,10 @@ 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 = 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 + 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]) puts "#{result.cmd_tuples} rows affected!" rescue => ex puts "Error: #{ex}" From 274a11f24443c4984aef9e32ad3e692060a68817 Mon Sep 17 00:00:00 2001 From: Guillaume Klein Date: Tue, 9 Aug 2016 08:12:37 +0900 Subject: [PATCH 0021/1447] Add French translations to the details plugin --- plugins/discourse-details/config/locales/client.fr.yml | 7 +++++++ plugins/discourse-details/config/locales/server.fr.yml | 3 +++ 2 files changed, 10 insertions(+) create mode 100644 plugins/discourse-details/config/locales/client.fr.yml create mode 100644 plugins/discourse-details/config/locales/server.fr.yml diff --git a/plugins/discourse-details/config/locales/client.fr.yml b/plugins/discourse-details/config/locales/client.fr.yml new file mode 100644 index 0000000000..84f9494dd8 --- /dev/null +++ b/plugins/discourse-details/config/locales/client.fr.yml @@ -0,0 +1,7 @@ +fr: + js: + details: + title: Cacher le texte + composer: + details_title: Résumé + details_text: "Ce texte sera caché" diff --git a/plugins/discourse-details/config/locales/server.fr.yml b/plugins/discourse-details/config/locales/server.fr.yml new file mode 100644 index 0000000000..4066a0937d --- /dev/null +++ b/plugins/discourse-details/config/locales/server.fr.yml @@ -0,0 +1,3 @@ +fr: + site_settings: + details_enabled: "Activer le plugin details. Si vous modifiez ceci, vous devez exécuter la commande \"rake posts:rebake\"." From 5cc8bb535bd25adc8c92f197943a2081694f4b51 Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 9 Aug 2016 10:02:18 +1000 Subject: [PATCH 0022/1447] SECURITY: do cookie auth rate limiting earlier --- lib/auth/default_current_user_provider.rb | 8 ++++++-- .../auth/default_current_user_provider_spec.rb | 10 ++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/auth/default_current_user_provider.rb b/lib/auth/default_current_user_provider.rb index 066f55d2c1..d726be453a 100644 --- a/lib/auth/default_current_user_provider.rb +++ b/lib/auth/default_current_user_provider.rb @@ -38,14 +38,18 @@ class Auth::DefaultCurrentUserProvider current_user = nil if auth_token && auth_token.length == 32 - current_user = User.where(auth_token: auth_token) + limiter = RateLimiter.new(nil, "cookie_auth_#{request.ip}", COOKIE_ATTEMPTS_PER_MIN ,60) + + if limiter.can_perform? + current_user = User.where(auth_token: auth_token) .where('auth_token_updated_at IS NULL OR auth_token_updated_at > ?', SiteSetting.maximum_session_age.hours.ago) .first + end unless current_user begin - RateLimiter.new(nil, "cookie_auth_#{request.ip}", COOKIE_ATTEMPTS_PER_MIN ,60).performed! + limiter.performed! rescue RateLimiter::LimitExceeded raise Discourse::InvalidAccess end diff --git a/spec/components/auth/default_current_user_provider_spec.rb b/spec/components/auth/default_current_user_provider_spec.rb index 3fecd09e56..dd69a375b3 100644 --- a/spec/components/auth/default_current_user_provider_spec.rb +++ b/spec/components/auth/default_current_user_provider_spec.rb @@ -86,6 +86,10 @@ describe Auth::DefaultCurrentUserProvider do end it "can only try 10 bad cookies a minute" do + + user = Fabricate(:user) + provider('/').log_on_user(user, {}, {}) + RateLimiter.stubs(:disabled?).returns(false) RateLimiter.new(nil, "cookie_auth_10.0.0.1", 10, 60).clear! @@ -97,10 +101,16 @@ describe Auth::DefaultCurrentUserProvider do 10.times do provider('/', env).current_user end + expect { provider('/', env).current_user }.to raise_error(Discourse::InvalidAccess) + expect { + env["HTTP_COOKIE"] = "_t=#{user.auth_token}" + provider("/", env).current_user + }.to raise_error(Discourse::InvalidAccess) + env["REMOTE_ADDR"] = "10.0.0.2" provider('/', env).current_user end From 73b6a22f615f965a93f5dcf863305096911b4973 Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 9 Aug 2016 10:12:56 +1000 Subject: [PATCH 0023/1447] UX: link to PM list from pm suggested topics --- app/assets/javascripts/discourse/controllers/topic.js.es6 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/controllers/topic.js.es6 b/app/assets/javascripts/discourse/controllers/topic.js.es6 index a21d55ca32..71a8ca8fc1 100644 --- a/app/assets/javascripts/discourse/controllers/topic.js.es6 +++ b/app/assets/javascripts/discourse/controllers/topic.js.es6 @@ -144,7 +144,7 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { @computed('model') suggestedTitle(model) { return model.get('isPrivateMessage') ? - ` ${I18n.t("suggested_topics.pm_title")}` : + ` ${I18n.t("suggested_topics.pm_title")}` : I18n.t("suggested_topics.title"); }, From 282f9948cbf17f9e713f2d385e20f0b941fddda4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Tue, 9 Aug 2016 20:14:49 +0200 Subject: [PATCH 0024/1447] FIX: wasn't able to update category's settings --- lib/validators/upload_url_validator.rb | 2 +- spec/models/category_spec.rb | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/validators/upload_url_validator.rb b/lib/validators/upload_url_validator.rb index 527ad2d4e9..da9c27d1fd 100644 --- a/lib/validators/upload_url_validator.rb +++ b/lib/validators/upload_url_validator.rb @@ -3,7 +3,7 @@ class UploadUrlValidator < ActiveModel::EachValidator if value.present? uri = URI.parse(value) rescue nil - unless uri && Upload.exists?(url: value) + unless uri && Discourse.store.has_been_uploaded?(value) record.errors[attribute] << (options[:message] || I18n.t('errors.messages.invalid')) end end diff --git a/spec/models/category_spec.rb b/spec/models/category_spec.rb index d603077ebf..ac5689578a 100644 --- a/spec/models/category_spec.rb +++ b/spec/models/category_spec.rb @@ -14,19 +14,20 @@ describe Category do context "url validation" do let(:user) { Fabricate(:user) } - let(:upload) { Fabricate(:upload) } it "ensures logo_url is valid" do expect(Fabricate.build(:category, user: user, logo_url: "---%")).not_to be_valid expect(Fabricate.build(:category, user: user, logo_url: "http://example.com/made-up.jpg")).not_to be_valid expect(Fabricate.build(:category, user: user, logo_url: upload.url)).to be_valid + expect(Fabricate.build(:category, user: user, logo_url: UrlHelper.schemaless(UrlHelper.absolute(upload.url)))).to be_valid end it "ensures background_url is valid" do expect(Fabricate.build(:category, user: user, background_url: ";test")).not_to be_valid expect(Fabricate.build(:category, user: user, background_url: "http://example.com/no.jpg")).not_to be_valid expect(Fabricate.build(:category, user: user, background_url: upload.url)).to be_valid + expect(Fabricate.build(:category, user: user, background_url: UrlHelper.schemaless(UrlHelper.absolute(upload.url)))).to be_valid end end From d8808aa9abde8d4dfa883f6b4d5ba92890fe274f Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 9 Aug 2016 12:16:29 -0400 Subject: [PATCH 0025/1447] Add back acceptance tests for full page search --- .../javascripts/discourse/lib/search.js.es6 | 34 ++++++++++--------- .../acceptance/search-full-test.js.es6 | 25 +++++++++----- .../helpers/create-pretender.js.es6 | 13 +++++++ 3 files changed, 48 insertions(+), 24 deletions(-) diff --git a/app/assets/javascripts/discourse/lib/search.js.es6 b/app/assets/javascripts/discourse/lib/search.js.es6 index b0929ca60a..348fe0f191 100644 --- a/app/assets/javascripts/discourse/lib/search.js.es6 +++ b/app/assets/javascripts/discourse/lib/search.js.es6 @@ -41,24 +41,26 @@ export function translateResults(results, opts) { results.resultTypes = []; // TODO: consider refactoring front end to take a better structure - [['topic','posts'],['user','users'],['category','categories']].forEach(function(pair){ - const type = pair[0], name = pair[1]; - if (results[name].length > 0) { - var result = { - results: results[name], - componentName: "search-result-" + ((opts.searchContext && opts.searchContext.type === 'topic' && type === 'topic') ? 'post' : type), - type, - more: r['more_' + name] - }; + if (r) { + [['topic','posts'],['user','users'],['category','categories']].forEach(function(pair){ + const type = pair[0], name = pair[1]; + if (results[name].length > 0) { + var result = { + results: results[name], + componentName: "search-result-" + ((opts.searchContext && opts.searchContext.type === 'topic' && type === 'topic') ? 'post' : type), + type, + more: r['more_' + name] + }; - if (result.more && name === "posts" && opts.fullSearchUrl) { - result.more = false; - result.moreUrl = opts.fullSearchUrl; + if (result.more && name === "posts" && opts.fullSearchUrl) { + result.more = false; + result.moreUrl = opts.fullSearchUrl; + } + + results.resultTypes.push(result); } - - results.resultTypes.push(result); - } - }); + }); + } const noResults = !!(results.topics.length === 0 && results.posts.length === 0 && diff --git a/test/javascripts/acceptance/search-full-test.js.es6 b/test/javascripts/acceptance/search-full-test.js.es6 index 96320ff0ce..005ea036f3 100644 --- a/test/javascripts/acceptance/search-full-test.js.es6 +++ b/test/javascripts/acceptance/search-full-test.js.es6 @@ -1,12 +1,21 @@ import { acceptance } from "helpers/qunit-helpers"; acceptance("Search - Full Page"); -// TODO: needs fixing (cc @sam) -// test("search", (assert) => { -// visit("/search?q=trout"); +test("perform various searches", assert => { + visit("/search"); -// andThen(() => { -// assert.ok(find('input.search').length > 0); -// assert.ok(find('.topic-list-item').length > 0); -// }); -// }); + andThen(() => { + assert.ok(find('input.search').length > 0); + assert.ok(find('.topic').length === 0); + }); + + fillIn('.search input', 'none'); + click('.search .btn-primary'); + + andThen(() => assert.ok(find('.topic').length === 0), 'has no results'); + + fillIn('.search input', 'posts'); + click('.search .btn-primary'); + + andThen(() => assert.ok(find('.topic').length === 1, 'has one post')); +}); diff --git a/test/javascripts/helpers/create-pretender.js.es6 b/test/javascripts/helpers/create-pretender.js.es6 index fc2c537c1a..b1e340058d 100644 --- a/test/javascripts/helpers/create-pretender.js.es6 +++ b/test/javascripts/helpers/create-pretender.js.es6 @@ -78,6 +78,19 @@ export default function() { this.get('/clicks/track', success); + this.get('/search', request => { + if (request.queryParams.q === 'posts') { + return response({ + posts: [{ + id: 1234 + }] + }); + } + + return response({}); + }); + + this.put('/users/eviltrout', () => response({ user: {} })); this.get("/t/280.json", () => response(fixturesByUrl['/t/280/1.json'])); From b2134aa1731fd0346969969cac55b56a7a603253 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 9 Aug 2016 13:22:14 -0400 Subject: [PATCH 0026/1447] Refactor full page search for style, remove lookups --- .../controllers/full-page-search.js.es6 | 36 ++++++--- .../initializers/page-tracking.js.es6 | 17 ----- .../discourse/lib/page-tracker.js.es6 | 21 +++++- .../discourse/routes/full-page-search.js.es6 | 8 +- .../discourse/templates/full-page-search.hbs | 74 +++++++++---------- .../acceptance/search-full-test.js.es6 | 6 +- 6 files changed, 85 insertions(+), 77 deletions(-) diff --git a/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 b/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 index 27ee3f0309..b2a5aeaeca 100644 --- a/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 +++ b/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 @@ -4,6 +4,7 @@ import showModal from 'discourse/lib/show-modal'; import { default as computed, observes } from 'ember-addons/ember-computed-decorators'; import Category from 'discourse/models/category'; import { escapeExpression } from 'discourse/lib/utilities'; +import { setTransient } from 'discourse/lib/page-tracker'; const SortOrders = [ {name: I18n.t('search.relevance'), id: 0}, @@ -14,6 +15,7 @@ const SortOrders = [ export default Ember.Controller.extend({ needs: ["application"], + bulkSelectEnabled: null, loading: Em.computed.not("model"), queryParams: ["q", "context_id", "context", "skip_context"], @@ -26,10 +28,15 @@ export default Ember.Controller.extend({ sortOrders: SortOrders, @computed('model.posts') - resultCount(posts){ + resultCount(posts) { return posts && posts.length; }, + @computed('resultCount') + hasResults(resultCount) { + return (resultCount || 0) > 0; + }, + @computed('q') hasAutofocus(q) { return Em.isEmpty(q); @@ -85,7 +92,7 @@ export default Ember.Controller.extend({ setSearchTerm(term) { this._searchOnSortChange = false; if (term) { - SortOrders.forEach((order) => { + SortOrders.forEach(order => { if (term.indexOf(order.term) > -1){ this.set('sortOrder', order.id); term = term.replace(order.term, ""); @@ -98,7 +105,7 @@ export default Ember.Controller.extend({ }, @observes('sortOrder') - triggerSearch(){ + triggerSearch() { if (this._searchOnSortChange) { this.search(); } @@ -130,13 +137,22 @@ export default Ember.Controller.extend({ this.set("controllers.application.showFooter", !this.get("loading")); }, - canBulkSelect: Em.computed.alias('currentUser.staff'), + @computed('hasResults') + canBulkSelect(hasResults) { + return this.currentUser && this.currentUser.staff && hasResults; + }, + + @computed + canCreateTopic() { + return this.currentUser && !this.site.mobileView; + }, search(){ if (this.get("searching")) return; this.set("searching", true); - const router = Discourse.__container__.lookup('router:main'); + this.set('bulkSelectEnabled', false); + this.get('selected').clear(); var args = { q: this.get("searchTerm") }; @@ -160,9 +176,9 @@ export default Ember.Controller.extend({ ajax("/search", { data: args }).then(results => { const model = translateResults(results) || {}; - router.transientCache('lastSearch', { searchKey, model }, 5); + setTransient('lastSearch', { searchKey, model }, 5); this.set("model", model); - }).finally(() => { this.set("searching",false); }); + }).finally(() => this.set("searching", false)); }, actions: { @@ -188,16 +204,12 @@ export default Ember.Controller.extend({ }, refresh() { - this.set('bulkSelectEnabled', false); - this.get('selected').clear(); this.search(); }, showSearchHelp() { // TODO: dupe code should be centralized - ajax("/static/search_help.html", { dataType: 'html' }).then((model) => { - showModal('searchHelp', { model }); - }); + ajax("/static/search_help.html", { dataType: 'html' }).then(model => showModal('searchHelp', { model })); }, search() { diff --git a/app/assets/javascripts/discourse/initializers/page-tracking.js.es6 b/app/assets/javascripts/discourse/initializers/page-tracking.js.es6 index 860ddaf0f8..7e744a7de9 100644 --- a/app/assets/javascripts/discourse/initializers/page-tracking.js.es6 +++ b/app/assets/javascripts/discourse/initializers/page-tracking.js.es6 @@ -7,31 +7,14 @@ export default { initialize(container) { - const cache = {}; - var transitionCount = 0; - // Tell our AJAX system to track a page transition const router = container.lookup('router:main'); router.on('willTransition', viewTrackingRequired); router.on('didTransition', function() { Em.run.scheduleOnce('afterRender', Ember.Route, cleanDOM); - transitionCount++; - _.each(cache, (v,k) => { - if (v && v.target && v.target < transitionCount) { - delete cache[k]; - } - }); }); - router.transientCache = function(key, data, count) { - if (data === undefined) { - return cache[key]; - } else { - return cache[key] = {data, target: transitionCount + count}; - } - }; - startPageTracking(router); // Out of the box, Discourse tries to track google analytics diff --git a/app/assets/javascripts/discourse/lib/page-tracker.js.es6 b/app/assets/javascripts/discourse/lib/page-tracker.js.es6 index 7e63b5c731..89deaafe03 100644 --- a/app/assets/javascripts/discourse/lib/page-tracker.js.es6 +++ b/app/assets/javascripts/discourse/lib/page-tracker.js.es6 @@ -2,6 +2,18 @@ const PageTracker = Ember.Object.extend(Ember.Evented); let _pageTracker = PageTracker.create(); let _started = false; + +const cache = {}; +let transitionCount = 0; + +export function setTransient(key, data, count) { + cache[key] = {data, target: transitionCount + count}; +} + +export function getTransient(key) { + return cache[key]; +} + export function startPageTracking(router) { if (_started) { return; } @@ -11,8 +23,13 @@ export function startPageTracking(router) { // Refreshing the title is debounced, so we need to trigger this in the // next runloop to have the correct title. - Em.run.next(() => { - _pageTracker.trigger('change', url, Discourse.get('_docTitle')); + Em.run.next(() => _pageTracker.trigger('change', url, Discourse.get('_docTitle'))); + + transitionCount++; + _.each(cache, (v,k) => { + if (v && v.target && v.target < transitionCount) { + delete cache[k]; + } }); }); _started = true; diff --git a/app/assets/javascripts/discourse/routes/full-page-search.js.es6 b/app/assets/javascripts/discourse/routes/full-page-search.js.es6 index 8507c0dce4..10cd876555 100644 --- a/app/assets/javascripts/discourse/routes/full-page-search.js.es6 +++ b/app/assets/javascripts/discourse/routes/full-page-search.js.es6 @@ -2,13 +2,13 @@ import { ajax } from 'discourse/lib/ajax'; import { translateResults, getSearchKey, isValidSearchTerm } from "discourse/lib/search"; import Composer from 'discourse/models/composer'; import PreloadStore from 'preload-store'; +import { getTransient, setTransient } from 'discourse/lib/page-tracker'; export default Discourse.Route.extend({ queryParams: { q: {}, context_id: {}, context: {}, skip_context: {} }, model(params) { - const router = Discourse.__container__.lookup('router:main'); - var cached = router.transientCache('lastSearch'); + const cached = getTransient('lastSearch'); var args = { q: params.q }; if (params.context_id && !args.skip_context) { args.search_context = { @@ -21,7 +21,7 @@ export default Discourse.Route.extend({ if (cached && cached.data.searchKey === searchKey) { // extend expiry - router.transientCache('lastSearch', { searchKey, model: cached.data.model }, 5); + setTransient('lastSearch', { searchKey, model: cached.data.model }, 5); return cached.data.model; } @@ -33,7 +33,7 @@ export default Discourse.Route.extend({ } }).then(results => { const model = (results && translateResults(results)) || {}; - router.transientCache('lastSearch', { searchKey, model }, 5); + setTransient('lastSearch', { searchKey, model }, 5); return model; }); }, diff --git a/app/assets/javascripts/discourse/templates/full-page-search.hbs b/app/assets/javascripts/discourse/templates/full-page-search.hbs index b869f0a724..d440956315 100644 --- a/app/assets/javascripts/discourse/templates/full-page-search.hbs +++ b/app/assets/javascripts/discourse/templates/full-page-search.hbs @@ -1,61 +1,57 @@ -{{#if model.posts}} - {{#if bulkSelectEnabled}} +{{#if bulkSelectEnabled}}
- {{i18n "search.select_all"}} - {{i18n "search.clear_all"}} + {{d-link action="selectAll" label="search.select_all"}} + {{d-link action="clearAll" label="search.clear_all"}}
- {{/if}} {{/if}} {{#if context}} -
- -
+
+ +
{{/if}} {{#conditional-loading-spinner condition=loading}} - {{#unless model.posts}} + {{#unless hasResults}}

{{#if searchActive}} - {{i18n "search.no_results"}} + {{i18n "search.no_results"}} {{/if}} {{i18n "search.search_help"}}

{{/unless}} - {{#if model.posts}} -
-
- - {{{i18n "search.result_count" count=resultCount term=noSortQ}}} - + {{#if hasResults}} +
+
+ + {{{i18n "search.result_count" count=resultCount term=noSortQ}}} + +
+
+ + {{i18n "search.sort_by"}} + + {{combo-box value=sortOrder content=sortOrders castInteger="true"}} +
-
- - {{i18n "search.sort_by"}} - - {{combo-box value=sortOrder content=sortOrders castInteger="true"}} -
-
{{/if}} {{#each model.posts as |result|}} @@ -101,7 +97,7 @@ {{#if showLikeCount}} {{#if result.like_count}} {{/if}} {{/if}} @@ -109,11 +105,11 @@
{{/each}} - {{#if model.posts}} - + {{#if hasResults}} + {{/if}} {{/conditional-loading-spinner}} diff --git a/test/javascripts/acceptance/search-full-test.js.es6 b/test/javascripts/acceptance/search-full-test.js.es6 index 005ea036f3..889b066ee6 100644 --- a/test/javascripts/acceptance/search-full-test.js.es6 +++ b/test/javascripts/acceptance/search-full-test.js.es6 @@ -6,16 +6,16 @@ test("perform various searches", assert => { andThen(() => { assert.ok(find('input.search').length > 0); - assert.ok(find('.topic').length === 0); + assert.ok(find('.fps-topic').length === 0); }); fillIn('.search input', 'none'); click('.search .btn-primary'); - andThen(() => assert.ok(find('.topic').length === 0), 'has no results'); + andThen(() => assert.ok(find('.fps-topic').length === 0), 'has no results'); fillIn('.search input', 'posts'); click('.search .btn-primary'); - andThen(() => assert.ok(find('.topic').length === 1, 'has one post')); + andThen(() => assert.ok(find('.fps-topic').length === 1, 'has one post')); }); From c1125c8649610a72e179416fae17d54104ebfef8 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 9 Aug 2016 13:41:25 -0400 Subject: [PATCH 0027/1447] PERF: Use simpler serializer for search, eager load post users --- app/serializers/search_post_serializer.rb | 5 ++--- lib/search.rb | 5 ++++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/serializers/search_post_serializer.rb b/app/serializers/search_post_serializer.rb index 1e92d044be..098aa60dff 100644 --- a/app/serializers/search_post_serializer.rb +++ b/app/serializers/search_post_serializer.rb @@ -1,9 +1,8 @@ -class SearchPostSerializer < PostSerializer +class SearchPostSerializer < BasicPostSerializer has_one :topic, serializer: TopicListItemSerializer - attributes :like_count + attributes :like_count, :blurb - attributes :blurb def blurb options[:result].blurb(object) end diff --git a/lib/search.rb b/lib/search.rb index 4cb1711c4e..84b29700b9 100644 --- a/lib/search.rb +++ b/lib/search.rb @@ -663,6 +663,7 @@ class Search post_sql = "SELECT *, row_number() over() row_number FROM (#{post_sql}) xxx" posts = Post.includes(:topic => :category) + .includes(:user) .joins("JOIN (#{post_sql}) x ON x.id = posts.topic_id AND x.post_number = posts.post_number") .order('row_number') @@ -679,7 +680,9 @@ class Search def topic_search if @search_context.is_a?(Topic) - posts = posts_query(@limit).where('posts.topic_id = ?', @search_context.id).includes(:topic => :category) + posts = posts_query(@limit).where('posts.topic_id = ?', @search_context.id) + .includes(:topic => :category) + .includes(:user) posts.each do |post| @results.add(post) end From 28436a604a65081f81ae8abfe0fc068e9d24f29c Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 9 Aug 2016 14:48:39 -0400 Subject: [PATCH 0028/1447] FIX: Prevent tricking the search from ignoring minimum lengths --- .../javascripts/discourse/lib/search.js.es6 | 10 +++---- lib/search.rb | 20 ++++++++++++-- spec/components/search_spec.rb | 27 +++++++++++++++++-- 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/app/assets/javascripts/discourse/lib/search.js.es6 b/app/assets/javascripts/discourse/lib/search.js.es6 index 348fe0f191..0598515b22 100644 --- a/app/assets/javascripts/discourse/lib/search.js.es6 +++ b/app/assets/javascripts/discourse/lib/search.js.es6 @@ -70,7 +70,7 @@ export function translateResults(results, opts) { return noResults ? null : Em.Object.create(results); } -function searchForTerm(term, opts) { +export function searchForTerm(term, opts) { if (!opts) opts = {}; // Only include the data we have @@ -94,7 +94,7 @@ function searchForTerm(term, opts) { return promise; } -const searchContextDescription = function(type, name){ +export function searchContextDescription(type, name) { if (type) { switch(type) { case 'topic': @@ -109,17 +109,15 @@ const searchContextDescription = function(type, name){ } }; -const getSearchKey = function(args){ +export function getSearchKey(args) { return args.q + "|" + ((args.searchContext && args.searchContext.type) || "") + "|" + ((args.searchContext && args.searchContext.id) || ""); }; -const isValidSearchTerm = function(searchTerm) { +export function isValidSearchTerm(searchTerm) { if (searchTerm) { return searchTerm.trim().length >= Discourse.SiteSettings.min_search_term_length; } else { return false; } }; - -export { searchForTerm, searchContextDescription, getSearchKey, isValidSearchTerm }; diff --git a/lib/search.rb b/lib/search.rb index 84b29700b9..38024cfcde 100644 --- a/lib/search.rb +++ b/lib/search.rb @@ -128,6 +128,8 @@ class Search end end + attr_accessor :term + def initialize(term, opts=nil) @opts = opts || {} @guardian = @opts[:guardian] || Guardian.new @@ -135,6 +137,7 @@ class Search @include_blurbs = @opts[:include_blurbs] || false @blurb_length = @opts[:blurb_length] @limit = Search.per_facet + @valid = true term = process_advanced_search!(term) @@ -155,14 +158,27 @@ class Search @results = GroupedSearchResults.new(@opts[:type_filter], term, @search_context, @include_blurbs, @blurb_length) end + def valid? + @valid + end + def self.execute(term, opts=nil) self.new(term, opts).execute end # Query a term def execute - if @term.blank? || @term.length < (@opts[:min_search_term_length] || SiteSetting.min_search_term_length) - return nil unless @filters.present? + + unless @filters.present? + min_length = @opts[:min_search_term_length] || SiteSetting.min_search_term_length + terms = (@term || '').split(/\s(?=(?:[^"]|"[^"]*")*$)/).reject {|t| t.length < min_length } + + if terms.blank? + @term = '' + @valid = false + return + end + @term = terms.join(' ') end # If the term is a number or url to a topic, just include that topic diff --git a/spec/components/search_spec.rb b/spec/components/search_spec.rb index 91a88719f5..f7dac71670 100644 --- a/spec/components/search_spec.rb +++ b/spec/components/search_spec.rb @@ -61,8 +61,31 @@ describe Search do end it 'does not search when the search term is too small' do - ActiveRecord::Base.expects(:exec_sql).never - Search.execute('evil', min_search_term_length: 5) + search = Search.new('evil', min_search_term_length: 5) + search.execute + expect(search.valid?).to eq(false) + expect(search.term).to eq('') + end + + it 'does not search for multiple small terms' do + search = Search.new('a b c d', min_search_term_length: 5) + search.execute + expect(search.valid?).to eq(false) + expect(search.term).to eq('') + end + + it 'searches for quoted short terms' do + search = Search.new('"a b c d"', min_search_term_length: 5) + search.execute + expect(search.valid?).to eq(true) + expect(search.term).to eq('"a b c d"') + end + + it 'discards short terms' do + search = Search.new('a b c okaylength', min_search_term_length: 5) + search.execute + expect(search.valid?).to eq(true) + expect(search.term).to eq('okaylength') end it 'escapes non alphanumeric characters' do From fd3a8583dd5c5f18c3f91839555744fa251586a6 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 9 Aug 2016 15:11:58 -0400 Subject: [PATCH 0029/1447] UX: Display a message when the search term is too short on full page --- .../controllers/full-page-search.js.es6 | 30 +++++++++---------- .../discourse/templates/full-page-search.hbs | 10 +++++-- .../stylesheets/common/base/search.scss | 4 +++ config/locales/client.en.yml | 1 + 4 files changed, 27 insertions(+), 18 deletions(-) diff --git a/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 b/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 index b2a5aeaeca..b33f338f6f 100644 --- a/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 +++ b/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 @@ -26,6 +26,7 @@ export default Ember.Controller.extend({ searching: false, sortOrder: 0, sortOrders: SortOrders, + invalidSearch: false, @computed('model.posts') resultCount(posts) { @@ -69,11 +70,6 @@ export default Ember.Controller.extend({ return isValidSearchTerm(q); }, - @computed('searchTerm', 'searching') - searchButtonDisabled(searchTerm, searching) { - return !!(searching || !isValidSearchTerm(searchTerm)); - }, - @computed('q') noSortQ(q) { if (q) { @@ -107,7 +103,7 @@ export default Ember.Controller.extend({ @observes('sortOrder') triggerSearch() { if (this._searchOnSortChange) { - this.search(); + this._search(); } }, @@ -147,14 +143,21 @@ export default Ember.Controller.extend({ return this.currentUser && !this.site.mobileView; }, - search(){ - if (this.get("searching")) return; - this.set("searching", true); + _search() { + if (this.get("searching")) { return; } + this.set('invalidSearch', false); + const searchTerm = this.get('searchTerm'); + if (!isValidSearchTerm(searchTerm)) { + this.set('invalidSearch', true); + return; + } + + this.set("searching", true); this.set('bulkSelectEnabled', false); this.get('selected').clear(); - var args = { q: this.get("searchTerm") }; + var args = { q: searchTerm }; const sortOrder = this.get("sortOrder"); if (sortOrder && SortOrders[sortOrder].term) { @@ -203,18 +206,13 @@ export default Ember.Controller.extend({ this.get('selected').clear(); }, - refresh() { - this.search(); - }, - showSearchHelp() { // TODO: dupe code should be centralized ajax("/static/search_help.html", { dataType: 'html' }).then(model => showModal('searchHelp', { model })); }, search() { - if (this.get("searchButtonDisabled")) return; - this.search(); + this._search(); } } }); diff --git a/app/assets/javascripts/discourse/templates/full-page-search.hbs b/app/assets/javascripts/discourse/templates/full-page-search.hbs index d440956315..5a57cfa87b 100644 --- a/app/assets/javascripts/discourse/templates/full-page-search.hbs +++ b/app/assets/javascripts/discourse/templates/full-page-search.hbs @@ -1,6 +1,6 @@ @@ -19,6 +19,12 @@ {{/if}} +{{#if invalidSearch}} +
+ {{i18n "search.too_short"}} +
+{{/if}} + {{#if context}}
+
+ + {{combo-box valueAttribute="value" content=notificationLevelsForReplying value=model.user_option.notification_level_when_replying}} +
+
{{combo-box valueAttribute="value" content=likeNotificationFrequencies value=model.user_option.like_notification_frequency}} diff --git a/app/models/notification_level_when_replying_site_setting.rb b/app/models/notification_level_when_replying_site_setting.rb new file mode 100644 index 0000000000..66b07cb545 --- /dev/null +++ b/app/models/notification_level_when_replying_site_setting.rb @@ -0,0 +1,26 @@ +require_dependency 'enum_site_setting' +require_dependency 'notification_levels' + +class NotificationLevelWhenReplyingSiteSetting < EnumSiteSetting + + def self.valid_value?(val) + val.to_i.to_s == val.to_s && + values.any? { |v| v[:value] == val.to_i } + end + + def self.notification_levels + NotificationLevels.topic_levels + end + + def self.values + @values ||= [ + { name: 'topic.notifications.watching.title', value: notification_levels[:watching] }, + { name: 'topic.notifications.tracking.title', value: notification_levels[:tracking] } + ] + end + + def self.translate_names? + true + end + +end diff --git a/app/models/topic_user.rb b/app/models/topic_user.rb index c07907e816..9738083ba7 100644 --- a/app/models/topic_user.rb +++ b/app/models/topic_user.rb @@ -37,24 +37,24 @@ class TopicUser < ActiveRecord::Base auto_track_tag: 12) end - def auto_track(user_id, topic_id, reason) + def auto_notification(user_id, topic_id, reason, notification_level) if TopicUser.where(user_id: user_id, topic_id: topic_id, notifications_reason_id: nil).exists? change(user_id, topic_id, - notification_level: notification_levels[:tracking], + notification_level: notification_level, notifications_reason_id: reason ) MessageBus.publish("/topic/#{topic_id}", { - notification_level_change: notification_levels[:tracking], + notification_level_change: notification_level, notifications_reason_id: reason }, user_ids: [user_id]) end end - def auto_watch(user_id, topic_id) + def auto_notification_for_staging(user_id, topic_id, reason) topic_user = TopicUser.find_or_initialize_by(user_id: user_id, topic_id: topic_id) topic_user.notification_level = notification_levels[:watching] - topic_user.notifications_reason_id = notification_reasons[:auto_watch] + topic_user.notifications_reason_id = reason topic_user.save end diff --git a/app/models/user_option.rb b/app/models/user_option.rb index 7e13a4d8f8..1071026c18 100644 --- a/app/models/user_option.rb +++ b/app/models/user_option.rb @@ -38,6 +38,7 @@ class UserOption < ActiveRecord::Base self.new_topic_duration_minutes = SiteSetting.default_other_new_topic_duration_minutes self.auto_track_topics_after_msecs = SiteSetting.default_other_auto_track_topics_after_msecs + self.notification_level_when_replying = SiteSetting.default_other_notification_level_when_replying self.like_notification_frequency = SiteSetting.default_other_like_notification_frequency @@ -129,26 +130,27 @@ end # # Table name: user_options # -# user_id :integer not null, primary key -# email_always :boolean default(FALSE), not null -# mailing_list_mode :boolean default(FALSE), not null -# email_digests :boolean -# email_direct :boolean default(TRUE), not null -# email_private_messages :boolean default(TRUE), not null -# external_links_in_new_tab :boolean default(FALSE), not null -# enable_quoting :boolean default(TRUE), not null -# dynamic_favicon :boolean default(FALSE), not null -# disable_jump_reply :boolean default(FALSE), not null -# automatically_unpin_topics :boolean default(TRUE), not null -# digest_after_minutes :integer -# auto_track_topics_after_msecs :integer -# new_topic_duration_minutes :integer -# last_redirected_to_top_at :datetime -# email_previous_replies :integer default(2), not null -# email_in_reply_to :boolean default(TRUE), not null -# like_notification_frequency :integer default(1), not null -# include_tl0_in_digests :boolean default(FALSE) -# mailing_list_mode_frequency :integer default(0), not null +# user_id :integer not null, primary key +# email_always :boolean default(FALSE), not null +# mailing_list_mode :boolean default(FALSE), not null +# email_digests :boolean +# email_direct :boolean default(TRUE), not null +# email_private_messages :boolean default(TRUE), not null +# external_links_in_new_tab :boolean default(FALSE), not null +# enable_quoting :boolean default(TRUE), not null +# dynamic_favicon :boolean default(FALSE), not null +# disable_jump_reply :boolean default(FALSE), not null +# automatically_unpin_topics :boolean default(TRUE), not null +# digest_after_minutes :integer +# auto_track_topics_after_msecs :integer +# notification_level_when_replying :integer +# new_topic_duration_minutes :integer +# last_redirected_to_top_at :datetime +# email_previous_replies :integer default(2), not null +# email_in_reply_to :boolean default(TRUE), not null +# like_notification_frequency :integer default(1), not null +# include_tl0_in_digests :boolean default(FALSE) +# mailing_list_mode_frequency :integer default(0), not null # # Indexes # diff --git a/app/serializers/user_option_serializer.rb b/app/serializers/user_option_serializer.rb index 7d7dedfa8a..33cc3f4cc8 100644 --- a/app/serializers/user_option_serializer.rb +++ b/app/serializers/user_option_serializer.rb @@ -13,6 +13,7 @@ class UserOptionSerializer < ApplicationSerializer :digest_after_minutes, :automatically_unpin_topics, :auto_track_topics_after_msecs, + :notification_level_when_replying, :new_topic_duration_minutes, :email_previous_replies, :email_in_reply_to, @@ -24,6 +25,10 @@ class UserOptionSerializer < ApplicationSerializer object.auto_track_topics_after_msecs || SiteSetting.default_other_auto_track_topics_after_msecs end + def notification_level_when_replying + object.notification_level_when_replying || SiteSetting.default_other_notification_level_when_replying + end + def new_topic_duration_minutes object.new_topic_duration_minutes || SiteSetting.default_other_new_topic_duration_minutes end diff --git a/app/services/user_updater.rb b/app/services/user_updater.rb index ad25b23fa3..44d217e3bd 100644 --- a/app/services/user_updater.rb +++ b/app/services/user_updater.rb @@ -29,6 +29,7 @@ class UserUpdater :digest_after_minutes, :new_topic_duration_minutes, :auto_track_topics_after_msecs, + :notification_level_when_replying, :email_previous_replies, :email_in_reply_to, :like_notification_frequency, diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index d7d843602b..9395c5ac4b 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -739,6 +739,8 @@ en: after_5_minutes: "after 5 minutes" after_10_minutes: "after 10 minutes" + notification_level_when_replying: "When I post in a topic, set that topic to" + invited: search: "type to search invites..." title: "Invites" diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 649f99fe9a..61988898c1 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -1373,6 +1373,7 @@ en: default_other_new_topic_duration_minutes: "Global default condition for which a topic is considered new." default_other_auto_track_topics_after_msecs: "Global default time before a topic is automatically tracked." + default_other_notification_level_when_replying: "Global default notification level when the user replies to a topic." default_other_external_links_in_new_tab: "Open external links in a new tab by default." default_other_enable_quoting: "Enable quote reply for highlighted text by default." default_other_dynamic_favicon: "Show new/updated topic count on browser icon by default." diff --git a/config/site_settings.yml b/config/site_settings.yml index 3a80594f62..e44994e8b1 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -1247,6 +1247,9 @@ user_preferences: default_other_auto_track_topics_after_msecs: enum: 'AutoTrackDurationSiteSetting' default: 240000 + default_other_notification_level_when_replying: + enum: 'NotificationLevelWhenReplyingSiteSetting' + default: 2 default_other_external_links_in_new_tab: false default_other_enable_quoting: true default_other_dynamic_favicon: false diff --git a/db/migrate/20160930123330_add_notification_level_when_replying.rb b/db/migrate/20160930123330_add_notification_level_when_replying.rb new file mode 100644 index 0000000000..0d3a9f6a5a --- /dev/null +++ b/db/migrate/20160930123330_add_notification_level_when_replying.rb @@ -0,0 +1,5 @@ +class AddNotificationLevelWhenReplying < ActiveRecord::Migration + def change + add_column :user_options, :notification_level_when_replying, :integer + end +end diff --git a/lib/post_creator.rb b/lib/post_creator.rb index b03af3d868..0cd26aa33d 100644 --- a/lib/post_creator.rb +++ b/lib/post_creator.rb @@ -452,9 +452,11 @@ class PostCreator end if @user.staged - TopicUser.auto_watch(@user.id, @topic.id) + TopicUser.auto_notification_for_staging(@user.id, @topic.id, TopicUser.notification_reasons[:auto_watch]) + elsif @user.user_option.notification_level_when_replying === NotificationLevels.topic_levels[:watching] + TopicUser.auto_notification(@user.id, @topic.id, TopicUser.notification_reasons[:created_post], NotificationLevels.topic_levels[:watching]) else - TopicUser.auto_track(@user.id, @topic.id, TopicUser.notification_reasons[:created_post]) + TopicUser.auto_notification(@user.id, @topic.id, TopicUser.notification_reasons[:created_post], NotificationLevels.topic_levels[:tracking]) end end diff --git a/spec/components/post_creator_spec.rb b/spec/components/post_creator_spec.rb index 54efd31cc9..ab1bd54866 100644 --- a/spec/components/post_creator_spec.rb +++ b/spec/components/post_creator_spec.rb @@ -798,6 +798,42 @@ describe PostCreator do end end + context "topic tracking" do + it "automatically watches topic based on preference" do + user.user_option.notification_level_when_replying = 3 + + admin = Fabricate(:admin) + topic = PostCreator.create(admin, + title: "this is the title of a topic created by an admin for watching notification", + raw: "this is the content of a topic created by an admin for keeping a watching notification state on a topic ;)" + ) + + post = PostCreator.create(user, + topic_id: topic.topic_id, + raw: "this is a reply to set the tracking state to watching ;)" + ) + topic_user = TopicUser.find_by(user_id: user.id, topic_id: post.topic_id) + expect(topic_user.notification_level).to eq(TopicUser.notification_levels[:watching]) + end + + it "topic notification level remains tracking based on preference" do + user.user_option.notification_level_when_replying = 2 + + admin = Fabricate(:admin) + topic = PostCreator.create(admin, + title: "this is the title of a topic created by an admin for tracking notification", + raw: "this is the content of a topic created by an admin for keeping a tracking notification state on a topic ;)" + ) + + post = PostCreator.create(user, + topic_id: topic.topic_id, + raw: "this is a reply to set the tracking state to tracking ;)" + ) + topic_user = TopicUser.find_by(user_id: user.id, topic_id: post.topic_id) + expect(topic_user.notification_level).to eq(TopicUser.notification_levels[:tracking]) + end + end + describe '#create!' do it "should return the post if it was successfully created" do title = "This is a valid title" diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 2552c11f49..f0bea747de 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -1246,6 +1246,7 @@ describe User do SiteSetting.default_other_new_topic_duration_minutes = -1 # not viewed SiteSetting.default_other_auto_track_topics_after_msecs = 0 # immediately + SiteSetting.default_other_notification_level_when_replying = 3 # immediately SiteSetting.default_other_external_links_in_new_tab = true SiteSetting.default_other_enable_quoting = false SiteSetting.default_other_dynamic_favicon = true @@ -1273,6 +1274,7 @@ describe User do expect(options.email_direct).to eq(false) expect(options.new_topic_duration_minutes).to eq(-1) expect(options.auto_track_topics_after_msecs).to eq(0) + expect(options.notification_level_when_replying).to eq(3) expect(CategoryUser.lookup(user, :watching).pluck(:category_id)).to eq([1]) expect(CategoryUser.lookup(user, :tracking).pluck(:category_id)).to eq([2]) diff --git a/spec/serializers/user_serializer_spec.rb b/spec/serializers/user_serializer_spec.rb index 09213ea23f..52613f9d50 100644 --- a/spec/serializers/user_serializer_spec.rb +++ b/spec/serializers/user_serializer_spec.rb @@ -19,6 +19,7 @@ describe UserSerializer do it "serializes options correctly" do # so we serialize more stuff SiteSetting.default_other_auto_track_topics_after_msecs = 0 + SiteSetting.default_other_notification_level_when_replying = 3 SiteSetting.default_other_new_topic_duration_minutes = 60*24 user = Fabricate.build(:user, @@ -32,6 +33,7 @@ describe UserSerializer do expect(json[:user_option][:dynamic_favicon]).to eq(true) expect(json[:user_option][:new_topic_duration_minutes]).to eq(60*24) expect(json[:user_option][:auto_track_topics_after_msecs]).to eq(0) + expect(json[:user_option][:notification_level_when_replying]).to eq(3) end end diff --git a/spec/services/user_updater_spec.rb b/spec/services/user_updater_spec.rb index 7a7de4234b..a9a69ef6d7 100644 --- a/spec/services/user_updater_spec.rb +++ b/spec/services/user_updater_spec.rb @@ -71,6 +71,7 @@ describe UserUpdater do digest_after_minutes: "45", new_topic_duration_minutes: 100, auto_track_topics_after_msecs: 101, + notification_level_when_replying: 3, email_in_reply_to: false ) expect(val).to be_truthy @@ -83,6 +84,7 @@ describe UserUpdater do expect(user.user_option.digest_after_minutes).to eq 45 expect(user.user_option.new_topic_duration_minutes).to eq 100 expect(user.user_option.auto_track_topics_after_msecs).to eq 101 + expect(user.user_option.notification_level_when_replying).to eq 3 expect(user.user_option.email_in_reply_to).to eq false end From 1302db2683a406f0b4c5b138285bec52f5d524f3 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Sat, 1 Oct 2016 05:14:35 +0800 Subject: [PATCH 0513/1447] Skip randomly failing test first. --- spec/controllers/extra_locales_controller_spec.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/controllers/extra_locales_controller_spec.rb b/spec/controllers/extra_locales_controller_spec.rb index a85ed0ae53..6289845f79 100644 --- a/spec/controllers/extra_locales_controller_spec.rb +++ b/spec/controllers/extra_locales_controller_spec.rb @@ -20,6 +20,7 @@ describe ExtraLocalesController do end it "should include plugin translations" do + skip "FIXME: Randomly failing" JsLocaleHelper.expects(:plugin_translations).with(I18n.locale.to_s).returns({ "admin_js" => { "admin" => { From bae54000429a443ac3a045dbcc0fb4fd2cd8560f Mon Sep 17 00:00:00 2001 From: Jay Pfaffman Date: Fri, 30 Sep 2016 14:24:58 -0700 Subject: [PATCH 0514/1447] All config can be done via environment variables --- script/import_scripts/kunena3.rb | 36 +++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/script/import_scripts/kunena3.rb b/script/import_scripts/kunena3.rb index bdc17514bc..2f4d7808c4 100644 --- a/script/import_scripts/kunena3.rb +++ b/script/import_scripts/kunena3.rb @@ -1,15 +1,31 @@ require "mysql2" require File.expand_path(File.dirname(__FILE__) + "/base.rb") -# HOWTO: https://meta.discourse.org/t/importing-from-kunena-3/43776 +# If you change this script's functionality, please consider making a note here: +# https://meta.discourse.org/t/importing-from-kunena-3/43776 + +# Before running this script, paste these lines into your shell, +# then use arrow keys to edit the values +=begin +export DB_HOST="localhost" +export DB_NAME="kunena" +export DB_USER="kunena" +export DB_PW="kunena" +export KUNENA_PREFIX="jos_" # "iff_" sometimes +export IMAGE_PREFIX="http://EXAMPLE.com/media/kunena/attachments" +export PARENT_FIELD="parent_id" # "parent" in some versions +=end class ImportScripts::Kunena < ImportScripts::Base - KUNENA_DB = "kunena" - KUNENA_PREFIX = "jos_" # "iff_" sometimes - # Path to [attachment]s - IMAGE_PREFIX = "http://EXAMPLE.com/media/kunena/attachments" - PARENT_FIELD = "parent_id" # try "parent" in case of "Unknown column 'parent_id'" + DB_HOST ||= ENV['DB_HOST'] || "localhost" + DB_NAME ||= ENV['DB_NAME'] || "kunena" + DB_USER ||= ENV['DB_USER'] || "kunena" + DB_PW ||= ENV['DB_PW'] || "kunena" + KUNENA_PREFIX ||= ENV['KUNENA_PREFIX'] || "jos_" # "iff_" sometimes + IMAGE_PREFIX ||= ENV['IMAGE_PREFIX'] || "http://EXAMPLE.com/media/kunena/attachments" + PARENT_FIELD ||= ENV['PARENT_FIELD'] || "parent_id" # "parent" in some versions + def initialize super @@ -17,10 +33,10 @@ class ImportScripts::Kunena < ImportScripts::Base @users = {} @client = Mysql2::Client.new( - host: "HOSTNAME", - username: "DATABASE_USER_NAME", - password: "DATABASE_USER_PASSWORD", - database: KUNENA_DB + host: DB_HOST, + username: DB_USER, + password: DB_PW, + database: DB_NAME ) end From 20c9c60dea9c8bead9a7216741f98ddc47ef6fc0 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Sat, 1 Oct 2016 08:53:30 +0200 Subject: [PATCH 0515/1447] FEATURE: support multisite configuration for search:reindex task --- lib/tasks/search.rake | 92 +++++++++++++++++++++++-------------------- 1 file changed, 50 insertions(+), 42 deletions(-) diff --git a/lib/tasks/search.rake b/lib/tasks/search.rake index 3d6483cad7..4f118227c6 100644 --- a/lib/tasks/search.rake +++ b/lib/tasks/search.rake @@ -1,46 +1,54 @@ task "search:reindex" => :environment do + ENV['RAILS_DB'] ? reindex_search : reindex_search_all_sites +end + +def reindex_search(db=RailsMultisite::ConnectionManagement.current_db) + puts "Reindexing '#{db}'" + puts "" + puts "Posts:" + Post.exec_sql("select p.id, p.cooked, c.name category, t.title, p.post_number, t.id topic_id from + posts p + join topics t on t.id = p.topic_id + left join categories c on c.id = t.category_id + ").each do |p| + post_id = p["id"] + cooked = p["cooked"] + title = p["title"] + category = p["cat"] + post_number = p["post_number"].to_i + topic_id = p["topic_id"].to_i + + SearchObserver.update_posts_index(post_id, cooked, title, category) + SearchObserver.update_topics_index(topic_id, title , cooked) if post_number == 1 + + putc "." + end + + puts + puts "Users:" + User.exec_sql("select id, name, username from users").each do |u| + id = u["id"] + name = u["name"] + username = u["username"] + SearchObserver.update_users_index(id, username, name) + + putc "." + end + + puts + puts "Categories" + + Category.exec_sql("select id, name from categories").each do |c| + id = c["id"] + name = c["name"] + SearchObserver.update_categories_index(id, name) + end + + puts +end + +def reindex_search_all_sites RailsMultisite::ConnectionManagement.each_connection do |db| - puts "Reindexing #{db}" - puts "" - puts "Posts:" - Post.exec_sql("select p.id, p.cooked, c.name category, t.title, p.post_number, t.id topic_id from - posts p - join topics t on t.id = p.topic_id - left join categories c on c.id = t.category_id - ").each do |p| - post_id = p["id"] - cooked = p["cooked"] - title = p["title"] - category = p["cat"] - post_number = p["post_number"].to_i - topic_id = p["topic_id"].to_i - - SearchObserver.update_posts_index(post_id, cooked, title, category) - SearchObserver.update_topics_index(topic_id, title , cooked) if post_number == 1 - - putc "." - end - - puts - puts "Users:" - User.exec_sql("select id, name, username from users").each do |u| - id = u["id"] - name = u["name"] - username = u["username"] - SearchObserver.update_users_index(id, username, name) - - putc "." - end - - puts - puts "Categories" - - Category.exec_sql("select id, name from categories").each do |c| - id = c["id"] - name = c["name"] - SearchObserver.update_categories_index(id, name) - end - - puts + reindex_search(db) end end From 5c131d3e10ad035e4b17c82ed53d09009fdbdef8 Mon Sep 17 00:00:00 2001 From: Blake Erickson Date: Mon, 3 Oct 2016 07:17:13 -0600 Subject: [PATCH 0516/1447] Remove route to action that doesn't exist Removed the `post "t"` route from the routes file because the `topics#create` action doesn't exist in the topics controller. New topics are created in the posts controller. --- config/routes.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index af169723dd..52259c49db 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -516,7 +516,6 @@ Discourse::Application.routes.draw do # Topics resource get "t/:id" => "topics#show" - post "t" => "topics#create" put "t/:id" => "topics#update" delete "t/:id" => "topics#destroy" put "t/:id/archive-message" => "topics#archive_message" From 08c4de388ee514e6ec38f2f576190b2c889db714 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Tue, 4 Oct 2016 12:13:28 +0200 Subject: [PATCH 0517/1447] make eslint happy --- app/assets/javascripts/discourse/components/topic-list.js.es6 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/components/topic-list.js.es6 b/app/assets/javascripts/discourse/components/topic-list.js.es6 index 79eb86b7ea..81a76db45b 100644 --- a/app/assets/javascripts/discourse/components/topic-list.js.es6 +++ b/app/assets/javascripts/discourse/components/topic-list.js.es6 @@ -1,4 +1,4 @@ -import { default as computed, observes, on } from 'ember-addons/ember-computed-decorators'; +import { default as computed, observes } from 'ember-addons/ember-computed-decorators'; export default Ember.Component.extend({ tagName: 'table', From 4b71fd253b84aef4b71400a6df3d753d47156400 Mon Sep 17 00:00:00 2001 From: cpradio Date: Mon, 26 Sep 2016 20:01:40 -0400 Subject: [PATCH 0518/1447] Advanced Search UI Properly support Categories so it updates the search box correctly Use category id, as it is more consistent with search results than using the slugs, especially for parent/subcategory Added Status Improve AutoComplete so it can receive updates Added the ability for AutoComplete to receive updates to badge-selector and group-selector Respect null, which is set via web-hooks Support both # and category: for category detection. Only update the searchedTerms if they differ from its current value (this helps the Category Selector receive updates) Opt in receive updates (#3) * Make the selectors opt-in for receiving updates * Opt-in to receive updates * Fix category detection for search-advanced-options Fix eslint error Update user-selector so it can receive updates live too Make the canReceiveUpdates check validate against 'true' Converted to use template literals Refactor the regex involved with this feature Split apart the init to make it a bit more manageable/testable Switch the category selector to category-chooser, so it is a dropdown of categories instead of auto-complete Reduce RegEx to make this happier with unicode languages and reduce some of the complexity --- .../components/badge-selector.js.es6 | 48 +++ .../components/category-selector.js.es6 | 20 +- .../components/group-selector.js.es6 | 15 +- .../components/search-advanced-options.js.es6 | 400 ++++++++++++++++++ .../discourse/components/user-selector.js.es6 | 8 +- .../discourse/lib/autocomplete.js.es6 | 29 +- .../javascripts/discourse/models/badge.js.es6 | 2 +- .../badge-selector-autocomplete.raw.hbs | 7 + .../templates/components/badge-selector.hbs | 1 + .../components/search-advanced-options.hbs | 78 ++++ .../discourse/templates/full-page-search.hbs | 2 + .../stylesheets/common/base/search.scss | 18 + app/controllers/badges_controller.rb | 5 + config/locales/client.en.yml | 40 ++ 14 files changed, 659 insertions(+), 14 deletions(-) create mode 100644 app/assets/javascripts/discourse/components/badge-selector.js.es6 create mode 100644 app/assets/javascripts/discourse/components/search-advanced-options.js.es6 create mode 100644 app/assets/javascripts/discourse/templates/badge-selector-autocomplete.raw.hbs create mode 100644 app/assets/javascripts/discourse/templates/components/badge-selector.hbs create mode 100644 app/assets/javascripts/discourse/templates/components/search-advanced-options.hbs diff --git a/app/assets/javascripts/discourse/components/badge-selector.js.es6 b/app/assets/javascripts/discourse/components/badge-selector.js.es6 new file mode 100644 index 0000000000..14b1e5349e --- /dev/null +++ b/app/assets/javascripts/discourse/components/badge-selector.js.es6 @@ -0,0 +1,48 @@ +import { on, observes, default as computed } from 'ember-addons/ember-computed-decorators'; + +export default Ember.Component.extend({ + @computed('placeholderKey') + placeholder(placeholderKey) { + return placeholderKey ? I18n.t(placeholderKey) : ''; + }, + + @observes('badgeNames') + _update() { + if (this.get('canReceiveUpdates') === 'true') + this._initializeAutocomplete({updateData: true}); + }, + + @on('didInsertElement') + _initializeAutocomplete(opts) { + var self = this; + var selectedBadges; + + var template = this.container.lookup('template:badge-selector-autocomplete.raw'); + self.$('input').autocomplete({ + allowAny: false, + items: _.isArray(this.get('badgeNames')) ? this.get('badgeNames') : [this.get('badgeNames')], + single: this.get('single'), + updateData: (opts && opts.updateData) ? opts.updateData : false, + onChangeItems: function(items){ + selectedBadges = items; + self.set("badgeNames", items.join(",")); + }, + transformComplete: function(g) { + return g.name; + }, + dataSource: function(term) { + return self.get("badgeFinder")(term).then(function(badges){ + + if(!selectedBadges){ + return badges; + } + + return badges.filter(function(badge){ + return !selectedBadges.any(function(s){return s === badge.name;}); + }); + }); + }, + template: template + }); + } +}); diff --git a/app/assets/javascripts/discourse/components/category-selector.js.es6 b/app/assets/javascripts/discourse/components/category-selector.js.es6 index eb06040624..10a7c454eb 100644 --- a/app/assets/javascripts/discourse/components/category-selector.js.es6 +++ b/app/assets/javascripts/discourse/components/category-selector.js.es6 @@ -1,18 +1,25 @@ import { categoryBadgeHTML } from 'discourse/helpers/category-link'; import Category from 'discourse/models/category'; -import { on } from 'ember-addons/ember-computed-decorators'; +import { on, observes } from 'ember-addons/ember-computed-decorators'; export default Ember.Component.extend({ + @observes('categories') + _update() { + if (this.get('canReceiveUpdates') === 'true') + this._initializeAutocomplete({updateData: true}); + }, + @on('didInsertElement') - _initializeAutocomplete() { + _initializeAutocomplete(opts) { const self = this, template = this.container.lookup('template:category-selector-autocomplete.raw'), regexp = new RegExp(`href=['\"]${Discourse.getURL('/c/')}([^'\"]+)`); this.$('input').autocomplete({ items: this.get('categories'), - single: false, + single: this.get('single'), allowAny: false, + updateData: (opts && opts.updateData) ? opts.updateData : false, dataSource(term) { return Category.list().filter(category => { const regex = new RegExp(term, 'i'); @@ -26,7 +33,12 @@ export default Ember.Component.extend({ const slug = link.match(regexp)[1]; return Category.findSingleBySlug(slug); }); - Em.run.next(() => self.set('categories', categories)); + Em.run.next(() => { + let existingCategory = _.isArray(self.get('categories')) ? self.get('categories') : [self.get('categories')]; + const result = _.intersection(existingCategory.map(itm => itm.id), categories.map(itm => itm.id)); + if (result.length !== categories.length || existingCategory.length !== categories.length) + self.set('categories', categories); + }); }, template, transformComplete(category) { diff --git a/app/assets/javascripts/discourse/components/group-selector.js.es6 b/app/assets/javascripts/discourse/components/group-selector.js.es6 index 6b278e7a83..a2080ecda2 100644 --- a/app/assets/javascripts/discourse/components/group-selector.js.es6 +++ b/app/assets/javascripts/discourse/components/group-selector.js.es6 @@ -1,4 +1,4 @@ -import { on, default as computed } from 'ember-addons/ember-computed-decorators'; +import { on, observes, default as computed } from 'ember-addons/ember-computed-decorators'; export default Ember.Component.extend({ @computed('placeholderKey') @@ -6,15 +6,24 @@ export default Ember.Component.extend({ return placeholderKey ? I18n.t(placeholderKey) : ''; }, + @observes('groupNames') + _update() { + if (this.get('canReceiveUpdates') === 'true') + this._initializeAutocomplete({updateData: true}); + }, + @on('didInsertElement') - _initializeAutocomplete() { + _initializeAutocomplete(opts) { var self = this; var selectedGroups; + var groupNames = this.get('groupNames'); var template = this.container.lookup('template:group-selector-autocomplete.raw'); self.$('input').autocomplete({ allowAny: false, - items: this.get('groupNames'), + items: _.isArray(groupNames) ? groupNames : (Ember.isEmpty(groupNames)) ? [] : [groupNames], + single: this.get('single'), + updateData: (opts && opts.updateData) ? opts.updateData : false, onChangeItems: function(items){ selectedGroups = items; self.set("groupNames", items.join(",")); diff --git a/app/assets/javascripts/discourse/components/search-advanced-options.js.es6 b/app/assets/javascripts/discourse/components/search-advanced-options.js.es6 new file mode 100644 index 0000000000..72c37455a4 --- /dev/null +++ b/app/assets/javascripts/discourse/components/search-advanced-options.js.es6 @@ -0,0 +1,400 @@ +import { on, observes, default as computed } from 'ember-addons/ember-computed-decorators'; + +const REGEXP_FILTER_PREFIXES = /(user:|@|category:|#|group:|badge:|tags?:|in:|status:|posts_count:|(before|after):)/ig; + +const REGEXP_USERNAME_PREFIX = /\s?(user:|@)/ig; +const REGEXP_CATEGORY_PREFIX = /\s?(category:|#)/ig; +const REGEXP_GROUP_PREFIX = /\s?group:/ig; +const REGEXP_BADGE_PREFIX = /\s?badge:/ig; +const REGEXP_TAGS_PREFIX = /\s?tags?:/ig; +const REGEXP_IN_PREFIX = /\s?in:/ig; +const REGEXP_STATUS_PREFIX = /\s?status:/ig; +const REGEXP_POST_COUNT_PREFIX = /\s?posts_count:/ig; +const REGEXP_POST_TIME_PREFIX = /\s?(before|after):/ig; + +const REGEXP_CATEGORY_SLUG = /\s?(\#[a-zA-Z0-9\-:]+)/ig; +const REGEXP_CATEGORY_ID = /\s?(category:[0-9]+)/ig; +const REGEXP_POST_TIME_WHEN = /(before|after)/ig; + +export default Em.Component.extend({ + tagName: 'div', + classNames: ['search-advanced', 'row'], + searchedTerms: {username: [], category: null, group: [], badge: [], tags: [], + in: '', status: '', posts_count: '', time: {when: 'before', days: ''}}, + inOptions: [ + {name: I18n.t('search.advanced.filters.likes'), value: "likes"}, + {name: I18n.t('search.advanced.filters.posted'), value: "posted"}, + {name: I18n.t('search.advanced.filters.watching'), value: "watching"}, + {name: I18n.t('search.advanced.filters.tracking'), value: "tracking"}, + {name: I18n.t('search.advanced.filters.private'), value: "private"}, + {name: I18n.t('search.advanced.filters.bookmarks'), value: "bookmarks"}, + {name: I18n.t('search.advanced.filters.first'), value: "first"}, + {name: I18n.t('search.advanced.filters.pinned'), value: "pinned"}, + {name: I18n.t('search.advanced.filters.unpinned'), value: "unpinned"}, + {name: I18n.t('search.advanced.filters.wiki'), value: "wiki"} + ], + statusOptions: [ + {name: I18n.t('search.advanced.statuses.open'), value: "open"}, + {name: I18n.t('search.advanced.statuses.closed'), value: "closed"}, + {name: I18n.t('search.advanced.statuses.archived'), value: "archived"}, + {name: I18n.t('search.advanced.statuses.noreplies'), value: "noreplies"}, + {name: I18n.t('search.advanced.statuses.single_user'), value: "single_user"}, + ], + postTimeOptions: [ + {name: I18n.t('search.advanced.post.time.before'), value: "before"}, + {name: I18n.t('search.advanced.post.time.after'), value: "after"} + ], + + @on('init') + @observes('searchTerm') + _init() { + let searchTerm = this.get('searchTerm'); + + if (!searchTerm) + return; + + this.findUsername(searchTerm); + this.findCategory(searchTerm); + this.findGroup(searchTerm); + this.findBadge(searchTerm); + this.findTags(searchTerm); + this.findIn(searchTerm); + this.findStatus(searchTerm); + this.findPostsCount(searchTerm); + this.findPostTime(searchTerm); + }, + + findSearchTerm(EXPRESSION, searchTerm) { + const expression_location = searchTerm.search(EXPRESSION); + if (expression_location === -1) + return ""; + + const remaining_phrase = searchTerm.substring(expression_location + 2); + let next_expression_location = remaining_phrase.search(REGEXP_FILTER_PREFIXES); + if (next_expression_location === -1) + next_expression_location = remaining_phrase.length; + + return searchTerm.substring(expression_location, next_expression_location + expression_location + 2); + }, + + findUsername(searchTerm) { + const match = this.findSearchTerm(REGEXP_USERNAME_PREFIX, searchTerm); + if (match.length !== 0) { + let existingInput = _.isArray(this.get('searchedTerms.username')) ? this.get('searchedTerms.username')[0] : this.get('searchedTerms.username'); + let userInput = match.replace(REGEXP_USERNAME_PREFIX, ''); + if (userInput.length !== 0 && existingInput !== userInput) + this.set('searchedTerms.username', [userInput]); + } else + this.set('searchedTerms.username', []); + }, + + @observes('searchedTerms.username') + updateUsername() { + let searchTerm = this.get('searchTerm'); + + const match = this.findSearchTerm(REGEXP_USERNAME_PREFIX, searchTerm); + const userFilter = this.get('searchedTerms.username'); + if (userFilter && userFilter.length !== 0) + if (match.length !== 0) + searchTerm = searchTerm.replace(match, ` user:${userFilter}`); + else + searchTerm += ` user:${userFilter}`; + else if (match.length !== 0) + searchTerm = searchTerm.replace(match, ''); + + this.set('searchTerm', searchTerm); + }, + + findCategory(searchTerm) { + const match = this.findSearchTerm(REGEXP_CATEGORY_PREFIX, searchTerm); + if (match.length !== 0) { + let existingInput = _.isArray(this.get('searchedTerms.category')) ? this.get('searchedTerms.category')[0] : this.get('searchedTerms.category'); + const subcategories = match.replace(REGEXP_CATEGORY_PREFIX, '').split(':'); + if (subcategories.length > 1) { + let userInput = Discourse.Category.findBySlug(subcategories[1], subcategories[0]); + if ((!existingInput && userInput) + || (existingInput && userInput && existingInput.id !== userInput.id)) + this.set('searchedTerms.category', userInput.id); + } else + if (isNaN(subcategories)) { + let userInput = Discourse.Category.findSingleBySlug(subcategories[0]); + if ((!existingInput && userInput) + || (existingInput && userInput && existingInput.id !== userInput.id)) + this.set('searchedTerms.category', userInput.id); + } else { + let userInput = Discourse.Category.findById(subcategories[0]); + if ((!existingInput && userInput) + || (existingInput && userInput && existingInput.id !== userInput.id)) + this.set('searchedTerms.category', userInput.id); + } + } else + this.set('searchedTerms.category', null); + }, + + @observes('searchedTerms.category') + updateCategory() { + let searchTerm = this.get('searchTerm'); + const categoryFilter = Discourse.Category.findById(this.get('searchedTerms.category')); + + const match = this.findSearchTerm(REGEXP_CATEGORY_PREFIX, searchTerm); + const slugCategoryMatches = match.match(REGEXP_CATEGORY_SLUG); + const idCategoryMatches = match.match(REGEXP_CATEGORY_ID); + if (categoryFilter && categoryFilter.length !== 0) { + const id = categoryFilter.id; + const slug = categoryFilter.slug; + if (categoryFilter && categoryFilter.parentCategory) { + const parentSlug = categoryFilter.parentCategory.slug; + if (slugCategoryMatches) + searchTerm = searchTerm.replace(slugCategoryMatches[0], ` #${parentSlug}:${slug}`); + else if (idCategoryMatches) + searchTerm = searchTerm.replace(idCategoryMatches[0], ` category:${id}`); + else + searchTerm += ` #${parentSlug}:${slug}`; + } else if (categoryFilter) { + if (slugCategoryMatches) + searchTerm = searchTerm.replace(slugCategoryMatches[0], ` #${slug}`); + else if (idCategoryMatches) + searchTerm = searchTerm.replace(idCategoryMatches[0], ` category:${id}`); + else + searchTerm += ` #${slug}`; + } + } else { + if (slugCategoryMatches) + searchTerm = searchTerm.replace(slugCategoryMatches[0], ''); + if (idCategoryMatches) + searchTerm = searchTerm.replace(idCategoryMatches[0], ''); + } + + this.set('searchTerm', searchTerm); + }, + + findGroup(searchTerm) { + const match = this.findSearchTerm(REGEXP_GROUP_PREFIX, searchTerm); + if (match.length !== 0) { + let existingInput = _.isArray(this.get('searchedTerms.group')) ? this.get('searchedTerms.group')[0] : this.get('searchedTerms.group'); + let userInput = match.replace(REGEXP_GROUP_PREFIX, ''); + if (userInput.length !== 0 && existingInput !== userInput) + this.set('searchedTerms.group', [userInput]); + } else + this.set('searchedTerms.group', []); + }, + + @observes('searchedTerms.group') + updateGroup() { + let searchTerm = this.get('searchTerm'); + + const match = this.findSearchTerm(REGEXP_GROUP_PREFIX, searchTerm); + const groupFilter = this.get('searchedTerms.group'); + if (groupFilter && groupFilter.length !== 0) + if (match.length !== 0) + searchTerm = searchTerm.replace(match, ` group:${groupFilter}`); + else + searchTerm += ` group:${groupFilter}`; + else if (match.length !== 0) + searchTerm = searchTerm.replace(match, ''); + + this.set('searchTerm', searchTerm); + }, + + findBadge(searchTerm) { + const match = this.findSearchTerm(REGEXP_BADGE_PREFIX, searchTerm); + if (match.length !== 0) { + let existingInput = _.isArray(this.get('searchedTerms.badge')) ? this.get('searchedTerms.badge')[0] : this.get('searchedTerms.badge'); + let userInput = match.replace(REGEXP_BADGE_PREFIX, ''); + if (userInput.length !== 0 && existingInput !== userInput) + this.set('searchedTerms.badge', [match.replace(REGEXP_BADGE_PREFIX, '')]); + } else + this.set('searchedTerms.badge', []); + }, + + @observes('searchedTerms.badge') + updateBadge() { + let searchTerm = this.get('searchTerm'); + + const match = this.findSearchTerm(REGEXP_BADGE_PREFIX, searchTerm); + const badgeFilter = this.get('searchedTerms.badge'); + if (badgeFilter && badgeFilter.length !== 0) + if (match.length !== 0) + searchTerm = searchTerm.replace(match, ` badge:${badgeFilter}`); + else + searchTerm += ` badge:${badgeFilter}`; + else if (match.length !== 0) + searchTerm = searchTerm.replace(match, ''); + + this.set('searchTerm', searchTerm); + }, + + findTags(searchTerm) { + const match = this.findSearchTerm(REGEXP_TAGS_PREFIX, searchTerm); + if (match.length !== 0) { + let existingInput = _.isArray(this.get('searchedTerms.tags')) ? this.get('searchedTerms.tags').join(',') : this.get('searchedTerms.tags'); + let userInput = match.replace(REGEXP_TAGS_PREFIX, ''); + if (userInput.length !== 0 && existingInput !== userInput) + this.set('searchedTerms.tags', userInput.split(',')); + } else + this.set('searchedTerms.tags', []); + }, + + @observes('searchedTerms.tags') + updateTags() { + let searchTerm = this.get('searchTerm'); + + const match = this.findSearchTerm(REGEXP_TAGS_PREFIX, searchTerm); + const tagFilter = this.get('searchedTerms.tags'); + if (tagFilter && tagFilter.length !== 0) { + const tags = tagFilter.join(','); + if (match.length !== 0) + searchTerm = searchTerm.replace(match, ` tags:${tags}`); + else + searchTerm += ` tags:${tags}`; + } else if (match.length !== 0) + searchTerm = searchTerm.replace(match, ''); + + this.set('searchTerm', searchTerm); + }, + + findIn(searchTerm) { + const match = this.findSearchTerm(REGEXP_IN_PREFIX, searchTerm); + if (match.length !== 0) { + let existingInput = this.get('searchedTerms.in'); + let userInput = match.replace(REGEXP_IN_PREFIX, ''); + if (userInput.length !== 0 && existingInput !== userInput) + this.set('searchedTerms.in', userInput); + } else + this.set('searchedTerms.in', ''); + }, + + @observes('searchedTerms.in') + updateIn() { + let searchTerm = this.get('searchTerm'); + + const match = this.findSearchTerm(REGEXP_IN_PREFIX, searchTerm); + const inFilter = this.get('searchedTerms.in'); + if (inFilter) + if (match.length !== 0) + searchTerm = searchTerm.replace(match, ` in:${inFilter}`); + else + searchTerm += ` in:${inFilter}`; + else if (match.length !== 0) + searchTerm = searchTerm.replace(match, ''); + + this.set('searchTerm', searchTerm); + }, + + findStatus(searchTerm) { + const match = this.findSearchTerm(REGEXP_STATUS_PREFIX, searchTerm); + if (match.length !== 0) { + let existingInput = this.get('searchedTerms.status'); + let userInput = match.replace(REGEXP_STATUS_PREFIX, ''); + if (userInput.length !== 0 && existingInput !== userInput) + this.set('searchedTerms.status', userInput); + } else + this.set('searchedTerms.status', ''); + }, + + @observes('searchedTerms.status') + updateStatus() { + let searchTerm = this.get('searchTerm'); + + const match = this.findSearchTerm(REGEXP_STATUS_PREFIX, searchTerm); + const statusFilter = this.get('searchedTerms.status'); + if (statusFilter) + if (match.length !== 0) + searchTerm = searchTerm.replace(match, ` status:${statusFilter}`); + else + searchTerm += ` status:${statusFilter}`; + else if (match.length !== 0) + searchTerm = searchTerm.replace(match, ''); + + this.set('searchTerm', searchTerm); + }, + + findPostsCount(searchTerm) { + const match = this.findSearchTerm(REGEXP_POST_COUNT_PREFIX, searchTerm); + if (match.length !== 0) { + let existingInput = this.get('searchedTerms.posts_count'); + let userInput = match.replace(REGEXP_POST_COUNT_PREFIX, ''); + if (userInput.length !== 0 && existingInput !== userInput) + this.set('searchedTerms.posts_count', userInput); + } else + this.set('searchedTerms.posts_count', ''); + }, + + @observes('searchedTerms.posts_count') + updatePostsCount() { + let searchTerm = this.get('searchTerm'); + + const match = this.findSearchTerm(REGEXP_POST_COUNT_PREFIX, searchTerm); + const postsCountFilter = this.get('searchedTerms.posts_count'); + if (postsCountFilter) + if (match.length !== 0) + searchTerm = searchTerm.replace(match, ` posts_count:${postsCountFilter}`); + else + searchTerm += ` posts_count:${postsCountFilter}`; + else if (match.length !== 0) + searchTerm = searchTerm.replace(match, ''); + + this.set('searchTerm', searchTerm); + }, + + findPostTime(searchTerm) { + const match = this.findSearchTerm(REGEXP_POST_TIME_WHEN, searchTerm); + if (match.length !== 0) { + let existingInputWhen = this.get('searchedTerms.time.when'); + let userInputWhen = match.match(REGEXP_POST_TIME_WHEN)[0]; + if (userInputWhen.length !== 0 && existingInputWhen !== userInputWhen) + this.set('searchedTerms.time.when', userInputWhen); + + let existingInputDays = this.get('searchedTerms.time.days'); + let userInputDays = match.replace(REGEXP_POST_TIME_PREFIX, ''); + if (userInputDays.length !== 0 && existingInputDays !== userInputDays) + this.set('searchedTerms.time.days', userInputDays); + } else + this.set('searchedTerms.time.days', ''); + }, + + @observes('searchedTerms.time.when', 'searchedTerms.time.days') + updatePostTime() { + let searchTerm = this.get('searchTerm'); + + const match = this.findSearchTerm(REGEXP_POST_TIME_PREFIX, searchTerm); + const timeDaysFilter = this.get('searchedTerms.time.days'); + if (timeDaysFilter) { + const when = this.get('searchedTerms.time.when'); + if (match.length !== 0) + searchTerm = searchTerm.replace(match, ` ${when}:${timeDaysFilter}`); + else + searchTerm += ` ${when}:${timeDaysFilter}`; + } else if (match.length !== 0) + searchTerm = searchTerm.replace(match, ''); + + this.set('searchTerm', searchTerm); + }, + + groupFinder(term) { + const Group = require('discourse/models/group').default; + return Group.findAll({search: term, ignore_automatic: false}); + }, + + badgeFinder(term) { + const Badge = require('discourse/models/badge').default; + return Badge.findAll({search: term}); + }, + + collapsedClassName: function() { + return (this.get('isExpanded')) ? "fa-caret-down" : "fa-caret-right"; + }.property('isExpanded'), + + @computed('isExpanded') + isCollapsed(isExpanded){ + return !isExpanded; + }, + + actions: { + expandOptions() { + this.set('isExpanded', !this.get('isExpanded')); + if (this.get('isExpanded')) + this._init(); + } + } +}); diff --git a/app/assets/javascripts/discourse/components/user-selector.js.es6 b/app/assets/javascripts/discourse/components/user-selector.js.es6 index 862f0fae49..e124b43fb2 100644 --- a/app/assets/javascripts/discourse/components/user-selector.js.es6 +++ b/app/assets/javascripts/discourse/components/user-selector.js.es6 @@ -3,8 +3,13 @@ import TextField from 'discourse/components/text-field'; import userSearch from 'discourse/lib/user-search'; export default TextField.extend({ + @observes('usernames') + _update() { + if (this.get('canReceiveUpdates') === 'true') + this.didInsertElement({updateData: true}); + }, - didInsertElement() { + didInsertElement(opts) { this._super(); var self = this, selected = [], @@ -29,6 +34,7 @@ export default TextField.extend({ disabled: this.get('disabled'), single: this.get('single'), allowAny: this.get('allowAny'), + updateData: (opts && opts.updateData) ? opts.updateData : false, dataSource: function(term) { var results = userSearch({ diff --git a/app/assets/javascripts/discourse/lib/autocomplete.js.es6 b/app/assets/javascripts/discourse/lib/autocomplete.js.es6 index 9509b4622a..47f8b0ff3c 100644 --- a/app/assets/javascripts/discourse/lib/autocomplete.js.es6 +++ b/app/assets/javascripts/discourse/lib/autocomplete.js.es6 @@ -42,7 +42,7 @@ export default function(options) { if (this.length === 0) return; - if (options === 'destroy') { + if (options === 'destroy' || options.updateData) { Ember.run.cancel(inputTimeout); $(this).off('keyup.autocomplete') @@ -50,7 +50,8 @@ export default function(options) { .off('paste.autocomplete') .off('click.autocomplete'); - return; + if (options === 'destroy') + return; } if (options && options.cancel && this.data("closeAutocomplete")) { @@ -162,28 +163,46 @@ export default function(options) { if (isInput) { const width = this.width(); - wrap = this.wrap("
").parent(); - wrap.width(width); + + if (options.updateData) { + wrap = this.parent(); + wrap.find('.item').remove(); + me.show(); + } else { + wrap = this.wrap("
").parent(); + wrap.width(width); + } + if(options.single) { this.css("width","100%"); } else { this.width(150); } - this.attr('name', this.attr('name') + "-renamed"); + + this.attr('name', (options.updateData) ? this.attr('name') : this.attr('name') + "-renamed"); + var vals = this.val().split(","); _.each(vals,function(x) { if (x !== "") { if (options.reverseTransform) { x = options.reverseTransform(x); } + if(options.single){ + me.hide(); + } addInputSelectedItem(x); } }); + if(options.items) { _.each(options.items, function(item){ + if(options.single){ + me.hide(); + } addInputSelectedItem(item); }); } + this.val(""); completeStart = 0; wrap.click(function() { diff --git a/app/assets/javascripts/discourse/models/badge.js.es6 b/app/assets/javascripts/discourse/models/badge.js.es6 index 333b40c57f..f94b657669 100644 --- a/app/assets/javascripts/discourse/models/badge.js.es6 +++ b/app/assets/javascripts/discourse/models/badge.js.es6 @@ -135,7 +135,7 @@ Badge.reopenClass({ if(opts && opts.onlyListable){ listable = "?only_listable=true"; } - return ajax('/badges.json' + listable).then(function(badgesJson) { + return ajax('/badges.json' + listable, { data: opts }).then(function(badgesJson) { return Badge.createFromJson(badgesJson); }); }, diff --git a/app/assets/javascripts/discourse/templates/badge-selector-autocomplete.raw.hbs b/app/assets/javascripts/discourse/templates/badge-selector-autocomplete.raw.hbs new file mode 100644 index 0000000000..4537c45160 --- /dev/null +++ b/app/assets/javascripts/discourse/templates/badge-selector-autocomplete.raw.hbs @@ -0,0 +1,7 @@ +
+ +
diff --git a/app/assets/javascripts/discourse/templates/components/badge-selector.hbs b/app/assets/javascripts/discourse/templates/components/badge-selector.hbs new file mode 100644 index 0000000000..c1c29859e2 --- /dev/null +++ b/app/assets/javascripts/discourse/templates/components/badge-selector.hbs @@ -0,0 +1 @@ + diff --git a/app/assets/javascripts/discourse/templates/components/search-advanced-options.hbs b/app/assets/javascripts/discourse/templates/components/search-advanced-options.hbs new file mode 100644 index 0000000000..f71b0f08d2 --- /dev/null +++ b/app/assets/javascripts/discourse/templates/components/search-advanced-options.hbs @@ -0,0 +1,78 @@ +

+ {{i18n "search.advanced.title"}} +

+{{#unless isCollapsed}} +
+
+
+ +
+ {{user-selector excludeCurrentUser=false usernames=searchedTerms.username class="user-selector" single="true" canReceiveUpdates="true"}} +
+
+
+ +
+ {{category-chooser value=searchedTerms.category}} +
+
+
+ +
+
+ +
+ {{group-selector groupFinder=groupFinder groupNames=searchedTerms.group single="true" canReceiveUpdates="true"}} +
+
+
+ +
+ {{badge-selector badgeFinder=badgeFinder badgeNames=searchedTerms.badge single="true" canReceiveUpdates="true"}} +
+
+
+ + {{#if siteSettings.tagging_enabled}} +
+
+ +
+ {{tag-chooser tags=searchedTerms.tags blacklist=searchedTerms.tags allowCreate=false placeholder="" everyTag="true" unlimitedTagCount="true"}} +
+
+
+ {{/if}} + +
+
+ +
+ {{combo-box valueAttribute="value" content=inOptions value=searchedTerms.in none="user.locale.any"}} +
+
+
+ +
+ {{combo-box valueAttribute="value" content=statusOptions value=searchedTerms.status none="user.locale.any"}} +
+
+
+ +
+
+ +
+ {{combo-box valueAttribute="value" content=postTimeOptions value=searchedTerms.time.when}} + {{input type="text" value=searchedTerms.time.days class="input-small" id='search-post-date'}} +
+
+
+ +
+ {{input type="number" value=searchedTerms.posts_count class="input-small" id='search-posts-count'}} +
+
+
+
+{{/unless}} diff --git a/app/assets/javascripts/discourse/templates/full-page-search.hbs b/app/assets/javascripts/discourse/templates/full-page-search.hbs index f2d3445865..31df545ec7 100644 --- a/app/assets/javascripts/discourse/templates/full-page-search.hbs +++ b/app/assets/javascripts/discourse/templates/full-page-search.hbs @@ -2,6 +2,8 @@ {{search-text-field value=searchTerm class="full-page-search input-xxlarge search no-blur" action="search" hasAutofocus=hasAutofocus}} {{d-button action="search" icon="search" class="btn-primary" disabled=searching}} + {{search-advanced-options searchTerm=searchTerm}} + {{#if canCreateTopic}} {{d-button id="create-topic" class="btn-default" action="createTopic" actionParam=searchTerm icon="plus" label="topic.create"}} {{/if}} diff --git a/app/assets/stylesheets/common/base/search.scss b/app/assets/stylesheets/common/base/search.scss index 835a17bf81..2fe1a4d8fb 100644 --- a/app/assets/stylesheets/common/base/search.scss +++ b/app/assets/stylesheets/common/base/search.scss @@ -97,6 +97,24 @@ } } +.search-advanced { + margin-bottom: 15px; + + .panel-title { + background-color: dark-light-diff($primary, $secondary, 90%, -75%); + padding: 5px 10px 5px 10px; + } + + .search-options { + border: 1px solid dark-light-diff($primary, $secondary, 90%, -75%); + padding: 10px; + + .control-group.pull-left { + width: 50%; + } + } +} + .search-footer { margin-bottom: 30px; } diff --git a/app/controllers/badges_controller.rb b/app/controllers/badges_controller.rb index 4b15a7796e..e7991c9de9 100644 --- a/app/controllers/badges_controller.rb +++ b/app/controllers/badges_controller.rb @@ -6,6 +6,11 @@ class BadgesController < ApplicationController badges = Badge.all + if search = params[:search] + search = search.to_s + badges = badges.where("name ILIKE ?", "%#{search}%") + end + if (params[:only_listable] == "true") || !request.xhr? # NOTE: this is sorted client side if needed badges = badges.includes(:badge_grouping) diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index cb25065a0f..ffa0cd2d72 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -674,6 +674,7 @@ en: title: "Interface language" instructions: "User interface language. It will change when you refresh the page." default: "(default)" + any: "any" password_confirmation: title: "Password Again" @@ -1217,6 +1218,45 @@ en: topic: "Search this topic" private_messages: "Search messages" + advanced: + title: Advanced Search + posted_by: + label: Posted by + in_category: + label: In Category + in_group: + label: In Group + with_badge: + label: With Badge + with_tags: + label: With Tags + filters: + label: Only return topics/posts that... + likes: I liked + posted: I posted in + watching: I'm watching + tracking: I'm tracking + private: are in my messages + bookmarks: I've bookmarked + first: are the very first post + pinned: are pinned + unpinned: are not pinned + wiki: are wiki + statuses: + label: Where topics + open: are open + closed: are closed + archived: are archived + noreplies: have zero replies + single_user: contain a single user + post: + count: + label: Minimum Post Count + time: + label: Posted + before: before + after: after + hamburger_menu: "go to another topic list or category" new_item: "new" go_back: 'go back' From 600b23c0a40a4453532d20c1a53ce426ae8e3e68 Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Tue, 4 Oct 2016 12:01:42 -0400 Subject: [PATCH 0519/1447] FIX: permalink redirects should work on tag paths --- app/controllers/application_controller.rb | 19 +++++++++++++++++++ app/controllers/list_controller.rb | 23 ++--------------------- app/controllers/tags_controller.rb | 8 ++++---- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index ed040589e2..d9b6e5e601 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -329,6 +329,25 @@ class ApplicationController < ActionController::Base request.session_options[:skip] = true end + def permalink_redirect_or_not_found + url = request.fullpath + permalink = Permalink.find_by_url(url) + + if permalink.present? + # permalink present, redirect to that URL + if permalink.external_url + redirect_to permalink.external_url, status: :moved_permanently + elsif permalink.target_url + redirect_to "#{Discourse::base_uri}#{permalink.target_url}", status: :moved_permanently + else + raise Discourse::NotFound + end + else + # redirect to 404 + raise Discourse::NotFound + end + end + private def locale_from_header diff --git a/app/controllers/list_controller.rb b/app/controllers/list_controller.rb index b3bc5d1931..e680ce8d68 100644 --- a/app/controllers/list_controller.rb +++ b/app/controllers/list_controller.rb @@ -259,7 +259,7 @@ class ListController < ApplicationController parent_category_id = nil if parent_slug_or_id.present? parent_category_id = Category.query_parent_category(parent_slug_or_id) - redirect_or_not_found and return if parent_category_id.blank? && !id + permalink_redirect_or_not_found and return if parent_category_id.blank? && !id end @category = Category.query_category(slug_or_id, parent_category_id) @@ -270,7 +270,7 @@ class ListController < ApplicationController (redirect_to category.url, status: 301) && return if category end - redirect_or_not_found and return if !@category + permalink_redirect_or_not_found and return if !@category @description_meta = @category.description_text raise Discourse::NotFound unless guardian.can_see?(@category) @@ -349,23 +349,4 @@ class ListController < ApplicationController periods end - def redirect_or_not_found - url = request.fullpath - permalink = Permalink.find_by_url(url) - - if permalink.present? - # permalink present, redirect to that URL - if permalink.external_url - redirect_to permalink.external_url, status: :moved_permanently - elsif permalink.target_url - redirect_to "#{Discourse::base_uri}#{permalink.target_url}", status: :moved_permanently - else - raise Discourse::NotFound - end - else - # redirect to 404 - raise Discourse::NotFound - end - end - end diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb index 87412084de..71d434d8b8 100644 --- a/app/controllers/tags_controller.rb +++ b/app/controllers/tags_controller.rb @@ -78,7 +78,7 @@ class TagsController < ::ApplicationController canonical_url "#{Discourse.base_url_no_prefix}#{public_send(url_method(params.slice(:category, :parent_category)))}" if @list.topics.size == 0 && params[:tag_id] != 'none' && !Tag.where(name: @tag_id).exists? - raise Discourse::NotFound + permalink_redirect_or_not_found else respond_with_list(@list) end @@ -220,13 +220,13 @@ class TagsController < ::ApplicationController parent_category_id = nil if parent_slug_or_id.present? parent_category_id = Category.query_parent_category(parent_slug_or_id) - redirect_or_not_found and return if parent_category_id.blank? + category_redirect_or_not_found and return if parent_category_id.blank? end @filter_on_category = Category.query_category(slug_or_id, parent_category_id) end - redirect_or_not_found and return if !@filter_on_category + category_redirect_or_not_found and return if !@filter_on_category guardian.ensure_can_see!(@filter_on_category) end @@ -305,7 +305,7 @@ class TagsController < ::ApplicationController options end - def redirect_or_not_found + def category_redirect_or_not_found # automatic redirects for renamed categories url = params[:parent_category] ? "c/#{params[:parent_category]}/#{params[:category]}" : "c/#{params[:category]}" permalink = Permalink.find_by_url(url) From 374617c8c9c2070acdf8efe30bb7e48c8922c97e Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Tue, 4 Oct 2016 14:09:28 -0400 Subject: [PATCH 0520/1447] FIX: mobile users page search field loses focus on each keypress --- app/assets/javascripts/discourse/templates/mobile/users.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/templates/mobile/users.hbs b/app/assets/javascripts/discourse/templates/mobile/users.hbs index f0fabceb33..96c80d023a 100644 --- a/app/assets/javascripts/discourse/templates/mobile/users.hbs +++ b/app/assets/javascripts/discourse/templates/mobile/users.hbs @@ -3,7 +3,7 @@
{{period-chooser period=period}} - {{text-field value=nameInput placeholderKey="directory.filter_name" class="filter-name"}} + {{text-field value=nameInput placeholderKey="directory.filter_name" class="filter-name no-blur"}}
{{#conditional-loading-spinner condition=model.loading}} From f936bd6607988664a1257c35601adb449de253f3 Mon Sep 17 00:00:00 2001 From: Jeff Atwood Date: Tue, 4 Oct 2016 13:29:23 -0700 Subject: [PATCH 0521/1447] UX: first run wizard now (mostly) works on mobile --- app/assets/stylesheets/wizard.scss | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/app/assets/stylesheets/wizard.scss b/app/assets/stylesheets/wizard.scss index 419b8b8616..52668acf7c 100644 --- a/app/assets/stylesheets/wizard.scss +++ b/app/assets/stylesheets/wizard.scss @@ -461,3 +461,23 @@ body.wizard { } } } + +/* fix wizard for mobile -- iPhone 5 default width */ +@media only screen and (max-device-width: 568px) { + h1 { font-size: 1.3em !important; } + .wizard-column { margin: auto !important; } + .wizard-step-contents { min-height: auto !important; } + .wizard-step-banner { width: 100% !important; margin-bottom: 1em !important; } + .select2-container { width: 100% !important; } + .wizard-step-footer { display: block !important; } + .wizard-progress { margin-bottom: 10px !important; } + .wizard-buttons { text-align: right !important; } + .wizard-footer { display: none !important; } + .wizard-field { margin-bottom: 1em !important; } + .wizard-step-description { margin-bottom: 1em !important; } + .wizard-column-contents { padding: 1em !important; } + .emoji-preview img { width: 16px !important; height: 16px !important; } + .invite-list .new-user { flex-direction: column !important; align-items: inherit !important; } + .invite-list .new-user .invite-email { width: 100% !important; margin-bottom: 5px !important; } + .invite-list .add-user { margin-top: 5px !important; } +} \ No newline at end of file From 601a96333ae5c40dcb79edf704460813d633889a Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 5 Oct 2016 15:37:47 +1100 Subject: [PATCH 0522/1447] FIX: last visited line not rendering correctly - stop changing cached models --- .../discourse/components/topic-list.js.es6 | 67 +++++++++++-------- .../templates/components/topic-list.hbs | 11 +-- .../templates/list/visited-line.raw.hbs | 9 +++ .../discourse/views/list/visited-line.js.es6 | 5 ++ 4 files changed, 53 insertions(+), 39 deletions(-) create mode 100644 app/assets/javascripts/discourse/templates/list/visited-line.raw.hbs create mode 100644 app/assets/javascripts/discourse/views/list/visited-line.js.es6 diff --git a/app/assets/javascripts/discourse/components/topic-list.js.es6 b/app/assets/javascripts/discourse/components/topic-list.js.es6 index 81a76db45b..0f080e83af 100644 --- a/app/assets/javascripts/discourse/components/topic-list.js.es6 +++ b/app/assets/javascripts/discourse/components/topic-list.js.es6 @@ -1,4 +1,4 @@ -import { default as computed, observes } from 'ember-addons/ember-computed-decorators'; +import { observes } from 'ember-addons/ember-computed-decorators'; export default Ember.Component.extend({ tagName: 'table', @@ -9,6 +9,7 @@ export default Ember.Component.extend({ this.addObserver('hideCategory', this.rerender); this.addObserver('order', this.rerender); this.addObserver('ascending', this.rerender); + this.refreshLastVisited(); }.on('init'), toggleInTitle: function(){ @@ -31,28 +32,45 @@ export default Ember.Component.extend({ return this.get('order') === "op_likes"; }.property('order'), - @computed('topics.@each', 'order', 'ascending') - lastVisitedTopic(topics, order, ascending) { + @observes('topics.@each') + topicsAdded() { + // special case so we don't keep scanning huge lists + if (!this.get('lastVisitedTopic')) { + this.refreshLastVisited(); + } + }, - this._cleanLastVisitedTopic(); + @observes('topics', 'order', 'ascending', 'category') + lastVisitedTopicChanged() { + this.refreshLastVisited(); + }, - if (!this.get('highlightLastVisited')) { return; } - if (order !== "default" && order !== "activity") { return; } - if (!topics || topics.length === 1) { return; } - if (ascending) { return; } + _updateLastVisitedTopic(topics, order, ascending) { + + this.set('lastVisitedTopic', null); + + if (!this.get('highlightLastVisited')) { + return; + } + + if (order !== "default" && order !== "activity") { + return; + } + + if (!topics || topics.length === 1) { + return; + } + + if (ascending) { + return; + } let user = Discourse.User.current(); if (!user || !user.previous_visit_at) { return; } - let prevTopic, topic; - - prevTopic = this.get('prevTopic'); - - if (prevTopic) { - return prevTopic; - } + let lastVisitedTopic, topic; let prevVisit = user.get('previousVisitAt'); @@ -66,13 +84,13 @@ export default Ember.Component.extend({ let i; for(i=topics.length-1;i>=start;i--){ if (topics[i].get('bumpedAt') > prevVisit) { - prevTopic = topics[i]; + lastVisitedTopic = topics[i]; break; } topic = topics[i]; } - if (!prevTopic || !topic) { + if (!lastVisitedTopic || !topic) { return; } @@ -81,20 +99,11 @@ export default Ember.Component.extend({ return; } - prevTopic.set('isLastVisited', true); - this.set('prevTopic', prevTopic); - - return prevTopic; + this.set('lastVisitedTopic', lastVisitedTopic); }, - @observes('category') - _cleanLastVisitedTopic() { - const prevTopic = this.get('prevTopic'); - - if (prevTopic) { - prevTopic.set('isLastVisited', false); - this.set('prevTopic', null); - } + refreshLastVisited() { + this._updateLastVisitedTopic(this.get('topics'), this.get('order'), this.get('ascending')); }, click(e) { diff --git a/app/assets/javascripts/discourse/templates/components/topic-list.hbs b/app/assets/javascripts/discourse/templates/components/topic-list.hbs index 9c3d662307..e6c3723447 100644 --- a/app/assets/javascripts/discourse/templates/components/topic-list.hbs +++ b/app/assets/javascripts/discourse/templates/components/topic-list.hbs @@ -28,15 +28,6 @@ expandAllPinned=expandAllPinned lastVisitedTopic=lastVisitedTopic selected=selected}} - - {{#if topic.isLastVisited}} - - - - {{i18n 'topics.new_messages_marker'}} - - - - {{/if}} + {{raw "list/visited-line" lastVisitedTopic=lastVisitedTopic topic=topic}} {{/each}} diff --git a/app/assets/javascripts/discourse/templates/list/visited-line.raw.hbs b/app/assets/javascripts/discourse/templates/list/visited-line.raw.hbs new file mode 100644 index 0000000000..16558146c5 --- /dev/null +++ b/app/assets/javascripts/discourse/templates/list/visited-line.raw.hbs @@ -0,0 +1,9 @@ +{{#if view.isLastVisited}} + + + + {{i18n 'topics.new_messages_marker'}} + + + +{{/if}} diff --git a/app/assets/javascripts/discourse/views/list/visited-line.js.es6 b/app/assets/javascripts/discourse/views/list/visited-line.js.es6 new file mode 100644 index 0000000000..0f07c3bb59 --- /dev/null +++ b/app/assets/javascripts/discourse/views/list/visited-line.js.es6 @@ -0,0 +1,5 @@ +export default Ember.Object.extend({ + isLastVisited: function(){ + return (this.get('lastVisitedTopic') === this.get('topic')); + }.property() +}); From 843c7a21c990f118722bdab1778ab91e16e7b835 Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 5 Oct 2016 18:08:54 +1100 Subject: [PATCH 0523/1447] FIX: properly handle blank localizations --- app/assets/javascripts/locales/i18n.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/assets/javascripts/locales/i18n.js b/app/assets/javascripts/locales/i18n.js index 97b1a1196c..d5320f628d 100644 --- a/app/assets/javascripts/locales/i18n.js +++ b/app/assets/javascripts/locales/i18n.js @@ -106,7 +106,7 @@ function checkExtras(origScope, sep, extras) { currentScope = scope.shift(); messages = messages[currentScope]; } - if (messages) { + if (messages !== undefined) { return messages; } } @@ -139,23 +139,23 @@ I18n.lookup = function(scope, options) { messages = messages[currentScope]; } - if (!messages) { + if (messages === undefined) { messages = checkExtras(origScope, this.defaultSeparator, this.extras); } - if (!messages) { + if (messages === undefined) { if (I18n.fallbacks) { var fallbacks = this.getFallbacks(locale); for (var fallback = 0; fallback < fallbacks.length; fallbacks++) { messages = I18n.lookup(lookupInitialScope, this.prepareOptions({locale: fallbacks[fallback]}, options)); - if (messages) { + if (messages !== undefined) { break; } } } - if (!messages && this.isValidNode(options, "defaultValue")) { + if (messages === undefined && this.isValidNode(options, "defaultValue")) { messages = options.defaultValue; } } From a061c025f1d0b3bbb86188c6ccb277268de06ff1 Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Wed, 5 Oct 2016 12:06:37 -0400 Subject: [PATCH 0524/1447] FIX: in create/edit category modal, don't prompt to choose a parent category when allow_uncategorized_topics is false --- .../javascripts/discourse/components/category-chooser.js.es6 | 2 +- .../discourse/templates/components/edit-category-general.hbs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/discourse/components/category-chooser.js.es6 b/app/assets/javascripts/discourse/components/category-chooser.js.es6 index 42fe4412ed..ab0c704b59 100644 --- a/app/assets/javascripts/discourse/components/category-chooser.js.es6 +++ b/app/assets/javascripts/discourse/components/category-chooser.js.es6 @@ -38,7 +38,7 @@ export default ComboboxView.extend({ @computed("rootNone") none(rootNone) { - if (Discourse.SiteSettings.allow_uncategorized_topics) { + if (Discourse.SiteSettings.allow_uncategorized_topics || this.get('allowUncategorized')) { if (rootNone) { return "category.none"; } else { diff --git a/app/assets/javascripts/discourse/templates/components/edit-category-general.hbs b/app/assets/javascripts/discourse/templates/components/edit-category-general.hbs index 9f93466ae1..734ad2b4c7 100644 --- a/app/assets/javascripts/discourse/templates/components/edit-category-general.hbs +++ b/app/assets/javascripts/discourse/templates/components/edit-category-general.hbs @@ -19,7 +19,7 @@ {{/each}} {{else}} - {{category-chooser valueAttribute="id" value=category.parent_category_id categories=parentCategories rootNone=true}} + {{category-chooser valueAttribute="id" value=category.parent_category_id categories=parentCategories rootNone=true allowUncategorized="true"}} {{/if}} {{/if}} From c70f52c4ddbad510885d3a29a6d476be5507875a Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Wed, 5 Oct 2016 12:14:56 -0400 Subject: [PATCH 0525/1447] remove some problem reports from the admin dashboard since they're covered by the setup wizard now --- app/models/admin_dashboard_data.rb | 35 +---------------- spec/models/admin_dashboard_data_spec.rb | 48 ------------------------ 2 files changed, 2 insertions(+), 81 deletions(-) diff --git a/app/models/admin_dashboard_data.rb b/app/models/admin_dashboard_data.rb index a8103aa7de..bfcaff65fa 100644 --- a/app/models/admin_dashboard_data.rb +++ b/app/models/admin_dashboard_data.rb @@ -94,10 +94,8 @@ class AdminDashboardData :ram_check, :google_oauth2_config_check, :facebook_config_check, :twitter_config_check, :github_config_check, :s3_config_check, :image_magick_check, - :failing_emails_check, :default_logo_check, :contact_email_check, - :send_consumer_email_check, :title_check, - :site_description_check, :site_contact_username_check, - :notification_email_check, :subfolder_ends_in_slash_check, + :failing_emails_check, :send_consumer_email_check, + :subfolder_ends_in_slash_check, :pop3_polling_configuration, :email_polling_errored_recently add_problem_check do @@ -216,39 +214,10 @@ class AdminDashboardData I18n.t('dashboard.failing_emails_warning', num_failed_jobs: num_failed_jobs) if num_failed_jobs > 0 end - def default_logo_check - if SiteSetting.logo_url =~ /#{SiteSetting.defaults[:logo_url].split('/').last}/ or - SiteSetting.logo_small_url =~ /#{SiteSetting.defaults[:logo_small_url].split('/').last}/ or - SiteSetting.favicon_url =~ /#{SiteSetting.defaults[:favicon_url].split('/').last}/ - I18n.t('dashboard.default_logo_warning') - end - end - - def contact_email_check - return I18n.t('dashboard.contact_email_missing') if !SiteSetting.contact_email.present? - return I18n.t('dashboard.contact_email_invalid') if !(SiteSetting.contact_email =~ User::EMAIL) - end - - def title_check - I18n.t('dashboard.title_nag') if SiteSetting.title == SiteSetting.defaults[:title] - end - - def site_description_check - I18n.t('dashboard.site_description_missing') if !SiteSetting.site_description.present? - end - def send_consumer_email_check I18n.t('dashboard.consumer_email_warning') if Rails.env.production? and ActionMailer::Base.smtp_settings[:address] =~ /gmail\.com|live\.com|yahoo\.com/ end - def site_contact_username_check - I18n.t('dashboard.site_contact_username_warning') if !SiteSetting.site_contact_username.present? || SiteSetting.site_contact_username == SiteSetting.defaults[:site_contact_username] - end - - def notification_email_check - I18n.t('dashboard.notification_email_warning') if !SiteSetting.notification_email.present? || SiteSetting.notification_email == SiteSetting.defaults[:notification_email] - end - def subfolder_ends_in_slash_check I18n.t('dashboard.subfolder_ends_in_slash') if Discourse.base_uri =~ /\/$/ end diff --git a/spec/models/admin_dashboard_data_spec.rb b/spec/models/admin_dashboard_data_spec.rb index eae7f68079..aa9f7080b3 100644 --- a/spec/models/admin_dashboard_data_spec.rb +++ b/spec/models/admin_dashboard_data_spec.rb @@ -146,54 +146,6 @@ describe AdminDashboardData do end end - describe 'default_logo_check' do - subject { described_class.new.default_logo_check } - - describe 'favicon_url check' do - before do - SiteSetting.logo_url = '/assets/my-logo.jpg' - SiteSetting.logo_small_url = '/assets/my-small-logo.jpg' - end - - it 'returns a string when favicon_url is default' do - expect(subject).not_to be_nil - end - - it 'returns a string when favicon_url contains default filename' do - SiteSetting.favicon_url = "/prefix#{SiteSetting.defaults[:favicon_url]}" - expect(subject).not_to be_nil - end - - it 'returns nil when favicon_url does not match default-favicon.png' do - SiteSetting.favicon_url = '/assets/my-favicon.png' - expect(subject).to be_nil - end - end - - describe 'logo_url check' do - before do - SiteSetting.favicon_url = '/assets/my-favicon.png' - SiteSetting.logo_small_url = '/assets/my-small-logo.jpg' - end - - it 'returns a string when logo_url is default' do - expect(subject).not_to be_nil - end - - it 'returns a string when logo_url contains default filename' do - SiteSetting.logo_url = "/prefix#{SiteSetting.defaults[:logo_url]}" - expect(subject).not_to be_nil - end - - it 'returns nil when logo_url does not match d-logo-sketch.png' do - SiteSetting.logo_url = '/assets/my-logo.png' - expect(subject).to be_nil - end - end - - # etc. - end - describe 'auth_config_checks' do shared_examples 'problem detection for login providers' do From f3eb58092d25a47a187d4aaa500fce71dbcaa298 Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Wed, 5 Oct 2016 15:14:51 -0400 Subject: [PATCH 0526/1447] FIX: twitter card meta tags use wrong urls on subfolder installs --- app/helpers/application_helper.rb | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index d0e70b6b0d..9504f22a04 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -150,11 +150,15 @@ module ApplicationHelper end # Use the correct scheme for open graph image - if opts[:image].present? && opts[:image].start_with?("//") - uri = URI(Discourse.base_url) - opts[:image] = "#{uri.scheme}:#{opts[:image]}" - elsif opts[:image].present? && opts[:image].start_with?("/uploads/") - opts[:image] = "#{Discourse.base_url}#{opts[:image]}" + if opts[:image].present? + if opts[:image].start_with?("//") + uri = URI(Discourse.base_url) + opts[:image] = "#{uri.scheme}:#{opts[:image]}" + elsif opts[:image].start_with?("/uploads/") + opts[:image] = "#{Discourse.base_url}#{opts[:image]}" + elsif GlobalSetting.relative_url_root && opts[:image].start_with?(GlobalSetting.relative_url_root) + opts[:image] = "#{Discourse.base_url_no_prefix}#{opts[:image]}" + end end # Add opengraph & twitter tags From 119746aaa05824bbddc6513149125161a9455fda Mon Sep 17 00:00:00 2001 From: Vinoth Kannan Date: Thu, 6 Oct 2016 20:00:39 +0530 Subject: [PATCH 0527/1447] new: FluxBB import script file added --- script/import_scripts/fluxbb.rb | 216 ++++++++++++++++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100644 script/import_scripts/fluxbb.rb diff --git a/script/import_scripts/fluxbb.rb b/script/import_scripts/fluxbb.rb new file mode 100644 index 0000000000..27d0682a6f --- /dev/null +++ b/script/import_scripts/fluxbb.rb @@ -0,0 +1,216 @@ +require "mysql2" + +require File.expand_path(File.dirname(__FILE__) + "/base.rb") + +# Call it like this: +# RAILS_ENV=production bundle exec ruby script/import_scripts/fluxbb.rb +class ImportScripts::FluxBB < ImportScripts::Base + + FLUXBB_DB = "fluxbb_db" + BATCH_SIZE = 1000 + + def initialize + super + + @client = Mysql2::Client.new( + host: "localhost", + username: "root", + password: "pa$$word", + database: FLUXBB_DB + ) + end + + def execute + import_users + import_categories + import_posts + suspend_users + end + + def import_users + puts '', "creating users" + + total_count = mysql_query("SELECT count(*) count FROM users;").first['count'] + + batches(BATCH_SIZE) do |offset| + results = mysql_query( + "SELECT id, username, realname name, url website, email email, registered created_at, + registration_ip registration_ip_address, last_visit last_visit_time, + last_email_sent last_emailed_at, location, group_id + FROM users + LIMIT #{BATCH_SIZE} + OFFSET #{offset};") + + break if results.size < 1 + + next if all_records_exist? :users, results.map {|u| u["id"].to_i} + + create_users(results, total: total_count, offset: offset) do |user| + { id: user['id'], + email: user['email'], + username: user['username'], + name: user['name'], + created_at: Time.zone.at(user['created_at']), + website: user['website'], + registration_ip_address: user['registration_ip_address'], + last_seen_at: Time.zone.at(user['last_visit_time']), + last_emailed_at: user['last_emailed_at'] == nil ? 0 : Time.zone.at(user['last_emailed_at']), + location: user['location'], + moderator: user['group_id'] == 2, + admin: user['group_id'] == 1 } + end + end + end + + def import_categories + puts "", "importing top level categories..." + + categories = mysql_query(" + SELECT id, cat_name name, disp_position position + FROM categories + ORDER BY id ASC + ").to_a + + create_categories(categories) do |category| + { + id: category["id"], + name: category["name"] + } + end + + puts "", "importing children categories..." + + children_categories = mysql_query(" + SELECT id, forum_name name, forum_desc description, disp_position position, cat_id parent_category_id + FROM forums + ORDER BY id + ").to_a + + create_categories(children_categories) do |category| + { + id: "child##{category['id']}", + name: category["name"], + description: category["description"], + parent_category_id: category_id_from_imported_category_id(category["parent_category_id"]) + } + end + end + + def import_posts + puts "", "creating topics and posts" + + total_count = mysql_query("SELECT count(*) count from posts").first["count"] + + batches(BATCH_SIZE) do |offset| + results = mysql_query(" + SELECT p.id id, + t.id topic_id, + t.forum_id category_id, + t.subject title, + t.first_post_id first_post_id, + p.poster_id user_id, + p.message raw, + p.posted created_at + FROM posts p, + topics t + WHERE p.topic_id = t.id + ORDER BY p.posted + LIMIT #{BATCH_SIZE} + OFFSET #{offset}; + ").to_a + + break if results.size < 1 + next if all_records_exist? :posts, results.map {|m| m['id'].to_i} + + create_posts(results, total: total_count, offset: offset) do |m| + skip = false + mapped = {} + + mapped[:id] = m['id'] + mapped[:user_id] = user_id_from_imported_user_id(m['user_id']) || -1 + mapped[:raw] = process_fluxbb_post(m['raw'], m['id']) + mapped[:created_at] = Time.zone.at(m['created_at']) + + if m['id'] == m['first_post_id'] + mapped[:category] = category_id_from_imported_category_id("child##{m['category_id']}") + mapped[:title] = CGI.unescapeHTML(m['title']) + else + parent = topic_lookup_from_imported_post_id(m['first_post_id']) + if parent + mapped[:topic_id] = parent[:topic_id] + else + puts "Parent post #{m['first_post_id']} doesn't exist. Skipping #{m["id"]}: #{m["title"][0..40]}" + skip = true + end + end + + skip ? nil : mapped + end + end + end + + def suspend_users + puts '', "updating banned users" + + banned = 0 + failed = 0 + total = mysql_query("SELECT count(*) count FROM bans").first['count'] + + system_user = Discourse.system_user + + mysql_query("SELECT username, email FROM bans").each do |b| + user = User.find_by_email(b['email']) + if user + user.suspended_at = Time.now + user.suspended_till = 200.years.from_now + + if user.save + StaffActionLogger.new(system_user).log_user_suspend(user, "banned during initial import") + banned += 1 + else + puts "Failed to suspend user #{user.username}. #{user.errors.try(:full_messages).try(:inspect)}" + failed += 1 + end + else + puts "Not found: #{b['email']}" + failed += 1 + end + + print_status banned + failed, total + end + end + + def process_fluxbb_post(raw, import_id) + s = raw.dup + + # :) is encoded as :) + s.gsub!(/(?:.*)/, '\1') + + # Some links look like this: http://www.onegameamonth.com + s.gsub!(/(.+)<\/a>/, '[\2](\1)') + + # Many bbcode tags have a hash attached to them. Examples: + # [url=https://google.com:1qh1i7ky]click here[/url:1qh1i7ky] + # [quote="cybereality":b0wtlzex]Some text.[/quote:b0wtlzex] + s.gsub!(/:(?:\w{8})\]/, ']') + + # Remove video tags. + s.gsub!(/(^\[video=.*?\])|(\[\/video\]$)/, '') + + s = CGI.unescapeHTML(s) + + # shortens link text like this, which breaks our markdown processing: + # [http://answers.yahoo.com/question/index ... 223AAkkPli](http://answers.yahoo.com/question/index?qid=20070920134223AAkkPli) + # + # Work around it for now: + s.gsub!(/\[http(s)?:\/\/(www\.)?/, '[') + + s + end + + def mysql_query(sql) + @client.query(sql, cache_rows: false) + end +end + +ImportScripts::FluxBB.new.perform From 7bf75f8828d62088ace9a2e7a7630d4927854ab1 Mon Sep 17 00:00:00 2001 From: Vinoth Kannan Date: Thu, 6 Oct 2016 20:09:40 +0530 Subject: [PATCH 0528/1447] fluxbb.rb: move configuration to ENV --- script/import_scripts/fluxbb.rb | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/script/import_scripts/fluxbb.rb b/script/import_scripts/fluxbb.rb index 27d0682a6f..505750dc5a 100644 --- a/script/import_scripts/fluxbb.rb +++ b/script/import_scripts/fluxbb.rb @@ -2,20 +2,30 @@ require "mysql2" require File.expand_path(File.dirname(__FILE__) + "/base.rb") +# Before running this script, paste these lines into your shell, +# then use arrow keys to edit the values +=begin +export FLUXBB_USER="root" +export FLUXBB_DB="fluxbb" +export FLUXBB_PW="" +=end + # Call it like this: # RAILS_ENV=production bundle exec ruby script/import_scripts/fluxbb.rb class ImportScripts::FluxBB < ImportScripts::Base - FLUXBB_DB = "fluxbb_db" - BATCH_SIZE = 1000 + FLUXBB_DB ||= ENV['FLUXBB_DB'] || "fluxbb" + BATCH_SIZE ||= 1000 + FLUXBB_PW ||= ENV['FLUXBB_PW'] || "" + FLUXBB_USER ||= ENV['FLUXBB_USER'] || "root" def initialize super @client = Mysql2::Client.new( host: "localhost", - username: "root", - password: "pa$$word", + username: FLUXBB_USER, + password: FLUXBB_PW, database: FLUXBB_DB ) end From 470529d4c8fd3edc806eed6ef9fe09128823db18 Mon Sep 17 00:00:00 2001 From: Vinoth Kannan Date: Thu, 6 Oct 2016 21:08:40 +0530 Subject: [PATCH 0529/1447] fluxbb.rb: importing groups & members --- script/import_scripts/fluxbb.rb | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/script/import_scripts/fluxbb.rb b/script/import_scripts/fluxbb.rb index 505750dc5a..79dc081d49 100644 --- a/script/import_scripts/fluxbb.rb +++ b/script/import_scripts/fluxbb.rb @@ -31,12 +31,27 @@ class ImportScripts::FluxBB < ImportScripts::Base end def execute + import_groups import_users import_categories import_posts suspend_users end + def import_groups + puts '', "creating groups" + + results = mysql_query( + "SELECT g_id id, g_title name, g_user_title title + FROM groups") + + create_groups(results) do |group| + { id: group['id'], + name: group['name'], + title: group['title'] } + end + end + def import_users puts '', "creating users" @@ -69,6 +84,17 @@ class ImportScripts::FluxBB < ImportScripts::Base moderator: user['group_id'] == 2, admin: user['group_id'] == 1 } end + + create_group_members(results) do |user| + if user.group_id + user_id = user_id_from_imported_user_id(user.id) + group_id = group_id_from_imported_group_id(user.group_id) + + if user_id && group_id + GroupUser.find_or_create_by(user_id: user_id, group_id: group_id) + end + end + end end end From 3002cc4cc778c7f3df9925b325f8219141817728 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Thu, 6 Oct 2016 21:21:00 +0530 Subject: [PATCH 0530/1447] Update Translations --- config/locales/client.ar.yml | 6 + config/locales/client.de.yml | 2 + config/locales/client.es.yml | 21 + config/locales/client.et.yml | 54 +- config/locales/client.fa_IR.yml | 20 + config/locales/client.fi.yml | 20 + config/locales/client.fr.yml | 120 +- config/locales/client.he.yml | 267 +- config/locales/client.it.yml | 8 + config/locales/client.pt_BR.yml | 3 + config/locales/client.ro.yml | 2633 +++++++++------ config/locales/client.sq.yml | 196 +- config/locales/client.sv.yml | 115 + config/locales/client.tr_TR.yml | 223 +- config/locales/client.zh_CN.yml | 69 + config/locales/server.de.yml | 6 + config/locales/server.fi.yml | 118 +- config/locales/server.fr.yml | 203 +- config/locales/server.he.yml | 705 +++- config/locales/server.pt_BR.yml | 104 + config/locales/server.ro.yml | 2843 +++++++++++++---- config/locales/server.ru.yml | 5 + config/locales/server.sq.yml | 71 +- config/locales/server.tr_TR.yml | 385 ++- plugins/poll/config/locales/client.fa_IR.yml | 14 + plugins/poll/config/locales/client.ro.yml | 38 +- plugins/poll/config/locales/server.he.yml | 26 +- plugins/poll/config/locales/server.ro.yml | 14 +- public/403.ro.html | 2 +- public/422.he.html | 2 +- public/500.ro.html | 8 +- public/503.ro.html | 4 +- .../lib/discourse_imgur/locale/server.ro.yml | 4 +- 33 files changed, 6176 insertions(+), 2133 deletions(-) diff --git a/config/locales/client.ar.yml b/config/locales/client.ar.yml index a843c7eb34..9e141ff9f2 100644 --- a/config/locales/client.ar.yml +++ b/config/locales/client.ar.yml @@ -3198,3 +3198,9 @@ ar: label: "جديد :" add: "أضف" filter: "بحث ( رابط داخلي أو خارجي )" + wizard_js: + wizard: + back: "الى الخلف" + next: "التالي" + invites: + add_user: "أضف" diff --git a/config/locales/client.de.yml b/config/locales/client.de.yml index 018e1edc54..605509d13d 100644 --- a/config/locales/client.de.yml +++ b/config/locales/client.de.yml @@ -136,6 +136,7 @@ de: enabled: 'sichtbar gemacht, %{when}' disabled: 'unsichtbar gemacht, %{when}' topic_admin_menu: "Thema administrieren" + wizard_required: "Es ist an der Zeit, Dein Forum einzurichten! Einrichtungs-Assistenten starten!" emails_are_disabled: "Die ausgehende E-Mail-Kommunikation wurde von einem Administrator global deaktiviert. Es werden keinerlei Benachrichtigungen per E-Mail verschickt." bootstrap_mode_enabled: "Damit du mit deiner Site einfacher loslegen kannst, befindest du dich im Bootstrapping-Modus. Alle neuen Benutzer erhalten die Vertrauensstufe 1 und bekommen eine tägliche Zusammenfassung per E-Mail. Der Modus wird automatisch deaktiviert, sobald sich mindestens %{min_users} Benutzer angemeldet haben." bootstrap_mode_disabled: "Der Bootstrapping-Modus wird innerhalb der nächsten 24 Stunden deaktiviert." @@ -796,6 +797,7 @@ de: one: "ein Fehler/%{duration}" other: "%{count} Fehler/%{duration}" learn_more: "mehr erfahren…" + all_time: 'gesamt' all_time_desc: 'Erstellte Themen' year: 'Jahr' year_desc: 'Themen, die in den letzten 365 Tagen erstellt wurden' diff --git a/config/locales/client.es.yml b/config/locales/client.es.yml index 1d2bac8ae4..5b13f4f886 100644 --- a/config/locales/client.es.yml +++ b/config/locales/client.es.yml @@ -136,6 +136,7 @@ es: enabled: 'listado %{when}' disabled: 'quitado de la lista, invisible %{when}' topic_admin_menu: "acciones de administrador para el tema" + wizard_required: "¡Hora de configurar tu foro! ¡Inicia el Asistente de Configuración!" emails_are_disabled: "Todos los emails salientes han sido desactivados por un administrador. No se enviará ninguna notificación por email." bootstrap_mode_enabled: "Para lanzar tu nuevo sitio más fácilmente, estás en modo de arranque. A todos los nuevos usuarios se les concederá el nivel 1 de confianza y recibirán resúmenes diarios por email. Esto se desactivará automáticamente cuando el número total de usuarios exceda los %{min_users}." bootstrap_mode_disabled: "El modo de arranque se desactivará en las próximas 24 horas." @@ -1101,6 +1102,7 @@ es: not_logged_in_user: 'página con el resumen de actividad y preferencias' current_user: 'ir a tu página de usuario' topics: + new_messages_marker: "última visita" bulk: unlist_topics: "Hacer invisibles" reset_read: "Restablecer leídos" @@ -2983,3 +2985,22 @@ es: label: "Nuevo:" add: "Añadir" filter: "Buscar (URL o URL externa)" + wizard_js: + wizard: + done: "Hecho" + back: "Atrás" + next: "Siguiente" + step: "%{current} de %{total}" + upload: "Subir" + uploading: "Subiendo..." + quit: "Tal vez más tarde" + staff_count: + one: "Tu comunidad tiene 1 miembro como staff." + other: "Tu comunidad tiene %{count} miembros como staff." + invites: + add_user: "añadir" + none_added: "No has invitado a nadie como staff. ¿Seguro que quieres continuar?" + roles: + admin: "Admin" + moderator: "Moderador" + regular: "Usuario habitual" diff --git a/config/locales/client.et.yml b/config/locales/client.et.yml index 670b5d3bb0..e809059cce 100644 --- a/config/locales/client.et.yml +++ b/config/locales/client.et.yml @@ -1101,6 +1101,7 @@ et: not_logged_in_user: 'kasutajaleht koos toimingute ja eelistuste kokkuvõttega' current_user: 'mine oma kasutajalehele' topics: + new_messages_marker: "viimane visiit" bulk: unlist_topics: "Eemalda teemad loetelust" reset_read: "Nulli loetud" @@ -1699,6 +1700,13 @@ et: spam: "See on spämm" custom_placeholder_notify_user: "Ole täpne, konstruktiivne ja alati lahke." custom_placeholder_notify_moderators: "Anna meile teada, mis Sulle täpsemalt muret teeb ja võimalusel lisa asjassepuutuvaid viiteid ning näiteid." + custom_message: + more: + one: "1 veel" + other: "{{count}} veel..." + left: + one: "1 jäänud" + other: "{{count}} jäänud" flagging_topic: title: "Täname, et aitad meie kogukonna viisakust säilitada!" action: "Tähista teema" @@ -1812,7 +1820,7 @@ et: other: "Uusi ({{count}})" help: "viimase paari päeva jooksul loodud teemad" posted: - title: "Minu postitused" + title: "Minu" help: "minu postitustega teemad" bookmarks: title: "Järjehoidjad" @@ -2174,6 +2182,7 @@ et: add_owners: Lisa omanikke incoming_email: "Individuaalne sissetuleva meili aadress" incoming_email_placeholder: "sisesta meiliaadress" + flair_preview: "Eelvaade" api: generate_master: "Genereeri API peavõti" none: "Hetkel aktiivsed API võtmed puuduvad." @@ -2188,6 +2197,29 @@ et: info_html: "See API võti lubab Sul teemasid luua ja uuendada JSON kutsete kaudu." all_users: "Kõik kasutajad" note_html: "Hoia seda võtit salajas, iga kasutaja, kes seda omab, võib luua suvalisi postitusi suvalise kasutaja nime alt." + web_hooks: + create: "Loo" + save: "Salvesta" + destroy: "Kustuta" + description: "Kirjeldus" + go_back: "Tagasi nimekirja" + content_type: "Sisutüüp" + wildcard_event: "Saada mulle kõik." + delivery_status: + inactive: "Mitteaktiivne" + failed: "Ebaõnnestunud" + successful: "Edukas" + events: + response: "Vastus" + headers: "Päised" + body: "Sisu" + go_list: "Mine nimekirja" + go_events: "Mine sündmuste juurde" + ping: "Ping" + status: "Staatus" + event_id: "ID" + timestamp: "Loaded" + actions: "Tegevused" plugins: title: "Plugin" installed: "Paigaldatud pluginad" @@ -2571,6 +2603,7 @@ et: suspend_reason: "Põhjus" suspended_by: "Peatati kasutaja poolt" delete_all_posts: "Kustuta kõik postitused" + delete_all_posts_confirm_MF: "Sa oled kustutamas {POSTS, plural, one {1 post} other {# posts}} and {TOPICS, plural, one {1 topic} other {# topics}}. Oled Sa kindel?" suspend: "Peata" unsuspend: "Taasluba" suspended: "Peatatud?" @@ -2771,6 +2804,7 @@ et: plugins: "Pistikprogrammid" user_preferences: "Kasutaja seaded" tags: "Sildid" + search: "Otsi" badges: title: Märgised new_badge: Uus märgis @@ -2863,6 +2897,7 @@ et: embed_by_username: "Kasutajanimi teema loomiseks" embed_post_limit: "Maksimaalne postituste arv, mida sängitada" embed_username_key_from_feed: "Võti discourse kasutajanime eraldamiseks voost" + embed_title_scrubber: "Regex postituste päiste puhastamiseks" embed_truncate: "Lühenda sängitatud postitused" embed_whitelist_selector: "CSS valik elementidele, mida lubada sängitamistes" embed_blacklist_selector: "CSS valik elementidele, mida eemaldada sängitamistes" @@ -2885,3 +2920,20 @@ et: label: "Uus" add: "Lisa" filter: "Otsi (URL või väline URL)" + wizard_js: + wizard: + done: "Tehtud" + back: "Tagasi" + next: "Järgmine" + upload: "Lae üles" + quit: "Võib-olla hiljem" + staff_count: + one: "Sinu kommuunis on 1 tiimi liige." + other: "Sinu kommuunis on %{count} tiimi liiget." + invites: + add_user: "lisa" + none_added: "Sa ei ole kutsunud ühtegi tiimi liiget. Oled Sa kindel, et soovid jätkata?" + roles: + admin: "Admin" + moderator: "Moderator" + regular: "Tavakasutaja" diff --git a/config/locales/client.fa_IR.yml b/config/locales/client.fa_IR.yml index 9736e4313a..f8e3512004 100644 --- a/config/locales/client.fa_IR.yml +++ b/config/locales/client.fa_IR.yml @@ -1664,6 +1664,19 @@ fa_IR: info_html: "موضوعات تازه پس از آخرین بازدید شما" all_users: "همه کاربران" note_html: "این کلید را امن نگهدارید، تمام کاربرانی که آن را دارند می توانند نوشته های دلخواه بسازند به عنوان هر کاربری" + web_hooks: + active: "فعال" + delivery_status: + failed: "ناموفق" + successful: "موفق" + events: + request: "درخواست" + response: "پاسخ" + body: "بدنه" + go_list: "برو به لیست" + event_id: "آی دی" + timestamp: "ساخته شده" + actions: "کار ها" plugins: title: "افزونه ها" installed: "افزونه های نصب شده" @@ -1715,6 +1728,7 @@ fa_IR: is_disabled: "بازگردانی در تنظیمات سایت از کار انداخته شده است." label: "بازیابی" title: "بازیابی پشتیبان" + confirm: "آیا از بازگردانی این پشتیبان مطمئن هستید ؟" rollback: label: "عقبگرد" title: "عقب گرد پایگاه داده به حالت کار قبلی" @@ -1821,13 +1835,17 @@ fa_IR: name: 'دوست داشتن' description: "رنگ دکمه های لایک" email: + title: "رایانامه ها " settings: "تنظیمات" + templates: "قالب ها" preview_digest: "پیشنمایش خلاصه" sending_test: "فرستادن ایمیل آزمایشی..." error: "خطا - %{server_error}" test_error: "در ارسال ایمیل آزمایشی مشکلی وجود داشته است. لطفاً مجدداً تنظیمات ایمیل خود را بررسی کنید، از این که هاستتان اتصالات ایمیل را مسدود نکرده اطمینان حاصل کرده و مجدداً تلاش کنید." sent: "فرستاده شده" skipped: "رد داده شده" + received: "دریافت شده" + rejected: "رد شده" sent_at: "ارسال شده در" time: "زمان" user: "کاربر" @@ -1845,6 +1863,8 @@ fa_IR: last_seen_user: "آخرین مشاهده کاربر :" reply_key: "کلید پاسخ" skipped_reason: "رد دادن دلیل" + incoming_emails: + from_address: "از طرف" logs: none: "هیچ آماری یافت نشد." filters: diff --git a/config/locales/client.fi.yml b/config/locales/client.fi.yml index ddb919e740..522e99ca3e 100644 --- a/config/locales/client.fi.yml +++ b/config/locales/client.fi.yml @@ -136,6 +136,7 @@ fi: enabled: 'listasi %{when}' disabled: 'poisti listauksista %{when}' topic_admin_menu: "ketjun ylläpitotoimet" + wizard_required: "Konfiguroidaan foorumisi! Aloita ohjattu asennus!" emails_are_disabled: "Ylläpitäjä on estänyt kaiken lähtevän sähköpostiliikenteen. Mitään sähköposti-ilmoituksia ei lähetetä." bootstrap_mode_enabled: "Jotta uuden palsta käynnistäminen olisi helpompaa, on sivusto asetettu aloitustilaan. Kaikki uudet käyttäjät siirretään automaattisesti luottamustasolle 1 ja heille lähetetään sähköpostitiivistelmät päivittäin. Tämä tila poistetaan automaattisesti, kun käyttäjien määrä ylittää %{min_users}." bootstrap_mode_disabled: "Aloitustila poistetaan seuraavan 24 tunnin aikana." @@ -2896,3 +2897,22 @@ fi: label: "Uusi:" add: "Lisää" filter: "Etsi (URL tai ulkoinen URL)" + wizard_js: + wizard: + done: "Valmis" + back: "Edellinen" + next: "Seuraava" + step: "%{current}/%{total}" + upload: "Lataa" + uploading: "Ladataan..." + quit: "Ehkä myöhemmin" + staff_count: + one: "Yhteisöllä on 1 henkilökuntalainen." + other: "Yhteisöllä on %{count} henkilökuntalaista." + invites: + add_user: "lisää" + none_added: "Et ole kutsunut lainkaan henkilökuntaa. Haluatko todella jatkaa?" + roles: + admin: "Ylläpitäjä" + moderator: "Valvoja" + regular: "Tavallinen käyttäjä" diff --git a/config/locales/client.fr.yml b/config/locales/client.fr.yml index 3582bc8fa5..5cae6a8766 100644 --- a/config/locales/client.fr.yml +++ b/config/locales/client.fr.yml @@ -118,24 +118,25 @@ fr: removed_user: "a retiré %{who} %{when}" removed_group: "a retiré %{who} %{when}" autoclosed: - enabled: 'fermé %{when}' - disabled: 'ouvert %{when}' + enabled: 'fermé automatiquement %{when}' + disabled: 'ouvert automatiquement %{when}' closed: - enabled: 'fermé %{when}' - disabled: 'ouvert %{when}' + enabled: 'a fermé ce sujet %{when}' + disabled: 'a ouvert ce sujet %{when}' archived: - enabled: 'archivé %{when}' - disabled: 'désarchivé %{when}' + enabled: 'a archivé ce sujet %{when}' + disabled: 'a désarchivé ce sujet %{when}' pinned: - enabled: 'épinglé %{when}' - disabled: 'désépinglé %{when}' + enabled: 'a épinglé ce sujet %{when}' + disabled: 'a désépinglé ce sujet %{when}' pinned_globally: - enabled: 'épinglé globalement %{when}' - disabled: 'désépinglé %{when}' + enabled: 'a épinglé ce sujet globalement %{when}' + disabled: 'a désépinglé ce sujet %{when}' visible: - enabled: 'listé %{when}' - disabled: 'délisté %{when}' + enabled: 'a rendu ce sujet visible %{when}' + disabled: 'a rendu ce sujet invisible %{when}' topic_admin_menu: "actions d'administration sur le sujet" + wizard_required: "C'est le moment de configurer votre forum ! Démarrer l'assistant de configuration." emails_are_disabled: "Le courriel sortant a été désactivé par un administrateur. Aucune notification courriel ne sera envoyée." bootstrap_mode_enabled: "Pour rendre le lancement de votre site plus facile, vous êtes en mode 'bootstrap'. Tout nouveau utilisateur sera accordé le niveau de confirance 1 et aura les résumés par courriel hebdomadaires activés. Ceci cessera d'être le cas lorsque le nombre d'utilisateurs dépassera %{min_users}." bootstrap_mode_disabled: "Le mode Bootstrap sera désactivé dans les prochaines 24 heures." @@ -176,7 +177,7 @@ fr: guidelines: "Charte" privacy_policy: "Politique de confidentialité" privacy: "Confidentialité" - terms_of_service: "Conditions Générales d'Utilisation" + terms_of_service: "Conditions générales d'utilisation" mobile_view: "Vue mobile" desktop_view: "Vue bureau" you: "Vous" @@ -199,10 +200,10 @@ fr: other: "{{count}} caractères" suggested_topics: title: "À lire ensuite" - pm_title: "Messages suggérés" + pm_title: "À lire ensuite" about: simple_title: "À propos" - title: "À propos de %{title}" + title: "À propos du site %{title}" stats: "Statistiques du site" our_admins: "Nos administrateurs" our_moderators: "Nos modérateurs" @@ -242,10 +243,10 @@ fr: click_to_show: "Cliquez pour afficher." preview: "prévisualiser" cancel: "annuler" - save: "Sauvegarder les modifications" + save: "Sauvegarder" saving: "Sauvegarde en cours…" saved: "Sauvegardé !" - upload: "Envoyer" + upload: "Joindre un fichier" uploading: "Envoi en cours…" uploading_filename: "Envoi de {{filename}}…" uploaded: "Envoyé !" @@ -277,7 +278,7 @@ fr: has_pending_posts: one: "Ce sujet a 1 message en attente de validation" other: "Ce sujet a {{count}} messages en attente de validation" - confirm: "Sauvegarder les modifications" + confirm: "Sauvegarder" delete_prompt: "Êtes-vous sûr de vouloir supprimer %{username} ? Cela supprimera tous ses messages et bloquera son courriel et son adresse IP." approval: title: "Ce message doit être approuvé" @@ -376,7 +377,7 @@ fr: '7': "Mentions" '9': "Citations" '11': "Modifications" - '12': "Eléments envoyés" + '12': "Éléments envoyés" '13': "Boîte de réception" '14': "En attente" categories: @@ -428,7 +429,7 @@ fr: mute: "Silencieux" edit: "Modifier les préférences" download_archive: "Télécharger mes messages" - new_private_message: "Nouveau message privé" + new_private_message: "Créer un message privé" private_message: "Message privé" private_messages: "Messages privés" activity_stream: "Activité" @@ -501,7 +502,7 @@ fr: users: "Utilisateurs" muted_users: "Silencieux" muted_users_instructions: "Cacher toutes les notifications de ces utilisateurs." - muted_topics_link: "Afficher les sujets en sourdine" + muted_topics_link: "Afficher les sujets en silencieux" watched_topics_link: "Afficher les sujets surveillés" automatically_unpin_topics: "Désépingler automatiquement les sujets quand j'arrive à la fin." apps: "Applications" @@ -589,7 +590,7 @@ fr: available: "Votre pseudo est disponible" global_match: "L'adresse de courriel correspond au pseudo enregistré" global_mismatch: "Déjà enregistré. Essayez {{suggestion}} ?" - not_available: "Non disponible. Essayez {{suggestion}} ?" + not_available: "Indisponible. Essayez {{suggestion}} ?" too_short: "Votre pseudo est trop court" too_long: "Votre pseudo est trop long" checking: "Vérification de la disponibilité du pseudo…" @@ -597,7 +598,7 @@ fr: prefilled: "L'adresse de courriel correspond à ce pseudo enregistré" locale: title: "Langue de l'interface" - instructions: "Langue de l'interface. Le changement sera pris en compte lorsque vous actualiserez la page." + instructions: "Langue de l'interface utilisateur. Le changement sera pris en compte lorsque vous actualiserez la page." default: "(par défaut)" password_confirmation: title: "Confirmation du mot de passe" @@ -614,12 +615,12 @@ fr: like_notification_frequency: title: "Notifier lors d'un J'aime" always: "Toujours" - first_time_and_daily: "La première fois qu'un message est aimé et quotidiennement" + first_time_and_daily: "La première fois qu'un message est aimé puis quotidiennement" first_time: "La première fois qu'un message est aimé" never: "Jamais" email_previous_replies: title: "Inclure les réponses précédentes en bas des courriels" - unless_emailed: "sauf si déjà envoyé" + unless_emailed: "sauf si déjà envoyées" always: "toujours" never: "jamais" email_digests: @@ -639,7 +640,7 @@ fr: categories_settings: "Catégories" new_topic_duration: label: "Considérer les sujets comme nouveaux quand" - not_viewed: "Je ne les ai pas encore vus" + not_viewed: "je ne les ai pas encore vus" last_here: "créés depuis ma dernière visite" after_1_day: "créés depuis hier" after_2_days: "créés durant les 2 derniers jours" @@ -726,7 +727,7 @@ fr: bookmark_count: one: "signet" other: "signets" - top_replies: "Réponses populaires" + top_replies: "Meilleures réponses" no_replies: "Pas encore de réponses." more_replies: "Plus de réponses" top_topics: "Meilleurs sujets" @@ -785,7 +786,7 @@ fr: read_only_mode: enabled: "Le site est en mode lecture seule. Vous pouvez continer à naviguer, mais les réponses, J'aime et autre interactions sont désactivées pour l'instant." login_disabled: "La connexion est désactivée quand le site est en mode lecture seule." - logout_disabled: "La déconnexion est désactivée quand le site est en mode lecture seule." + logout_disabled: "La déconnexion est désactivée quand le site est en lecture seule." too_few_topics_and_posts_notice: "Démarrons cette discussion! Il y a actuellement %{currentTopics} / %{requiredTopics} sujets et %{currentPosts} / %{requiredPosts} messages. Les nouveaux visiteurs ont besoin de quelques conversations pour lire et répondre." too_few_topics_notice: "Démarrons cette discussion ! Il y a actuellement %{currentTopics} / %{requiredTopics} sujets. Les nouveaux visiteurs ont besoin de quelques conversations à lire et répondre." too_few_posts_notice: "Démarrons cette discussion ! Il y a actuellement %{currentPosts} / %{requiredPosts} messages. Les nouveaux visiteurs ont besoin de quelques conversations à lire et répondre." @@ -828,7 +829,7 @@ fr: disable: 'Afficher tous les messages' deleted_filter: enabled_description: "Ce sujet contient des messages supprimés, qui ont été cachés." - disabled_description: "Les messages supprimés de ce sujet sont visibles." + disabled_description: "Les messages supprimés du sujet sont visibles." enable: "Cacher les messages supprimés" disable: "Afficher les messages supprimés" private_message_info: @@ -921,7 +922,7 @@ fr: more_emoji: "plus…" options: "Options" whisper: "murmure" - unlist: "non listé" + unlist: "invisible" add_warning: "Ceci est un avertissement officiel." toggle_whisper: "Modifier le murmure" toggle_unlisted: "Modifier la visibilité" @@ -1041,7 +1042,7 @@ fr: replied: "Répondu" posted: "Message par" edited: "Modifier votre message par" - liked: "Aime votre message" + liked: "A aimé votre message" private_message: "Message privé de" invited_to_private_message: "Invité pour un message privé par" invited_to_topic: "Invité à un sujet par" @@ -1101,6 +1102,7 @@ fr: not_logged_in_user: 'page utilisateur avec un résumé de l''activité et les préférences ' current_user: 'aller à votre page utilisateur' topics: + new_messages_marker: "dernière visite" bulk: unlist_topics: "Ne plus lister les sujets" reset_read: "Réinitialiser la lecture" @@ -1132,7 +1134,7 @@ fr: latest: "Il n'y a aucun sujet pour le moment. C'est triste…" hot: "Il n'y a aucun sujet populaire pour le moment." bookmarks: "Vous n'avez pas encore mis de signets à des sujets." - category: "Il n'y a aucun sujet sur {{category}}." + category: "Il n'y a pas de sujets dans {{category}}." top: "Il n'y a pas de meilleurs sujets." search: "Votre recherche ne retourne aucun résultat." educate: @@ -1398,7 +1400,7 @@ fr: instructions: one: "Veuillez choisir un nouvel auteur pour le message de {{old_user}}." other: "Veuillez choisir un nouvel auteur pour les {{count}} messages de {{old_user}}." - instructions_warn: "Aucune notification à propos de ce message ne seront transféré rétroactivement à ce nouvel auteur.
Attention: Actuellement, aucune donnée lié au message n'est transféré vers le nouvel auteur. À utiliser avec précaution." + instructions_warn: "Aucune notification à propos de ce message ne sera transférée rétroactivement au nouvel utilisateur.
Attention : actuellement, aucune donnée liée aux messages n'est transféré vers le nouvel utilisateur. À utiliser avec précaution." change_timestamp: title: "Modifier la date/heure" action: "modifier la date/heure" @@ -1609,7 +1611,7 @@ fr: button: ' Brut' category: can: 'peut… ' - none: '(aucun catégorie)' + none: '(aucune catégorie)' all: 'Toutes les catégories' choose: 'Sélectionner une catégorie…' edit: 'modifier' @@ -1734,7 +1736,7 @@ fr: warning: help: "Ceci est un avertissement officiel." bookmarked: - help: "Vous avez mis un signet à ce topic" + help: "Vous avez mis un signet à ce sujet" locked: help: "Ce sujet est fermé ; il n'accepte plus de nouvelles réponses" archived: @@ -2066,7 +2068,7 @@ fr: private_messages_title: "Messages" mobile_title: "Mobile" space_free: "{{size}} libre" - uploads: "téléchargements" + uploads: "fichiers envoyés" backups: "sauvegardes" traffic_short: "Trafic" traffic: "Requêtes Web Application" @@ -2089,7 +2091,7 @@ fr: end_date: "Date de fin" groups: "Tous les groupes" commits: - latest_changes: "Dernières modifications: merci de mettre à jour régulièrement!" + latest_changes: "Dernières modifications : veuillez mettre à jour régulièrement !" by: "par" flags: title: "Signalements" @@ -2100,7 +2102,7 @@ fr: agree_flag_modal_title: "Accepter et…" agree_flag_hide_post: "Accepter (cacher le message + envoi d'un MP)" agree_flag_hide_post_title: "Masquer ce message et envoyer automatiquement un message à l'utilisateur afin qu'il le modifie rapidement" - agree_flag_restore_post: "Accepter (restauré le message)" + agree_flag_restore_post: "Accepter (rétablir le message)" agree_flag_restore_post_title: "Restaurer ce message" agree_flag: "Accepter le signalement" agree_flag_title: "Accepter le signalement et garder le message inchangé" @@ -2154,8 +2156,8 @@ fr: one: "spam" other: "spam x{{count}}" groups: - primary: "Groupe primaire" - no_primary: "(pas de groupe primaire)" + primary: "Groupe principal" + no_primary: "(pas de groupe principal)" title: "Groupes" edit: "Modifier les groupes" refresh: "Actualiser" @@ -2193,6 +2195,7 @@ fr: flair_color: "Couleur de la vignette d'avatar" flair_color_placeholder: "(Facultatif) Couleur en héxadécimal" flair_preview: "Prévisualiser" + flair_note: "Note : la vignette d'avatar sera uniquement affichée pour le groupe principal d'un utilisateur." api: generate_master: "Générer une clé d'API maître" none: "Il n'y a pas de clés API actives en ce moment." @@ -2426,11 +2429,11 @@ fr: name: "quaternaire" description: "Liens de navigation." header_background: - name: "fond du header" - description: "Couleur de fond du header." + name: "arrière-plan de l'entête" + description: "Couleur d'arrière-plan de l'entête du site." header_primary: - name: "header primaire" - description: "Textes et icônes du header. " + name: "primaire de l'entête" + description: "Textes et icônes dans l'entête du site. " highlight: name: 'accentuation' description: 'La couleur de fond des éléments accentués sur la page, comme les messages et sujets.' @@ -2878,7 +2881,7 @@ fr: badge_type: Type de badge badge_grouping: Groupe badge_groupings: - modal_title: Regroupements de badge + modal_title: Groupes de badges granted_by: Décerné par granted_at: Décerné le reason_help: (Lien vers un message ou sujet) @@ -2946,11 +2949,11 @@ fr: confirm_delete: "Êtes-vous sûr de vouloir supprimer cet hôte?" sample: "Introduire le code HTML suivant dans votre site pour créer et intégrer des sujets Discourse. Remplacer REPLACE_ME avec l'URL de la page dans laquelle vous l'intégrer." title: "Intégration externe" - host: "Hôtes permis" + host: "Hôtes autorisés" path_whitelist: "Chemins autorisés" edit: "modifier" - category: "Ajouter dans catégorie" - add_host: "Ajouter hôte" + category: "Écrire dans la catégorie" + add_host: "Ajouter un hôte" settings: "Paramètres d'intégration externe" feed_settings: "Paramètres de flux RSS/ATOM" feed_description: "Fournir un flux RSS/ATOM pour votre site peut améliorer la capacité de Discourse à importer votre contenu." @@ -2966,7 +2969,7 @@ fr: embed_classname_whitelist: "Classes CSS autorisées" feed_polling_enabled: "Importer les messages via flux RSS/ATOM" feed_polling_url: "URL du flux RSS/ATOM à importer" - save: "Sauvegarder paramètres d'intégration" + save: "Sauvegarder les paramètres d'intégration" permalink: title: "Permaliens" url: "URL" @@ -2982,3 +2985,22 @@ fr: label: "Nouveau :" add: "Ajouter" filter: "Rechercher (URL ou URL externe)" + wizard_js: + wizard: + done: "Terminer" + back: "Retour" + next: "Suivant" + step: "%{current} sur %{total}" + upload: "Envoi" + uploading: "Envoi en cours…" + quit: "Peut-être plus tard" + staff_count: + one: "Votre communauté a 1 responsable." + other: "Votre communauté a %{count} responsables." + invites: + add_user: "ajouter" + none_added: "Vous n'avez invité aucun responsable. Êtes-vous sûr de vouloir continuer ?" + roles: + admin: "Administrateur" + moderator: "Modérateur" + regular: "Utilisateur" diff --git a/config/locales/client.he.yml b/config/locales/client.he.yml index edfff33129..ddf9174675 100644 --- a/config/locales/client.he.yml +++ b/config/locales/client.he.yml @@ -95,10 +95,10 @@ he: other: "אחרי %{count} ימים" x_months: one: "אחרי חודש אחד" - other: "אחרי {{count}}% חודשים" + other: "אחרי %{count} חודשים" x_years: one: "אחרי שנה אחת" - other: "אחרי {{count}}% שנים" + other: "אחרי %{count} שנים" previous_month: 'חודש קודם' next_month: 'חודש הבא' share: @@ -118,11 +118,11 @@ he: removed_user: "%{who} הוסרו ב-%{when}" removed_group: "הסירו %{who} %{when}" autoclosed: - enabled: 'סגר %{when}' - disabled: 'פתח %{when}' + enabled: 'נסגר %{when}' + disabled: 'נפתח %{when}' closed: - enabled: 'סגר %{when}' - disabled: 'פתח %{when}' + enabled: 'נסגר %{when}' + disabled: 'נפתח %{when}' archived: enabled: 'עבר לארכיון %{when}' disabled: 'הוצא מהארכיון %{when}' @@ -136,6 +136,7 @@ he: enabled: 'נכנס לרשימה %{when}' disabled: 'הוצא מהרשימה %{when}' topic_admin_menu: "פעולות ניהול לנושא" + wizard_required: "הגיע הזמן לכוונן את הפורום שלכם! התחילו את אשף ההקמה!" emails_are_disabled: "כל הדוא\"ל היוצא נוטרל באופן גורף על ידי מנהל אתר. שום הודעת דוא\"ל, מכל סוג שהוא, תשלח." bootstrap_mode_enabled: "כדי להקל על הקמת האתר החדש שלכם, אתם במצב איתחול-ראשוני. כל המשתמשים החדשים יקבלו רמת אמון 1 ויקבלו סיכומים יומיים במייל. אפשרות זו תכובה אוטומטית כאשר יהיו יותר מ %{min_users} משתמשים." bootstrap_mode_disabled: "מצב איתחול-ראשוני יכובה ב 24 השעות הקרובות." @@ -173,7 +174,7 @@ he: one: "קישור" other: "קישורים" faq: "שאלות נפוצות" - guidelines: "כללי התנהלות" + guidelines: "הנחיות" privacy_policy: "מדיניות פרטיות" privacy: "פרטיות" terms_of_service: "תנאי השירות" @@ -212,11 +213,11 @@ he: last_30_days: "ב-30 הימים האחרונים" like_count: "לייקים" topic_count: "נושאים" - post_count: "פרסומים" + post_count: "פוסטים" user_count: "חדשים" active_user_count: "משתמשים פעילים" contact: "צרו קשר" - contact_info: "במקרה של ארוע בנושא חשוב או חירומים המשפיע על האתר, אנא צרו איתנו קשר ב:%{contact_info}." + contact_info: "במקרה של ארוע קריטי או דחוף המשפיע על האתר, אנא צרו איתנו קשר ב: %{contact_info}." bookmarked: title: "סימניה" clear_bookmarks: "ביטול סימניות" @@ -242,7 +243,7 @@ he: click_to_show: "הקליקו כדי להציג." preview: "תצוגה מקדימה" cancel: "ביטול" - save: "שמור שינויים" + save: "שמירת שינויים" saving: "שומר..." saved: "נשמר!" upload: "העלה" @@ -289,12 +290,12 @@ he: user_action: user_posted_topic: "{{user}} פרסם את הנושא" you_posted_topic: "את/ה פרסמת את הנושא" - user_replied_to_post: "{{user}} הגיב ל: {{post_number}}" + user_replied_to_post: "{{user}} הגיב/ה ל: {{post_number}}" you_replied_to_post: "את/ה הגבת ל: {{post_number}}" user_replied_to_topic: "{{user}} הגיב לנושא הזה" you_replied_to_topic: "את/ה הגבת לנושא הזה" - user_mentioned_user: "{{user}} הזכיר את {{another_user}}" - user_mentioned_you: "{{user}} הזכיר אותך" + user_mentioned_user: "{{user}} הזכיר/ה את {{another_user}}" + user_mentioned_you: "{{user}} הזכיר/ה אותך" you_mentioned_user: "את/ה הזכרת את {{another_user}}" posted_by_user: "פורסם על ידי {{user}}" posted_by_you: "פורסם על ידך" @@ -316,7 +317,7 @@ he: days_visited: "ביקורים" days_visited_long: "ימים לביקור" posts_read: "נקראו" - posts_read_long: "פרסומים שנקראו" + posts_read_long: "פוסטים שנקראו" total_rows: one: "משתמש/ת 1" other: "%{count} משתמשים" @@ -356,7 +357,7 @@ he: description: "תקבלו התראה על כל פוסט חדש במסגרת כל הודעה, וסך התשובות יוצג." watching_first_post: title: "צפייה בפוסט הראשון" - description: "תקבלו התראה על הפרסום הראשון בכל נושא חדש בקבוצה זו." + description: "תקבלו התראה על הפוסט הראשון בכל נושא חדש בקבוצה זו." tracking: title: "במעקב" description: "תקבלו התראה אם מישהו מזכיר את @שמכם או עונה לכם, ותופיע ספירה של תגובות חדשות." @@ -369,7 +370,7 @@ he: user_action_groups: '1': "לייקים שניתנו" '2': "לייקים שהתקבלו" - '3': "מועדפים" + '3': "סימניות" '4': "נושאים" '5': "תשובות" '6': "תגובות" @@ -391,9 +392,9 @@ he: fix_order: "סדר מיקומים" fix_order_tooltip: "לא לכל הקטגוריות יש מספר סידורי יחודי, זה עלול לגרום לבעיות." save: "שמור סדר" - apply_all: "הפעל" + apply_all: "החל" position: "מיקום" - posts: "פרסומים" + posts: "פוסטים" topics: "נושאים" latest: "לאחרונה" latest_by: "לאחרונה על ידי" @@ -407,7 +408,7 @@ he: other: "%{count} נושאים חדשים ב-%{unit}." ip_lookup: title: חיפוש כתובת IP - hostname: שם מארח (Hostname) + hostname: שם שרת location: מיקום location_not_found: (לא ידוע) organisation: ארגון @@ -421,12 +422,12 @@ he: post_count: "# פרסומים" confirm_delete_other_accounts: "אתם בטוחים שברצונכם למחוק חשבונות אלו?" user_fields: - none: "(בחר אפשרות)" + none: "(בחרו אפשרות)" user: said: "{{username}}:" profile: "פרופיל" mute: "השתק" - edit: "ערוך העדפות" + edit: "עריכת העדפות" download_archive: "הורדת הפרסומים שלי" new_private_message: "הודעה חדשה" private_message: "הודעה" @@ -434,7 +435,7 @@ he: activity_stream: "פעילות" preferences: "העדפות" expand_profile: "הרחב" - bookmarks: "מועדפים" + bookmarks: "סימניות" bio: "אודותיי" invited_by: "הוזמנו על ידי" trust_level: "רמת אמון" @@ -443,10 +444,10 @@ he: desktop_notifications: label: "התראות לשולחן העבודה" not_supported: "התראות לא נתמכות בדפדפן זה. מצטערים." - perm_default: "הדלק התראות" + perm_default: "הפעלת התראות" perm_denied_btn: "הרשאות נדחו" perm_denied_expl: "מנעתם הרשאה לקבלת התראות. אפשרו התראות בהגדרות הדפדפן שלכם." - disable: "כבה התראות" + disable: "כבוי התראות" enable: "אפשר התראות" each_browser_note: "הערה: עליך לשנות הגדרה זו עבור כל דפדפן בנפרד." dismiss_notifications: "בטלו הכל" @@ -482,9 +483,9 @@ he: tracked_tags_instructions: "אתם תעקבו אוטומטית אחר כל הנושאים עם תגיות אלו. ספירה של פוסטים חדשים תופיע ליד הנושא." muted_tags: "מושתק" muted_tags_instructions: "אתם לא תיודעו לגבי דבר בנוגע לנושאים חדשים עם תגיות אלו, והם לא יופיעו ברשימת האחרונים." - watched_categories: "עוקב" + watched_categories: "נצפה" watched_categories_instructions: "תעקבו באופן אוטומטי אחרי כל הנושאים בקטגוריות אלו. תקבלו התראה על כל הפרסומים והנושאים החדשים. מספר הפרסומים יופיע לצד כותרת הנושא." - tracked_categories: "רגיל+" + tracked_categories: "במעקב" tracked_categories_instructions: "אתם תעקבו אוטומטית אחר כל הנושאים עם קטגוריות אלו. ספירה של פוסטים חדשים תופיע ליד הנושא." watched_first_post_categories: "צפייה בפוטס הראשון" watched_first_post_categories_instructions: "אתם תיודעו לגבי הפוסט הראשון בכל נושא חדש בקטגוריות אלו." @@ -547,16 +548,16 @@ he: title: "שנה דואר אלקטרוני" taken: "סליחה, הכתובת הזו אינה זמינה." error: "הייתה שגיאה בשינוי כתובת הדואר האלקטרוני שלך. אולי היא תפוסה?" - success: "שלחנו דואר אלקטרוני לכתובת הדואר הזו. בבקשה עקוב אחרי הוראות האישור שם." + success: "שלחנו דואר אלקטרוני לכתובת הדואר הזו. בבקשה עיקבו אחרי הוראות האישור שם." change_avatar: title: "שינוי תמונת הפרופיל" gravatar: "Gravatar, מבוסס על" - gravatar_title: "שנה את ה-avatar שלך באתר-Gravatar" + gravatar_title: "שנו את הדמות שלכם באתר-Gravatar" refresh_gravatar_title: "רענון האווטר שלכם" letter_based: "תמונת פרופיל משובצת מערכתית" uploaded_avatar: "תמונה אישית" - uploaded_avatar_empty: "הוסף תמונה אישית" - upload_title: "העלה את התמונה שלך" + uploaded_avatar_empty: "הוסיפו תמונה אישית" + upload_title: "העלו את התמונה שלכם" upload_picture: "העלאת תמונה" image_is_not_a_square: "אזהרה: קיצצנו את התמונה שלך; האורך והרוחב לא היו שווים." cache_notice: "שינית את תמונת הפרופיל שלך בהצלחה אבל יכול לקחת קצת זמן עד שהתמונה תופיע." @@ -583,13 +584,13 @@ he: too_short: "השם שלך קצר מידי" ok: "השם נראה טוב" username: - title: "שם משתמש" + title: "שם משתמש/ת" instructions: "ייחודי, ללא רווחים וקצר" short_instructions: "אנשים יכולים לאזכר אותך כ @{{username}}" available: "שם המשתמש שלך פנוי" global_match: "הדואר האלקטרוני תואם את שם המשתמש הרשום" - global_mismatch: "כבר רשום. נסה {{suggestion}}?" - not_available: "לא זמין. נסה {{suggestion}}?" + global_mismatch: "כבר רשום. נסו {{suggestion}}?" + not_available: "לא זמין. נסו {{suggestion}}?" too_short: "שם המשתמש שלך קצר מידי" too_long: "שם המשתמש שלך ארוך מידי" checking: "בודק זמינות שם משתמש..." @@ -601,7 +602,7 @@ he: default: "(ברירת מחדל)" password_confirmation: title: "סיסמה שוב" - last_posted: "פרסום אחרון" + last_posted: "פוסט אחרון" last_emailed: "נשלח לאחרונה בדואר אלקטרוני" last_seen: "נראה" created: "הצטרפו" @@ -661,7 +662,7 @@ he: title: "הזמנות" user: "משתמשים שהוזמנו" sent: "נשלח" - none: "אין הזמנות ממתינות להציג" + none: "אין הזמנות ממתינות להציג." truncated: one: "מראה את ההזמנה הראשונה." other: "מראה את {{count}} ההזמנות הראשונות." @@ -748,7 +749,7 @@ he: title: "כתובת IP בהרשמה" avatar: title: "תמונת פרופיל" - header_title: "פרופיל, הודעות, סימניות והגדרות " + header_title: "פרופיל, הודעות, סימניות והעדפות" title: title: "כותרת" filters: @@ -845,16 +846,16 @@ he: search_hint: 'שם משתמש/ת, דוא"ל או כתובת IP' create_account: title: "יצירת חשבון חדש" - failed: "משהו לא בסדר, אולי כבר קיימת כתובת דואר אלקטרוני כזו. נסה את קישור שכחתי סיסמה." + failed: "משהו לא בסדר, אולי כבר קיימת כתובת דואר אלקטרוני כזו. נסו את קישור שכחתי סיסמה." forgot_password: title: "אתחול סיסמה" action: "שכחתי את הסיסמה שלי" invite: "הזן שם משתמש או כתובת דואר אלקטרוני ונשלח לך קישור לאיפוס סיסמה" reset: "איפוס סיסמה" - complete_username: "אם קיים חשבון שמתאים לשם המשתמש %{username}, אתה אמור לקבל בקרוב מייל עם הוראות לאיפוס הסיסמא. " - complete_email: "במידה והחשבון מתאים לכתובת %{email}, אתם אמורים לקבל בקרוב מייל עם הוראות לאיפוס הסיסמא." - complete_username_found: "מצאנו חשבון שתואם לשם המשתמש %{username}, קרוב לודאי שתקבלו דוא\"ל עם הנחיות כיצד לאתחל את הסיסמא שלכם תוך זמן קצר." - complete_email_found: "מצאנו חשבון תואם ל%{email}. בתוך זמן קצר תקבלו אליו דוא\"ל עם הנחיות כיצד לאתחל את הסיסמא שלכם." + complete_username: "אם קיים חשבון שמתאים לשם המשתמש %{username}, אתם אמורים לקבל בקרוב מייל עם הוראות לאיפוס הסיסמה." + complete_email: "במידה והחשבון מתאים לכתובת %{email}, אתם אמורים לקבל בקרוב מייל עם הוראות לאיפוס הסיסמה." + complete_username_found: "מצאנו חשבון שתואם לשם המשתמש %{username}, קרוב לודאי שתקבלו דוא\"ל עם הנחיות כיצד לאתחל את הסיסמה שלכם תוך זמן קצר." + complete_email_found: "מצאנו חשבון תואם ל%{email}. בתוך זמן קצר תקבלו אליו דוא\"ל עם הנחיות כיצד לאתחל את הסיסמה שלכם." complete_username_not_found: "שום חשבון אינו תואם לשם המשתמש %{username}" complete_email_not_found: "שום חשבון אינו תואם ל %{email}" login: @@ -864,8 +865,8 @@ he: email_placeholder: "דואר אלקטרוני או שם משתמש/ת" caps_lock_warning: "מקש Caps Lock לחוץ" error: "שגיאה לא ידועה" - rate_limit: "בבקשה המתן לפני שתנסה להתחבר שוב." - blank_username_or_password: "אנא הקישור את כתובת הדוא\"ל או שם המשתמש/ת שלכם וסיסמא." + rate_limit: "בבקשה המתינו לפני שתנסו להתחבר שוב." + blank_username_or_password: "אנא הקישור את כתובת הדוא\"ל או שם המשתמש/ת שלכם וסיסמה." reset_password: 'אפס סיסמה' logging_in: "מתחבר...." or: "או" @@ -959,7 +960,7 @@ he: view_new_post: "צפו בפוסט החדש שלכם." saving: "שומר" saved: "נשמר!" - saved_draft: "טיוטאת פרסום בתהליך, לחצו כדי להמשיך." + saved_draft: "טיוטאת פוסט בתהליך, לחצו כדי להמשיך." uploading: "מעלה..." show_preview: 'הראה תצוגה מקדימה »' hide_preview: '« הסתר תצוגה מקדימה' @@ -1040,23 +1041,23 @@ he: quoted: "צוטט על ידי" replied: "השיב" posted: "פורסם על ידי" - edited: "ערוך את פרסומך על ידי" - liked: "אהב את הפרסום שלך" + edited: "ערוך את הפוסט שלך על ידי" + liked: "אהב את הפוסט שלך" private_message: "הודעה פרטית מ" invited_to_private_message: "הזמנה להודעה פרטית מ" invited_to_topic: "הוזמנת לנושא חדש מ" invitee_accepted: "הזמנה התקבלה על ידי" - moved_post: "הפרסום שלך הוזז על ידי" - linked: "קישור לפרסום שלך" + moved_post: "הפוסט שלך הוזז על ידי" + linked: "קישור לפוסט שלך" granted_badge: "עיטור הוענק" group_message_summary: "הודעות בדואר-נכנס קבוצתי" popup: - mentioned: '{{username}} הזכיר אותך ב{{topic}}" - {{site_title}}"' - group_mentioned: '{{username}} הזכיר אתכם ב "{{topic}}" - {{site_title}}' - quoted: '{{username}} ציטט אותך ב"{{topic}}" - {{site_title}}' - replied: '{{username}} הגיב לך ב"{{topic}}" - {{site_title}}' - posted: '{{username}} הגיב ב"{{topic}}" - {{site_title}}' - private_message: '{{username}} שלח לך הודעה פרטית ב"{{topic}}" - {{site_title}}' + mentioned: '{{username}} הזכיר/ה אותך ב{{topic}}" - {{site_title}}"' + group_mentioned: '{{username}} הזכיר/ה אתכם ב "{{topic}}" - {{site_title}}' + quoted: '{{username}} ציטט/ה אותך ב"{{topic}}" - {{site_title}}' + replied: '{{username}} הגיב/ה לך ב"{{topic}}" - {{site_title}}' + posted: '{{username}} הגיב/ה ב"{{topic}}" - {{site_title}}' + private_message: '{{username}} שלח/ה לך הודעה פרטית ב"{{topic}}" - {{site_title}}' linked: '{{username}} קישרו לפוסט שלכם מ"{{topic}}" - {{site_title}}' upload_selector: title: "הוספת תמונה" @@ -1065,12 +1066,12 @@ he: from_the_web: "מהאינטרנט" remote_tip: "קישור לתמונה" remote_tip_with_attachments: "קישור לתמונה או לקובץ {{authorized_extensions}}" - local_tip: "בחר תמונות ממכשירך" + local_tip: "בחרו תמונות ממכשירכם" local_tip_with_attachments: "בחרו תמונות או קבצים ממכשיר {{authorized_extensions}} שלכם" hint: "(ניתן גם לגרור לעורך להעלאה)" hint_for_supported_browsers: "תוכלו גם לגרור או להדביק תמונות לעורך" uploading: "מעלה" - select_file: "בחר קובץ" + select_file: "בחירת קובץ" image_link: "קישור לתמונה יצביע ל" search: sort_by: "מיון על פי" @@ -1078,8 +1079,8 @@ he: latest_post: "הפוסטים האחרונים" most_viewed: "הנצפה ביותר" most_liked: "האהובים ביותר" - select_all: "בחר הכל" - clear_all: "נקה הכל" + select_all: "בחירה של הכל" + clear_all: "נקוי של הכל" too_short: "מילת החיפוש שלכם קצרה מידי." result_count: one: "תוצאה אחת ל \"{{term}}\"" @@ -1101,6 +1102,7 @@ he: not_logged_in_user: 'עמוד משתמש עם סיכום פעילות נוכחית והעדפות' current_user: 'לך לעמוד המשתמש שלך' topics: + new_messages_marker: "ביקור אחרון" bulk: unlist_topics: "הסרת נושאים" reset_read: "איפוס נקראו" @@ -1154,7 +1156,7 @@ he: topic: unsubscribe: stop_notifications: "תקבלו פחות התראות עבור {{title}}" - change_notification_state: "מצב ההתראות הנוכחי שלך הוא" + change_notification_state: "מצב ההתראות הנוכחי שלכם הוא" filter_to: one: "פוסט אחד בנושא" other: "{{count}} פוסטים בנושא" @@ -1212,9 +1214,9 @@ he: jump_reply_up: קפיצה לתגובה קודמת jump_reply_down: קפיצה לתגובה מאוחרת deleted: "הנושא הזה נמחק" - auto_close_notice: "הנושא הזה ינעל אוטומטית %{timeLeft}." + auto_close_notice: "הנושא הזה יסגר אוטומטית %{timeLeft}." auto_close_notice_based_on_last_post: "נושא זה ייסגר %{duration} אחר התגובה האחרונה." - auto_close_title: 'הגדרות נעילה אוטומטית' + auto_close_title: 'הגדרות סגירה אוטומטית' auto_close_save: "שמור" auto_close_remove: "אל תנעל נושא זה אוטומטית" auto_close_immediate: @@ -1240,7 +1242,7 @@ he: reasons: mailing_list_mode: "אתם במצב רשימת תפוצה, אז תיודעו לגבי תגובות לנושא זה באמצעות מייל." '3_10': 'תקבלו התראות כיוון שאתם צופים בתג שקשור לנושא זה.' - '3_6': 'תקבלו התראות כיוון שאת/ה עוקב אחרי קטגוריה זו.' + '3_6': 'תקבלו התראות כיוון שאתם עוקבים אחרי קטגוריה זו.' '3_5': 'תקבלו התראות כיוון שהתחלתם לעקוב אחרי הנושא הזה אוטומטית.' '3_2': 'תקבלו התראות כיוון שאתם עוקבים אחרי הנושא הזה.' '3_1': 'תקבלו התראות כיוון שאתם יצרתם את הנושא הזה.' @@ -1249,8 +1251,8 @@ he: '2_4': 'תקבלו התראות כיוון שפרסמתם תגובה לנושא זה.' '2_2': 'תקבלו התראות כיוון שאתם עוקבים אחרי הנושא הזה.' '2': 'תקבלו התראות כיוון שקראתם את הנושא הזה.' - '1_2': 'תקבלו התראה אם מישהו יזכיר את @שם_המשתמש/ת שלך או ישיב לפרסום שלך.' - '1': 'תקבלו התראה אם מישהו יזכיר את @שם_המשתמש/ת שלך או ישיב לפרסום שלך.' + '1_2': 'תקבלו התראה אם מישהו יזכיר את @שם_המשתמש/ת שלכם או ישיב לכם.' + '1': 'תקבלו התראה אם מישהו יזכיר את @שם_המשתמש/ת שלכם או ישיב לכם.' '0_7': 'את/ה מתעלם/מתעלמת מכל ההתראות בקטגוריה זו.' '0_2': 'אתם מתעלמים מכל ההתראות בנושא זה.' '0': 'אתם מתעלמים מכל ההתראות בנושא זה.' @@ -1261,17 +1263,17 @@ he: title: "עוקב" description: "תקבלו התראה על כל תגובה חדשה בנושא זה ומספר התגובות החדשות יוצג. " tracking_pm: - title: "רגיל+" + title: "עוקב" description: "ספירה של תגובות חדשות תופיע עבור הודעה זו. אתם תיודעו אם מישהו מזכיר את @שמכם או עונה לכם." tracking: - title: "רגיל+" + title: "עוקב" description: "כמו רגיל, בנוסף מספר התגובות שלא נקראו יוצג לנושא זה." regular: title: "רגיל" - description: "תקבלו התראה אם מישהו יזכיר את @שם_המשתמש/ת שלך או ישיב לפרסום שלך." + description: "תקבלו התראה אם מישהו יזכיר את @שם_המשתמש/ת שלכם או ישיב לכם." regular_pm: title: "רגיל" - description: "תקבלו התראה אם מישהו יזכיר את @שם_המשתמש/ת שלך או ישיב לפרסום שלך." + description: "תקבלו התראה אם מישהו יזכיר את @שם_המשתמש/ת שלכם או ישיב לכם." muted_pm: title: "מושתק" description: "לעולם לא תקבלו התראה בנוגע להודעה זו." @@ -1365,7 +1367,7 @@ he: email_placeholder: 'name@example.com' success_email: "שלחנו הזמנה ל: {{emailOrUsername}}. נודיע לכם כשהזמנה תענה. בידקו את טאב ההזמנות בעמוד המשתמש שלכם בשביל לעקוב אחרי ההזמנות ששלחתם." success_username: "הזמנו את המשתמש להשתתף בנושא." - error: "מצטערים, לא יכלנו להזמין האיש הזה. אולי הוא כבר הוזמן בעבר? (תדירות שליחת ההזמנות מוגבלת)" + error: "מצטערים, לא יכלנו להזמין משתמש/ת אלו. אולי הם כבר הוזמנו בעבר? (תדירות שליחת ההזמנות מוגבלת)" login_reply: 'התחברו כדי להשיב' filters: n_posts: @@ -1402,11 +1404,11 @@ he: other: "אנא בחרו את הבעלים החדש של {{count}} הפוסטים מאת {{old_user}}." instructions_warn: "יש לשים לב שהתראות על פוסט זה יועברו למשתמש החדש רטרואקטיבית.
זהירות: כרגע, שום מידע תלוי-פוסט אינו מועבר למשתמש החדש. השתמשו בזהירות." change_timestamp: - title: "שנה חותמת זמן" - action: "זנה חותמת זמן" - invalid_timestamp: "חותמת זמן לא יכולה להיות בעתיד" - error: "הייתה שגיאה בשינוי חותמת הזמן של הפוסט" - instructions: "אנא בחרו את חותמת הזמן החדשה של הפוסט. פרסומים בפוסט יועדכנו לאותם הפרשי זמנים." + title: "שינוי חותמת זמן" + action: "שינוי חותמת זמן" + invalid_timestamp: "חותמת זמן לא יכולה להיות בעתיד." + error: "היתה שגיאה בשינוי חותמת הזמן של הנושא." + instructions: "אנא בחרו את חותמת הזמן החדשה של הנושא. פוסטים בנושא יועדכנו לאותם הפרשי זמנים." multi_select: select: 'בחירה' selected: 'נבחרו ({{count}})' @@ -1455,7 +1457,7 @@ he: errors: create: "סליחה, הייתה שגיאה ביצירת הפוסט שלכם. אנא נסו שנית." edit: "סליחה, הייתה שגיאה בעריכת הפוסט שלכם. אנא נסו שנית." - upload: "סליחה, הייתה שגיאה בהעלאת הקובץ שלך. אנא נסה שנית" + upload: "סליחה, הייתה שגיאה בהעלאת הקובץ שלך. אנא נסו שנית" file_too_large: "מצטערים, הקובץ גדול מידי (הגודל המירבי הוא {{max_size_kb}}kb). אולי תקצו להעלות קבצים גדולים לשירות שיתוף בענן ולשתף את הקישור." too_many_uploads: "סליחה, אך ניתן להעלות רק קובץ אחת כל פעם." too_many_dragged_and_dropped_files: "מצטערים, אתם יכולים להעלות עד 10 קבצים בו זמנית." @@ -1465,7 +1467,7 @@ he: attachment_download_requires_login: "מצטערים, עליכם להיות מחוברים כדי להוריד את הקבצים המצורפים." abandon: confirm: "האם אתם רוצים לנטוש את הפוסט שלכם?" - no_value: "לא, שמור אותה" + no_value: "לא, שמור אותו" yes_value: "כן, נטוש" via_email: "פוסט זה הגיע באמצעות דוא\"ל" via_auto_generated_email: "פוסט זה הגיע דרך מייל שנוצר אוטומטית" @@ -1627,7 +1629,7 @@ he: tag_groups_placeholder: "(אופציונלי) רשימת קבוצות תגים" delete: 'מחק קטגוריה' create: 'קטגוריה חדשה' - create_long: 'צור קטגוריה חדשה' + create_long: 'יצירת קטגוריה חדשה' save: 'שמור קטגוריה' slug: 'כתובת חלזונית לקטגוריה' slug_placeholder: '(אופציונאלי) מלים-מחוברות-במקפים-לכתובת-URL' @@ -1652,14 +1654,14 @@ he: security: "אבטחה" special_warning: "אזהרה: קטגוריה זו הגיעה מראש והגדרות האבטחה שלה אינן ניתנות לשינוי. אם אתם מעוניינים להשתמש בקטגוריה זו, מחקו אותה במקום להשתמש בה מחדש." images: "תמונות" - auto_close_label: "נעל פוסטים אוטומטית אחרי:" + auto_close_label: "סגור נושאים אוטומטית אחרי:" auto_close_units: "שעות" email_in: "כתובת דואר נכנס מותאמת אישית:" email_in_allow_strangers: "קבלת דוא\"ל ממשתמשים אנונימיים ללא חשבונות במערכת הפורומים" email_in_disabled: "אפשרות הפרסום של נושאים חדשים דרך דוא\"ל נוטרלה בהגדרות האתר. כדי לאפשר פרסום באמצעות משלוח דוא\"ל," email_in_disabled_click: 'אפשרו את את ההגדרה "דוא"ל נכנס"' - suppress_from_homepage: "הרחק קטגוריה זו מהעמוד הראשי" - allow_badges_label: "הרשו לעיטורים (badges) להיות מוענקים בקטגוריה זו" + suppress_from_homepage: "הרחיקו קטגוריה זו מהעמוד הראשי." + allow_badges_label: "הרשו לעיטורים להיות מוענקים בקטגוריה זו" edit_permissions: "ערוך הרשאות" add_permission: "הוסף הרשאה" this_year: "השנה" @@ -1676,7 +1678,7 @@ he: title: "צפייה בפוסט הראשון" description: "תקבלו התראה על הפוסט הראשון בכל אחד מהנושאים בקטגוריות אלו." tracking: - title: "רגיל+" + title: "עוקב" description: "אתם תעקבו אוטומטית אחרי כל הנושאים בקטגוריות אלו. אתם תיודעו אם מישהו מזכיר את @שמכם או עונה לכם, וספירה של תגובות חדשות תופיע לכם." regular: title: "נורמלי" @@ -1700,7 +1702,7 @@ he: cant: "סליחה, לא ניתן לדגל פוסט זה כרגע." notify_staff: 'התראה לצוות באופן פרטי' formatted_name: - off_topic: "מחוץ לנושא הפוסט" + off_topic: "אוף-טופיק" inappropriate: "לא ראוי" spam: "זהו ספאם" custom_placeholder_notify_user: "היה ממוקד, חיובי ואדיב תמיד." @@ -1738,7 +1740,7 @@ he: bookmarked: help: "יצרתם סימניה לנושא זה" locked: - help: "הנושא הזה נעול, הוא לא מקבל יותר תגובות חדשות" + help: "הנושא הזה סגור, הוא לא מקבל יותר תגובות חדשות" archived: help: "הנושא הזה אוכסן בארכיון; הוא הוקפא ולא ניתן לשנותו" locked_and_archived: @@ -1757,11 +1759,11 @@ he: posts: "פוסטים" posts_long: "יש {{number}} פוסטים בנושא הזה" posts_likes_MF: | - לנושא זה יש {count, plural, one {פרסום אחד} other {# פרסומים}} - נמוך {עם יחס גבוה של לייקים לפרסום} - בינוני {עם יחס גבוה מאוד של לייקים לפרסום} - גבוה {עם יחס גבוה בצורה יוצאת דופן של לייקים לפרסום} - אחר {}} + לנושא זה יש {count, plural, one {תגובה 1} other {# תגובות}} {ration, select, + low {עם יחס גבוה של לייקים לפוסט} + med {עם יחס גבוה מאוד של לייקים לפוסט} + high {עם יחס גבוה בצורה יוצאת דופן של לייקים לפוסט} + other {}} original_post: "פוסט מקורי" views: "צפיות" views_lowercase: @@ -1841,7 +1843,7 @@ he: help: "נושאים מדוברים בקטגוריה {{categoryName}}" top: title: "מובילים" - help: "הפוסטים הפעילים ביותר בשנה, חודש, שבוע או יום האחרונים" + help: "הנושאים הפעילים ביותר בשנה, חודש, שבוע או יום האחרונים" all: title: "תמיד" yearly: @@ -2066,7 +2068,7 @@ he: suspended: 'מושעים:' private_messages_short: "הודעות" private_messages_title: "הודעות" - mobile_title: "סלולר" + mobile_title: "נייד" space_free: "{{size}} חופשיים" uploads: "העלאות" backups: "גיבויים" @@ -2177,7 +2179,7 @@ he: custom: "מותאם" bulk_complete: "המשתמשים התווספו לקבוצה." bulk: "הוספה מרוכזת לקבוצה" - bulk_paste: "הדביקו רשימה של שמות משתמש או כתובות אימייל, אחת בכל שורה:" + bulk_paste: "הדביקו רשימה של שמות משתמשים או כתובות אימייל, אחת בכל שורה:" bulk_select: "(בחר קבוצה)" automatic: "אוטומטי" automatic_membership_email_domains: "משתמשים אשר נרשמים עם מארח דוא\"ל שתואם בדיוק לאחד מהרשימה, יוספו באופן אוטומטי לקבוצה זו:" @@ -2325,19 +2327,19 @@ he: title: "בטל את הפעולה הנוכחית" confirm: "אתם בטוחים שברצונכם לבטל את הפעולה הנוכחית?" backup: - label: "גבה" + label: "גבוי" title: "צור גיבוי" confirm: "האם תרצו להתחיל גיבוי חדש?" without_uploads: "כן (ללא הכללת קבצים)" download: - label: "הורד" + label: "הורדה" title: "הורד את הגיבוי" destroy: title: "הסר את הגיבוי" confirm: "אתם בטוחים שברצונכם להשמיד את הגיבוי הזה?" restore: is_disabled: "שחזור אינו מאופשר לפי הגדרות האתר." - label: "שחזר" + label: "שחזור" title: "שחזר את הגיבוי" confirm: "האם אתם בטוחים שאתם מעוניינים לשחזר את הגיבוי הזה?" rollback: @@ -2387,12 +2389,12 @@ he: new: "חדש" new_style: "סגנון חדש" import: "יבוא" - import_title: "בחר קובץ או הדביקו טקסט" + import_title: "בחרו קובץ או הדביקו טקסט" delete: "מחק" delete_confirm: "מחק את ההתאמה הזו?" about: "שינוי סגנונות CSS וכותרות HTML באתר. הוספת התאמות כדי להתחיל לערוך." color: "צבע" - opacity: "טשטוש" + opacity: "שקיפות" copy: "העתק" email_templates: title: "תבניות דואר אלקטרוני" @@ -2453,7 +2455,7 @@ he: preview_digest: "תצוגה מקדימה של סיכום" sending_test: "שולח דואר אלקטרוני לבדיקה..." error: "שגיאה - %{server_error}" - test_error: "הייתה בעיה בשליחת הדואר האלקטרוני. בבקשה בדוק את ההגדרות שלך ונסה שנית." + test_error: "הייתה בעיה בשליחת הדואר האלקטרוני. בבקשה בידקו את ההגדרות שלכם ונסו שנית." sent: "נשלח" skipped: "דולג" bounced: "הוחזר" @@ -2500,7 +2502,7 @@ he: none: "לא נמצאו לוגים." filters: title: "סינון" - user_placeholder: "username" + user_placeholder: "שם משתמש" address_placeholder: "name@example.com" type_placeholder: "סיכום, הרשמה..." reply_key_placeholder: "מפתח תגובה" @@ -2540,10 +2542,10 @@ he: deleted: "אין ערך חדש. הרשומה נמחקה." actions: delete_user: "מחק משתמש" - change_trust_level: "שנה רמת אמון" + change_trust_level: "שנוי רמת אמון" change_username: "שינוי שם משתמש/ת" - change_site_setting: "שנה הגדרות אתר" - change_site_customization: "שנה התאמת אתר" + change_site_setting: "שנוי הגדרות אתר" + change_site_customization: "שנוי התאמת אתר" delete_site_customization: "מחק התאמת אתר" change_site_text: "שינוי טקסט אתר" suspend_user: "השעה משתמש" @@ -2557,7 +2559,7 @@ he: anonymize_user: "הפיכת משתמש/ת לאנונימיים" roll_up: "גלגול למעלה של בלוקים של IP" change_category_settings: "שינוי הגדרות קטגוריה" - delete_category: "מחק קטגוריה" + delete_category: "מחיקת קטגוריה" create_category: "יצירת קטגוריה" block_user: "חסום משתמש" unblock_user: "בטל חסימת משתמש" @@ -2659,7 +2661,7 @@ he: unsuspend_failed: "משהו נכשל בביטול השהיית המשתמש הזה {{error}}" suspend_duration: "למשך כמה זמן יהיה המשתמש מושעה?" suspend_duration_units: "(ימים)" - suspend_reason_label: "מדוע אתה משעה? הטקסט הזה יהיה נראה לכולם בעמוד המשתמש הזה, ויוצג למשתמש כשינסה להתחבר. נסה לשמור עליו קצר." + suspend_reason_label: "מדוע אתם משעים? הטקסט הזה יהיה נראה לכולם בעמוד המשתמש הזה, ויוצג למשתמש כשינסה להתחבר. נסו לשמור עליו קצר." suspend_reason: "סיבה" suspended_by: "הושעה על ידי" delete_all_posts: "מחק את כל הפוסטים" @@ -2685,7 +2687,7 @@ he: grant_admin: 'הענק ניהול ראשי' revoke_moderation: 'שללו הנחיה' grant_moderation: 'העניקו הנחיה' - unblock: 'בטל חסימה' + unblock: 'ביטול חסימה' block: 'חסום' reputation: מוניטין permissions: הרשאות @@ -2710,7 +2712,7 @@ he: anonymize_yes: "כן, הפיכת חשבון זה לאנונימי" anonymize_failed: "התרחשה בעיה בהפיכת חשבון זה לאנונימי." delete: "מחק משתמש" - delete_forbidden_because_staff: "לא ניתן למחוק מנהלים ראשיים ומנהלים." + delete_forbidden_because_staff: "לא ניתן למחוק מנהלים ומנחים." delete_posts_forbidden_because_staff: "לא ניתן למחוק את כל הפרסומים של מנהלי מערכת ומפקחים." delete_forbidden: one: "לא ניתן למחוק משתמשים אם יש להם הודעות. מחקו את כל ההודעות לפני ניסיון מחיקה של משתמש. (הודעות ישנות יותר מיום אחד לא ניתן למחוק.)" @@ -2783,7 +2785,7 @@ he: will_be_demoted: "הורדה קרובה בדרגה." on_grace_period: "כרגע בתקופת חחסד של העלאה בדרכה, לא תתבצע הורדה בטבלה." locked_will_not_be_promoted: "רמת האמון נעולה. לא תתבצע העלאה בדרגה." - locked_will_not_be_demoted: "רמת האמןו נעולה. לא תתבצע הורדה בדרגה." + locked_will_not_be_demoted: "רמת האמון נעולה. לא תתבצע הורדה בדרגה." sso: title: "התחברות חד פעמית" external_id: "ID חיצוני" @@ -2843,7 +2845,7 @@ he: no_results: "לא נמצאו תוצאות." clear_filter: "נקה" add_url: "הוספת כתובת URL" - add_host: "הוסיפו מארח" + add_host: "הוספת שרת" categories: all_results: 'הכל' required: 'נדרש' @@ -2866,7 +2868,7 @@ he: backups: "גיבויים" login: "התחברות" plugins: "הרחבות" - user_preferences: "הגדרות משתמש" + user_preferences: "העדפות משתמש" tags: "תגיות" search: "חיפוש" badges: @@ -2896,12 +2898,12 @@ he: grant_badge: העניקו עיטור granted_badges: עיטורים שהוענקו grant: הענק - no_user_badges: "ל%{name} לא הוענקו תגים." + no_user_badges: "ל%{name} לא הוענקו עיטורים." no_badges: אין עיטורים שניתן להעניק. - none_selected: "בחרו תג כדי להתחיל" - allow_title: אפשר לתג להיות בשימוש ככותרת. + none_selected: "בחרו עיטור כדי להתחיל" + allow_title: אפשר לעיטור להיות בשימוש ככותרת. multiple_grant: יכולים להינתן מספר פעמים - listable: הצגת תגים בעמוד התגים הפומבי + listable: הצגת עיטורים בעמוד העיטורים הפומבי enabled: אפשרו עיטור icon: סמליל image: תמונה @@ -2909,7 +2911,7 @@ he: query: שאילתת עיטור (SQL) target_posts: פרסומי מטרות שאילתה auto_revoke: הפעלת שאילתת ביטול יומית - show_posts: הצגת הפוסט על הענקת התגים בעמוד התגים + show_posts: הצגת הפוסט על הענקת העיטורים בעמוד העיטורים trigger: הפעלה trigger_type: none: "רענון יומי" @@ -2921,12 +2923,12 @@ he: preview: link_text: "הצגה מקדימה של עיטורים שהוענקו" plan_text: "הצגה מקדימה עם query plan" - modal_title: "הצגה מקדימה של שאילתת תגים (Badge Query Preview)" + modal_title: "הצגה מקדימה של שאילתת עיטורים (Badge Query Preview)" sql_error_header: "התרחשה תקלה עם השאילתה" - error_help: "ראו את הקישורים הבאים לעזרה עם שאילתת תגים." + error_help: "ראו את הקישורים הבאים לעזרה עם שאילתת עיטורים." bad_count_warning: header: "זהירות!" - text: "חסרות דוגמאות הענקה חסרות. זה קורה כשחיפוש תגים מחזיר מזהה משתמש או מזהה פוסט שאינם קיימים. זה עלול לגרום לתוצאות לא צפויות מאוחר יותר - אנא בדקו שוב את מחרוזת החיפוש שלכם." + text: "חסרות דוגמאות הענקה. זה קורה כשחיפוש עיטורים מחזיר מזהה משתמש או מזהה פוסט שאינם קיימים. זה עלול לגרום לתוצאות לא צפויות מאוחר יותר - אנא בדקו שוב את מחרוזת החיפוש שלכם." no_grant_count: "אין עיטורים להקצאה." grant_count: one: "עיטור אחד להקצאה." @@ -2947,13 +2949,13 @@ he: embedding: get_started: "אם ברצונכם לשלב את דיסקורס באתר אחר, התחילו בהוספת השרת שלו." confirm_delete: "האם אתם בטוחים שאתם רוצים למחוק את הhost הזה? " - sample: "השתמש בקוד HTML הבא באתר שלך על מנת ליצור נושאי דיסקורס משולבים. החלף REPLACE_ME בURL הקאנוני של העמוד שבו אתה מכניס נושא מכונן. " + sample: "השתמש בקוד HTML הבא באתר שלך על מנת ליצור נושאי דיסקורס משולבים. החלף REPLACE_ME ב URL הקאנוני של העמוד שבו אתה מכניס נושא מכונן. " title: "שילוב (embedding)" - host: "מארחים הורשו" + host: "שרתים מורשים" path_whitelist: "רשימה לבנה של נתיבים" edit: "ערוך" category: "פרסם לקטגוריה" - add_host: "הוסיפו מארח" + add_host: "הוספת שרת" settings: "הגדרות הטמעה" feed_settings: "הגדרות פיד" feed_description: "לספק פיד RSS/ATOM לאתרך יכול לשפר את היכולת של דיסקורס ליבא את התוכן שלך." @@ -2972,16 +2974,35 @@ he: save: "שמור הגדרות הטמעה" permalink: title: "קישורים קבועים" - url: "כתובת" + url: "URL" topic_id: "מזהה נושא" topic_title: "נושא" post_id: "מזהה פוסט" post_title: "פוסט" category_id: "מזהה לקטגוריה" category_title: "קטגוריה" - external_url: "ID חיצוני" - delete_confirm: אתה בטוח שברצונך למחוק את הלינק הקבוע? + external_url: "URL חיצוני" + delete_confirm: אתם בטוחים שברצונכם למחוק את הלינק הקבוע? form: label: "חדש:" add: "הוסף" - filter: "חפש (כתובת או כתובת חיצונית)" + filter: "חפש (URL או URL חיצוני)" + wizard_js: + wizard: + done: "סיום" + back: "חזרה" + next: "הבא" + step: "%{current} מתוך %{total}" + upload: "העלאה" + uploading: "מעלה..." + quit: "אולי מאוחר יותר" + staff_count: + one: "לקהילה שלכם יש חבר צוות 1." + other: "לקהילה שלכם יש %{count} חברי צוות." + invites: + add_user: "הוספה" + none_added: "טרם הזמנתם חברי צוות. האם אתם בטוחים שאתם מעוניינים להמשיך?" + roles: + admin: "מנהלים" + moderator: "מנחה" + regular: "משתמשים רגילים" diff --git a/config/locales/client.it.yml b/config/locales/client.it.yml index d2584ad256..e7609471ff 100644 --- a/config/locales/client.it.yml +++ b/config/locales/client.it.yml @@ -464,6 +464,8 @@ it: suspended_notice: "Questo utente è sospeso fino al {{date}}." suspended_reason: "Motivo: " github_profile: "Github" + mailing_list_mode: + few_per_day: "Inviami una email per ogni nuovo messaggio (circa 2 al giorno)" tag_settings: "Etichette" watched_tags: "Osservate" tracked_tags: "Seguite" @@ -474,6 +476,8 @@ it: watched_categories_instructions: "Osserverai automaticamente tutti gli argomenti in queste categorie. Riceverai notifiche su tutti i nuovi messaggi e argomenti e, accanto all'argomento, apparirà il conteggio dei nuovi messaggi." tracked_categories: "Seguite" tracked_categories_instructions: "Seguirai automaticamente tutti gli argomenti appartenenti a queste categorie. Accanto all'argomento comparirà il conteggio dei nuovi messaggi." + watched_first_post_categories: "Osservando Primo Messaggio" + watched_first_post_tags: "Osservando Primo Messaggio" muted_categories: "Silenziate" muted_categories_instructions: "Non ti verrà notificato nulla sui nuovi argomenti in queste categorie, e non compariranno nell'elenco Ultimi." delete_account: "Cancella il mio account" @@ -486,7 +490,9 @@ it: muted_users: "Silenziati" muted_users_instructions: "Occulta tutte le notifiche da questi utenti." muted_topics_link: "Mostra argomenti silenziati" + watched_topics_link: "Mostra argomenti osservati" automatically_unpin_topics: "Spunta automaticamente gli argomenti quando arrivi in fondo." + revoke_access: "Revoca Accesso" api_permissions: "Permessi:" api_approved: "Approvato:" api_read: "lettura" @@ -656,7 +662,9 @@ it: rescind: "Rimuovi" rescinded: "Invito revocato" reinvite: "Rinvia Invito" + reinvite_all: "Re-invia tutti gli Inviti" reinvited: "Invito rinviato" + reinvited_all: "Tutti gli inviti re-inviati" time_read: "Ora di Lettura" days_visited: "Presenza (giorni)" account_age_days: "Età dell'utente in giorni" diff --git a/config/locales/client.pt_BR.yml b/config/locales/client.pt_BR.yml index 5048ecba07..eadb0ce518 100644 --- a/config/locales/client.pt_BR.yml +++ b/config/locales/client.pt_BR.yml @@ -399,6 +399,9 @@ pt_BR: latest_by: "recentes por" toggle_ordering: "alternar controle de ordenação" subcategories: "Subcategorias" + topic_sentence: + one: "1 tópico" + other: "%{count} tópicos" topic_stat_sentence: one: "%{count} novo tópico nos últimos %{unit}." other: "%{count} novos tópicos nos últimos %{unit}." diff --git a/config/locales/client.ro.yml b/config/locales/client.ro.yml index 9508994ec9..073aeb41e9 100644 --- a/config/locales/client.ro.yml +++ b/config/locales/client.ro.yml @@ -40,41 +40,41 @@ ro: long_date_with_year_without_time: "DD MMM 'YY" long_date_without_year_with_linebreak: "DD MMM
HH:mm" long_date_with_year_with_linebreak: "DD MMM 'YY
HH:mm" - wrap_ago: "%{date} zile în urmă" + wrap_ago: "%{date} (de) zile în urmă" tiny: half_a_minute: "< 1m" less_than_x_seconds: one: "< 1s" few: "< %{count}s" - other: "< %{count}s" + other: "< %{count} s" x_seconds: one: "1s" few: "%{count}s" - other: "%{count}s" + other: "%{count} s" x_minutes: one: "1m" few: "%{count}m" - other: "%{count}m" + other: "%{count} m" about_x_hours: one: "1h" few: "%{count}h" - other: "%{count}h" + other: "%{count} h" x_days: one: "1z" few: "%{count}z" - other: "%{count}z" + other: "%{count} z" about_x_years: one: "1a" - few: "%{count}a" - other: "%{count}a" + few: "%{count} a" + other: "%{count} a" over_x_years: one: "> 1a" - few: "> %{count}a" - other: "> %{count}a" + few: "> %{count} a" + other: "> %{count} a" almost_x_years: one: "1a" few: "%{count}a" - other: "%{count}a" + other: "%{count} de a" date_month: "DD MMMM" date_year: "MMM 'YY" medium: @@ -120,21 +120,21 @@ ro: previous_month: 'Luna anterioară' next_month: 'Luna următoare' share: - topic: 'distribuie această discuție' - post: 'distribuie postarea #%{postNumber}' - close: 'închide' - twitter: 'distribuie pe Twitter' - facebook: 'distribuie pe Facebook' - google+: 'distribuie pe Google+' - email: 'trimite această adresă pe email' + topic: 'Distribuie un link cu acest subiect' + post: 'Distribuie postarea #%{postNumber}' + close: 'Închide' + twitter: 'Distribuie pe Twitter' + facebook: 'Distribuie pe Facebook' + google+: 'Distribuie pe Google+' + email: 'Drimite pe email' action_codes: public_topic: "a făcut acest subiect public %{when}" private_topic: "a făcut acest subiect privat %{when}" split_topic: "desparte această discuție %{when}" - invited_user: "a invitat pe %{who} pe %{when}" - invited_group: "a invitat pe %{who} pe %{when}" - removed_user: "a scos pe %{who} pe %{when}" - removed_group: "scos pe %{who} pe %{when}" + invited_user: "a invitat pe %{who} %{when}" + invited_group: "a invitat pe %{who} %{when}" + removed_user: "a scos pe %{who} %{when}" + removed_group: "scos pe %{who} %{when}" autoclosed: enabled: 'închis %{when}' disabled: 'deschis %{when}' @@ -145,17 +145,18 @@ ro: enabled: 'arhivat %{when}' disabled: 'dezarhivat %{when}' pinned: - enabled: 'promovat %{when}' - disabled: 'nepromovat %{when}' + enabled: 'fixat %{when}' + disabled: 'ne-fixat %{when}' pinned_globally: - enabled: 'promovat global %{when}' - disabled: 'nepromovat %{when}' + enabled: 'fixat la nivel global %{when}' + disabled: 'ne-fixat %{when}' visible: - enabled: 'listat %{when}' - disabled: 'retras %{when}' - topic_admin_menu: "Opțiuni administrare discuție" + enabled: 'afișat %{when}' + disabled: 'ascuns %{when}' + topic_admin_menu: "Opțiuni administrare subiect" + wizard_required: "Acum a sosit momentul să configurați forumul! Porniți Setup Wizard!" emails_are_disabled: "Trimiterea de emailuri a fost dezactivată global de către un administrator. Nu vor fi trimise notificări email de nici un fel." - bootstrap_mode_enabled: "Pentru a ușura lansarea site-ul dvs., sunteți în modul bootstrap. Toți noii utilizatori vor primi nivelul 1 de încredere și avea activată primirea de email-uri cu rezumat zilnic. Această setare va fi dezactivată automat de îndată ce numărul total de utilizatori depășește %{min_users}." + bootstrap_mode_enabled: "Pentru a ușura lansarea site-ului tău ești în modul bootstrap. Toți noii utilizatori vor primi nivelul de încredere 1 și vor avea activată primirea zilnică a unui email-rezumat. Această setare va fi dezactivată automat de îndată ce numărul total de utilizatori depășește %{min_users}." bootstrap_mode_disabled: "Modul bootstrap va fi dezactivat în următoarele 24 de ore." s3: regions: @@ -172,7 +173,7 @@ ro: ap_northeast_2: "Asia Pacific (Seoul)" sa_east_1: "South America (Sao Paulo)" cn_north_1: "China (Beijing)" - edit: 'editează titlul și categoria acestui subiect' + edit: 'Editează titlul și categoria acestui subiect' not_implemented: "Această funcționalitate nu a fost implementată încă." no_value: "Nu" yes_value: "Da" @@ -186,22 +187,22 @@ ro: flags_title: "Semnalare" show_more: "Mai mult" show_help: "Opțiuni" - links: "Adrese" + links: "Adrese web" links_lowercase: - one: "adresă" - few: "adrese" - other: "adrese" - faq: "Întrebări" - guidelines: "Ajutor" + one: "link" + few: "link-uri" + other: "de link-uri" + faq: "Întrebări frecvente" + guidelines: "Indicații" privacy_policy: "Politică de confidențialitate" privacy: "Confidențialitate" terms_of_service: "Termenii serviciului" - mobile_view: "Ecran pentru mobil" - desktop_view: "Ecran pentru desktop" + mobile_view: "Vedere pentru mobil" + desktop_view: "Vedere pentru desktop" you: "Tu" or: "sau" - now: "Adineauri" - read_more: 'citește mai mult' + now: "Acum" + read_more: 'Citește mai mult' more: "Mai mult" less: "Mai puțin" never: "Niciodată" @@ -210,7 +211,7 @@ ro: daily: "Zilnic" weekly: "Săptămânal" every_two_weeks: "Odată la două săptamâni" - every_three_days: "la fiecare trei zile" + every_three_days: "La fiecare trei zile" max_of_count: "max din {{count}}" alternation: "sau" character_count: @@ -218,14 +219,14 @@ ro: few: "{{count}} caractere" other: "{{count}} de caractere" suggested_topics: - title: "Alte discuții" + title: "Subiecte sugerate" pm_title: "Mesaje sugerate" about: simple_title: "Despre" title: "Despre %{title}" stats: "Statisticile site-ului" - our_admins: "Administratorii" - our_moderators: "Moderatorii" + our_admins: "Administratori" + our_moderators: "Moderatori" stat: all_time: "Tot timpul" last_7_days: "Ultimele 7 zile" @@ -241,92 +242,92 @@ ro: title: "Semn de carte" clear_bookmarks: "Șterge semnele de carte" help: - bookmark: "Click pentru plasare semn de carte pe prima postare a acestei discuții" - unbookmark: "Click pentru ștergerea tuturor semnelor de carte din această discuție" + bookmark: "Click pentru a adăuga semn de carte la subiectul ăsta" + unbookmark: "Click pentru a șterge semnele de carte" bookmarks: - not_logged_in: "ne pare rău, trebuie să fii autentificat pentru a pune un semn de carte" + not_logged_in: "Ne pare rău, trebuie să fii autentificat pentru a pune un semn de carte" created: "Ai pus semn de carte pe acest mesaj" - not_bookmarked: "Ai citit deja aceast mesaj; fă clic să adaugi semn de carte" + not_bookmarked: "Ai citit deja acest mesaj; fă clic să adaugi semn de carte" last_read: "Acesta este ultimul mesaj citit de tine; fă click să adaugi semn de carte" - remove: "Semn de carte înlăturat" - confirm_clear: "Ești sigur că dorești să ştergi toate bookmark-urile din acest subiect?" + remove: "Șterge semn de carte" + confirm_clear: "Ești sigur că dorești să ștergi toate semnele de carte din acest subiect?" topic_count_latest: one: "{{count}} subiect nou sau actualizat." few: "{{count}} subiecte noi sau actualizate." - other: "{{count}} subiecte noi sau actualizate." + other: "{{count}} de subiecte noi sau actualizate." topic_count_unread: one: "Un subiect necitit." few: "{{count}} subiecte necitite." - other: "{{count}} de subiecte necitite." + other: "{{count}} (de) subiecte necitite." topic_count_new: one: "Un subiect nou." few: "{{count}} subiecte noi." other: "{{count}} de subiecte noi." click_to_show: "Click pentru vizualizare." - preview: "vizualizează" - cancel: "anulează" - save: "Salvează Schimbările" - saving: "Se Salvează..." + preview: "Previzualizează" + cancel: "Anulează" + save: "Salvează schimbările" + saving: "Se salvează..." saved: "Salvat!" upload: "Încarcă" - uploading: "Încărcare..." + uploading: "Se încarcă..." uploading_filename: "Se încarcă {{filename}}..." uploaded: "Încărcat!" enable: "Activează" disable: "Dezactivează" - undo: "Anulează acțiunea precedentă" - revert: "Refacere" + undo: "Anulează acțiunea" + revert: "Revenire la starea inițială" failed: "Eșuat" - switch_to_anon: "Intrați în Modul Anonim" - switch_from_anon: "Ieșiți din Modul Anonim" + switch_to_anon: "Intrați în Modul anonim" + switch_from_anon: "Ieșiți din Modul anonim" banner: close: "Ignoră acest banner." - edit: "Editează acest banner >>" + edit: "Editează acest banner." choose_topic: - none_found: "Nu au fost găsite discuții." + none_found: "Nu au fost găsite subiecte noi." title: - search: "Caută o discuție după nume, url sau id:" - placeholder: "Scrie aici titlul discuției" + search: "Căutați un subiect după nume, url sau id:" + placeholder: "Scrieți aici titlul subiectului" queue: - topic: "Discuție:" + topic: "Subiect:" approve: 'Aprobare' - reject: 'Respinge' + reject: 'Respingere' delete_user: 'Şterge utilizatorul' title: "Necesită aprobare" - none: "Nu sunt postări de revizuit." + none: "Nu sunt postări de verificat." edit: "Editează" cancel: "Anulează" - view_pending: "vezi postările în aşteptare" + view_pending: "Vezi postările în aşteptare" has_pending_posts: - one: "Această discuție are 1 postare în așteptare" - few: "Această discuţie are {{count}} postări în aşteptare." - other: "Această discuţie are {{count}} de postări în aşteptare." - confirm: "Salvează Schimbările" - delete_prompt: "Ești sigur că vrei să ștergi utilizatorul %{username}? Vor fi șterse toate postările iar email-ul și IP-ul vor fi blocate." + one: "Acest subiect are o postare în așteptare" + few: "Acest subiect are {{count}} postări în așteptare." + other: "Acest subiect are {{count}} de postări în așteptare." + confirm: "Salvează schimbările" + delete_prompt: "Ești sigur că vrei să ștergi utilizatorul %{username}? Vor fi șterse toate postările lui iar email-ul și IP-ul vor fi blocate." approval: title: "Necesită aprobare" - description: "Am primit nouă postare dar trebuie să fie aprobată de un moderator înainte că ea să apară pe site. Va rugăm să aveţi răbdare." + description: "Am primit noua postare dar trebuie să fie aprobată de un moderator înainte că ea să apară pe site. Te rugăm să ai răbdare." pending_posts: one: "Aveţi 1 postare în aşteptare." few: "Aveţi {{count}} postări în aşteptare." - other: "Aveţi {{count}} de postări în aşteptare." + other: "Aveţi {{count}} (de) postări în așteptare." ok: "OK" user_action: user_posted_topic: "{{user}} a postat discuția" - you_posted_topic: "Dvs. aţi postat discuția" + you_posted_topic: "ai postat subiectul" user_replied_to_post: "{{user}}a răspuns la{{post_number}}" - you_replied_to_post: "You a răspuns la {{post_number}}" - user_replied_to_topic: "{{user}} a răspuns la discuție" - you_replied_to_topic: "You a răspuns la discuție" - user_mentioned_user: "{{user}} a menționat {{another_user}}" - user_mentioned_you: "{{user}} a menționat you" - you_mentioned_user: "You a menționat {{another_user}}" - posted_by_user: "Postat de către {{user}}" - posted_by_you: "Postat de către tine" - sent_by_user: "Trimis de către {{user}}" - sent_by_you: "Trimis de către tine" + you_replied_to_post: "Tu ai răspuns la {{post_number}}" + user_replied_to_topic: "{{user}} a răspuns la subiect" + you_replied_to_topic: "Tu ai răspuns la subiect" + user_mentioned_user: "{{user}} a menționat pe {{another_user}}" + user_mentioned_you: "{{user}} te-a menționat pe tine" + you_mentioned_user: "Tu ai menționat pe {{another_user}}" + posted_by_user: "Postat de {{user}}" + posted_by_you: "Postat de tine" + sent_by_user: "Trimis de {{user}}" + sent_by_you: "Trimis de tine" directory: - filter_name: "filtrează după utilizator" + filter_name: "Filtrează după nume utilizator" title: "Utilizatori" likes_given: "Oferite" likes_received: "Primite" @@ -337,15 +338,15 @@ ro: topic_count_long: "Subiecte create" post_count: "Răspunsuri" post_count_long: "Răspunsuri postate" - no_results: "Fără rezultat." + no_results: "Nu s-au găsit rezultate." days_visited: "Vizite" days_visited_long: "Zile de vizită" posts_read: "Citite" - posts_read_long: "Posturi citite" + posts_read_long: "Postări citite" total_rows: one: "1 utilizator" few: "%{count} utilizatori" - other: "%{count} utilizatori" + other: "%{count} de utilizatori" groups: empty: posts: "Nu există nici o postare a membrilor acestui grup." @@ -355,108 +356,108 @@ ro: topics: "Nu exista nici un subiect postat de membrii acestui grup." add: "Adaugă" selector_placeholder: "Adaugă membri" - owner: "proprietar" + owner: "Proprietar" visible: "Grupul este vizibil tuturor utilizatorilor" index: "Grupuri" title: - one: "grup" - few: "grupuri" - other: "grupuri" + one: "Grup" + few: "Grupuri" + other: "de grupuri" members: "Membri" - topics: "Discuții" + topics: "Subiecte" posts: "Postări" mentions: "Mențiuni" messages: "Mesaje" alias_levels: title: "Cine poate trimite mesaje către acest grup sau să îl @menționeze?" nobody: "Nimeni" - only_admins: "Doar Adminii" + only_admins: "Doar adminii" mods_and_admins: "Doar moderatorii și adminii" - members_mods_and_admins: "Doar membri grupului, moderatorii și adminii" + members_mods_and_admins: "Membrii grupului, moderatorii și adminii" everyone: "Toată lumea" trust_levels: title: "Nivel de încredere acordat automat membrilor atunci când sunt adăugați:" - none: "Nimic" + none: "Nimeni" notifications: watching: - title: "Urmărit" + title: "Urmărind activ" description: "Veți fi notificat pentru fiecare nouă postare în fiecare mesaj, și va fi afișat un contor al noilor răspunsuri." watching_first_post: - title: "Urmărind Prima Postare" - description: "Veți fi notificat doar cu pentru prima postare din fiecare nou subiect al acestui grup." + title: "Urmărind activ prima postare" + description: "Vei fi notificat doar pentru prima postare din fiecare nou subiect al acestui grup." tracking: - title: "Urmărit" - description: "Veți fi notificat dacă cineva menționează @numele dvs. sau vă răspunde, și va fi afișat un contor al noilor răspunsuri." + title: "Urmărind" + description: "Vei fi notificat dacă cineva menționează @numele tău sau îți răspunde și va fi afișat un contor al noilor răspunsuri." regular: title: "Normal" - description: "Vei fi notificat dacă cineva îți menționează @numele sau îți va scrie un reply." + description: "Vei fi notificat dacă cineva îți menționează @numele sau îți va răspunde." muted: - title: "Mut" - description: "Nu veți fi niciodată notificat despre nimic legat de noile subiecte din acest grup." + title: "Setat pe silențios" + description: "Nu vei fi niciodată notificat despre nimic legat de noile subiecte din acest grup." user_action_groups: - '1': "Aprecieri Date" - '2': "Aprecieri Primite" + '1': "Aprecieri date" + '2': "Aprecieri primite" '3': "Semne de carte" - '4': "Discuții" + '4': "Subiecte" '5': "Răspunsuri" '6': "Răspunsuri" '7': "Mențiuni" '9': "Citate" '11': "Editări" - '12': "Obiecte Trimise" + '12': "Elemente trimise" '13': "Primite" '14': "În așteptare" categories: - all: "toate categoriile" - all_subcategories: "toate" - no_subcategory: "niciuna" + all: "Toate categoriile" + all_subcategories: "Toate" + no_subcategory: "Niciuna" category: "Categorie" category_list: "Afișează lista de categorii" reorder: - title: "Rearanjeaza Categoriile" + title: "Rearanjează categoriile" title_long: "Rearanjeaza lista de categorii" - fix_order: "Pozitii fixe" - fix_order_tooltip: "Nu toate categoriile au un numar de pozitie unic, asta poate cauze rezultate neasteptate." - save: "Salveaza ordinea" - apply_all: "Aplica" - position: "Pozitie" + fix_order: "Fixează poziții" + fix_order_tooltip: "Nu toate categoriile au un numar de poziție unic, asta poate cauza rezultate neașteptate." + save: "Salvează ordinea" + apply_all: "Aplică" + position: "Poziție" posts: "Postări" - topics: "Discuții" - latest: "Ultimele" - latest_by: "recente dupa" - toggle_ordering: "Control comandă comutare" - subcategories: "Subcategorie" + topics: "Subiecte" + latest: "Cele mai recente" + latest_by: "Cele mai recente după" + toggle_ordering: "Comută criteriu de aranjare" + subcategories: "Subcategorii" topic_sentence: - one: "un subiect" + one: "Un subiect" few: "%{count} subiecte" - other: "%{count} subiecte" + other: "%{count} de subiecte" topic_stat_sentence: - one: "%{count} subiect în %{unit}." + one: "%{count} subiect nou în %{unit}." few: "%{count} subiecte noi în %{unit}." - other: "%{count} subiecte noi în %{unit}." + other: "%{count} de subiecte noi în %{unit}." ip_lookup: title: Căutare adresă IP hostname: Nume gazdă location: Locație - location_not_found: (necunoscut) + location_not_found: (necunoscută) organisation: Organizație phone: Telefon other_accounts: "Alte conturi cu această adresă IP" delete_other_accounts: "Șterge %{count}" - username: "nume de utilizator" - trust_level: "TL" - read_time: "Timp de citire" - topics_entered: "Discuții la care particip" - post_count: "# postari" + username: "Nume de utilizator" + trust_level: "NÎ" + read_time: "Durată vizită pe site" + topics_entered: "Subiecte la care particip" + post_count: "# postări" confirm_delete_other_accounts: "Ești sigur că vrei să ștergi aceste conturi?" user_fields: - none: "(selecteaza o optiune)" + none: "(alege o opțiune)" user: - said: "{{username}} a spus:" + said: "{{username}}:" profile: "Profil" - mute: "Anulează" - edit: "Editează Preferințe" - download_archive: "descarcă arhiva postărilor mele" + mute: "Silențios" + edit: "Editează preferințe" + download_archive: "Descarcă arhiva postărilor mele" new_private_message: "Mesaj nou" private_message: "Mesaj" private_messages: "Mesaje" @@ -466,257 +467,296 @@ ro: bookmarks: "Semne de carte" bio: "Despre mine" invited_by: "Invitat de" - trust_level: "Nivel de Încredere" + trust_level: "Nivel de încredere" notifications: "Notificări" statistics: "Statistici" desktop_notifications: - label: "Notificari desktop" - not_supported: "Notificarile nu sunt suportate in acest browser." - perm_default: "Activeaza notificarile" - perm_denied_btn: "Nu se permite accesul" - perm_denied_expl: "Ați ridicat permisiunea pentru notificări. Permiteți notificările prin setările browser-ului." - disable: "Dezactiveaza notificarile" - enable: "Activeaza Notificarile" - each_browser_note: "Notati: Setarile vor fi modificate pe orice alt browser." - dismiss_notifications: "Anulează Tot" - dismiss_notifications_tooltip: "Marchează cu citit toate notificările necitite" + label: "Notificări desktop" + not_supported: "Acest browser nu suportă notificări. Ne pare rău." + perm_default: "Activează notificări" + perm_denied_btn: "Notificări blocate" + perm_denied_expl: "Ai blocat notificările. Activează notificările din setările browser-ului." + disable: "Dezactivează notificări" + enable: "Activează notificările" + each_browser_note: "Observație: Setările trebuie modificate pe fiecare browser utilizat." + dismiss_notifications: "Elimină tot" + dismiss_notifications_tooltip: "Marchează toate notificările ca citite" disable_jump_reply: "Nu sări la postarea mea după ce răspund" - dynamic_favicon: "Arată subiectele noi/actualizate în iconiţă browserului." + dynamic_favicon: "Arată subiectele noi/actualizate în pictograma browserului." external_links_in_new_tab: "Deschide toate adresele externe într-un tab nou" - enable_quoting: "Activează răspunsuri-citat pentru textul selectat" - change: "schimbă" + enable_quoting: "Activează citarea răspunsurilor pentru textul selectat" + change: "Schimbă" moderator: "{{user}} este moderator" admin: "{{user}} este admin" moderator_tooltip: "Acest utilizator este moderator" admin_tooltip: "Acest utilizator este admin" blocked_tooltip: "Acest utilizator este blocat." - suspended_notice: "Acest user este suspendat păna la {{date}}." + suspended_notice: "Acest utilizator este suspendat până la {{date}}." suspended_reason: "Motiv: " github_profile: "Github" email_activity_summary: "Sumarul activității" mailing_list_mode: - label: " " + label: " Mod mailing list" enabled: "Activați modul mailing list" + instructions: | + " Această setare nu ține cont de setarea de la sumarul activităților.
+ Subiectele setate pe silențios și categoriile nu sunt incluse în aceste emailuri." daily: "Trimite actualizări zilnice" individual: "Trimite un email pentru fiecare postare nouă" + many_per_day: "Trimite câte un email pentru pentru fiecare nouă postare (aproximativ {{dailyEmailEstimate}} pe zi)" + few_per_day: "Trimite câte un email pentru fiecare nouă postare (aproximativ 2 pe zi)" tag_settings: "Etichete" - watched_tags: "Văzut" - tracked_tags: "Urmărit" - watched_categories: "Văzut" - tracked_categories: "Tracked" - muted_categories: "Muted" + watched_tags: "Urmărite activ" + watched_tags_instructions: "Vei vedea automat toate subiectele cu aceste etichete. Vei fi notificat pentru fiecare nouă postare și subiect. De asemenea, un contor al noilor postări va apărea lângă subiect." + tracked_tags: "Urmărite" + tracked_tags_instructions: "Vei urmări automat toate subiectele cu aceste etichete. De asemenea, un contor al noilor postări va apărea lângă subiect." + muted_tags: "Setate pe silențios" + muted_tags_instructions: "Nu vei fi notificat despre nimic legat de noile subiecte cu aceste etichete, și subiectele respective nu vor apărea în lista cu ultimele subiecte." + watched_categories: "Urmărite activ" + watched_categories_instructions: "Vei vizualiza automat toate subiectele din aceste categorii. Vei fi notificat cu privire la toate noile postări și subiecte. De asemenea, un contor al noilor postări va apărea lângă subiect." + tracked_categories: "Urmărite" + tracked_categories_instructions: "Vei urmări automat toate subiectele din aceste categorii. Un contor al noilor postări va apărea lângă subiect." + watched_first_post_categories: "Urmărire activă prima postare" + watched_first_post_categories_instructions: "Vei fi notificat cu privire la prima postare din fiecare nou subiect din aceste categorii. " + watched_first_post_tags: "Urmărire activă prima postare" + watched_first_post_tags_instructions: "Vei fi notificat cu privire la prima postare din fiecare nou subiect cu aceste etichete." + muted_categories: "Setat pe silențios" + muted_categories_instructions: "Nu vei fi notificat despre nimic legat de noile subiecte din aceste categorii și subiectele respective nu vor apărea în lista cu cele mai recente subiecte." delete_account: "Șterge-mi contul" - delete_account_confirm: "Ești sigur că vrei sa ștergi contul? Această acțiune nu este reversibilă!" + delete_account_confirm: "Ești sigur că vrei să ștergi contul? Această acțiune este ireversibilă!" deleted_yourself: "Contul tău a fost șters cu succes." - delete_yourself_not_allowed: "Nu iți poți sterge contul deocamdată. Contactează administratorul pentru ștergerea contului." + delete_yourself_not_allowed: "Momentan nu îți poți șterge contul. Contactează un admin pentru a o face." unread_message_count: "Mesaje" admin_delete: "Șterge" users: "Utilizatori" muted_users: "Silențios" - muted_users_instructions: "Suprimă toate notificările de la aceşti utilizatori" - muted_topics_link: "Arata topicurile dezactivate." - apps: "Applicații" - revoke_access: "Revocați Accesul" - undo_revoke_access: "Anulați Revocarea Accesului" + muted_users_instructions: "Oprește toate notificările de la aceşti utilizatori." + muted_topics_link: "Arată subiectele dezactivate" + watched_topics_link: "Arată subiectele urmărite activ" + automatically_unpin_topics: "Detașare automată a subiectelor când ajung la sfârșitul paginii." + apps: "Aplicații" + revoke_access: "Revocă accesul" + undo_revoke_access: "Anulează revocarea accesului" api_permissions: "Permisiuni:" api_approved: "Aprobate:" api_read: "citire" api_read_write: "citire și scriere" staff_counters: - flags_given: "Semnale ajutătoare" - flagged_posts: "postări semnalate" - deleted_posts: "postări șterse" - suspensions: "suspendări" - warnings_received: "avertizări" + flags_given: "Marcaje ajutătoare" + flagged_posts: "Postări marcate" + deleted_posts: "Postări șterse" + suspensions: "Suspendări" + warnings_received: "Avertizări" messages: all: "Toate" - inbox: "Inbox" + inbox: "Primite" sent: "Trimise" - archive: "Arhivează" - groups: "Grupurile Mele" + archive: "Arhivă" + groups: "Grupurile mele" bulk_select: "Selectează mesaje" - move_to_inbox: "Mută în Inbox" + move_to_inbox: "Mută în „Primite”" move_to_archive: "Arhivează" + failed_to_move: "Mutarea mesajelor selectate a eșuat (poate că v-a căzut rețeaua)" select_all: "Selectează tot" change_password: success: "(email trimis)" in_progress: "(se trimite email)" error: "(eroare)" action: "Trimite email pentru resetare parolă" - set_password: "Introduceți parolă" + set_password: "Introdu parolă" change_about: - title: "Schimbă la Profil" + title: "Schimbare date personale" + error: "A apărut o eroare la schimbarea acestei valori." change_username: title: "Schimbă numele utilizatorului" + confirm: "Dacă îți schimbi numele de utilizator, toate citările anterioare ale posturilor tale și toate mențiunile @numelui se vor pierde. Ești absolut sigur că vrei asta?" taken: "Acest nume de utilizator este deja folosit." - error: "S-a intâmpinat o eroare pe parcursul schimbării numelui de utilizator." - invalid: "Acest nume de utilizator este invalid. Trebuie să includă doar cifre și litere." + error: "A apărut o eroare la schimbarea numelui de utilizator." + invalid: "Acest nume de utilizator este nevalid. Trebuie să includă doar cifre și litere." change_email: - title: "Schimbă Email" - taken: "Acest email nu este disponibil." - error: "A apărut o eroare la schimbarea de email. Poate această adresă este deja in folosința?" + title: "Schimbă email" + taken: "Această adresă există deja în baza de date." + error: "A apărut o eroare la schimbarea de email. Poate această adresă este deja utilizată?" success: "Am trimis un email către adresa respectivă. Urmează instrucțiunile de confirmare." change_avatar: - title: "Schimbă poză profilului personal" + title: "Schimbă poza de profil" gravatar: "Gravatar, bazat pe" - gravatar_title: "Schimbă avatarul de pe site-ul Gravatar." + gravatar_title: "Schimbă-ți avatarul de pe site-ul Gravatar." refresh_gravatar_title: "Reactualizează Gravatarul" letter_based: "Poză de profil atribuită de sistem." uploaded_avatar: "Poză preferată" uploaded_avatar_empty: "Adaugă poza preferată" - upload_title: "Încarcă poza personală" + upload_title: "Încarcă poza preferată" upload_picture: "Încarcă poza" - image_is_not_a_square: "Atenţie: poză este decupată, dar înălţimea şi lăţimea nu sunt egale." - cache_notice: "Fotografia de profil a fost schimbata, dar poate dura ceva timp pana sa apara datorita caching-ului din browser." + image_is_not_a_square: "Atenţie: poza este decupată, înălțimea și lățimea nu erau egale." + cache_notice: "Poza de profil a fost schimbată cu succes, dar poate dura ceva timp până să fie afișată din cauza caching-ului din browser." change_profile_background: - title: "Datele Profilului" + title: "Fundal pentru pagina de profil" instructions: "Fundalul profilului va fi centrat şi va avea o dimensiune standard de 850px." change_card_background: - title: "Fundal" + title: "Fundal pentru pagina cu date personale" instructions: "Fundalul va fi centrat şi va avea o dimensiune standard de 590px." email: title: "Email" instructions: "Emailul nu va fi făcut public." ok: "Îți vom trimite un email pentru confirmare." - invalid: "introduceți o adresă validă pentru confirmare." + invalid: "Introduceți o adresă de email validă." authenticated: "Emailul a fost autentificat de către {{provider}}." + frequency_immediately: "Vom trimite imediat un email dacă nu ai citit deja despre ce este vorba. " + frequency: + one: "Vom trimite un email doar dacă nu te-am văzut în ultimul minut." + few: "Vom trimite un email doar dacă nu te-am văzut în ultimele {{count}} minute." + other: "Vom trimite un email doar dacă nu te-am văzut în ultimele {{count}} de minute." name: title: "Nume" - instructions: "Versiunea lungă a numelui." - instructions_required: "Numele dvs. complet" + instructions: "Nume complet (opțional)" + instructions_required: "Numele tău complet" too_short: "Numele este prea scurt." - ok: "Numele dvs arată bine." + ok: "Numele tău este OK." username: - title: "Nume Utilizator" - instructions: "Numele de utilizator trebuie sa fie unic, fără spații, scurt." + title: "Nume utilizator" + instructions: "Unic, fără spații, scurt." short_instructions: "Ceilalți te pot menționa ca @{{username}}." - available: "Numele de utilizator este valabil." + available: "Numele de utilizator este disponibil." global_match: "Emailul se potrivește numelui de utilizator înregistrat." - global_mismatch: "Deja înregistrat. Încearcă:{{suggestion}}?" - not_available: "Nu este valabil. Încearcă:{{suggestion}}?" + global_mismatch: "Numele este deja înregistrat. Încerci {{suggestion}}?" + not_available: "Nu este disponibil. Încerci {{suggestion}}?" too_short: "Numele de utilizator este prea scurt." too_long: "Numele de utilizator este prea lung." - checking: "Verifică valabilitatea numelui de utilizator..." - enter_email: 'Nume de utilizator găsit. Introduceți emailul potrivit.' + checking: "Verifică disponibilitatea numelui de utilizator..." + enter_email: 'Nume de utilizator găsit. Introduceți adresa de email corespunzătoare.' prefilled: "Emailul se potrivește cu numele de utilizator înregistrat." locale: title: "Limba interfeței" - instructions: "Limba este folosită de interfața forumului. Schimbarea se va produce odată ce reîmprospatați pagina." - default: "(din oficiu)" + instructions: "Limba pentru interfața forumului. Schimbarea se va produce odată ce reîmprospătați pagina." + default: "(implicit)" password_confirmation: title: "Confirmă parola" last_posted: "Ultima postare" - last_emailed: "Ultimul email dat" - last_seen: "Văzut" - created: "Participare" + last_emailed: "Ultimul email" + last_seen: "Văzut acum" + created: "Înscris" log_out: "Ieșire" location: "Locație" card_badge: - title: "Insignă utilizator" + title: "Ecuson utilizator" website: "Website" email_settings: "Email" like_notification_frequency: - title: "Notificați atunci când i se dă like" + title: "Notificare atunci când se primește apreciere" always: "Întotdeauna" + first_time_and_daily: "Prima dată când o postare este apreciată și zilnic" + first_time: "Prima dată când o postare este apreciată" never: "Niciodată" email_previous_replies: + title: "Include răspunsurile precedente la sfârșitul emailurilor" + unless_emailed: "dacă nu a fost trimis anterior" always: "întotdeauna" never: "niciodată" email_digests: + title: "Când nu vin aici în vizită, trimite-mi un email cu rezumatul subiectelor și răspunsurilor populare" every_30_minutes: "La fiecare 30 de minute " - every_hour: "în fiecare oră" - daily: "zilnic" - every_three_days: "la fiecare trei zile" - weekly: "săptămânal" - every_two_weeks: "la fiecare două săptămâni" - email_direct: "Trimite un email când cineva mă citează, îmi răspunde la un post, menţionează @username meu, sau mă invită la o discuţie." - email_private_messages: "Trimite-mi un emai când cineva îmi răspunde." - email_always: "Trimite-mi notificarile de email atunci cand sunt activ pe site." + every_hour: "În fiecare oră" + daily: "Zilnic" + every_three_days: "La fiecare trei zile" + weekly: "Săptămânal" + every_two_weeks: "La fiecare două săptămâni" + include_tl0_in_digests: "Include conținut de la utilizatori noi în rezumatul de pe email." + email_in_reply_to: "Include un fragment din răspunsurile la postare în emailuri" + email_direct: "Trimite un email când cineva mă citează, îmi răspunde la o postare, menționează numele meu de utilizator, sau mă invită la un subiect." + email_private_messages: "Trimite-mi un email când cineva îmi trimite un mesaj." + email_always: "Trimite-mi notificările pe email atunci când sunt activ pe site." other_settings: "Altele" categories_settings: "Categorii" new_topic_duration: - label: "Consideră discuțiile ca fiind noi" - not_viewed: "Nu le-am văzut încă " - last_here: "Create de la ultima vizită " - after_1_day: "creat azi" - after_2_days: "creat in ultimele 2 zile" - after_1_week: "creat in ultima saptamana" - after_2_weeks: "creat in ultimele 2 saptamni" + label: "Consideră subiectele ca fiind noi dacă" + not_viewed: "nu le-am văzut încă " + last_here: "au fost create de la ultima vizită " + after_1_day: "au fostcreate în ultima zi" + after_2_days: "au fost create în ultimele 2 zile" + after_1_week: "au fost create în ultima săptămână" + after_2_weeks: "au fost create în ultimele 2 săptămâni" auto_track_topics: "Urmăreşte automat discuţiile pe care le vizitez " auto_track_options: never: "niciodată" immediately: "imediat" - after_30_seconds: "dupa 30 de secunde" - after_1_minute: "dupa 1 minut" - after_2_minutes: "dupa 2 minute" - after_3_minutes: "dupa 3 minute" - after_4_minutes: "dupa 4 minute" - after_5_minutes: "dupa 5 minute" - after_10_minutes: "dupa 10 minute" + after_30_seconds: "după 30 de secunde" + after_1_minute: "după 1 minut" + after_2_minutes: "după 2 minute" + after_3_minutes: "după 3 minute" + after_4_minutes: "după 4 minute" + after_5_minutes: "după 5 minute" + after_10_minutes: "după 10 minute" invited: search: "Scrie pentru a căuta invitații..." title: "Invitații" - user: "Utilizatori invitați" - sent: "Trimis" + user: "Utilizator invitat" + sent: "Trimis(e)" none: "Nu sunt invitații în așteptare." truncated: - one: "Se arată prima invitație." - few: "Se arată primele {{count}} invitații." - other: "Se arată primele {{count}} de invitații." - redeemed: "Invitații rascumpărate" - redeemed_at: "Răscumpărate" - pending: "Invitații in așteptare" - pending_tab: "In asteptare" - pending_tab_with_count: "In asteptare ({{count}})" + one: "Se afișează prima invitație." + few: "Se afișează primele {{count}} invitații." + other: "Se afișează primele {{count}} de invitații." + redeemed: "Invitații acceptate" + redeemed_tab: "Acceptate" + redeemed_tab_with_count: "({{count}}) Acceptate" + redeemed_at: "Acceptate" + pending: "Invitații în așteptare" + pending_tab: "În așteptare" + pending_tab_with_count: "În așteptare: ({{count}})" topics_entered: "Subiecte văzute" - posts_read_count: "Posturi citite" + posts_read_count: "Postări citite" expired: "Această invitație a expirat." - rescind: "Anulează" - rescinded: "Invitație anulată" - reinvite: "Retrimite Invitaţia" + rescind: "Elimină" + rescinded: "Invitație eliminată" + reinvite: "Retrimite invitaţia" + reinvite_all: "Retrimite toate invitațiile" reinvited: "Invitaţia a fost retrimisă" - time_read: "Timp de citit" + reinvited_all: "Toate invitațiile retrimise!" + time_read: "Timp de citire" days_visited: "Zile de vizită" account_age_days: "Vârsta contului în zile" create: "Trimite o invitație" + generate_link: "Copiază link-ul de invitație" + generated_link_message: '

Link-ul de invitație a fost generat cu succes!

Linkul de invitație e valabil doar pentru această adresă de email: %{invitedEmail}

' bulk_invite: - none: "Nu ai invitat încă pe nimeni. Poți trimite invitații individuale sau mai multor oameni deodată prin incărcarea fișierului de invitație multiplă." - text: "Invitație multiplă din fișierul" - uploading: "Incarcă" - success: "Fişier încărcat cu succes, veţi fi înştiinţat printr-un mesaj când procesarea va fi completă." + none: "Nu ai invitat încă pe nimeni. Poți trimite invitații individuale sau mai multor oameni deodată prin încărcarea fișierului de invitații multiple." + text: "Invitație multiplă din fișier" + uploading: "Se încarcă..." + success: "Fișier încărcat cu succes, vei fi înștiințat printr-un mesaj când procesarea este completă." error: "A apărut o eroare la încărcarea fișierului '{{filename}}': {{message}}" password: title: "Parolă" too_short: "Parola este prea scurtă." common: "Această parolă este prea comună." - same_as_username: "Parolă este identică cu numele de utilizator" - same_as_email: "Parolă este identică cu adresa de email" - ok: "Parola dumneavoastră arată bine." - instructions: "Trebuiesc minim %{count} de caractere." + same_as_username: "Parolă identică cu numele de utilizator" + same_as_email: "Parolă identică cu adresa de email" + ok: "Parola dumneavoastră este OK." + instructions: "Trebuie minim %{count} (de) caractere." summary: title: "Sumar" stats: "Statistici" - time_read: "timp de citit" + time_read: "Timp petrecut pe site" topic_count: - one: "subiect creat" + one: "un subiect creat" few: "subiecte create" other: "de subiecte create" post_count: - one: "postare creată" + one: "o postare creată" few: "postări create" other: "de postări create" likes_given: - one: " dat" + one: " dată" few: " date" other: "de date" likes_received: - one: " primit" + one: " primită" few: " primite" other: "de primite" days_visited: - one: "zi vizitată" - few: "vizite zilnice" - other: "de zile vizitate" + one: "vizită" + few: "vizite" + other: "de vizite" posts_read: one: "postare citită" few: "postări citite" @@ -728,25 +768,26 @@ ro: top_replies: "Top răspunsuri" no_replies: "Nici un răspuns încă." more_replies: "Mai multe răspunsuri" - top_topics: "Top discuții" - no_topics: "Nici o discuție încă." - more_topics: "Mai multe discuții" - top_badges: "Top insigne" - no_badges: "Nici o insignă încă" - more_badges: "Mai multe insigne" + top_topics: "Top subiecte" + no_topics: "Nici un subiect." + more_topics: "Mai multe subiecte" + top_badges: "Top ecusoane" + no_badges: "Nu există încă ecusoane" + more_badges: "Mai multe ecusoane" top_links: "Top link-uri" no_links: "Nici un link încă." most_liked_by: "Cele mai apreciate de către" most_liked_users: "Cele mai apreciate" - most_replied_to_users: "Cele mai răspune pentru" + most_replied_to_users: "Cele mai multe răspunsuri pentru" + no_likes: "Nicio apreciere încă." associated_accounts: "Conectări" ip_address: - title: "Ultima adresă de IP" + title: "Ultima adresă IP" registration_ip_address: - title: "Înregistrarea adresei de IP" + title: "Înregistrare adresă IP" avatar: title: "Poză de profil" - header_title: "profil, mesaje, favorite si preferințe" + header_title: "profil, mesaje, semne de carte și preferințe" title: title: "Titlu" filters: @@ -755,134 +796,163 @@ ro: posted_by: "Postat de" sent_by: "Trimis de" private_message: "mesaj" - the_topic: "Subiectul" - loading: "Încarcă..." + the_topic: "subiectul" + loading: "Se încarcă..." errors: - prev_page: "în timp ce încarcă" + prev_page: "în timp ce se încarcă" reasons: network: "Eroare de rețea" - server: "Eroare de server: {{code}}" - forbidden: "Acces nepermis" + server: "Eroare de server" + forbidden: "Acces refuzat" unknown: "Eroare" not_found: "Pagina nu a fost găsită" desc: network: "Te rugăm să verifici conexiunea." - network_fixed: "Se pare ca și-a revenit." - server: "Ceva nu a funcționat." + network_fixed: "Se pare că și-a revenit." + server: "Cod de eroare: {{status}}" forbidden: "Nu ești autorizat să vezi această pagină." not_found: "Oops, aplicația încearcă să încarce un URL care nu există." unknown: "Ceva nu a funcționat." buttons: back: "Înapoi" again: "Încearcă din nou" - fixed: "Încarcare pagină" + fixed: "Încărcare pagină" close: "Închide" assets_changed_confirm: "Acest site tocmai a fost actualizat. Reîmprospătați pentru cea mai nouă versiune?" logout: "Aţi fost deconectat." refresh: "Reîmprospătează" read_only_mode: - login_disabled: "Autentificarea este dezactivată când siteul este în modul doar pentru citit." + enabled: "Acest site se află în modul exclusiv-citire. Te rugăm să continui să răsfoiești, însă sunt dezactivate acțiunile de răspuns, apreciere și altele. " + login_disabled: "Autentificarea este dezactivată când siteul este în modul exclusiv-citire." + logout_disabled: "Deautentificarea este dezactivată cât timp site-ul este în modul exclusiv-citire." + too_few_topics_and_posts_notice: "Haideți să pornim această discuție! Momentan sunt %{currentTopics} / %{requiredTopics} subiecte și %{currentPosts} / %{requiredPosts} postări. Vizitatorii au nevoie de niște conversații pe care să le citească și la care să răspundă." + too_few_topics_notice: "Haideți să pornim această discuție! Momentan sunt %{currentTopics} / %{requiredTopics} subiecte. Vizitatorii au nevoie de niște conversații pe care să le citească și la care să răspundă." + too_few_posts_notice: "Haideți să pornim această discuție! Momentan sunt %{currentPosts} / %{requiredPosts} postări. Vizitatorii au nevoie de niște conversații pe care să le citească și la care să răspundă." + logs_error_rate_notice: + reached: "%{relativeAge}%{rate} a atins limita admisă de %{siteSettingRate}." + exceeded: "%{relativeAge}%{rate} a depășit limita admisă de %{siteSettingRate}." + rate: + one: "o eroare/%{duration}" + few: "%{count} erori/%{duration}" + other: "%{count} de erori/%{duration}" learn_more: "află mai multe..." all_time: 'total' all_time_desc: 'total subiecte create' year: 'an' - year_desc: 'discuții create în ultimile 365 de zile' + year_desc: 'subiecte create în ultimile 365 de zile' month: 'lună' - month_desc: 'discuții create în ultimile 30 de zile' + month_desc: 'subiecte create în ultimile 30 de zile' week: 'săptămană' - week_desc: 'discuții create în ultimile 7 zile' + week_desc: 'subiecte create în ultimile 7 zile' day: 'zi' - first_post: Prima Postare - mute: Anulare - unmute: Activare - last_post: Ultima Postare - last_reply_lowercase: ultimul răspuns + first_post: Prima postare + mute: Blochează + unmute: Deblochează + last_post: Ultima postare + last_reply_lowercase: Ultimul răspuns replies_lowercase: one: răspuns few: răspunsuri - other: răspunsuri + other: de răspunsuri signup_cta: sign_up: "Înregistrare" - hide_session: "Aminteste-mi maine." - hide_forever: "Nu, Multumesc" - hidden_for_session: "Ok, te vom intreba maine. Poti oricand folosi 'Autentificare' pentru a crea un cont." - value_prop: "Cand creati un cont nou, vom retine exact ce ati citit, astfel continuati intotdeauna de unde ati ramas. Deasemenea primiti notificari, aici sau prin email atunci se posteaza ceva nou. Puteti \"aprecia\" postari pentru a impartasi iubire :heartbeat:" + hide_session: "Amintește-mi mai târziu." + hide_forever: "Nu, mulțumesc" + hidden_for_session: "OK, vom reveni. Poți oricând folosi secțiunea de 'Autentificare' pentru a crea un cont." + intro: "Salutare! :heart_eyes: Se pare că îți place subiectul, dar nu ți-ai făcut cont pe site." + value_prop: "Când creezi un cont nou, noi reținem exact ce citești, astfel încât întotdeauna poți să te întorci exact unde ai rămas. Vei primi de asemenea și notificări, aici sau prin email, de câte ori apare o nouă postare. Și tu vei putea să apreciezi postări pentru a-ți arăta aprecierea. :heartbeat:" summary: - enabled_description: "Vizualizați sumarul discuției: cea mai interesantă postare, așa cum a fost determinată de comunitate. Pentru toate postările, faceți click dedesubt." - enable: 'Fă sumarul discuției' + enabled_description: "Vizualizezi un rezumat al acestui subiect: cea mai interesantă postare, așa cum a fost desemnată de comunitate. " + description: "Există {{replyCount}} răspunsuri." + description_time: "Există {{replyCount}} răspunsuri cu un timp necesar pentru citire estimat la {{readingTime}} minute." + enable: 'Fă rezumatul acestui subiect' disable: 'Arată toate postările' deleted_filter: - enabled_description: "Această discuție conține postări șterse, ce au fost ascunse. " - disabled_description: "Postările șterse din discuție sunt vizibile." + enabled_description: "Acest subiect conține postări șterse, care au fost ascunse. " + disabled_description: "Postările șterse din subiect sunt vizibile." enable: "Ascunde postările șterse" disable: "Arată postările șterse" private_message_info: title: "Mesaj" invite: "Invită alte persoane..." - remove_allowed_user: "Chiar doriți să îl eliminați pe {{name}} din acest mesaj privat?" + remove_allowed_user: "Chiar dorești să îl elimini pe {{name}} din acest mesaj privat?" + remove_allowed_group: "Ești sigur că vrei să îl scoți pe {{name}} din acest mesaj?" email: 'Email' username: 'Nume utilizator' last_seen: 'Văzut' created: 'Creat' created_lowercase: 'creat' trust_level: 'Nivel de încredere' - search_hint: 'Numele de utilizator sau email' + search_hint: 'Numele de utilizator, email sau adresă IP' create_account: title: "Creează cont" - failed: "Ceva a decurs greșit, poate că acest email e deja înregistrat, încearcă linkul parolă uitată " + failed: "Ceva s-a întâmplat, poate că acest email este deja înregistrat, încearcă să-ți resetezi parola la link-ul respectiv." forgot_password: title: "Resetare parolă" action: "Mi-am uitat parola" - invite: "Introduce-ți numele de utilizator sau adresa de email și vă vom trimite un email pentru resetarea parolei." - reset: "Resetare Parolă" - complete_username: "Dacă contul se potrivește numelui de utilizator %{username}, ar trebui să primiți în scurt timp un email cu instrucțiunile de resetare a parolei." - complete_email: "Dacă un cont se potrivește cu %{email}, ar trebui să primiți un email în cel mai scurt timp cu instrucțiunile de resetare a parolei." - complete_username_found: "Am găsit un cont care se potriveşte cu utilizatorul %{username}, veţi primi un email cu instrucţiunile cum să resetati parolă în cel mai scurt timp." - complete_email_found: "Am găsit un cont care se potriveşte cu adresa %{email}, veţi primi un email cu instrucţiunile cum să resetati parolă în cel mai scurt timp." + invite: "Introdu numele de utilizator sau adresa de email și-ți vom trimite un email pentru resetarea parolei." + reset: "Resetare parolă" + complete_username: "Dacă contul corespunde cu numele de utilizator %{username}, ar trebui să primești în scurt timp un email cu instrucțiunile de resetare a parolei." + complete_email: "Dacă un cont corespunde cu %{email}, ar trebui să primești un email în cel mai scurt timp cu instrucțiunile de resetare a parolei." + complete_username_found: "Am găsit un cont care se potrivește cu utilizatorul %{username}, vei primi un email cu instrucțiunile de resetare a parolei în cel mai scurt timp." + complete_email_found: "Am găsit un cont care se potrivește cu adresa %{email}, vei primi un email cu instrucțiunile de resetare a parolei în cel mai scurt timp." complete_username_not_found: "Nici un cont nu se potriveşte cu utilizatorul %{username}" - complete_email_not_found: "Nici un cont nu se potriveşte adresei %{email}" + complete_email_not_found: "Nici un cont nu se potrivește cu adresa %{email}" login: title: "Autentificare" username: "Utilizator" password: "Parolă" email_placeholder: "email sau nume de utilizator" - caps_lock_warning: "Caps Lock este apăsat" + caps_lock_warning: "Tasta Caps Lock este activă" error: "Eroare necunoscută" - rate_limit: "Te rog asteapta inainte de a te reconecta." - blank_username_or_password: "Introduceți emailul sau numele de utilizator și parola." + rate_limit: "Te rog așteaptă înainte de a te reconecta." + blank_username_or_password: "Introdu emailul sau numele de utilizator și parola." reset_password: 'Resetare parolă' logging_in: "În curs de autentificare..." or: "sau" authenticating: "Se autentifică..." - awaiting_confirmation: "Contul dumneavoastră așteaptă să fie activat .Folosiți linkul de reamintire a parolei, pentru a iniția un alt email de activare." - awaiting_approval: "Contul dumneavoastră nu a fost aprobat încă de un admin . Veți primi un email când se aprobă." + awaiting_confirmation: "Contul tău așteaptă să fie activat. Folosește linkul de reamintire a parolei, pentru a cere un alt email de activare." + awaiting_approval: "Contul tău nu a fost aprobat încă de un admin . Vei primi un email când se aprobă." requires_invite: "Ne pare rău, accesul la forum se face pe bază de invitație." - not_activated: "Nu te poți loga încă. Am trimis anterior un email de activare pentru {{sentTo}}. Urmăriți instrucțiunile din email pentru a vă activa contul." - not_allowed_from_ip_address: "Nu va puteţi conecta de la această adresa de IP." - admin_not_allowed_from_ip_address: "Nu va puteţi conecta ca administrator de la această adresa de IP." - resend_activation_email: "Click aici pentru a trimite emailul de activare încă odată." - sent_activation_email_again: "Am trimis un alt email de activare pentru dvs la {{currentEmail}}. Poate dura câteva minute până ajunge; Vizitați și secțiunea de spam a mailului." - to_continue: "Te rog sa te autentifici." - preferences: "Trebuie sa fi autentificat pentru a schimba preferintele." - forgot: "Nu imi amintesc detaliile contului meu." + not_activated: "Nu te poți loga încă. Am trimis anterior un email de activare pentru {{sentTo}}. Urmează instrucțiunile din email pentru a-ți activa contul." + not_allowed_from_ip_address: "Nu te poți conecta cu această adresă IP." + admin_not_allowed_from_ip_address: "Nu te poți conecta ca administrator cu această adresă IP." + resend_activation_email: "Click aici pentru a retrimite emailul de activare." + sent_activation_email_again: "Am trimis un alt email de activare pentru tine la {{currentEmail}}. Poate dura câteva minute până ajunge; vezi și în secțiunea de spam a mailului." + to_continue: "Te rog să te autentifici." + preferences: "Trebuie să fii autentificat pentru a schimba preferințele." + forgot: "Nu îmi amintesc detaliile contului meu." google: title: "cu Google" - message: "Autentificare cu Google (Asigurați-vă că barierele de pop up nu sunt active)" + message: "Autentificare cu Google (Verifică browserul să nu blocheze ferestrele pop-up)" google_oauth2: title: "cu Google" - message: "Autentificare cu Google (Asigurați-vă că barierele de pop up nu sunt active)" + message: "Autentificare cu Google (Verifică browserul să nu blocheze ferestrele pop-up)" twitter: title: "cu Twitter" - message: "Autentificare cu Twitter (Asigurați-vă că barierele de pop up nu sunt active)" + message: "Autentificare cu Twitter (Verifică browserul să nu blocheze ferestrele pop-up)" + instagram: + title: "cu Instagram" + message: "Autentificare cu Instagram (Verifică browserul să nu blocheze ferestrele pop-up)" facebook: title: "cu Facebook" - message: "Autentificare cu Facebook (Asigurați-vă că barierele de pop up nu sunt active)" + message: "Autentificare cu Facebook (Verifică browserul să nu blocheze ferestrele pop-up)" yahoo: title: "cu Yahoo" - message: "Autentificare cu Yahoo (Asigurați-vă că barierele de pop up nu sunt active)" + message: "Autentificare cu Yahoo (Verifică browserul să nu blocheze ferestrele pop-up)" github: title: "cu GitHub" - message: "Autentificare cu GitHub (Asigurați-vă că barierele de pop up nu sunt active)" + message: "Autentificare cu GitHub (Verifică browserul să nu blocheze ferestrele pop-up)" + emoji_set: + apple_international: "Apple/International" + google: "Google" + twitter: "Twitter" + emoji_one: "Emoji One" + win10: "Win10" + category_page_style: + categories_only: "Numai categorii" + categories_with_featured_topics: "Categorii cu subiecte promovate" + categories_and_latest_topics: "Categorii și subiecte recente" shortcut_modifier_key: shift: 'Shift' ctrl: 'Ctrl' @@ -890,89 +960,106 @@ ro: composer: emoji: "Emoji :)" more_emoji: "mai multe..." - options: "Optiuni" - whisper: "soapta" - add_warning: "Această este o avertizare oficială." - posting_not_on_topic: "Cărei discuții vrei să-i răspunzi?" - saving_draft_tip: "salvează..." + options: "Opțiuni" + whisper: "discret" + unlist: "nelistat" + add_warning: "Aceasta este o avertizare oficială." + toggle_whisper: "Comută modul discret" + toggle_unlisted: "Comută modul nelistat" + posting_not_on_topic: "În care subiect vrei să răspunzi?" + saving_draft_tip: "se salvează..." saved_draft_tip: "salvat" saved_local_draft_tip: "salvat local" - similar_topics: "discuția dvs e similară cu..." - drafts_offline: "proiecte offline" + similar_topics: "Subiectul tău seamănă cu..." + drafts_offline: "schiță offline" + group_mentioned: + one: "Prin menționarea {{group}}, urmează să notifici o persoană – ești sigur?" + few: "Prin menționarea {{group}}, urmează să notifici {{count}} persoane – ești sigur?" + other: "Prin menționarea {{group}}, urmează să notifici {{count}} de persoane – ești sigur?" + duplicate_link: "Se pare că link-ul tău către {{domain}} a fost deja postat în cadrul subiectului de către @{{username}} în un răspuns {{ago}} în urmă – eși sigur că vrei să îl postezi din nou?" error: - title_missing: "Este nevoie de titlu" - title_too_short: "Titlul trebuie sa aibă minim {{min}} de caractere" - title_too_long: "Titlul nu poate avea {{max}} de caractere" - post_missing: "Postarea nu poate fi gol" - post_length: "Postarea trebuie sa aibă minim {{min}} de caractere" + title_missing: "Trebuie un titlu" + title_too_short: "Titlul trebuie să aibă minim {{min}} (de) caractere" + title_too_long: "Titlul nu poate avea mai mult de {{max}} (de) caractere" + post_missing: "Postarea nu poate fi goală" + post_length: "Postarea trebuie să aibă minim {{min}} (de) caractere" try_like: 'Ai încercat butonul ?' category_missing: "Trebuie să alegi o categorie" - save_edit: "Salvează Editarea" - reply_original: "Răspunde discuției originale" + save_edit: "Salvează editarea" + reply_original: "Răspunde la subiectul inițial" reply_here: "Răspunde aici" reply: "Răspunde" cancel: "Anulează" - create_topic: "Creează o Discuţie" + create_topic: "Creează un subiect" create_pm: "Mesaj" title: "Sau apasă Ctrl+Enter" users_placeholder: "Adaugă un utilizator" - title_placeholder: "Care este tema discuției într-o singură propoziție?" - edit_reason_placeholder: "de ce editați?" + title_placeholder: "Despre ce e vorba în acest subiect - pe scurt?" + edit_reason_placeholder: "de ce editezi?" show_edit_reason: "(adaugă motivul editării)" - reply_placeholder: "Scrie aici. Utilizeaza Markdown, BBCode or HTML la format. Trage sau lipeste imagini." - view_new_post: "Vizualizează noua postare." - saving: "Salvare" + reply_placeholder: "Scrie aici. Utilizează formatarea Markdown, BBCode sau HTML. Trage sau lipește imagini." + view_new_post: "Vezi noua ta postare." + saving: "Se salvează" saved: "Salvat!" - saved_draft: "Ai o postare în stadiul neterminat. Fă click oriunde pentru a continua editarea." - uploading: "Încarcă..." + saved_draft: "Ai o postare neterminată. Fă click pentru a continua editarea." + uploading: "Se încarcă..." show_preview: 'arată previzualizare »' hide_preview: '« ascunde previzualizare' quote_post_title: "Citează întreaga postare" + bold_label: "B" bold_title: "Aldin" bold_text: "text aldin" + italic_label: "I" italic_title: "Italic" italic_text: "text italic" - link_title: "Adresă Hyper" - link_description: "adaugă aici descrierea adresei hyper" - link_dialog_title: "Introdu adresă hyper" + link_title: "Hyperlink" + link_description: "adaugă aici descrierea link-ului" + link_dialog_title: "Introdu link" link_optional_text: "titlu opțional" link_url_placeholder: "http://example.com" - quote_title: "Citat-bloc" - quote_text: "Citat-bloc" + quote_title: "Bloc citat" + quote_text: "Bloc citat" code_title: "Text preformatat" - code_text: "indentează preformatarea textului cu 4 spații" + code_text: "indentează textul preformatat cu 4 spații" + paste_code_text: "tastează sau lipește cod aici" upload_title: "Încarcă" - upload_description: "Introduceți aici descrierea fișierelor încărcate" - olist_title: "Listă numerică" - ulist_title: "Listă punctată" - list_item: "conținut de listă" + upload_description: "Descrie fișierele de încărcat" + olist_title: "Listă numerotată" + ulist_title: "Listă cu marcatori" + list_item: "Element listă" + heading_label: "H" heading_title: "Titlu" heading_text: "Titlu" - hr_title: "Linie orizontală" - help: "Ajutor de editare" + hr_title: "Riglă orizontală" + help: "Ajutor pentru formatarea cu Markdown" toggler: "ascunde sau arată editorul" modal_ok: "Ok" - modal_cancel: "Anuleaza" + modal_cancel: "Anulare" cant_send_pm: "Nu poți trimite mesaje către %{username}" - admin_options_title: "Setări opționale ale discuției pentru moderatori" + yourself_confirm: + title: "Ai uitat să adaugi destinatari?" + body: "În acest moment mesajul acesta nu este trimis decât către tine însuți!" + admin_options_title: "Setări opționale pentru moderatori cu privire la acest subiect" auto_close: - label: "Închide automat discuţia după:" - error: "Introduceţi o valoare valida." - based_on_last_post: "Nu închide discuţia până când ultimul răspuns nu are o vechime de cel puţin:" + label: "Închide automat discuția la:" + error: "Introduceţi o valoare validă." + based_on_last_post: "Nu închide subiectul până când ultimul răspuns nu are o vechime de cel puțin" all: - examples: 'Introdu numărul de ore (24), timpul absolut (17:30) sau dată şi timpul cu secunde (2013-11-22 14:00).' + examples: 'Introdu numărul de ore (24), timpul absolut (17:30) sau data şi ora cu secunde (2013-11-22 14:00).' limited: units: "(# de ore)" examples: 'Introdu numărul de ore (24).' notifications: - title: "notifică menționarea @numelui, răspunsuri la postările mele, discuții, mesaje private, etc" - none: "Nu pot încarcă notificările în acest moment." + title: "notificări la menționările @numelui tău, răspunsuri la postările sau subiectele tale, mesaje, etc." + none: "Nu pot încărca notificările în acest moment." + empty: "Nu au fost găsite notificări." more: "vezi notificările mai vechi" - total_flagged: "toate postările semnalate" - mentioned: "@

{{username}} {{description}}

" - quoted: "

{{username}} {{description}}

" - replied: "

{{username}} {{description}}

" - posted: "

{{username}} {{description}}

" + total_flagged: "toate postările marcate" + mentioned: "

{{username}} {{description}}

" + group_mentioned: "

{{username}} {{description}}

" + quoted: "

{{username}} {{description}}

" + replied: "

{{username}} {{description}}

" + posted: "

{{username}} {{description}}

" edited: "

{{username}} {{description}}

" liked: "

{{username}} {{description}}

" liked_2: "

{{username}}, {{username2}} {{description}}

" @@ -985,115 +1072,150 @@ ro: invited_to_topic: "

{{username}} {{description}}

" invitee_accepted: "

{{username}} a acceptat invitația ta

" moved_post: "

{{username}} mutată {{description}}

" - granted_badge: "

Ţi s-a acordat {{description}}

" + linked: "

{{username}} {{description}}

" + granted_badge: "

Ţi s-a acordat {{description}}

" + watching_first_post: "

Postare nouă {{description}}

" + group_message_summary: + one: "

Există un mesaj în căsuța poștală a grupului {{group_name}}

" + few: "

Există {{count}} mesaje în căsuța poștală a grupului {{group_name}}

" + other: "

Există {{count}} de mesaje în căsuța poștală a grupului {{group_name}}

" alt: - mentioned: "Mentionat de" + mentioned: "Menționat de" quoted: "Citat de" - replied: "Raspuns" + replied: "Răspuns" posted: "Postat de" + edited: "Editează postarea prin" + liked: "V-a apreciat postarea" private_message: "Mesaj privat de la" + invited_to_private_message: "Invitat la un mesaj privat de către" + invited_to_topic: "Invitat la un subiect de către" + invitee_accepted: "Invitație acceptată de către" + moved_post: "Postarea ta a fost mutată de către" linked: "Link spre postarea ta" + granted_badge: "Ecuson acordat" + group_message_summary: "Mesaje în căsuța poștală a grupului" popup: mentioned: '{{username}} te-a menţionat în "{{topic}}" - {{site_title}}' group_mentioned: '{{username}} te-a menţionat în "{{topic}}" - {{site_title}}' quoted: '{{username}} te-a citat în "{{topic}}" - {{site_title}}' replied: '{{username}} ți-a răspuns la "{{topic}}" - {{site_title}}' - posted: '{{username}} a postal în "{{topic}}" - {{site_title}}' + posted: '{{username}} a postat în "{{topic}}" - {{site_title}}' private_message: '{{username}} ți-a trimis un mesaj privat în "{{topic}}" - {{site_title}}' - linked: '{{username}} a făcut o legătură la post-ul tău din "{{topic}}" - {{site_title}}' + linked: '{{username}} a pus un link către postarea ta din "{{topic}}" - {{site_title}}' upload_selector: title: "Adaugă o imagine" - title_with_attachments: "adaugă o imagine sau un fișier" - from_my_computer: "din dispozitivul meu" + title_with_attachments: "Adaugă o imagine sau un fișier" + from_my_computer: "Din dispozitivul meu" from_the_web: "De pe web" - remote_tip: "adresă către imagine http://example.com/image.jpg" - local_tip: "selectează imagini de pe dispozitivul tău" - local_tip_with_attachments: "selectează imagini sau fișiere de pe dispozitivul tău {{authorized_extensions}}" - hint: "(puteți să trageți și să aruncați în editor pentru a le încărca)" - uploading: "Încarcă" - select_file: "Slectează fișier" - image_link: "Adresa din imagine va duce la" + remote_tip: "link către imagine" + remote_tip_with_attachments: "link la imagine sau fișier {{authorized_extensions}}" + local_tip: "alege imagini de pe dispozitivul tău" + local_tip_with_attachments: "alege imagini sau fișiere de pe dispozitivul tău {{authorized_extensions}}" + hint: "(poți să faci drag and drop în editor pentru a le încărca)" + hint_for_supported_browsers: "Poți de asemenea să faci drag and drop sau să lipești imagini în editor" + uploading: "Se încarcă" + select_file: "Alege fișier" + image_link: "Link-ul de la imagine va duce la" search: sort_by: "Sortează după" relevance: "Relevanță" - latest_post: "Ultimele postări" + latest_post: "Cele mai recente postări" most_viewed: "Cele mai văzute" most_liked: "Cele mai apreciate" select_all: "Selectează tot" + clear_all: "Șterge tot" + too_short: "Termenul căutat este prea scurt." result_count: one: "Un rezultat pentru \"{{term}}\"" few: "{{count}} rezultate pentru \"{{term}}\"" other: "{{count}} de rezultate pentru \"{{term}}\"" - title: "caută discuții, postări, utilizatori sau categorii" - no_results: "Fără rezultat." + title: "Caută subiecte, postări, utilizatori sau categorii" + no_results: "Nici un rezultat." + no_more_results: "Nu s-au mai găsit alte rezultate." search_help: Ajutor căutare - searching: "Caută..." + searching: "Se caută..." post_format: "#{{post_number}} de {{username}}" context: user: "Caută postări după @{{username}}" - topic: "Caută în această discuție" + category: "Caută în categoria #{{category}} " + topic: "Caută în acest subiect" private_messages: "Caută mesaje" + hamburger_menu: "Du-te la o altă categorie saulistă de subiecte" new_item: "nou" go_back: 'înapoi' - not_logged_in_user: 'pagina utilizatorului cu sumarul activităților și preferințelor' - current_user: 'mergi la pagina proprie de utilizator' + not_logged_in_user: 'pagina utilizatorului cu rezumatul activităților și preferințelor' + current_user: 'mergi la pagina ta de utilizator' topics: + new_messages_marker: "ultima vizită" bulk: - reset_read: "resetează citirea" + unlist_topics: "Elimină subiecte din listă" + reset_read: "Resetează citite" delete: "Șterge subiectele" + dismiss: "Abandonează" + dismiss_read: "Abandonează toate necitite" + dismiss_button: "Abandonează..." + dismiss_tooltip: "Abandonează numai postările noi sau oprește urmărirea subiectelor" + also_dismiss_topics: "Încetează urmărirea subiectelor astfel încât să nu mai îmi apară niciodată ca necitite" dismiss_new: "Anulează cele noi" - toggle: "activează selecția în masă pentru discuții" - actions: "Acțiuni în masă" + toggle: "activează selecția multiplă a subiectelor" + actions: "Acțiuni multiple" change_category: "Schimbă categoria" - close_topics: "Închide discuțiile" + close_topics: "Închide subiectele" archive_topics: "Arhivează subiectele" notification_level: "Schimbă nivelul de notificări" - choose_new_category: "Alege o nouă categorie pentru această discuţie" + choose_new_category: "Alege o nouă categorie pentru acest subiect" selected: one: "Ai selectat un subiect." few: "Ai selectat {{count}} subiecte." other: "Ai selectat {{count}} de subiecte." + change_tags: "Schimbă etichete" + choose_new_tags: "Alege etichete noi pentru aceste subiecte:" + changed_tags: "Etichetele pentru aceste subiecte au fost schimbate." none: - unread: "Nu sunt discuții necitite." - new: "Nu sunt discuții noi." - read: "Nu ai citit nicio discuție încă." - posted: "Nu ai postat în nicio discuție încă." - latest: "Nu există nicio discuție nouă." - hot: "Nu există nicio discuție importantă." - bookmarks: "Nu aveţi nici un semn de carte încă." - category: "Nu există nicio discuție din categoria {{category}}." - top: "Nu exită nicio discuție de top." - search: "Nu sunt rezulate la căutare." + unread: "Nu sunt subiecte necitite." + new: "Nu sunt subiecte noi." + read: "Nu ai citit încă niciun subiect." + posted: "Nu ai postat încă în niciun subiect." + latest: "Nu există niciun subiect recent. Asta-i trist." + hot: "Nu există niciun subiect fierbinte." + bookmarks: "Nu ai nici un semn de carte încă." + category: "Nu există niciun subiect din categoria {{category}}." + top: "Nu exită niciun subiect de top." + search: "Nu sunt rezultate." + educate: + new: '

Subiectele noi vor apărea aici.

Implicit, subiectele vor fi considerate noi și vor afișa un indicator că suntnoi dacă au fost create în ultimele 2 zile.

Mergi la preferințe pentru a schimba această setare.

' + unread: '

Subiectele necitite vor apărea aici

Implicit, subiectele sunt considerate necitite și se va afișa numărul celor necitite 1dacă ai:

  • Creat subiectul
  • Răspuns la subiect
  • Citit subiectul de mai mult de 4 minute

Sau dacă ai setat în mod explicit subiectul pe Urmărire sau Urmărire activă prin intermediul contorului de notificare de la sfârșitul fiecărui subiect.

Mergi la preferințe pentru a schimba această setare.

' bottom: - latest: "Nu există nicio ultimă discuție." - hot: "Nu mai există discuții importante." - posted: "Nu mai există discuții postate." - read: "Nu mai există discuții citite." - new: "Nu mai există discuții noi." - unread: "Nu mai există discuții necitite." - category: "Nu mai există discuții din categoria {{category}}." - top: "Nu mai există discuții de top." + latest: "Nu mai există niciun subiect recent." + hot: "Nu mai există subiecte importante." + posted: "Nu mai există subiecte postate." + read: "Nu mai există subiecte citite." + new: "Nu mai există subiecte noi." + unread: "Nu mai există subiecte necitite." + category: "Nu mai există subiecte din categoria {{category}}." + top: "Nu mai există subiecte de top." bookmarks: "Nu mai sunt semne de carte." search: "Nu mai sunt rezultate." topic: unsubscribe: stop_notifications: "Vei primi mai puține notificări pentru {{title}}" + change_notification_state: "Starea actuală a notificărilor tale este" filter_to: - one: "Un mesaj în discuție" - few: "{{count}} mesaje în discuție" - other: "{{count}} de mesaje în discuție" - create: 'Discuție Nouă' - create_long: 'Creează discuție nouă' + one: "O postare în subiect" + few: "{{count}} postări în subiect" + other: "{{count}} de postări în subiect" + create: 'Subiect nou' + create_long: 'Creează un subiect nou' private_message: 'Scrie un mesaj.' archive_message: help: 'Mută mesajul în arhivă' title: 'Arhivează' move_to_inbox: - title: 'Mută în Inbox' - help: 'Mută mesajul în Inbox' - list: 'Discuții' - new: 'discuție nouă' - unread: 'necitită' + title: 'Mută în Primite' + help: 'Mută mesajul în Primite' + list: 'Subiecte' + new: 'subiect nou' + unread: 'necitit' new_topics: one: 'Un subiect nou' few: '{{count}} subiecte noi' @@ -1102,17 +1224,17 @@ ro: one: 'Un subiect necitit' few: '{{count}} subiecte necitite' other: '{{count}} de subiecte necitite' - title: 'Discuție' + title: 'Subiect' invalid_access: title: "Discuția este privată" - description: "Ne pare rău nu ai acces la acea discuție!" - login_required: "Trebuie să fii autentificat să poți vedea discuția." + description: "Ne pare rău, nu ai acces la acest subiect!" + login_required: "Trebuie să fii autentificat pentru a vedea subiectul ăsta." server_error: - title: "Discuția nu s-a putut încărca" - description: "Ne pare rău, nu am putut încărca discuția, posibil din cauza unei probleme de conexiune. Încercați din nou. Dacă problema persistă, anunță-ne." + title: "Nu s-a putut încărca subiectul" + description: "Ne pare rău, nu am putut încărca subiectul, posibil din cauza unei probleme de conexiune. Încearcă din nou. Dacă problema persistă, anunță-ne." not_found: - title: "Discuție negăsită" - description: "Ne pare rău, Nu am putut găsii discuția. Poate a fost ștearsă de un moderator?" + title: "Subiectul nu a fost găsit" + description: "Ne pare rău, Nu am putut găsi subiectul. Poate a fost șters de un moderator?" total_unread_posts: one: "ai un mesaj necitit în această discuţie." few: "ai {{count}} mesaje necitite în această discuţie." @@ -1129,55 +1251,68 @@ ro: one: "există o apreciere pentru această discuţie" few: "sunt {{count}} aprecieri pentru această discuţie" other: "sunt {{count}} de aprecieri pentru această discuţie" - back_to_list: "Înapoi la lista de discuții" - options: "Opțiunile discuției" - show_links: "arată link-urile din această discuție" - toggle_information: "activează detaliile discuției" - read_more_in_category: "Vrei să citești mai mult? Răsfoiește alte discuții din {{catLink}} sau {{latestLink}}." - read_more: "Vrei să citești mai multe discuții? {{catLink}} sau {{latestLink}}." - read_more_MF: "{ UNREAD, plural, =0 {} one { Este o discuție necitită } other { Sunt # discuții necitite } } { NEW, plural, =0 {} one { {BOTH, select, true{și } false {este } other{}} o discuție nouă} other { {BOTH, select, true{și } false {sunt } other{}} # discuții noi} } remaining, or {CATEGORY, select, true {răsfoiește alte discuții în {catLink}} false {{latestLink}} other {} }" - browse_all_categories: Priviți toate categoriile - view_latest_topics: arată ultimele discuții - suggest_create_topic: De ce să nu creați o discuție? + back_to_list: "Înapoi la lista de subiecte" + options: "Opțiuni pentru subiect" + show_links: "arată link-urile din acest subiect" + toggle_information: "comută între detaliile subiectului" + read_more_in_category: "Vrei să citești mai mult? Răsfoiește alte subiecte din {{catLink}} sau {{latestLink}}." + read_more: "Vrei să citești mai multe subiecte? {{catLink}} sau {{latestLink}}." + read_more_MF: "{ UNREAD, plural, =0 {} one { Există un subiect necitit } other { Sunt # subiecte necitite } } { NEW, plural, =0 {} one { {BOTH, select, true{și } false {există } other{}} un subiect nou} other { {BOTH, select, true{și } false {sunt } other{}} # subiecte noi} } rămase, sau {CATEGORY, select, true {răsfoiți alte subiecte în {catLink}} false {{latestLink}} other {}}" + browse_all_categories: Răsfoiți prin toate categoriile + view_latest_topics: arată ultimele subiecte + suggest_create_topic: Ce ar fi să creezi un subiect? jump_reply_up: sări la un răspuns mai vechi jump_reply_down: sări la un răspuns mai nou - deleted: "Discuția a fost ștearsă" - auto_close_notice: "Această discuție va fi inchisă în %{timeLeft}." - auto_close_notice_based_on_last_post: "Această discuţie se va închide după %{duration} de la ultimul răspuns." - auto_close_title: 'Setările de auto-închidere' + deleted: "Subiectul a fost șters" + auto_close_notice: "Acest subiect va fi automat închis în %{timeLeft}." + auto_close_notice_based_on_last_post: "Acest subiect va fi automat închis după %{duration} de la ultimul răspuns." + auto_close_title: 'Setări de închidere automată' auto_close_save: "Salvează" - auto_close_remove: "nu închide automat această discuție" + auto_close_remove: "Nu închide automat acest subiect" + auto_close_immediate: + one: "Ultima postare din subiect este deja veche de o oră, așa că subiectul va fi închis imediat." + few: "Ultima postare din subiect este deja veche de %{count} ore, așa că subiectul va fi închis imediat." + other: "Ultima postare din subiect este deja veche de %{count} de ore, așa că subiectul va fi închis imediat." + timeline: + back: "Înapoi" + back_description: "Întoarce-te la ultima ta postare necitită" + replies_short: "%{current} / %{total}" progress: - title: Progresul Discuției + title: Evoluția subiectului go_top: "început" go_bottom: "sfârșit" go: "mergi" - jump_bottom: "sări la ultimul mesaj" - jump_bottom_with_number: "sări la mesajul %{post_number}" + jump_bottom: "sari la ultimul mesaj" + jump_prompt: "sari la postarea" + jump_prompt_long: "La ce postare dorești să sari?" + jump_bottom_with_number: "sari la mesajul %{post_number}" total: toate postările current: Postarea curentă notifications: + title: schimbă frecvența cu care vei fi notificat despre acest subiect reasons: + mailing_list_mode: "Ai modul mailing list activat, așa că nu vei fi notificat prin email cu privire la răspunsurile la acest subiect." + '3_10': 'Vei primi notificări pentru ca urmărești o etichetă de la acest subiect.' '3_6': 'Vei primi notificări deoarece urmărești activ această categorie.' - '3_5': 'Vei primi notificări deoarece ai început să urmărești activ această discuție automat.' - '3_2': 'Vei primi notificări deoarece urmărești activ această discuție.' - '3_1': 'Vei primi notificări deoarece ați creat această discuție.' - '3': 'Vei primi notificări deoarece urmărești activ această discuție.' + '3_5': 'Vei primi notificări deoarece ai început să urmărești activ acest subiect, în mod automat.' + '3_2': 'Vei primi notificări deoarece urmărești activ acest subiect.' + '3_1': 'Vei primi notificări deoarece ai creat acest subiect.' + '3': 'Vei primi notificări deoarece urmărești activ acest subiect.' '2_8': 'Vei primi notificări deoarece urmărești această categorie.' - '2_4': 'Vei primi notificări deoarece ai postat un răspuns în această discuție.' - '2_2': 'Vei primi notificări fiindcă urmărești această discuție.' - '2': 'Vei primi notificări fiindcă citești această discuție.' + '2_4': 'Vei primi notificări deoarece ai postat un răspuns în acest subiect.' + '2_2': 'Vei primi notificări fiindcă urmărești acest subiect.' + '2': 'Vei primi notificări fiindcă citești acest subiect.' '1_2': 'Vei fi notificat dacă cineva îți menționează @numele sau îți scrie un răspuns.' '1': 'Vei fi notificat dacă cineva îți menționează @numele sau îți scrie un răspuns.' '0_7': 'Ignori toate notificările din această categorie.' - '0_2': 'Ignori toate notificările din această discuție.' - '0': 'Ignori toate notificările din această discuție.' + '0_2': 'În acest moment ignori toate notificările de la acest subiect.' + '0': 'În acest moment ignori toate notificările de la acest subiect.' watching_pm: - title: "Urmărit Activ" + title: "Urmărind activ" description: "Numărul postărilor noi va fi arătat pentru acest mesaj și vei fi notificat pentru orice răspuns scris." watching: - title: "Urmărit Activ" - description: "Numărul postărilor noi va fi arătat pentru această discuție și vei fi notificat pentru orice răspuns scris." + title: "Urmărind activ" + description: "Vei fi notificat la fiecare nou răspuns pe acest subiect și numărul de mesaje noi va fi afișat." tracking_pm: title: "Urmărit" description: "Numărul postărilor noi va fi arătat pentru acest mesaj. Vei fi notificat dacă cineva îți menționează @numele sau îți scrie un răspuns." @@ -1195,120 +1330,148 @@ ro: description: "Nu vei fi niciodată notificat despre acest mesaj." muted: title: "Silențios" - description: "Nu vei fi notificat de răspunsurile noi din această discuție și nu vor apărea în tabul necitite." + description: "Nu vei fi notificat niciodată despre nimic legat de acest subiect și acesta nu va fi afișat la subiecte recente." actions: - recover: "Restaurează discuția" - delete: "Șterge Discuție" - open: "Redeschide discuția" - close: "Închide discuția" - multi_select: "Selectează discuţiile ..." - auto_close: "Închide automat" - pin: "Promovează discuţia pe pagină..." - unpin: "Anulează promovarea discuției" - unarchive: "Dezarhivează discuția" - archive: "Arhivează discuția" + recover: "Restaurează subiect" + delete: "Șterge subiect" + open: "Deschide subiect" + close: "Închide subiect" + multi_select: "Selectează subiectele ..." + auto_close: "Închidere automată..." + pin: "Fixează subiect..." + unpin: "Anulează subiect fixat..." + unarchive: "Dezarhivează subiect" + archive: "Arhivează subiect" invisible: "Fă invizibil" visible: "Fă vizibil" - reset_read: "Resetează informația citită" + reset_read: "Resetează datele despre subiecte citite" + make_public: "Transformă în subiect public" + make_private: "Transformă în mesaj privat" feature: - pin: "Promovează discuţia" - unpin: "Anulează promovarea discuției" + pin: "Fixează subiectul" + unpin: "Anulează subiect fixat" pin_globally: "Promovează discuţia global" make_banner: "Adaugă statutul de banner" remove_banner: "Șterge statutul de banner" reply: title: 'Răspunde' - help: 'începe să compui un răspuns pentru această discuție' + help: 'începe să scrii un răspuns la acest subiect' clear_pin: - title: "Șterge promovarea" - help: "Șterge promovarea acestei discuții pentru a nu mai apărea la începutul listei de discuții" + title: "Anulează subiect fixat" + help: "Elimină subiectul fixat pentru a nu mai apărea la începutul listei de subiecte." share: title: 'Distribuie' - help: 'distribuie o adresă spre această discuție' + help: 'distribuie un link cu acest subiect' flag_topic: - title: 'Marcheză' - help: 'marchează privat această discuție pentru atenție sau trimite o notificare privată despre ea' - success_message: 'Ai marcat cu succes această discuție.' + title: 'Marcaje' + help: 'marchează acest subiect pentru a atrage atenția adminilor sau a le trimite o notificare privată despre el' + success_message: 'Ai marcat cu succes acest subiect.' feature_topic: - title: "Promovează această discuţie" - confirm_pin: "Ai deja {{count}} discuţii promovate. Prea multe discuţii promovate pot fi deveni o problemă pentru utilizatorii noi sau anonimi. Ești sigur că vrei să promovezi o altă discuţie în această categorie?" - unpin: "Îndepărtează aceast mesaje din top-ul categoriei {{categoryLink}}" - pin_note: "Utilizatorii pot anula promovarea unui subiect individual pentru ei înșiși." - pin_validation: "Este nevoie de o dată pentru a putea promova această discuție." - not_pinned: "Nu sunt discuții promovate în {{categoryLink}}." - confirm_pin_globally: "Sunt {{count}} discuţii promovate la nivel global. Prea multe discuţii promovate pot fi deveni o problemă pentru utilizatorii noi sau anonimi. Ești sigur că vrei să promovezi o altă discuţie la nivel global?" - unpin_globally: "Eliminați acest subiect din partea de sus a tuturor listelor de discuţii." - global_pin_note: "Utilizatorii pot anula promovarea unui subiect individual pentru ei înșiși." - not_pinned_globally: "Nu există subiecte promovate global." + title: "Promovează acest subiect" + pin: "Pune acest subiect în vârful categoriei {{categoryLink}} până" + confirm_pin: "Ai deja {{count}} subiecte fixate. Prea multe subiecte fixate pot deveni o problemă pentru utilizatorii noi sau anonimi. Ești sigur că vrei să fixezi un alt subiect în această categorie?" + unpin: "Elimină aceste mesaje din vârful categoriei {{categoryLink}}." + unpin_until: "Elimină acest subiect din vârful categoriei {{categoryLink}} sau așteaptă până %{until}." + pin_note: "Utilizatorii pot anula un subiect fixat doar de ei pentru ei înșiși." + pin_validation: "Este necesară o dată pentru a putea fixa acest subiect." + not_pinned: "Nu sunt subiecte fixate în {{categoryLink}}." + already_pinned: + one: "Număr de subiecte momentan fixate în {{categoryLink}}: {{count}}" + few: "Număr de subiecte momentan fixate în {{categoryLink}}: {{count}}" + other: "Număr de subiecte momentan fixate în {{categoryLink}}: {{count}}" + pin_globally: "Pune acest subiect în vârful listei tuturor subiectelor până" + confirm_pin_globally: "Sunt {{count}} subiecte fixate la nivel global. Prea multe subiecte fixate pot fi deveni o problemă pentru utilizatorii noi sau anonimi. Ești sigur că vrei să fixezi un nou subiect la nivel global?" + unpin_globally: "Elimină acest subiect din partea de sus a tuturor listelor de discuţii." + unpin_globally_until: "Scoate acest subiect din vârful listei tuturor subiectelor și așteaptă până %{until}." + global_pin_note: "Utilizatorii pot anula un subiect fixat doar de ei pentru ei înșiși." + not_pinned_globally: "Nu există subiecte fixate global." + already_pinned_globally: + one: "Număr de subiecte fixate la nivel global: {{count}}" + few: "Număr de subiecte fixate la nivel global: {{count}}" + other: "Număr de subiecte fixate la nivel global: {{count}}" make_banner: "Transformă acest subiect într-un banner care apare în partea de sus a tuturor paginilor." - remove_banner: "Îndepărtaţi mesajul banner care apare în partea de sus a fiecărei pagini." - banner_note: "Utilizatorii pot îndepărta baner-ul închizându-l. Doar un singur mesaj poate fi folosit că baner într-un moment dat." - inviting: "Invită..." + remove_banner: "Elimină mesajul banner care apare în partea de sus a fiecărei pagini." + banner_note: "Utilizatorii pot îndepărta baner-ul închizându-l. Doar un singur mesaj poate fi folosit ca baner într-un moment dat." + no_banner_exists: "Nu există nici un subiect banner." + banner_exists: "Există un subiect banner." + inviting: "Se trimit invitații..." + automatically_add_to_groups: "Această invitație include accesul la următoarele grupuri:" invite_private: title: 'Invită la mesaj privat' - email_or_username: "adresa de Email sau numele de utilizator al invitatului" + email_or_username: "adresa de email sau numele de utilizator al invitatului" email_or_username_placeholder: "adresa de email sau numele utilizatorului" action: "Invită" success: "Am invitat acest utilizator să participe la acest mesaj." - error: "Ne pare rău, a apărut o eroare la trimiterea invitației către acel utilizator." + success_group: "Am invitat acest grup să participe la acest mesaj." + error: "Ne pare rău, a apărut o eroare la trimiterea invitației către respectivul utilizator." group_name: "numele grupului" + controls: "Controale pentru subiect" invite_reply: title: 'Invitație' username_placeholder: "nume utilizator" action: 'Trimite o invitație' help: 'invită alţi utilizatori la această discuţie via email sau notificare' - to_forum: "Vom trimite un email scurt permițând prietenilor tăisă participe făcând click pe o adesă fără a necesita autentificare." - sso_enabled: "Introdu numele de utilizator al persoanei pe care dorești să o inviți la acesta discuţie." - to_topic_blank: "Introdu numele de utilizator sau adresa de email a persoanei pe care dorești să o inviți la acesta discuţie." - to_topic_email: "Ai introdus o adresa de e-mail. Vom trimite un email cu o invitaţie ce va permite prietenului tău să răspundă imediat la această discuţie." - email_placeholder: 'exemplu@nume.com' - success_email: "Am trimis o invitaţie către {{emailOrUsername}}.. Te vom anunţă când invitaţia este folosită. Verifică tab-ul invitaţii pe pagină ta de utilizator pentru a monitoriza invitaţiile. " + to_forum: "Vom trimite un email scurt prietenilor tăi ca să participe făcând click pe o adresă, fără a fi nevoie de autentificare." + sso_enabled: "Introdu numele de utilizator al persoanei pe care dorești să o inviți la acest subiect." + to_topic_blank: "Introdu numele de utilizator sau adresa de email a persoanei pe care dorești să o inviți la acest subiect." + to_topic_email: "Ai introdus o adresă de email. Vom trimite către ea un email cu o invitație ce îi va permite prietenului tău să răspundă imediat la acest subiect." + to_topic_username: "Ai introdus un nume utilizator. Îi vom trimite o notificare cu link pentru a-l invita la acest subiect." + to_username: "Introdu numele de utilizator al persoanei pe care dorești să o inviți. Îi vom trimite o notificare cu link pentru a o invita la acest subiect." + email_placeholder: 'nume@exemplu.com' + success_email: "Am trimis o invitație către {{emailOrUsername}}.. Te vom anunţa când invitația este folosită. Verifică tab-ul de invitații pe pagina ta de utilizator pentru a monitoriza invitațiile. " success_username: "Am invitat acest utilizator să participe la această discuţie." - error: "Ne pare rău, nu am putut invită persoană indicată. Poate că a fost deja invitată? (Invitaţiile sunt limitate)" + error: "Ne pare rău, nu am putut invita persoana indicată. Poate că a fost deja invitată? (Invitaţiile sunt limitate)" login_reply: 'Autentifică-te pentru a răspunde.' filters: n_posts: - one: "O Postare" + one: "O postare" few: "{{count}} postări" other: "{{count}} de postări" - cancel: "Arată din nou toate postările din această discuție." + cancel: "Șterge filtre" split_topic: - title: "Mutare în discuție nouă " - action: "mută în discuție nouă" - topic_name: "Numele noii discuții" - error: "S-a semnalat o eroare la mutarea postărilor către discuția nouă." + title: "Mutare în subiect nou." + action: "mută în subiect nou" + topic_name: "Numele subiectului nou" + error: "A apărut o eroare la mutarea postărilor în subiectul nou." instructions: one: "Vei crea o nouă discuţie care va fi populată cu postarea selectată." few: "Vei crea o nouă discuţie care va fi populată cu cele {{count}} postări selectate." other: "Vei crea o nouă discuţie care va fi populată cu cele {{count}} de postări selectate." merge_topic: - title: "Mută în discuție existentă" - action: "mută în discuție existentă" - error: "S-a semnalat o eroare la mutarea postărilor în acea discuție." + title: "Mută în subiect deja existent" + action: "mută în subiect deja existent" + error: "A apărut o eroare la mutarea postărilor în acel subiect." instructions: - one: "Vă rugăm să alegeţi discuţia unde doriţi să mutaţi acest mesaj." - few: "Vă rugăm să alegeţi discuţia unde doriţi să mutaţi aceste {{count}} mesaje." - other: "Vă rugăm să alegeţi discuţia unde doriţi să mutaţi aceste {{count}} de mesaje." + one: "Te rugăm să alegi subiectul unde dorești să muți acest mesaj." + few: "Te rugăm să alegi subiectul unde dorești să muți aceste {{count}} mesaje." + other: "Te rugăm să alegi subiectul unde dorești să muți aceste {{count}} de mesaje." + merge_posts: + title: "Comasează postările selectate" + action: "comasează postările selectate" + error: "A apărut o eroare la comasarea postărilor selectate." change_owner: - title: "Schimbă deținătorul postărilor" - action: "Schimbă apartenența" - error: "S-a semnalat o eroare la schimbarea apartenenței postărilor." - label: "Noul deținător al postărilor" - placeholder: "numele de utilizator al deținătorului" + title: "Schimbă proprietarul postărilor" + action: "Schimbă proprietarul" + error: "A apărut o eroare la schimbarea proprietarului postărilor." + label: "Noul proprietar al postărilor" + placeholder: "numele de utilizator al proprietarului" instructions: - one: "Va rugăm să alegeţi noul propietar pentru mesajul postat de {{old_user}}." - few: "Va rugăm să alegeţi noul propietar pentru cele {{count}} mesajele postate de {{old_user}}." - other: "Va rugăm să alegeţi noul propietar pentru cele {{count}} de mesajele postate de {{old_user}}." + one: "Alege noul proprietar pentru mesajul postat de {{old_user}}." + few: "Alege noul proprietar pentru cele {{count}} mesaje postate de {{old_user}}." + other: "Alege noul proprietar pentru cele {{count}} de mesaje postate de {{old_user}}." instructions_warn: "NB: nicio notificare ce privește această postare nu va fi transferabilă retroactiv către noul utilizator.
Avertisment: Acum, nicio informație ce depinde de postare nu va fi transferată noului utilizator. Folosește cu atenție." change_timestamp: title: "Schimbă data publicării" action: "schimbă data publicării" + invalid_timestamp: "Marcajul de timp nu poate fi în viitor." + error: "A apărut o eroare la schimbarea marcajului de timp în subiect." + instructions: "Te rugăm să selectezi noul marcaj de timp pentru subiect. Postările din acest subiect vor fi actualizate pentru a menține aceeași diferență de timp." multi_select: select: 'selectează' selected: 'selectate ({{count}})' select_replies: 'selectează +răspunsuri' delete: șterge selecția - cancel: anularea selecției + cancel: anulare selecție select_all: selectează tot deselect_all: deselectează tot description: @@ -1318,21 +1481,21 @@ ro: post: reply: " {{replyAvatar}} {{usernameLink}}" reply_topic: " {{link}}" - quote_reply: "răspunde prin citat" + quote_reply: "citează răspuns" edit: "Editează {{link}} {{replyAvatar}} {{username}}" - edit_reason: "Motivul: " + edit_reason: "Motivul edit[rii: " post_number: "postarea {{number}}" last_edited_on: "postare editată ultima oară la" - reply_as_new_topic: "Răspunde cu o discuție nouă" - continue_discussion: "În continuarea discuției {{postLink}}:" + reply_as_new_topic: "Răspunde cu link către subiect" + continue_discussion: "În continuarea discuției de la {{postLink}}:" follow_quote: "mergi la postarea citată" show_full: "Arată postarea în întregime" show_hidden: 'Arată conținut ascuns.' deleted_by_author: one: "(post retras de autor, va fi şters automat în %{count} ore, cu excepţia cazului în care mesajul este marcat)" few: "(postări retrase de autor, vor fi şterse automat în %{count} ore, cu excepţia cazului în care mesajele sunt marcate)" - other: "(postări retrase de autor, vor fi şterse automat în %{count} ore, cu excepţia cazului în care mesajele sunt marcate)" - expand_collapse: "expandează/restrânge" + other: "(postări retrase de autor, vor fi şterse automat în %{count} de ore, cu excepţia cazului în care mesajele sunt marcate)" + expand_collapse: "extinde/restrânge" gap: one: "vezi un răspuns ascuns" few: "vezi {{count}} răspunsuri ascunse" @@ -1343,119 +1506,132 @@ ro: few: "{{count}} răspunsuri" other: "{{count}} de răspunsuri" has_likes: - one: "O Apreciere" - few: "{{count}} Aprecieri" - other: "{{count}} de Aprecieri" + one: "O apreciere" + few: "{{count}} aprecieri" + other: "{{count}} de aprecieri" has_likes_title: - one: "O persoană a apreciat acest post." - few: "{{count}} persoane au apreciat acest post." - other: "{{count}} de persoane au apreciat acest post." - has_likes_title_only_you: "Ai apreciat acest post" + one: "O persoană a apreciat această postare." + few: "{{count}} persoane au apreciat această postare." + other: "{{count}} de persoane au apreciat această postare." + has_likes_title_only_you: "Ai apreciat această postare." has_likes_title_you: - one: "Ai apreciat acest post împreună cu un alt utilizator." - few: "Ai apreciat acest post împreună cu alți {{count}} utilizatori." - other: "Ai apreciat acest post împreună cu alți {{count}} de utilizatori." + one: "Ai apreciat această postare împreună cu un alt utilizator." + few: "Ai apreciat această postare împreună cu alți {{count}} utilizatori." + other: "Ai apreciat această postare împreună cu alți {{count}} de utilizatori." errors: - create: "Ne pare rău, a apărut o eroare în creerea postării. Te rugăm să încerci iar." - edit: "Ne pare rău, a apărut o eroare în editarea postării. Te rugăm să încerci iar." - upload: "Ne pare rău, a apărut o eroare în încărcarea acelui fișier. Te rugăm să încerci iar." - too_many_uploads: "Ne pare rău, poți încarca doar câte un fișier." - upload_not_authorized: "Ne pare rău, fișierul pe care-l încarci nu este autorizat (extensia pentru autorizare: {{authorized_extensions}})." - image_upload_not_allowed_for_new_user: "Ne pare rău, un utilizator nou nu poate încarca imagini." - attachment_upload_not_allowed_for_new_user: "Ne pare rău, un utilizator nou nu poate încarca atașamnete." - attachment_download_requires_login: "Ne pare rău, dar trebuie să fii autentificat pentru a descarca ataşamente." + create: "Ne pare rău, a apărut o eroare la creerea postării. Te rugăm să încerci iar." + edit: "Ne pare rău, a apărut o eroare la editarea postării. Te rugăm să încerci iar." + upload: "Ne pare rău, a apărut o eroare la încărcarea fișierului. Te rugăm să încerci iar." + file_too_large: "Ne pare rău, fișierul este prea mare (mărimea maximă este {{max_size_kb}}kb). De ce nu încarci acest fișier mare pe un serviciu de distribuție prin cloud și apoi să îi partajezi link-ul?" + too_many_uploads: "Ne pare rău, poți încărca doar câte un fișier." + too_many_dragged_and_dropped_files: "Ne pare rău, poți încărca doar 10 fișiere simultan." + upload_not_authorized: "Ne pare rău, fișierul pe care-l încarci nu este permis (extensii permise: {{authorized_extensions}})." + image_upload_not_allowed_for_new_user: "Ne pare rău, un utilizator nou nu poate încărca imagini." + attachment_upload_not_allowed_for_new_user: "Ne pare rău, un utilizator nou nu poate încărca atașamente." + attachment_download_requires_login: "Ne pare rău, dar trebuie să fii autentificat pentru a descărca ataşamente." abandon: confirm: "Ești sigur că dorești să abandonezi postarea?" - no_value: "Nu, pastrează" + no_value: "Nu, păstrează" yes_value: "Da, abandonează" - via_email: "acest post a sosit via email" + via_email: "această postare a sosit via email" + via_auto_generated_email: "Această postare a sosit prin intermediul unui email auto-generat" + whisper: "această postare este doar pentru moderatori (modul discret)" + wiki: + about: "această postare este un wiki" archetypes: save: 'Opțiuni de salvare' + few_likes_left: "Îți mulțumim că împărtășești aprecierea! Mai ai doar câteva aprecieri pentru azi." controls: - reply: "începe compunerea unui răspuns pentru această postare" - like: "apreciează acestă postăre" + reply: "începe să scrii un răspuns pentru această postare" + like: "apreciează acestă postare" has_liked: "ai apreciat acest răspuns" - undo_like: "anuleazaă aprecierea" + undo_like: "anulează aprecierea" edit: "editează această postare" - edit_anonymous: "Ne pare rău, dar trebuie să fii autentificat pentru a edita acest post." - flag: "marchează privat această postare pentru atenție sau trimite o notificare privată despre aceasta" + edit_anonymous: "Ne pare rău, dar trebuie să fii autentificat pentru a edita această postare." + flag: "marchează această postare ca să-ți atragă atenția sau trimite o notificare privată despre ea" delete: "șterge această postare" - undelete: "rescrie această postare" - share: "distribuie adresa către această postare" + undelete: "restaurează această postare" + share: "distribuie un link către această postare" more: "Mai mult" delete_replies: confirm: - one: "Dorești să ștergi răspunsul direct la acest mesaj?" - few: "Dorești să ștergi cele {{count}} răspunsuri directe la acest mesaj?" - other: "Dorești să ștergi cele {{count}} de răspunsuri directe la acest mesaj?" + one: "Vrei să ștergi răspunsul direct la acest mesaj?" + few: "Vrei să ștergi cele {{count}} răspunsuri directe la acest mesaj?" + other: "Vrei să ștergi cele {{count}} de răspunsuri directe la acest mesaj?" yes_value: "Da, șterge și răspunsurile" no_value: "Nu, doar postarea" - admin: "acțiuni administrative de postare" + admin: "acțiuni administrative pentru postări" wiki: "Fă postarea Wiki" - unwiki: "Anulează stadiul de wiki al postării" - convert_to_moderator: "Adaugă culoarea personalului" - revert_to_regular: "Sterge culoarea personalului" + unwiki: "Nu mai fă Wiki din postare" + convert_to_moderator: "Adaugă culoare pentru staff" + revert_to_regular: "Șterge culoarea pentru staff" rebake: "Reconstruieşte HTML" unhide: "Arată" + change_owner: "Schimbă proprietarul" actions: - flag: 'Semnal' + flag: 'Marchează cu marcaj de avertizare' defer_flags: one: "Amână marcarea" few: "Amână marcările" other: "Amână marcările" undo: - off_topic: "Retrage semnalare" - spam: "Retrage semnalare" - inappropriate: "Retrage semnalare" - bookmark: "Retrage marcare" + off_topic: "Retrage marcaj de avertizare" + spam: "Retrage marcaj de avertizare" + inappropriate: "Retrage marcaj de avertizare" + bookmark: "Șterge semn de carte" like: "Retrage apreciere" vote: "Retrage vot" people: - off_topic: "semnalat ca offtopic" - spam: "somnalat ca spam" - inappropriate: "semnalat ca nepotrivit" + off_topic: "marcat cu marcaj de avertizare \"în afara subiectului\"" + spam: "marcat cu marcaj de avertizare \"spam\"" + inappropriate: "marcat cu marcaj de avertizare \"inadecvat\"" + notify_moderators: "moderatori notificați" + notify_user: "a trimis un mesaj" + bookmark: "a pus semn de carte la asta" + like: "a apreciat asta" + vote: "a votat la asta" by_you: - off_topic: "Ați marcat ca fiind în afara discuției" - spam: "Ați marcat ca fiind spam" - inappropriate: "Ați marcat ca nepotrivit" - notify_moderators: "Ai marcat discuția pentru moderare" - notify_user: "Aţi trimis un mesaj către acest utilizator" - bookmark: "Ați marcat ca semn de carte această postare" - like: "Ați apreciat" - vote: "Ați votat aceasta postare" + off_topic: "Ai marcat asta cu mesaj de avertizare, ca fiind în afara subiectului" + spam: "Ai marcat asta cu mesaj de avertizare, ca fiind spam" + inappropriate: "Ai marcat asta cu mesaj de avertizare, ca fiind inadecvat" + notify_moderators: "Ai marcat asta cu mesaj de avertizare, pentru moderare" + notify_user: "Ai trimis un mesaj către acest utilizator" + bookmark: "Ai marcat ca semn de carte această postare" + like: "Ai apreciat" + vote: "Ai votat aceasta postare" by_you_and_others: off_topic: - one: "Dvs. şi încă o persoană aţi marcat acest mesaj ca fiind în afară discuţiei." - few: "Dvs. şi alte {{count}} persoane aţi marcat acest mesaj ca fiind în afară discuţiei." - other: "Dvs. şi alte {{count}} de persoane aţi marcat acest mesaj ca fiind în afară discuţiei." + one: "Tu şi încă o persoană aţi marcat acest mesaj ca fiind în afară subiectului" + few: "Tu şi alte {{count}} persoane aţi marcat acest mesaj ca fiind în afara subiectului." + other: "Tu şi alte {{count}} de persoane aţi marcat acest mesaj ca fiind în afara subiectului." spam: - one: "Dvs. şi încă o persoană aţi marcat acest mesaj ca spam. " - few: "Dvs. şi alte {{count}} persoane aţi marcat acest mesaj ca spam. " - other: "Dvs. şi alte {{count}} de persoane aţi marcat acest mesaj ca spam. " + one: "Tu şi încă o persoană aţi marcat acest mesaj ca spam. " + few: "Tu şi alte {{count}} persoane aţi marcat acest mesaj ca spam. " + other: "Tu şi alte {{count}} de persoane aţi marcat acest mesaj ca spam. " inappropriate: - one: "Dvs. şi încă o persoană aţi marcat acest mesaj ca inadecvat. " - few: "Dvs. şi alte {{count}} persoane aţi marcat acest mesaj ca inadecvat. " - other: "Dvs. şi alte {{count}} de persoane aţi marcat acest mesaj ca inadecvat. " + one: "Tu şi încă o persoană aţi marcat acest mesaj ca inadecvat. " + few: "Tu şi alte {{count}} persoane aţi marcat acest mesaj ca inadecvat. " + other: "Tu şi alte {{count}} de persoane aţi marcat acest mesaj ca inadecvat. " notify_moderators: - one: "Dvs. şi încă o persoană aţi marcat acest mesaj pentru moderare." - few: "Dvs. şi alte {{count}} persoane aţi marcat acest mesaj pentru moderare." - other: "Dvs. şi alte {{count}} de persoane aţi marcat acest mesaj pentru moderare." + one: "Tu şi încă o persoană aţi marcat acest mesaj pentru moderare." + few: "Tu şi alte {{count}} persoane aţi marcat acest mesaj pentru moderare." + other: "Tu şi alte {{count}} de persoane aţi marcat acest mesaj pentru moderare." notify_user: - one: "Dvs. şi încă o persoană aţi trimis un mesaj către acest utilizator." - few: "Dvs. şi alte {{count}} persoane aţi trimis un mesaj către acest utilizator." - other: "Dvs. şi alte {{count}} de persoane aţi trimis un mesaj către acest utilizator." + one: "Tu şi încă o persoană aţi trimis un mesaj către acest utilizator." + few: "Tu şi alte {{count}} persoane aţi trimis un mesaj către acest utilizator." + other: "Tu şi alte {{count}} de persoane aţi trimis un mesaj către acest utilizator." bookmark: - one: "Dvs. şi încă o persoană aţi pus un semn de carte pentru această postare." - few: "Dvs. şi alte {{count}} persoane aţi pus un semn de carte pentru această postare." - other: "Dvs. şi alte {{count}} de persoane aţi pus un semn de carte pentru această postare." + one: "Tu şi încă o persoană aţi pus un semn de carte pentru această postare." + few: "Tu şi alte {{count}} persoane aţi pus un semn de carte pentru această postare." + other: "Tu şi alte {{count}} de persoane aţi pus un semn de carte pentru această postare." like: - one: "Dvs. şi încă o persoană aţi apreciat aceasta." - few: "Dvs. şi alte {{count}} persoane aţi apreciat aceasta." - other: "Dvs. şi alte {{count}} de persoane aţi apreciat aceasta." + one: "Tu şi încă o persoană aţi apreciat aceasta." + few: "Tu şi alte {{count}} persoane aţi apreciat asta." + other: "Tu şi alte {{count}} de persoane aţi apreciat asta." vote: - one: "Dvs. şi încă o persoană aţi votat pentru această postare." - few: "Dvs. şi alte {{count}} persoane aţi votat pentru această postare." - other: "Dvs. şi alte {{count}} de persoane aţi votat pentru această postare." + one: "Tu şi încă o persoană aţi votat la această postare." + few: "Tu şi alte {{count}} persoane aţi votat la această postare." + other: "Tu şi alte {{count}} de persoane aţi votat la această postare." by_others: off_topic: one: "O persoană a marcat acesta ca fiind în afară discuţiei" @@ -1472,7 +1648,7 @@ ro: notify_moderators: one: "O persoană a marcat acest mesaj pentru moderare" few: "{{count}} persoane au marcat acest mesaj pentru moderare" - other: "{{count}} persoane au marcat acest mesaj pentru moderare" + other: "{{count}} de persoane au marcat acest mesaj pentru moderare" notify_user: one: "o persoană a trimis un mesaj către acest utilizator" few: "{{count}} persoane au trimis un mesaj către acest utilizator" @@ -1491,27 +1667,33 @@ ro: other: "{{count}} de persoane au votat pentru acest mesaj" delete: confirm: - one: "Sunteți sigur că vreți să ștergeți acest mesaj?" - few: "Sunteți sigur că vreți să ștergeți toate aceste mesaje?" - other: "Sunteți sigur că vreți să ștergeți toate aceste mesaje?" + one: "Ești sigur că vrei să ștergi acest mesaj?" + few: "Ești sigur că vrei să ștergi toate aceste mesaje?" + other: "Ești sigur că vrei să ștergi toate aceste mesaje?" + merge: + confirm: + one: "Ești sigur că vrei să aduni laolaltă această postare?" + few: "Ești sigur că vrei să comasezi aceste {{count}} postări?" + other: "Ești sigur că vrei să comasezi aceste {{count}} de postări?" revisions: controls: first: "Prima revizie" previous: "Revizie precedentă" - next: "Urmatoarea revizie" + next: "Următoarea revizie" last: "Ultima revizie" hide: "Ascunde revizia" show: "Afișează revizia" + revert: "Restaurează această revizie" comparing_previous_to_current_out_of_total: "{{previous}} {{current}} / {{total}}" displays: inline: - title: "Arată rezultatul randării cu adăugări și proprietăți" + title: "Arată output-ul randat, cu adăugiri și ștergeri intercalate" button: ' HTML' side_by_side: - title: "Arată proprietățile rezultatului randării una lângă alta" + title: "Arată una lângă alta diferențele din output-ul randat" button: ' HTML' side_by_side_markdown: - title: "Arată sursa de marcare a proprietăților una lângă alta" + title: "Arată una lângă alta diferențele din sursa brută" button: ' Markdown' category: can: 'can… ' @@ -1520,132 +1702,177 @@ ro: choose: 'Selectează o categorie…' edit: 'editează' edit_long: "Editează" - view: 'Arată discuțiile în categorie' + view: 'Arată subiectele din categorie' general: 'General' settings: 'Setări' + topic_template: "Șablon subiect" + tags: "Etichete" + tags_allowed_tags: "În această categorie se pot folosi numai etichetele:" + tags_allowed_tag_groups: "În această categorie se pot folosi numai grupurile de etichete:" + tags_placeholder: "(Opțional) lista etichetelor permise" + tag_groups_placeholder: "(Opțional) lista grupurilor de etichete permise" delete: 'Șterge categorie' - create: 'Creează categorie' - save: 'Salvează categorie' - slug: 'Slug Categorie' + create: 'Categorie nouă' + create_long: 'Creează o categorie nouă' + save: 'Salvare categorie' + slug: 'Categorii propuse' slug_placeholder: '(Opțional) cuvinte-punctate pentru url' - creation_error: S-a semnalat o eroare în timpul creării categoriei. - save_error: S-a semnalat o eroare in timpul salvării categoriei. + creation_error: A apărut o eroare în timpul creării categoriei. + save_error: A apărut o eroare in timpul salvării categoriei. name: "Numele categoriei" description: "Descriere" - topic: "Topicul categoriei" - logo: "Imaginea Logo a categoriei" + topic: "Subiectul categoriei" + logo: " Logo pentru categorie" background_image: "Imaginea de fundal a categoriei" - badge_colors: "Culorile insignei" - background_color: "Culoarea de fundal" - foreground_color: "Culoarea de prim-plan" - name_placeholder: "Unul sau doua cuvinte maximum" - color_placeholder: "Orice culoare" - delete_confirm: "Sigur doriți să ștergeți această categorie?" - delete_error: "S-a semnalat o eroare la ștergerea acestei categorii." - list: "Lista categorii" - no_description: "Va rugăm adăugați o descriere acestei categorii." + badge_colors: "Culori de ecuson" + background_color: "Culoare de fundal" + foreground_color: "Culoare de prim-plan" + name_placeholder: "Unul sau două cuvinte maximum" + color_placeholder: "Orice culoare web" + delete_confirm: "Sigur dorești să ștergi această categorie?" + delete_error: "A apărut o eroare la ștergerea acestei categorii." + list: "Afișare categoriile" + no_description: "Adaugă o descriere acestei categorii." change_in_category_topic: "Editează descrierea" already_used: 'Această culoare este folosită la o altă categorie' security: "Securitate" + special_warning: "Atenție: Această categorie este pre-instalată și setările de securitate nu pot fi editate. Dacă nu dorești să folosești această categorie, va trebui să o ștergi în loc să-i schimbi destinația." images: "Imagini" - auto_close_label: "Auto-inchide discuțiile după:" + auto_close_label: "Închide automat subiectele după:" auto_close_units: "ore" email_in: "Adresa email de primire preferențială:" - email_in_allow_strangers: "Acceptă emailuri de la utilizatori anonimi fară cont" - email_in_disabled: "Postarea discuțiilor noi prin email este dezactivată din setările siteului. Pentru a activa postarea discuțiilor noi prin email," - email_in_disabled_click: 'activarea setării "primire email ".' - allow_badges_label: "Permite acordarea de insigne în această categorie" - edit_permissions: "Editează Permisiuni" - add_permission: "Adaugă Permisiune" + email_in_allow_strangers: "Acceptă emailuri de la utilizatori anonimi fără cont" + email_in_disabled: "Postarea subiectelor noi prin email este dezactivată din setările siteului. Pentru a activa postarea subiectelor noi prin email," + email_in_disabled_click: 'activează opțiunea "primire email ".' + suppress_from_homepage: "Elimină această categorie de pe pagina principală." + allow_badges_label: "Permite acordarea de ecusoane în această categorie" + edit_permissions: "Editează permisiuni" + add_permission: "Adaugă permisiune" this_year: "anul acesta" position: "poziție" default_position: "Poziție inițială" - position_disabled: "Categoriile vor fi afișate în ordinea activitații. Pentru a controla ordinea categoriilor în listă, " - position_disabled_click: 'activeaza setarea "poziția fixa a categoriei".' - parent: "Categoria parinte" + position_disabled: "Categoriile vor fi afișate în ordinea activității. Pentru a controla ordinea categoriilor în listă, " + position_disabled_click: 'activează setarea "poziția fixă a categoriei".' + parent: "Categorie părinte" notifications: watching: - title: "Vizualizare" + title: "Urmărind activ" + description: "Vei urmări automat toate subiectele din aceste categorii. Vei fi notificat cu privire la fiecare nouă postare din fiecare subiect, și va fi afișat un contor al noilor răspunsuri." + watching_first_post: + title: "Urmărind activ prima postare" + description: "Vei fi notificat doar cu privire la primele postări din fiecare nou subiect din aceste categorii." tracking: title: "Urmărire" + description: "Vei urmări automat toate subiectele din aceste categorii. Vei fi notificat dacă cineva îți menționează @numele sau îți răspunde, și va fi afișat un contor al noilor răspunsuri." regular: title: "Normal" - description: "Veți fi notificat dacă cineva vă menționează @numele sau vă scrie un reply." + description: "Vei fi notificat dacă cineva îți menționează @numele sau îți răspunde." muted: - title: "Silențios" + title: "Setat pe silențios" + description: "Nu vei fi niciodată notificat cu privire la nimic legat de noile subiecte din aceste categorii și ele nu vor apărea în listă." flagging: - title: 'Mulțumim că ne ajuți să păstrăm o comunitate civilizată!' + title: 'Îți mulțumim că ne ajuți să păstrăm o comunitate civilizată!' action: 'Marcare' - take_action: "Actionează" + take_action: "Acționează" notify_action: 'Mesaj' - official_warning: 'Avertismen Oficial' + official_warning: 'Avertizare oficială' delete_spammer: "Șterge spammer" - yes_delete_spammer: "Da, Șterge spammer" + delete_confirm_MF: "Ești pe cale să ștergi {POSTS, plural, one {1 postare} other {# postări}} și {TOPICS, plural, one {1 subiect} other {# subiecte}} de la acest utilizator, și să îi ștergi contul, blochezi înscrierile de pe IP-ul lui {ip_address}, și să îi adăugi adresa de email {email} pe lista celor blocate permanent. Ești sigur că acest utilizator este spammer?" + yes_delete_spammer: "Da, șterge spammer" ip_address_missing: "(N/A)" hidden_email_address: "(ascuns)" - submit_tooltip: "Acceptă marcarea privată" - take_action_tooltip: "Accesati permisiunea marcarii imediat, nu mai asteptati alte marcaje comune" - cant: "Ne pare rău nu puteți marca această postare deocamdată." - notify_staff: 'Notifică un moderator în privat' + submit_tooltip: "Trimite marcaj de avertizare privat" + take_action_tooltip: "Se trimite marcajul de avertizare imediat, în loc să se aștepte și alte marcaje de avertizare ale comunității" + cant: "Ne pare rău, deocamdată nu poți marca această postare cu marcaj de avertizare." + notify_staff: 'Notifică în privat un moderator ' formatted_name: - off_topic: "În afară discuției" - inappropriate: "Inadecvat" - spam: "Este Spam" - custom_placeholder_notify_user: "De ce această postare necesită comunicarea cu utilizatorul directă sau privată? Fiți specific, constructiv și intotdeauna amabil." - custom_placeholder_notify_moderators: "De ce această postare necesită atenția moderatorului? Spuneți-ne exact ceea ce vă nelamurește, și oferiți adrese relevante de câte ori e posibil." + off_topic: "În afara subiectului" + inappropriate: "E inadecvat" + spam: "E spam" + custom_placeholder_notify_user: "Fii specific, constructiv și întotdeauna amabil." + custom_placeholder_notify_moderators: "Spune-ne exact ceea ce te preocupă, și dă-ne și link-uri relevante de câte ori e posibil." + custom_message: + at_least: + one: "introdu cel puțin un caracter" + few: "introdu cel puțin {{count}} caractere" + other: "introdu cel puțin {{count}} de caractere" + more: + one: "încă {{count}} ..." + few: "încă {{count}} ..." + other: "încă {{count}} ..." + left: + one: "a mai rămas {{count}} ..." + few: "au mai rămas {{count}} ..." + other: "au mai rămas {{count}} ..." flagging_topic: - title: "De ce marcați privat această discuție?" - action: "Marchează discuție" + title: "Îți mulțumim că ne ajuți să păstrăm o comunitate civilizată!" + action: "Marchează subiectul cu marcaj de avertizare" notify_action: "Mesaj" topic_map: - title: "Sumarul discuției" - participants_title: "Posteri Frecvenţi" - links_title: "Legături Populare" + title: "Rezumatul subiectului" + participants_title: "Postaci frecvenţi" + links_title: "Legături populare" + links_shown: "arată mai multe link-uri..." clicks: one: "1 click" few: "%{count} click-uri" - other: "%{count} click-uri" + other: "%{count} de click-uri" + post_links: + about: "afișează mai multe link-uri din această postare" + title: + one: "mai e %{count}" + few: "mai sunt %{count}" + other: "mai sunt %{count}" topic_statuses: warning: help: "Aceasta este o avertizare oficială." bookmarked: - help: "Aţi pus un semn de carte pentru această discuţie" + help: "Ai pus un semn de carte pentru această discuţie" locked: - help: "Această discuție este închisă; nu mai acceptă răspunsuri noi" + help: "Acest subiect este închis; nu mai acceptă răspunsuri noi" archived: - help: "Această discuție a fost arhivată; Este închetată și nu poate fi editată" + help: "Acest subiect a fost arhivat; Este înghețat și nu poate fi schimbat" + locked_and_archived: + help: "Acest subiect este închis și arhivat; nu mai acceptă răspunsuri noi și nu mai poate fi schimbat." unpinned: - title: "Desprinde" - help: "Această discuţie va fi afişată în ordinea iniţială, nici un mesaj nu este promovat la inceputul listei." + title: "Ne-fixate" + help: "Această subiect este ne-fixat, acum va fi afișat în ordine normală." pinned_globally: - title: "Promovat Global" + title: "Fixat la nivel global" + help: "Acest subiect este fixat la nivel global; va fi afișat în vârful celor mai recente din categoria sa" pinned: - title: "Promovat" - help: "Aceast mesaj va fi promovat. Va fi afişat la începutul discuţiei." + title: "Fixat" + help: "Acest subiect este fixat. Va fi afișat la începutul categoriei din care face parte." invisible: - help: "Această discuție este invizibilă; nu va fi afișată în listele de discuții și va fi accesată numai prin adresa directă" + help: "Acest subiect este invizibil; nu va fi afișat în listele de subiecte și va putea fi accesat numai prin link direct" posts: "Postări" - posts_long: "sunt {{number}} de postări în această discuție" - original_post: "Postări originale" + posts_long: "sunt {{number}} (de) postări în acest subiect" + posts_likes_MF: | + Acest subiect are {count, plural, one {1 răspuns} other {# răspunsuri}} {ratio, select, + jos {cu o rată înaltă de aprecieri pe postare} + med {cu o foarte înaltă rată de aprecieri pe postare} + înalt {cu o rată extrem de înaltă de aprecieri pe postare} + other {}} + original_post: "Postare inițială" views: "Vizualizări" views_lowercase: one: "vizualizare" few: "vizualizări" - other: "vizualizări" + other: "de vizualizări" replies: "Răspunsuri" - views_long: "această discuție a fost vizualizată de {{number}} de ori" + views_long: "acest subiect a fost vizualizat de {{number}} (de) ori" activity: "Activitate" likes: "Aprecieri" likes_lowercase: one: "apreciere" few: "aprecieri" other: "aprecieri" - likes_long: "sunt {{number}} aprecieri în această discuție" + likes_long: "sunt {{number}} (de) aprecieri în acest subiect" users: "Utilizatori" users_lowercase: one: "utilizator" few: "utilizatori" - other: "utilizatori" + other: "de utilizatori" category_title: "Categorie" history: "Istoric" changed_by: "de {{author}}" @@ -1654,54 +1881,67 @@ ro: not_available: "Indisponibil!" categories_list: "Listă categorii" filters: - with_topics: "%{filter} Discuții" - with_category: "%{filter} %{category} discuții" + with_topics: "%{filter} subiecte" + with_category: "%{filter} %{category} subiecte" latest: - title: "Ultimele" + title: "Cele mai recente" title_with_count: - one: "Ultimele (1)" - few: "Ultimele ({{count}})" - other: "Ultimele ({{count}})" - help: "Discuții cu postări recente" + one: "Cel mai recent (1)" + few: "Cele mai recente ({{count}})" + other: "Cele mai recente ({{count}})" + help: "subiecte cu postări recente" hot: title: "Interesant" - help: "o selecție a discuțiilor interesante" + help: "o selecție a celor mai interesante subiecte" read: title: "Citite" - help: "Discuții citite, în ordinea cronologică a citirii" + help: "Subiecte citite, în ordinea cronologică a citirii" search: title: "Caută" - help: "caută în toate discuțiile" + help: "caută în toate subiectele" categories: title: "Categorii" title_in: "Categoria - {{categoryName}}" - help: "toate discuțiile grupate pe categorii" + help: "toate subiectele grupate pe categorii" unread: title: "Necitite" title_with_count: one: "Necitit (1)" few: "Necitite ({{count}})" other: "Necitite ({{count}})" - help: "discuțiile pe care le vizualizați sau urmariți momentan ce includ postări necitite" + help: "subiecte pe care le urmărești activ sau cele pe care le urmărești și care includ postări necitite" + lower_title_with_count: + one: "{{count}} necitit" + few: "{{count}} necitite" + other: "{{count}} necitite" new: + lower_title_with_count: + one: "{{count}} nou" + few: "{{count}} noi" + other: "{{count}} noi" lower_title: "nou" title: "Noi" title_with_count: one: "Nou (1)" few: "Noi ({{count}})" other: "Noi ({{count}})" - help: "discuții create în ultimele zile" + help: "subiecte create în ultimele zile" posted: title: "Postările mele" - help: "discuții în care ați postat" + help: "subiecte în care ai postat" bookmarks: title: "Semne de carte" - help: "discuții cu semne de carte" + help: "subiecte cu semne de carte" category: - help: "discuțiile recente din categoria {{categoryName}}" + title: "{{categoryName}}" + title_with_count: + one: "{{categoryName}} (1)" + few: "{{categoryName}} ({{count}})" + other: "{{categoryName}} ({{count}})" + help: "subiecte recente din categoria {{categoryName}}" top: title: "Top" - help: "o selecție a celor mai bune discuții din ultimul an, lună sau zi" + help: "o selecție a celor mai bune subiecte din ultimul an, ultima lună sau zi" all: title: "Dintotdeauna" yearly: @@ -1718,124 +1958,296 @@ ro: this_year: "An" this_quarter: "Trimestru" this_month: "Lună" - this_week: "Săptămană" + this_week: "Săptămână" today: "Astăzi" other_periods: "vezi topul" - browser_update: 'Din nefericire, browserul dumneavoastră este prea vechi pentru a funcționa pe acest forum . Va rugăm reânoiți browserul.' + browser_update: 'Din nefericire, browserul tău este prea vechi pentru a funcționa pe acest forum . Te rugăm actualizează browserul.' permission_types: full: "Creează / Răspunde / Vizualizează" - create_post: "Răspunde / Vizualizaează" - readonly: "Vizualizaează" + create_post: "Răspunde / Vizualizează" + readonly: "Doar citire" + lightbox: + download: "descărcare" + search_help: + title: 'Ajutor căutare' + keyboard_shortcuts_help: + title: 'Scurtături de tastatură' + jump_to: + title: 'Sari la' + home: 'g, h Acasă' + latest: 'g, l Cele mai recente' + new: 'g, n Noi' + unread: 'g, u Necitite' + categories: 'g, c Categorii' + top: 'g, t Top' + bookmarks: 'g, b Semne de carte' + profile: 'g, p Profil' + messages: 'g, m Mesaje' + navigation: + title: 'Navigare' + jump: '# Mergi la postarea #' + back: 'u Înapoi' + up_down: 'k/j Mută selecția ↑ ↓' + open: 'o or Intră Deschide subiectul selectat' + next_prev: 'shift+j/shift+k Secțiunea următoare/anterioară' + application: + title: 'Aplicație' + create: 'Creează subiect nou' + notifications: 'n Deschide notificări' + hamburger_menu: '= Deschide meniu hamburger' + user_profile_menu: 'p Deschide meniu utilizator' + show_incoming_updated_topics: '. Arată subiectele actualizate' + search: '/ Caută' + help: '? Deschide ajutor tastatură' + dismiss_new_posts: 'x, r Abandonează postări noi' + dismiss_topics: 'x, t Abandonează subiecte' + log_out: 'shift+z shift+z Ieșire' + actions: + title: 'Acțiuni' + bookmark_topic: 'f Comută semnul de carte pentru subiect' + pin_unpin_topic: 'shift+p Fixează/Desprinde subiect' + share_topic: 'shift+s Distribuie subiect' + share_post: 's distribuie postare' + reply_as_new_topic: 't Răspunde ca subiect link-uit' + reply_topic: 'shift+r Răspunde la subiect' + reply_post: 'r Răspunde la postare' + quote_post: 'q Citează postare' + like: 'l Apreciază postare' + flag: '! Marchează postare cu marcaj de avertizare' + bookmark: 'b Marchează postare cu semn de carte' + edit: 'e Editează postare' + delete: 'd Șterge postare' + mark_muted: 'm, m Setează subiect pe silențios' + mark_regular: 'm, r Subiect obișnuit (implicit)' + mark_tracking: 'm, t Urmărește subiect' + mark_watching: 'm, w Urmărește activ subiect' badges: + earned_n_times: + one: "A primit acest ecuson o dată" + few: "A primit acest ecuson de %{count} ori" + other: "A primit acest ecuson de %{count} de ori" + granted_on: "Acordat pe %{date}" + others_count: "Numărul celorlalți care au acest ecuson (%{count})" + title: Ecusoane + allow_title: "titlu disponibil" + multiple_grant: "acordat de mai multe ori" + badge_count: + one: "%{count} ecuson" + few: "%{count} ecusoane" + other: "%{count} de ecusoane" more_badges: one: "Încă una" few: " Alte %{count}" other: " Alte %{count}" + granted: + one: "%{count} acordat" + few: "%{count} acordate" + other: "%{count} acordate" + select_badge_for_title: Selectați un ecuson pentru a-l folosi ca titlu + none: "" + badge_grouping: + getting_started: + name: Cum începem + community: + name: Comunitate + trust_level: + name: Nivel de încredere + other: + name: Altele + posting: + name: Care postează + google_search: | +

Caută cu Google

+

+

+

+ tagging: + all_tags: "Toate etichetele" + selector_all_tags: "toate etichetele" + selector_no_tags: "fără etichete" + changed: "etichete schimbate:" + tags: "Etichete" + choose_for_topic: "alege etichetele opționale pentru acest subiect" + delete_tag: "Șterge etichetă" + delete_confirm: "Ești sigur că vrei să ștergi această etichetă?" + rename_tag: "Redenumire etichetă" + rename_instructions: "Alege un nume nou pentru etichetă:" + sort_by: "Sortat după:" + sort_by_count: "contor" + sort_by_name: "nume" + manage_groups: "Gestionare grupuri de etichete" + manage_groups_description: "Definește grupuri pentru a organiza etichetele" + filters: + without_category: "%{filter} %{tag} subiecte" + with_category: "%{filter} %{tag} subiecte în %{category}" + untagged_without_category: "%{filter} subiecte fără etichetă" + untagged_with_category: "%{filter} subiecte fără etichetă în %{category}" + notifications: + watching: + title: "Urmărind activ" + description: "Vei urmări activ în mod automat toate subiectele cu această etichetă. Vei fi notificat cu privire la toate noile postări și subiecte, și în plus, un contor al postărilor noi și al celor necitite va apărea în dreptul subiectului." + watching_first_post: + title: "Urmărind activ prima postare" + description: "Vei fi notificat doar cu privire la prima postare din fiecare nou subiect cu această etichetă." + tracking: + title: "Urmărind" + description: "Vei urmări automat toate subiectele cu această etichetă. Un contor cu postările necitite și cu cele noi va apărea lingă subiect." + regular: + title: "Utilizator frecvent" + description: "Vei fi notificat dacă cineva îți menționează @numele sau răspunde la postare." + muted: + title: "Silențios" + description: "Nu vei fi notificat cu privire la nimic legat de noile subiecte cu această etichetă și ele nu vor apărea în tab-ul cu subiecte necitite." + groups: + title: "Grupuri de etichete" + about: "Adaugă etichete la grupuri pentru a le gestiona mai ușor." + new: "Grup nou" + tags_label: "Etichete din acest grup:" + parent_tag_label: "Etichetă părinte:" + parent_tag_placeholder: "Opțional" + parent_tag_description: "Etichetele din acest grup nu pot fi folosite dacă eticheta părinte nu este prezentă." + one_per_topic_label: "Limitare la o singură etichetă pe subiect din acest grup" + new_name: "Grup nou de etichete" + save: "Salvează" + delete: "Șterge" + confirm_delete: "Ești sigur că vrei să ștergi acest grup de etichete?" + topics: + none: + unread: "Nu ai niciun subiect necitit." + new: "Nu ai niciun subiect nou." + read: "Nu ai citit nici un subiect până acum." + posted: "Nu ai postat încă la nici un subiect." + latest: "Nu există subiecte recente." + hot: "Nu există subiecte interesante." + bookmarks: "Nu există încă subiecte cu semn de carte." + top: "Nu există încă subiecte de top." + search: "Nu există rezultate pentru căutare." + bottom: + latest: "Nu mai există alte subiecte recente." + hot: "Nu mai există alte subiecte interesante." + posted: "Nu mai există alte subiecte postate." + read: "Nu mai exisă subiecte citite." + new: "Nu mai există alte subiecte noi." + unread: "Nu mai există subiecte necitite." + top: "Nu mai există subiecte de top." + bookmarks: "Nu mai există subiecte cu semn de carte." + search: "Nu mai există alte rezultate pentru căutare." + invite: + custom_message: "Dă un aer un pic mai personal invitației tale scriind un" + custom_message_link: "mesaj personalizat" + custom_message_placeholder: "Introdu mesajul tău personalizat" + custom_message_template_forum: "Salutare! Ar trebui să te alături acestui forum!" + custom_message_template_topic: "Salutare! Cred că o să îți placă acest subiect!" admin_js: type_to_filter: "tastează pentru a filtra..." admin: - title: 'Discurs Admin' + title: 'Admin Discourse' moderator: 'Moderator' dashboard: - title: "Spațiu de lucru" - last_updated: "Actualizările spațiului de lucru:" + title: "Panou de control" + last_updated: "Panou de control actualizat ultima dată:" version: "Versiune" - up_to_date: "Sunteți la zi!" - critical_available: "O actualizare importantă este valabilă." - updates_available: "Actualizări sunt disponibile." - please_upgrade: "Vă rugăm upgradați!" - no_check_performed: "O căutare a actualizărilor nu a fost făcută. Asigurați-vă că sidekiq este pornit." - stale_data: "O căutare a actualizărilor nu a fost făcută în ultimul timp. Asigurați-vă că sidekiq este pornit." - version_check_pending: "Se pare că ați actualizat recent. Fantastic!" - installed_version: "Instalat" + up_to_date: "Ești la zi!" + critical_available: "O actualizare importantă este disponibilă." + updates_available: "Sunt disponibile actualizări." + please_upgrade: "Te rugăm actualizează!" + no_check_performed: "Nu s-au căutat actualizări. Verifică dacă sidekiq este pornit." + stale_data: "Nu s-au căutat actualizări în ultimul timp. Verifică dacă că sidekiq este pornit." + version_check_pending: "Se pare că ai actualizat recent. Fantastic!" + installed_version: "Instalată" latest_version: "Ultima" - problems_found: "Ceva probleme s-au întâmpinat la instalarea discursului:" - last_checked: "Ultima dată verificat" + problems_found: "Au fost niște probleme la instalarea Discourse:" + last_checked: "Ultima verificare" refresh_problems: "Reîmprospătează" - no_problems: "Nicio problemă semnalată." + no_problems: "Nu a apărut nicio problemă." moderators: 'Moderatori:' admins: 'Admini:' blocked: 'Blocați:' suspended: 'Suspendați:' - private_messages_short: "Msgs" + private_messages_short: "Msje" private_messages_title: "Mesaje" mobile_title: "Mobil" space_free: "{{size}} liber" uploads: "încărcări" backups: "copii de siguranță" - traffic_short: "trafic" + traffic_short: "Trafic" traffic: "Cereri web" page_views: "Cereri API" page_views_short: "Cereri API" - show_traffic_report: "Arată Raportul de Trafic detaliat" + show_traffic_report: "Arată raportul detaliat cu privire la trafic" reports: - today: "astăzi" + today: "Astăzi" yesterday: "Ieri" - last_7_days: "din ultimele 7 zile" - last_30_days: "din ultimele 30 de zile" - all_time: "Din totdeauna" + last_7_days: "Din ultimele 7 zile" + last_30_days: "Din ultimele 30 de zile" + all_time: "Dintotdeauna" 7_days_ago: "Acum 7 zile" 30_days_ago: "Acum 30 de zile" all: "Toate" - view_table: "Arată ca tabel" - refresh_report: "Reactualizează Raportul" + view_table: "tabel" + view_graph: "grafic" + refresh_report: "Reactualizează raportul" start_date: "Data de început " end_date: "Data de sfârşit" groups: "Toate grupurile" commits: - latest_changes: "Ultimele schimbări: Vă rugăm reactualizați des!" + latest_changes: "Cele mai recente schimbări: te rugăm actualizează frecvent!" by: "de către" flags: - title: "Marcaje" + title: "Marcaje de avertizare" old: "Vechi" active: "Active" agree: "De acord" agree_title: "Confirmă acest marcaj ca valid și corect" agree_flag_modal_title: "De acord și..." agree_flag_hide_post: "De acord (ascunde postarea + trimite MP)" - agree_flag_hide_post_title: "Ascunde acest post şi trimite un mesaj urgent utilizatorului să îl editeze." - agree_flag_restore_post: "De acord (restaurare post)" - agree_flag_restore_post_title: "Restaurează acest post" - agree_flag: "De acord cu marcarea" - agree_flag_title: "De acord cu marcarea și menține postarea neschimbată" + agree_flag_hide_post_title: "Ascunde această postare și trimite automat un mesaj utilizatorului, cerându-i insistent să îl editeze." + agree_flag_restore_post: "De acord (restaurare postare)" + agree_flag_restore_post_title: "Restaurează această postare" + agree_flag: "De acord cu marcajul de avertizare" + agree_flag_title: "De acord cu marcajul de avertizare și menține postarea neschimbată" defer_flag: "Amânare" - defer_flag_title: "Scoate marcajul; Nu necesită o acțiune deocamdată." - delete: "Ștergere" - delete_title: "Șterge postarea la care face referința marcajul." - delete_post_defer_flag: "Șterge postarea și renunță la marcaj" - delete_post_defer_flag_title: "Șterge postarea; dacă este prima, șterge discuția" - delete_post_agree_flag: "Șterge postarea și aprobă marcajul" - delete_post_agree_flag_title: "Șterge postarea; dacă este prima, sterge discuția" - delete_flag_modal_title: "Ștergere și..." - delete_spammer: "Ștergere Spammer" - delete_spammer_title: "Șterge utilizatorul , postările și discuțiile acestuia." + defer_flag_title: "Scoate marcajul de avertizare; Nu necesită nicio acțiune deocamdată." + delete: "Șterge" + delete_title: "Șterge postarea la care se referă marcajul de avertizare." + delete_post_defer_flag: "Șterge postarea și amână decizia privind marcajul de avertizare" + delete_post_defer_flag_title: "Șterge postarea; dacă este prima, șterge subiectul" + delete_post_agree_flag: "Șterge postarea și aprobă marcajul de avertizare" + delete_post_agree_flag_title: "Șterge postarea; dacă este prima, șterge subiectul" + delete_flag_modal_title: "Șterge și..." + delete_spammer: "Șterge spammer" + delete_spammer_title: "Șterge utilizatorul, postările și subiectele acestuia." disagree_flag_unhide_post: "Nu sunt de acord (arată postarea)" - disagree_flag_unhide_post_title: "Înlătură orice marcaj din postare și fă postarea din nou vizibilă" + disagree_flag_unhide_post_title: "Elimină orice marcaj de avertizare din postare și fă din nou vizibilă postarea" disagree_flag: "Nu sunt de acord" - disagree_flag_title: "Refuză marcaj, acesta fiind invalid sau incorect" + disagree_flag_title: "Refuză marcaj ca fiind nevalid sau incorect" clear_topic_flags: "Terminat" - clear_topic_flags_title: "Discuția a fost analizată iar problema rezolvată. Face-ți click pe Terminat pentru a înlătura marcajul." - more: "(detalii...)" + clear_topic_flags_title: "Subiectul a fost analizat iar problema rezolvată. Fă click pe Terminat pentru a înlătura marcajele." + more: "(mai multe răspunsuri...)" dispositions: - agreed: "de acord" - disagreed: "Nu sunt de acord" - deferred: "amânat" + agreed: "aprobate" + disagreed: "respinse" + deferred: "amânate" flagged_by: "Marcat de către" - resolved_by: "Resolvat de către" + resolved_by: "Rezolvat de " took_action: "A luat măsuri" system: "Sistem" - error: "Ceva a nu a funcționat" + error: "Ceva nu a funcționat" reply_message: "Răspunde" no_results: "Nu există marcaje." - topic_flagged: "Această discuție a fost marcată." - visit_topic: "Vizualizați discuția pentru a acționa." - was_edited: "Mesajul a fost editat după primul semn" - previous_flags_count: "Acest mesaj a fost deja marcat de {{count}} ori." + topic_flagged: "Aceast subiect a fost marcat cu marcaj de avertizare." + visit_topic: "Vizualizează subiectul pentru a acționa." + was_edited: "Mesajul a fost editat după primul marcaj" + previous_flags_count: "Acest mesaj a fost deja marcat de {{count}} (de) ori." summary: action_type_3: - one: "în afară discuţiei" - few: "în afară discuţiei x{{count}}" - other: "în afară discuţiei x{{count}}" + one: "în afara subiectului" + few: "în afara subiectului x{{count}}" + other: "în afara subiectului x{{count}}" action_type_4: one: "inadecvat" few: "inadecvat x{{count}}" @@ -1856,15 +2268,15 @@ ro: primary: "Grup primar" no_primary: "(nu există grup primar)" title: "Grupuri" - edit: "Editează Grupuri" + edit: "Editează grupuri" refresh: "Reîmprospătează" new: "Noi" - selector_placeholder: "adaugă utilizatori" - name_placeholder: "Numele grupului, fără spații, asemenea regulii de utilizator" - about: "Editează aici apartentența la grupuri și numele" + selector_placeholder: "introdu nume de utilizator" + name_placeholder: "Numele grupului, fără spații, asemenea regulii de la numele de utilizator" + about: "Editează aici numele și apartenența la grupuri" group_members: "Membrii grupului" - delete: "Ștergere" - delete_confirm: "Șterg acest grup?" + delete: "Șterge" + delete_confirm: "Ștergi acest grup?" delete_failed: "Imposibil de șters grupul. Dacă este unul automat, nu se poate șterge." delete_member_confirm: "Şterge '%{username}' din grupul '%{group}'?" delete_owner_confirm: "Revocă dreptul de proprietar pentru '%{username}'?" @@ -1873,31 +2285,112 @@ ro: add_members: "Adaugă membri" custom: "Personalizat" bulk_complete: "Utilizatorii au fost adăugați în grup." - bulk: "Adaugă în grup la grămadă" - bulk_paste: "Lipiți o listă de utilizatori sau email-uri, unul pe linie:" - bulk_select: "(selectați un grup)" + bulk: "Adaugă în grup mai mulți utilizatori odată" + bulk_paste: "Lipește o listă de utilizatori sau email-uri, câte unul pe linie:" + bulk_select: "(selectează un grup)" automatic: "Automat" - automatic_membership_email_domains: "Utilizatorii care se înregistrează cu un domeniu de email care se potriveşte cu unul din lista va fi adăugat automat în aces grup:" - automatic_membership_retroactive: "Aplicaţi aceeaşi regulă pentru domeniul de email pentru a adaugă utilizatorii existenţi" - default_title: "Titlu automat pentru toţi utilizatorii din acest grup" - primary_group: "Setează automat că grup primar" + automatic_membership_email_domains: "Utilizatorii care se înregistrează cu un domeniu de email identic cu unul din lista asta vor fi adăugați automat în acest grup:" + automatic_membership_retroactive: "Aplică aceeaşi regulă pentru domeniul de email pentru a adauga utilizatorii existenţi" + default_title: "Titlu implicit pentru toți utilizatorii din acest grup" + primary_group: "Setează automat ca grup principal" group_owners: Proprietari add_owners: Adaugă proprietari - incoming_email_placeholder: "introduceți adresa de email" + incoming_email: "Adresă de primire emailuri personalizată" + incoming_email_placeholder: "introducere adresă de email" + flair_url: "Imagine avatar cu element distinct" + flair_url_placeholder: "(Opțional) URL-ul imagine sau clasă Font Awesome" + flair_bg_color: "Culoarea de fundal a avatarului cu element distinct" + flair_bg_color_placeholder: "(Opțional) Valoarea Hex a culorii" + flair_color: "Culoarea avatarului cu element distinct" + flair_color_placeholder: "(Opțional) Valoarea Hex a culorii" + flair_preview: "Previzualizare" + flair_note: "Observație: Elementul distinct va fi afișat doar pentru grupul principal al utilizatorului." api: generate_master: "Generează cheie API principală" none: "Nu sunt chei API principale active deocamdată." user: "Utilizator" title: "API" key: "Cheie API" - generate: "Generează" - regenerate: "Regenerează" - revoke: "Revocare" - confirm_regen: "Sunteți sigur ca doriți să înlocuiți această cheie API cu una nouă?" - confirm_revoke: "Sunteți sigur ca doriți să revocați acea cheie?" - info_html: "Cheia dumneavoastră API vă permite să creați și să actualizați discuții folosind sintaxa JSON." + generate: "Generare" + regenerate: "Regenerare" + revoke: "Revocă" + confirm_regen: "Ești sigur că dorești să înlocuiești această cheie API cu una nouă?" + confirm_revoke: "Ești sigur că dorești să revoci această cheie?" + info_html: "Cheia ta API îți permite să creezi și să actualizezi subiecte folosind sintaxa JSON." all_users: "Toți utilizatorii" - note_html: "Păstrează această cheie secretă, toți utilizatorii ce o detin pot crea postări arbitrare pe forum ca oricare alt utilizator." + note_html: "Păstrează această cheie secretă, toți utilizatorii ce o dețin pot crea postări arbitrare pe forum dându-se drept oricare alt utilizator." + web_hooks: + title: "Webhooks" + none: "Momentan nu există nici un webhook" + instruction: "Webhooks permit Discourse să notifice servicii externe atunci când anumite evenimente se petrec pe site. Când un webhook este declanșat, o interogare POST va fi trimisă la URL-urile menționate." + detailed_instruction: "O interogare POST va fi trimisă catre URL-ul menționat atunci când se produc evenimentele alese." + new: "Nou webhook" + create: "Creează" + save: "Salvează" + destroy: "Șterge" + description: "Descriere" + controls: "Controale" + go_back: "Înapoi la listă" + payload_url: "URL-ul încărcăturii " + payload_url_placeholder: "https://example.com/postreceive" + 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" + event_chooser: "Ce evenimente vrei să declanșeze acest webhook?" + wildcard_event: "Trimite-mi orice." + individual_event: "Selectează evenimente individuale." + verify_certificate: "Verifică certificatul TSL al URL-ului încărcăturii" + active: "Active" + active_notice: "Vom livra detaliile evenimentului atunci când acesta se va produce." + categories_filter_instructions: "Webhook-urile relevante se vor declanșa numai dacă evenimentul este legat de categoriile specificate. Lasă liber pentru a declanșa webhooks pentru toate categoriile." + categories_filter: "Categorii declanșate" + groups_filter_instructions: "Webhook-urile relevante vor fi declanșate dacă evenimentul este legat de grupuri specificate. Lasă liber pentru a declanșa webhooks pentru toate grupurile." + groups_filter: "Grupuri declanșate" + delete_confirm: "Șterge acest webhook?" + topic_event: + name: "Eveniment subiect" + details: "Atunci când există un subiect nou, revizuit, schimbat sau șters." + post_event: + name: "Eveniment postare" + details: "Atunci când exista un răspuns nou, editat, șters sau recuperat." + user_event: + name: "Eveniment utilizator" + details: "Atunci când un utilizator este creat sau aprobat." + delivery_status: + title: "Starea livrării" + inactive: "Inactivă" + failed: "Eșuată" + successful: "Cu succes" + events: + none: "Nu există evenimente înrudite." + redeliver: "Livrează din nou" + incoming: + one: "Există un nou eveniment " + few: "Există {{count}} noi evenimente." + other: "Există {{count}} de noi evenimente." + completed_in: + one: "Terminat într-o secundă." + few: "Terminat în {{count}} secunde." + other: "Terminat în {{count}} de secunde." + request: "Cerere" + response: "Răspuns" + redeliver_confirm: "Ești sigur ca vrei să livrezi din nou aceeași încărcătură?" + headers: "Antete" + payload: "Încărcătură" + body: "Corp" + go_list: "Mergi la listă" + go_details: "Editează webhook" + go_events: "Mergi la evenimente" + ping: "Ping" + status: "Cod de stare" + event_id: "ID" + timestamp: "Creat" + completion: "Timp finalizare" + actions: "Acțiuni" plugins: title: "Plugin-uri" installed: "Plugin-uri instalate" @@ -1907,15 +2400,23 @@ ro: enabled: "Activat?" is_enabled: "D" not_enabled: "N" - change_settings: "Schimbă Setările" + change_settings: "Schimbă setările" change_settings_short: "Setări" howto: "Cum instalez un plugin?" backups: - title: "Copii de siguranță" + title: "Backup-uri" menu: - backups: "Copii de siguranță" + backups: "Backup-uri" logs: "Rapoarte" none: "Nici o copie de siguranță disponibilă." + read_only: + enable: + title: "Activează modul exclusiv-citire" + label: "Activează exclusiv-citire" + confirm: "Ești sigur că vrei să activezi modul exclusiv-citire?" + disable: + title: "Dezactivează modul exclusiv-citire" + label: "Dezactivează exclusiv-citire" logs: none: "Nu există rapoarte..." columns: @@ -1923,58 +2424,60 @@ ro: size: "Mărime" upload: label: "Încarcă" - title: "Încarcă o copie de siguranţă în această instanţa." - uploading: "ÎNCARCĂ" + title: "Încarcă un backup în această instanță." + uploading: "Se încarcă..." success: "fișierul '{{filename}}' a fost încărcat cu succes." - error: "S-a semnalat o eroare la încărcarea fișierului '{{filename}}': {{message}}" + error: "A apărut o eroare la încărcarea fișierului '{{filename}}': {{message}}" operations: is_running: "O altă operație este în desfășurare..." - failed: "operația {{operation}} nu s-a finalizat. Vă rugăm verificați rapoartele." + failed: "operația {{operation}} nu s-a finalizat. Te rugăm verifică rapoartele." cancel: - label: "Anulează" + label: "Anulare" title: "Anulează operația curentă" - confirm: "Sunteți sigur că doriți să anulați operația curentă?" + confirm: "Ești sigur că dorești să anulezi operația curentă?" backup: - label: "Salvare de siguranţă" - title: "Creați o copie de siguranță" - confirm: "Ești sigur că vrei să faci o nouă copie de siguranță?" + label: "Backup" + title: "Creează un backup" + confirm: "Ești sigur că vei să începi o nouă operațiune de backup?" without_uploads: "Da (nu include fişierele)" download: - label: "Descarcă" - title: "Downloadează copia de siguranță" + label: "Descărcare" + title: "Descarcă backup-ul" destroy: - title: "Sterge copie de siguranță" - confirm: "Ești sigur ca vrei să ștergi această copie de siguranță?" + title: "Șterge backup-ul" + confirm: "Ești sigur că vrei să ștergi această copie de siguranță?" restore: - is_disabled: "Restabilirea este dezactivată din setările siteului." - label: "Restaurează" - title: "Restaurează copia de siguranță" + is_disabled: "Restabilirea este dezactivată din setările site-ului." + label: "Restabilire" + title: "Restabilire din backup" + confirm: "Ești sigur că vrei să restaurezi acest backup?" rollback: - label: "Revenire la situaţia anterioară" - title: "Restabilește baza de date în stadiul anterior" + label: "Revenire la stadiul anterior" + title: "Restabilește baza de date la stadiul funcțional anterior" + confirm: "Ești sigur că vrei să restaurezi baza de date la starea funcțională anterioară?" export_csv: - user_archive_confirm: "Sunteţi sigur că doriţi să descărcaţi mesajele dvs.?" - success: "Exportul a fost iniţiat. Veţi primi un mesaj de notificare când procesul se va termina." - failed: "Exportul a eşuat. Va rugăm verificaţi jurnalul." - rate_limit_error: "Postările pot fi descărcate doar o singură dată pe zi. Va rugăm încercaţi mâine." + user_archive_confirm: "Ești sigur că vrei să îți descarci mesajele?" + success: "Exportul a fost inițiat. Vei primi un mesaj de notificare când procesul se va termina." + failed: "Exportul a eşuat. Verifică jurnalul." + rate_limit_error: "Postările pot fi descărcate doar o singură dată pe zi. Te rugăm încearcă mâine." button_text: "Exportă" button_title: - user: "Exportă lista totală a utilizatorilor în formatul CSV." - staff_action: "Exportă jurnalul de acțiuni a conducerii în formatul CSV." - screened_email: "Exportă lista totală a adreselor de email verificate în format CSV." - screened_ip: "Exportă lista totală a adreselor de IP verificate în format CSV." - screened_url: "Exportă lista totală a adreselor URL verificate în format CSV." + user: "Exportă lista totală a utilizatorilor, în format CSV." + staff_action: "Exportă jurnalul de acțiuni al echipei, în format CSV." + screened_email: "Exportă lista totală a adreselor de email verificate, în format CSV." + screened_ip: "Exportă lista totală a adreselor de IP verificate, în format CSV." + screened_url: "Exportă lista totală a adreselor URL verificate, în format CSV." export_json: - button_text: "Exportă" + button_text: "Exportă " invite: - button_text: "Trimite o invitație" - button_title: "Trimite o invitație" + button_text: "Trimite invitații" + button_title: "Trimite invitații" customize: - title: "Personalizări" - long_title: "Modificarea Site-ului" - css: "Foaie de stil" - header: "Titlu" - top: "Top" + title: "Personalizare" + long_title: "Personalizările site-ului" + css: "CSS" + header: "Antet" + top: "Sus" footer: "Subsol" embedded_css: "Embedded CSS" head_tag: @@ -1985,45 +2488,45 @@ ro: title: "HTML care va fi inserat înaintea de tag-ul " override_default: "Nu include foaia de stil standard" enabled: "Activat?" - preview: "previzualizează" + preview: "previzualizare" undo_preview: "șterge previzualizarea" - rescue_preview: "stil predefinit" - explain_preview: "Vizualizează site-ul cu foaia de stil predefinită" - explain_undo_preview: "Înapoi la foaia de stil preferentială activată momentan" - explain_rescue_preview: "Vizualizeaza site-ul cu foaia de stil predefinită" - save: "Salvează" + rescue_preview: "stil implicit" + explain_preview: "Vizualizează site-ul cu această foaie de stil personalizată" + explain_undo_preview: "Înapoi la foaia de stil personalizată activă acum" + explain_rescue_preview: "Vizualizează site-ul cu foaia de stil implicită" + save: "Salvare" new: "Nou" new_style: "Stil nou" import: "Importă" - import_title: "Selectați un fișier sau lipiți un text" + import_title: "Selectează un fișier sau lipește un text" delete: "Șterge" - delete_confirm: "Șterge aceste preferințe?" - about: "Modifică foaia de stil CSS și capetele HTML Modify CSS din site. Adaugă o preferința pentru a începe." + delete_confirm: "Șterge această personalizare?" + about: "Modifică foaia de stil CSS și header-ele HTML din site. Adaugă o personalizare pentru a începe." color: "Culoare" opacity: "Opacitate" copy: "Copiază" email_templates: - title: "Sabloane" + title: "Șabloane de emailuri" subject: "Subiect" multiple_subjects: "Acest șablon are mai multe subiecte" body: "Body" - none_selected: "Selectați un șablon pentru a începe editarea" - revert: "Revocați schimbările" - revert_confirm: "Ești sigur că vreți să revocați schimbările?" + none_selected: "Selectează un șablon pentru a începe editarea" + revert: "Revocă schimbările" + revert_confirm: "Ești sigur că vrei să revoci schimbările?" css_html: title: "CSS/HTML" - long_title: "Customizarile CSS and HTML" + long_title: "Personalizări CSS și HTML" colors: title: "Culori" - long_title: "Tabel culori" - about: "Modifică culorile folosite în site fară a scrie CSS. Adaugă un nou aranjament pentru a începe." - new_name: "O un nou aranjament pentru culori" - copy_name_prefix: "Copiază" - delete_confirm: "Șterge acest aranjament de culori?" - undo: "rescrie" - undo_title: "Rescrie schimbările acestei culori de ultima oară când a fost salvată." - revert: "refacere" - revert_title: "Resetează culoarea la stadiul aranjamentului predefinit ." + long_title: "Scheme de culori" + about: "Modifică culorile folosite pe site fără a scrie CSS. Pentru a începe, adăugă o nouă schemă." + new_name: "Nouă schemă de culori" + copy_name_prefix: "Copie a" + delete_confirm: "Ștergi această schemă de culori?" + undo: "revenire" + undo_title: "Revino asupra schimbărilor aduse acestei culori, de ultima oară când a fost salvată și până acum." + revert: "revenire" + revert_title: "Resetează această culoare la schema de culori implicită din Discourse." primary: name: 'primar' description: 'Majoritatea textului, iconițe și margini.' @@ -2032,66 +2535,76 @@ ro: description: 'Culoarea principală de fundal și culoarea textului anumitor butoane.' tertiary: name: 'terțiar' - description: 'Adrese, cateva butoane, notificări, și culoarea de accent.' + description: 'Link-uri, câteva butoane, notificări, și culoare de accent.' quaternary: - name: "quaternar" - description: "Adrese de navigare." + name: "cuaternar" + description: "Linkuri de navigare." header_background: - name: "fundalul Header-ului" + name: "fundalul header-ului" description: "Culoarea de fundal a header-ului din site." header_primary: name: "header-ul primar" description: "Textul și inconițele din header-ul site-ului." highlight: - name: 'Iluminare' - description: 'Culoarea de fundal a elementelor iluminate din pagina, cum ar fi postări și discuții.' + name: 'punere în evidență' + description: 'Culoarea de fundal a elementelor puse în evidență din pagină, cum ar fi postări și discuții.' danger: name: 'Pericol' - description: 'Ilumineazș culoarea pentru acțiuni ca ștergerea postărilor și a discuțiilor.' + description: 'Evidențiază culoarea pentru acțiuni de tipul ștergerii postărilor și al subiectelor.' success: name: 'succes' - description: 'Indică starea de succes a unei operațiuni.' + description: 'Arată că acțiunea s-a terminat cu succes.' love: - name: 'Iubire' + name: 'apreciere' description: "Culoarea butonului de apreciere." email: - title: "Emails" + title: "Email" settings: "Opțiuni" templates: "Șabloane" - preview_digest: "Previzualizează rezumat" - sending_test: "Trimite email de test..." + preview_digest: "Rezumat previzualizare" + sending_test: "Se trimite email de test..." error: "EROARE - %{server_error}" - test_error: "S-a semnalat o problemă la trimtirerea email-ului. Vă rugăm verificați setările mailului, Verificați ca gazda sa nu bocheze conexiunile de email și reâncercați." + test_error: "A apărut o problemă la trimiterea email-ului. Te rugăm verifică setările mailului, Verifică dacă gazda nu blochează conexiunile de email și încearcă din nou." sent: "Trimise" skipped: "Omise" + bounced: "Ricoșate" received: "Primite" rejected: "Respinse" sent_at: "Trimise la" time: "Timp" user: "Utilizator" - email_type: "Tipul de Email" + email_type: "Tipul de email" to_address: "La adresa" test_email_address: "Adresă email de test" - send_test: "Trimite Email de test" + send_test: "Trimite email de test" sent_test: "trimis!" delivery_method: "Metoda de livrare" + preview_digest_desc: "Previzualizează conținutul emailurilor-rezumat trimise către utilizatori inactivi." refresh: "Reîmprospătează" format: "Format" html: "html" text: "text" last_seen_user: "Ultimul utilizator văzut:" reply_key: "Cheie de răspuns" - skipped_reason: "Motiv omiterii" + skipped_reason: "Motivul omiterii" incoming_emails: from_address: "De la" to_addresses: "Către" cc_addresses: "Cc" subject: "Subiect" error: "Eroare" + none: "Nu s-au găsit emailuri primite." + modal: + title: "Detaliile emailului primit" + error: "Eroare" + headers: "Antete" + subject: "Subiect" + body: "Corp" + rejection_message: "Mail respingere" filters: - from_placeholder: "from@example.com" - to_placeholder: "to@example.com" - cc_placeholder: "cc@example.com" + from_placeholder: "de_la@exemplu.com" + to_placeholder: "către@exemplu.com" + cc_placeholder: "cc@exemplu.com" subject_placeholder: "Subiect..." error_placeholder: "Eroare" logs: @@ -2109,8 +2622,8 @@ ro: created_at: "Creat" last_match_at: "Ultima potrivire" match_count: "Potriviri" - ip_address: "Adresa IP" - topic_id: "ID Discuție" + ip_address: "Adresă IP" + topic_id: "ID Subiect" post_id: "ID Mesaj" category_id: "ID categorie" delete: 'Șterge' @@ -2121,13 +2634,13 @@ ro: do_nothing: "nu acționa" staff_actions: title: "Acțiunile membrilor din staff" - instructions: "Clic pe numele utilizatorului şi acţiuni pentru a filtra lista. Clic pe poză profilului pentru a vizita pagina utilizatorului." + instructions: "Clic pe numele utilizatorului şi acţiuni pentru a filtra lista. Clic pe poza profilului pentru a vizita pagina utilizatorului." clear_filters: "Arată tot" staff_user: "Utilizatorul din staff" target_user: "Utilizator țintă" subject: "Subiect" when: "Când" - context: "Contextul" + context: "Context" details: "Detalii" previous_value: "Precedent" new_value: "Nou" @@ -2146,13 +2659,14 @@ ro: change_site_text: "schimbă textul site-ului" suspend_user: "suspendă utilizatorul" unsuspend_user: "reactivează utilizator" - grant_badge: "acordă insignă" - revoke_badge: "revocă insignă" - check_email: "Verifică emailul" - delete_topic: "şterge discuția" - delete_post: "şterge mesajul" - impersonate: "joacă rolul" - anonymize_user: "fă userul anonim" + grant_badge: "acordă ecuson" + revoke_badge: "revocă ecuson" + check_email: "verifică emailul" + delete_topic: "șterge subiectul" + delete_post: "șterge postarea" + impersonate: "joacă rolul utilizatorului" + anonymize_user: "transformă în utilizator anonim" + roll_up: "consolidează blocurile de IP" change_category_settings: "schimbă setările categoriei" delete_category: "șterge categorie" create_category: "creează categorie" @@ -2162,55 +2676,63 @@ ro: revoke_admin: "Revocă titlul de Admin" grant_moderation: "Acordă titlul de Moderator" revoke_moderation: "Revocă titlul de Moderator" + backup_operation: "operație de backup" + deleted_tag: "etichetă ștearsă" + renamed_tag: "etichetă redenumită" + revoke_email: "revoca email" screened_emails: title: "Email-uri filtrate" - description: "Când cineva încearcă să creeze un nou cont, următorul email va fi verificat iar înregistrarea va fi blocată, sau o altă acțiune va fi inițiată." + description: "Când cineva încearcă să creeze un cont nou, următorul email va fi verificat iar înregistrarea va fi blocată, sau o altă acțiune va fi inițiată." email: "Adresa email" actions: allow: "Permite" screened_urls: title: "URL-uri filtrate" - description: "URL-urile listate aici au fost folosite în postări de către utilizatorii ce sunt identificați ca spammeri." + description: "URL-urile listate aici au fost folosite în postări de către utilizatorii considerați spammeri." url: "URL" domain: "Domeniu" screened_ips: title: "IP-uri filtrate" - description: 'adresele de IP sunt supravegheate. Folosește "permite" să golești lista de IP-uri.' + description: 'adrese IP supravegheate. Folosește "permite" să marchezi IP-urile ca permise' delete_confirm: "Ești sigur că vrei să anulezi regula pentru %{ip_address}?" + roll_up_confirm: "Ești sigur că vrei să consolidezi adresele IP monitorizate în mod obișnuit în subrețele?" + rolled_up_some_subnets: "S-au consolidat cu succes înregistrările de IP-uri blocate pe următoarele subrețele: %{subnets}." + rolled_up_no_subnet: "Nu e nimic de consolidat" actions: block: "Blochează" do_nothing: "Permite" - allow_admin: "Permite Admin" + allow_admin: "Permite admin" form: label: "Noi:" ip_address: "Adresă IP" add: "Adaugă" filter: "Caută" roll_up: - text: "Roll up" + text: "Consolidează" + title: "Crează noi înregistrari cu subrețele blocate dacă există cel puțin 'min_ban_entries_for_roll_up' înregistrări." logster: title: "Jurnal de erori" impersonate: - title: "Imită Utilizator" - help: "Folosește această unealtă pentru a imita un cont de utilizator în scopul de debugging." + title: "Joacă rolul utilizatorului" + help: "Folosește această unealtă pentru a imita un cont de utilizator pentru depanare. Va trebui să te deconectezi după ce termini." not_found: "Utilizatorul nu poate fi găsit." - invalid: "Ne pare rău, dar nu puteţi prelua rolul acelui utilizator." + invalid: "Ne pare rău, nu poți prelua acest rol." users: title: 'Utilizatori' - create: 'Adaugă Utilizator cu titlul de Admin' - last_emailed: "Ultimul Email trimis" + create: 'Adaugă utilizator cu titlul de admin' + last_emailed: "Ultimul email trimis" not_found: "Ne pare rău, acest nume de utilizator nu există în sistem." - id_not_found: "Ne pare rău, dar acest utilizator nu există în sistemul nostru." - active: "Activ" - show_emails: "Arată Mail-urile" + id_not_found: "Ne pare rău, dar acest utilizator nu există în sistem." + active: "Activi" + show_emails: "Arată email" nav: new: "Nou" - active: "Activ" + active: "Active" pending: "În așteptare" staff: 'Personalul' suspended: 'Suspendate' blocked: 'Blocate' - suspect: 'Suspect' + suspect: 'Suspecți' approved: "Aprobate?" approved_selected: one: "aprobă utilizatorul" @@ -2223,158 +2745,174 @@ ro: titles: active: 'Utilizatori activi' new: 'Utilizatori noi' - pending: 'Utilizatori în așteptare de previzualizare' - newuser: 'Utilizatori la nielul de încredere 0 (utilizator nou)' - basic: 'Utilizatori la nivel de încredere 1 (utilizator de baza)' - member: 'Utilizatori la nivel de încredere 2 (Membri)' - regular: 'Utilizatori la nivel de încredere 3 (Utilizator activ)' - leader: 'Utilizatori la nivel de încredere 4 (Lider)' - staff: "Personalul" + pending: 'Utilizatori în așteptare pentru aprobare' + newuser: 'Utilizatori la nivelul de încredere 0 (Utilizator nou)' + basic: 'Utilizatori la nivel de încredere 1 (Utilizator simplu)' + member: 'Utilizatori la nivel de încredere 2 (Utilizator membru)' + regular: 'Utilizatori la nivel de încredere 3 (Utilizator frecvent)' + leader: 'Utilizatori la nivel de încredere 4 (Utilizator lider)' + staff: "Echipa" admins: 'Administratori' moderators: 'Moderatori' blocked: 'Utilizatori blocați' suspended: 'Utilizatori suspendați' - suspect: 'Utilizatori Suspecţi' + suspect: 'Utilizatori suspecţi' reject_successful: - one: "1 utilizator a fost rejectat cu success." - few: "%{count} utilizatori au fost rejectaţi cu success." - other: "%{count} utilizatori au fost rejectaţi cu success." + one: "1 utilizator a fost respins cu succes." + few: "%{count} utilizatori au fost respinși cu succes." + other: "%{count} de utilizatori au fost respinși cu succes." reject_failures: - one: "Rejectarea a 1 utilizator a eşuat." - few: "Rejectarea a %{count} utilizatori a eşuat." - other: "Rejectarea a %{count} utilizatori a eşuat." + one: "Un utilizator nu a putut fi respins." + few: " %{count} utilizatori nu au putut fi respinși." + other: "%{count} de utilizatori nu au putut fi respinși." not_verified: "Neverificat" check_email: title: "Arată adresa de email a acestui utilizator" text: "Arată" user: - suspend_failed: "Ceva nu a funcționat în suspendarea acestui utilizator {{error}}" - unsuspend_failed: "Ceva nu a funcționat în activarea acestui utilizator {{error}}" + suspend_failed: "Ceva nu a funcționat la suspendarea acestui utilizator {{error}}" + unsuspend_failed: "Ceva nu a funcționat la activarea acestui utilizator {{error}}" suspend_duration: "Pentru cât timp va fi suspendat utilizatorul?" suspend_duration_units: "(zile)" - suspend_reason_label: "De ce suspendați? Acest text va fi vizibil oricui pe pagina de profil a utilizatorului, și va fi arătat utilizatorului când încearca autentificara. încercați să fiți succint." + suspend_reason_label: "Motivul suspendării? Acest text va fi vizibil pe pagina de profil a utilizatorului, și va fi arătat utilizatorului atunci când încearcă să se autentifice. Încearcă să fii succint." suspend_reason: "Motiv" suspended_by: "Suspendat de" delete_all_posts: "Șterge toate postările" + delete_all_posts_confirm_MF: "Ești pe cale să ștergi {POSTS, plural, one {1 postare} other {# postări}} și {TOPICS, plural, one {1 subiect} other {# subiecte}}. Ești sigur?" suspend: "Suspendă" - unsuspend: "Activat" + unsuspend: "Reactivează" suspended: "Suspendat?" moderator: "Moderator?" admin: "Admin?" blocked: "Blocat?" + staged: "În așteptare?" show_admin_profile: "Admin" - edit_title: "Editează Titlu" - save_title: "Salvează Titlu" - refresh_browsers: "Fortează reîmprospătarea browserului" - refresh_browsers_message: "Mesajul a fost trimis către toţi clienţii. " + edit_title: "Editează titlu" + save_title: "Salvează titlu" + refresh_browsers: "Forțează reîmprospătarea browserului" + refresh_browsers_message: "Mesajul a fost trimis către toţi. " show_public_profile: "Arată profilul public" - impersonate: 'Imită' - ip_lookup: "Cautare IP" + impersonate: 'Joacă rolul utilizatorului' + ip_lookup: "Căutare IP" log_out: "Ieșire" logged_out: "Acest utilizator a ieșit de pe toate dispozitivele" - revoke_admin: 'Revocă tirlu Admin' - grant_admin: 'Acordă titlu Admin' - revoke_moderation: 'Revocă titlu moderator' - grant_moderation: 'Acordă titlu moderator' + revoke_admin: 'Revocă titlu de admin' + grant_admin: 'Acordă titlu de admin' + revoke_moderation: 'Revocă titlu de moderator' + grant_moderation: 'Acordă titlu de moderator' unblock: 'Deblochează' block: 'Blochează' reputation: Reputație permissions: Permisiuni activity: Activitate - like_count: Aprecieri primite + like_count: Aprecieri acordate / primite last_100_days: 'în ultimele 100 zile' - private_topics_count: Discuții private + private_topics_count: Subiecte private posts_read_count: Postări citite - post_count: Postări Create - topics_entered: Discuții Văzute - flags_given_count: Marcaje acordate - flags_received_count: Marcaje primite - warnings_received_count: Avertizări Primite - flags_given_received_count: 'Marcaje Acordate / Primite' + post_count: Postări create + topics_entered: Subiecte văzute + flags_given_count: Marcaje de avertizare acordate + flags_received_count: Marcaje de avertizare primite + warnings_received_count: Avertismente primite + flags_given_received_count: 'Marcaje de avertizare acordate/primite' approve: 'Aprobare' approved_by: "aprobat de" - approve_success: "Utilizator aprobat , email trimis cu instrucțiuni de activare." - approve_bulk_success: "Succes! Toți utilizatorii selectați au fost aprobați și notificați." + approve_success: "Utilizator aprobat, email trimis cu instrucțiuni de activare." + approve_bulk_success: "Succes! Toți utilizatorii selectați au fost aprobați și anunțați." time_read: "Timp de citire" - anonymize: "Fă userul anonim" - anonymize_confirm: "Sunteţi SIGUR că vreţi să transformaţi acest cont într-un cont anonim? Operaţiunea va schimba numele utilizatorului şi adresa de email şi va reseta toate informaţiile din profil." - anonymize_yes: "Da, fă acest user anonim" - anonymize_failed: "A apărut o problema în timpul transformării contului în cont anonim." - delete: "Ștergere Utilizator" + anonymize: "Transformă în utilizator anonim" + anonymize_confirm: "Ești SIGUR că vrei să transformi acest cont într-un cont anonim? Operaţiunea va schimba numele utilizatorului şi adresa de email şi va reseta toate informaţiile din profil." + anonymize_yes: "Da, transformă acest cont în cont anonim" + anonymize_failed: "A apărut o problemă în timpul transformării contului în cont anonim." + delete: "Ștergere utilizator" delete_forbidden_because_staff: "Adminii și moderatorii nu pot fi sterși." - delete_posts_forbidden_because_staff: "Nu puteți șterge toate mesajele administratorilor și moderatorilor." + delete_posts_forbidden_because_staff: "Nu poți șterge mesajele administratorilor și moderatorilor." delete_forbidden: - one: "Utilizatorii nu pot fi şterşi dacă au postări. Ştergeţi toate postările înainte de a încerca ştergerea unui utilizator. (Postările mai vechi de %{count} zile nu pot fi şterse)" - few: "Utilizatorii nu pot fi şterşi dacă au postări. Ştergeţi toate postările înainte de a încerca ştergerea unui utilizator. (Postările mai vechi de %{count} zile nu pot fi şterse)" - other: "Utilizatorii nu pot fi şterşi dacă au postări. Ştergeţi toate postările înainte de a încerca ştergerea unui utilizator. (Postările mai vechi de %{count} zile nu pot fi şterse)" + one: "Utilizatorii nu pot fi șterși dacă au postări. Șterge toate postările înainte de a încerca ștergerea unui utilizator. (Postările mai vechi de 1 zi nu pot fi șterse)" + few: "Utilizatorii nu pot fi șterși dacă au postări. Şterge toate postările înainte de a încerca ștergerea unui utilizator. (Postările mai vechi de %{count} zile nu pot fi șterse)" + other: "Utilizatorii nu pot fi șterși dacă au postări. Șterge toate postările înainte de a încerca ștergerea unui utilizator. (Postările mai vechi de %{count} de zile nu pot fi șterse)" cant_delete_all_posts: - one: "Nu pot fi şterse toate postările. Unele postări sunt mai vechi de %{count} zile. (Setarea delete_user_max_post_age)" + one: "Nu pot fi şterse toate postările. Unele postări sunt mai vechi de 1 zi. (Setarea delete_user_max_post_age)" few: "Nu pot fi şterse toate postările. Unele postări sunt mai vechi de %{count} zile. (Setarea delete_user_max_post_age)" - other: "Nu pot fi şterse toate postările. Unele postări sunt mai vechi de %{count} zile. (Setarea delete_user_max_post_age)" + other: "Nu pot fi șterse toate postările. Unele postări sunt mai vechi de %{count} de zile. (Setarea delete_user_max_post_age)" cant_delete_all_too_many_posts: one: "Nu pot fi şterse toate postările deoarece utilizatorul are mai mult de 1 postare. (Setarea delete_all_posts_max)" few: "Nu pot fi şterse toate postările deoarece utilizatorul are mai mult de %{count} postări. (Setarea delete_all_posts_max)" - other: "Nu pot fi şterse toate postările deoarece utilizatorul are mai mult de %{count} postări. (Setarea delete_all_posts_max)" - delete_confirm: "Sunteți sigur că doriți ștergerea acestui utilizator? Acțiunea este permanentă!" - delete_and_block: "Da, și block viitoarele autentificări pe acest email și adresă IP" - delete_dont_block: "Da, șterge decât utilizatorul" + other: "Nu pot fi şterse toate postările deoarece utilizatorul are mai mult de %{count} de postări. (Setarea delete_all_posts_max)" + delete_confirm: "Ești SIGUR că vrei ștergerea acestui utilizator? Acțiunea este ireversibilă!" + delete_and_block: "Da, și blochează viitoarele autentificări cu acest email și această adresă IP" + delete_dont_block: "Da, șterge doar utilizatorul" deleted: "Utilizatorul a fost șters." - delete_failed: "S-a semnalat o eroare la ștergerea utilizatorului. Asigurați-vă că toate postările sunt șterse înainte de a încerca ștergerea utilizatorului." + delete_failed: "A apărut o eroare la ștergerea utilizatorului. Asigură-te că toate postările sunt șterse înainte de a încerca ștergerea utilizatorului." send_activation_email: "Trimite email de activare" - activation_email_sent: "Um email de activare a fost trimis." - send_activation_email_failed: "S-a semnalat o eroare la trimiterea altui email de activare. %{error}" - activate: "Activarea contului" - activate_failed: "S-a semnalat o problemă la activarea utilizatorului." + activation_email_sent: "A fost trimis un email de activare" + send_activation_email_failed: "A apărut o eroare la trimiterea altui email de activare. %{error}" + activate: "Activare cont" + activate_failed: "A apărut o problemă la activarea utilizatorului." deactivate_account: "Dezactivează cont" - deactivate_failed: "S-a semnalat o problemă la dezactivarea utilizatoprului." - unblock_failed: 'S-a semnalat o problemă la deblocarea utlizatorului.' - block_failed: 'S-a semnalat o problemă la blocarea utilizatorului.' + deactivate_failed: "A apărut o problemă la dezactivarea contului." + unblock_failed: 'A apărut o problemă la deblocarea contului.' + block_failed: 'A apărut o problemă la blocarea contului.' + block_confirm: 'Ești sigur că vrei să blochezi acest utilizator? Nu va mai putea să creeze niciun subiect sau postare.' block_accept: 'Blochează utilizatorul' + bounce_score: "Rata de ricoșeu" + reset_bounce_score: + label: "Resetează" + title: "Resetează rata de ricoșeu înapoi la 0" deactivate_explanation: "Un utilizator dezactivat va trebui să-și revalideze email-ul." suspended_explanation: "Un utilizator suspendat nu se poate autentifica" - block_explanation: "Un utilizator blocat nu poate posta sau porni o discuție." - trust_level_change_failed: "S-a semnalat o problemă la schimbarea nivelului de încredere al utilizatorului." + block_explanation: "Un utilizator blocat nu poate posta sau scrie un subiect." + staged_explanation: "Un utilizator în așteptare poate posta numai prin email la subiectele specifice." + bounce_score_explanation: + none: "În ultimul timp nu au fost primite ricoșeuri de acest email." + some: "În ultimul timp au fost primite unele ricoșeuri de la acest email." + threshold_reached: "Au fost primite prea multe ricoșeuri de la acest email." + trust_level_change_failed: "A apărut o problemă la schimbarea nivelului de încredere al utilizatorului." suspend_modal_title: "Suspendă utilizator" trust_level_2_users: "utilizatori de nivel de încredere 2 " trust_level_3_requirements: "Cerințe pentru nivelul 3 de încredere" - trust_level_locked_tip: "Nivelul de Încredere este blocat, sistemul nu va promova sau retrograda utilizatorii" - trust_level_unlocked_tip: "Nivelul de Încredere este deblocat, sistemul poate promova sau retrograda utilizatorii" - lock_trust_level: "Blochează Nivelul de Încredere" - unlock_trust_level: "Deblochează Nivelul de Încredere" + trust_level_locked_tip: "Nivelul de încredere este blocat, sistemul nu va promova sau retrograda utilizatorii" + trust_level_unlocked_tip: "Nivelul de încredere este deblocat, sistemul poate promova sau retrograda utilizatorii" + lock_trust_level: "Blochează nivelul de încredere" + unlock_trust_level: "Deblochează nivelul de încredere" tl3_requirements: title: "Cerințe pentru nivelul 3 de încredere" - value_heading: "Valoarea" - requirement_heading: "Cerințe" + table_title: + one: "În ultima zi:" + few: "În ultimele %{count} zile:" + other: "În ultimele %{count} de zile:" + value_heading: "Valoare" + requirement_heading: "Cerință" visits: "Vizite" - days: "zile" - topics_replied_to: "Discuții la care s-a răspuns" - topics_viewed: "Discuții văzute" - topics_viewed_all_time: "Discuții văzute (din totdeauna)" + days: "Zile" + topics_replied_to: "Subiecte la care s-a răspuns" + topics_viewed: "Subiecte vizualizate" + topics_viewed_all_time: "Subiecte vizualizate (dintotdeauna)" posts_read: "Postări citite" - posts_read_all_time: "Postări citite (din totdeauna)" - flagged_posts: "Postări marcate" - flagged_by_users: "Utilizatori ce au marcat" - likes_given: "Aprecieri Oferite" - likes_received: "Aprecieri Primite" - likes_received_days: "Aprecieri Primite: zile unice" - likes_received_users: "Aprecieri Primite: utilizatori unici" - qualifies: "Calificări pentru nivelul 3 de încredere." + posts_read_all_time: "Postări citite (dintotdeauna)" + flagged_posts: "Postări marcate cu marcaje de avertizare" + flagged_by_users: "Utilizatori ce au marcat cu marcaje de avertizare" + likes_given: "Aprecieri oferite" + likes_received: "Aprecieri primite" + likes_received_days: "Aprecieri primite: zile unice" + likes_received_users: "Aprecieri primite: utilizatori unici" + qualifies: "Se califică pentru nivelul 3 de încredere." does_not_qualify: "Nu se califică pentru nivelul 3 de încredere." - will_be_promoted: "Vor fi promovați în 24 de ore." + will_be_promoted: "Va fi promovați în curând." will_be_demoted: "Va fi retrogradat în curând." - on_grace_period: "În prezent, în perioada de grație de promovare, nu va fi retrogradat." - locked_will_not_be_promoted: "Nivelul de Încredere blocat. Nu va fi niciodata promovat." - locked_will_not_be_demoted: "Nivelul de Încredere blocat. Nu va fi niciodata retrogradat." + on_grace_period: "În prezent, în perioada de grație a promovării, nu va fi retrogradat." + locked_will_not_be_promoted: "Nivelul de încredere blocat. Nu va fi niciodată promovat." + locked_will_not_be_demoted: "Nivelul de încredere blocat. Nu va fi niciodată retrogradat." sso: - title: "Single Sign On" + title: "Autentificare unică" external_id: "ID Extern" - external_username: "Nume Utilizator" + external_username: "Nume utilizator" external_name: "Nume" external_email: "Email" external_avatar_url: "URL poză de profil" user_fields: title: "Câmpuri utilizator" - help: "Adăugaţi câmpuri pe care utilizatorii le pot completa." + help: "Adaugă câmpuri pe care utilizatorii le pot completa." create: "Creează un câmp utilizator" untitled: "Fără titlu" name: "Nume câmp" @@ -2384,8 +2922,8 @@ ro: edit: "Editează" delete: "Șterge" cancel: "Anulează" - delete_confirm: "Sunteți sigur că stergeți acest câmp utilizator?" - options: "Optiuni" + delete_confirm: "Ești sigur că vrei să ștergi acest câmp utilizator?" + options: "Opțiuni" required: title: "Necesar la înscriere?" enabled: "necesar" @@ -2395,34 +2933,42 @@ ro: enabled: "editabil" disabled: "nu este editabil" show_on_profile: - title: "Arată în profilul public" - enabled: "arată în profil" - disabled: "nu arată în profil" + title: "Arată în profilul public?" + enabled: "se afișează în profil" + disabled: "nu se afișează în profil" + show_on_user_card: + title: "Afișează pe pagina cu date personale utilizatorului?" + enabled: "se afișează" + disabled: "nu se afișează" field_types: - text: 'Câmp Text' + text: 'Câmp text' confirm: 'Confirmare' - dropdown: "Select" + dropdown: "Meniu derulant" site_text: - title: 'Conținut' - edit: 'editează' + description: "Poți personaliza orice text pe forum. Te rugăm să începi prin a căuta mai jos:" + search: "Caută textul pe care vrei să îl editezi" + title: 'Conținut text' + edit: 'Editează' revert: "Revocați schimbările" - revert_confirm: "Ești sigur că vreți să revocați schimbările?" + revert_confirm: "Ești sigur că vrei să revoci schimbările?" go_back: "Înapoi la căutare" - show_overriden: 'Arată doar rescrierile' + recommended: "Îți recomandăm să personalizezi următorul text pentru a se adapta nevoilor tale:" + show_overriden: 'Arată doar ignorate' site_settings: - show_overriden: 'Arată doar rescrierile' + show_overriden: 'Arată doar pe cele ignorate' title: 'Setări' - reset: 'resetează' - none: 'nimic' + reset: 'Resetează' + none: 'Nimic' no_results: "Nu s-au găsit rezultate." clear_filter: "Șterge" add_url: "adaugă URL" + add_host: "adaugă gazdă" categories: all_results: 'Toate' - required: 'Cerute' + required: 'Necesare' basic: 'Setări de bază' users: 'Utilizatori' - posting: 'Mesaje' + posting: 'Postări' email: 'Email' files: 'Fișiere' trust: 'Niveluri de încredere' @@ -2431,54 +2977,58 @@ ro: seo: 'SEO' spam: 'Spam' rate_limits: 'Limite' - developer: 'Developer' - embedding: "Includere" + developer: 'Dezvoltator' + embedding: "Embedding" legal: "Legal" + user_api: 'API Utilizator' uncategorized: 'Altele' backups: "Copii de siguranță" login: "Autentificare" plugins: "Plugin-uri" user_preferences: "Preferințe" + tags: "Etichete" + search: "Căutare" badges: - title: Insigne - new_badge: Insignă nouă + title: Ecusoane + new_badge: Ecuson nou new: Nou name: Nume - badge: Insignă - display_name: Afișeaza numele + badge: Ecuson + display_name: Afișează numele description: Descriere - badge_type: Tipul insignei + long_description: Descriere lungă + badge_type: Tipul ecusonului badge_grouping: Grup badge_groupings: - modal_title: Insigne de grup + modal_title: Grupuri ecusoane granted_by: Acordat de granted_at: Acordat la - reason_help: (O legătură către o postare sau o discuţie) + reason_help: (O legătură către o postare sau un subiect) save: Salvează delete: Șterge - delete_confirm: Ești sigur că vrei să ștergi această insignă? + delete_confirm: Ești sigur că vrei să ștergi acest ecuson? revoke: Revocă reason: Motiv expand: Extinde … - revoke_confirm: Sunteți sigur ca revocați insigna? - edit_badges: Editează insigne - grant_badge: Acordă insignă - granted_badges: Insigne acordate + revoke_confirm: Ești sigur că vrei să revoci ecusonul? + edit_badges: Editează ecusoane + grant_badge: Acordă ecuson + granted_badges: Ecusoane acordate grant: Acordă - no_user_badges: "%{name} nu i-a fost acordată nicio insignă." - no_badges: Nu există nicio insignă ce poate fi acordată. - none_selected: "Selectaţi o insignă pentru a începe" - allow_title: Permite insigna sa fie folosită ca titlu - multiple_grant: Poate sa fie acordată de mai multe ori - listable: Arată insignă pe pagina publică a insignelor - enabled: Activează insignă + no_user_badges: "Lui %{name} nu i-a fost acordat niciun ecuson." + no_badges: Nu există niciun ecuson care poate fi acordat. + none_selected: "Selectaţi un ecuson pentru a începe" + allow_title: Permite ca ecusonul să fie folosit ca titlu + multiple_grant: Poate fi acordat de mai multe ori + listable: Arată ecuson pe pagina publică a ecusoanelor + enabled: Activează ecuson icon: Pictogramă image: Imagine - icon_help: "Folosiţi o clasă Font Awesome sau un URL pentru imagine" - query: Interogare insignă (SQL) - target_posts: Interogarea mesajelor ţintă - auto_revoke: Pornește verificarea de revocare î fiecare zi - show_posts: Arata mesaje ce acordă insigne pe pagina de insigne + icon_help: "Folosiţi o clasă de fonturi Font Awesome sau un URL pentru imagine" + query: Interogare ecusoane (SQL) + target_posts: Interogarea mesajelor utilizatorilor-ţintă + auto_revoke: Pornește verificarea de revocare în fiecare zi + show_posts: Arata mesaje ce acordă ecusoane pe pagina de ecusoane trigger: Declanșator trigger_type: none: "Actualizare zilnică" @@ -2486,14 +3036,21 @@ ro: post_revision: "Când un utlizator creează sau editează un mesaj" trust_level_change: "Când un utilizator schimbă nivelul de încredere" user_change: "Când un utilizator este editat sau creat" + post_processed: "După ce o postare este procesată" preview: - link_text: "Previzualizare insigne acordate" + link_text: "Previzualizare ecusoane acordate" plan_text: "Previzualizare cu interogare" - modal_title: "Previzualizare Interogare Insignă" + modal_title: "Previzualizare interogari ecusoane" sql_error_header: "A apărut o eroare la executarea interogării." - error_help: "Vezi legăturile următoare pentru ajutor referitor la interogări pentru insigne." + error_help: "Vezi legăturile următoare pentru ajutor cu privire la interogări pentru ecusoane." bad_count_warning: header: "ATENȚIE!" + text: "Unele șabloane lipsesc. Asta se întâmplă atunci când o interogare de ecusoane returnează user IDs sau post IDs care nu există. Asta ar putea da naștere la rezultate neașteptate mai târziu - te rugăm să verifici din nou interogarea." + no_grant_count: "Nu există ecusoane pentru atribuire." + grant_count: + one: "Un ecuson pentru atribuire." + few: "%{count} ecusoane pentru atribuire." + other: "%{count} de ecusoane pentru atribuire." sample: "Exemplu:" grant: with: %{username} @@ -2508,16 +3065,30 @@ ro: image: "Imagine" delete_confirm: "Ești sigur că vrei să ștergi emoji-ul :%{name}:?" embedding: + get_started: "Dacă dorești să încorporezi Discourse pe un alt website, începe prin a-i adăuga gazda." confirm_delete: "Ești sigur că vrei să ștergi acest host?" - sample: "Folosiți următorul cod HTML în site-ul dvs. pentru a crea și pentru a embed-ui topic-uri discourse. Înlocuiți REPLACE_ME cu URL-ul canonic al paginii pe care doriți să o embed-uiți." + sample: "Folosește următorul cod HTML în site-ul tău pentru a crea și pentru a încorpora subiecte Discourse. Înlocuiește ÎNLOCUIEȘTE_MĂ cu URL-ul canonic al paginii pe care dorești să o încorporezi." title: "Embedding" host: "Host-uri permise" + path_whitelist: "Cale permise" edit: "editează" category: "Postează în categoria" add_host: "Adaugă host" settings: "Setări pentru embeding" - feed_settings: "Setări Feed" + feed_settings: "Setări feed" + feed_description: "Furnizând un feed RSS/ATOM pentru site-ul tau, poți să îmbunătățești capacitatea Discourse de a-ți importa conținutul." + crawling_settings: "Setări roboți de căutare" + crawling_description: "Când Discourse creează subiecte pentru postările tale, dacă nu este prezent nici un feed RSS/ATOM, va încerca să extragă conținutul din codul HTML. Uneori pot apărea probleme la extragerea conținutului, așa că îți dăm posibilitatea să specifici regulile CSS pentru a ușura extracția." + embed_by_username: "Nume utilizator pentru creare subiect" embed_post_limit: "Numărul maxim de postări de încorporat." + embed_username_key_from_feed: "Tastă pentru a retrage nume utilizator discourse din feed" + embed_title_scrubber: "Expresie obișnuită pentru a curăța titlurile postărilor" + embed_truncate: "Scurtează postările embedded." + embed_whitelist_selector: "Selector CSS pentru elemente care nu sunt permise în embeds." + embed_blacklist_selector: "Selector CSS pentru elemente care sunt șterse din emebds." + embed_classname_whitelist: "Nume de clase CSS permise" + feed_polling_enabled: "Importă postări via RSS/ATOM" + feed_polling_url: "URL-ul feed-ului RSS/ATOM pentru indexare" save: "Salvați setările pentru embeding" permalink: title: "Adrese permanente" @@ -2534,3 +3105,23 @@ ro: label: "Nou:" add: "Adaugă" filter: "Căutare (URL sau URL extern)" + wizard_js: + wizard: + done: "Terminat" + back: "Înapoi" + next: "Următorul" + step: "%{current} din %{total}" + upload: "Încărcare" + uploading: "Se încarcă..." + quit: "Poate mai târziu" + staff_count: + one: "Comunitatea ta are un membru al echipei." + few: "Comunitatea ta are %{count} membri ai echipei." + other: "Comunitatea ta are %{count} de membri ai echipei." + invites: + add_user: "adaugă" + none_added: "Nu ați invitat nici un membru al echipei. Ești sigur că vrei să continui?" + roles: + admin: "Administrator" + moderator: "Moderator" + regular: "Utilizator frecvent" diff --git a/config/locales/client.sq.yml b/config/locales/client.sq.yml index d24c4baf49..de792227ad 100644 --- a/config/locales/client.sq.yml +++ b/config/locales/client.sq.yml @@ -166,7 +166,7 @@ sq: admin_title: "Admin" flags_title: "Sinjalizimet" show_more: "trego më shumë" - show_help: "opsione" + show_help: "ndihmë dhe kërko me Google" links: "Lidhjet" links_lowercase: one: "lidhje" @@ -488,6 +488,7 @@ sq: delete_account: "Fshi llogarinë time" delete_account_confirm: "Jeni i sigurtë që dëshironi ta mbyllni përgjithmonë llogarinë tuaj? Ky veprim nuk mund të zhbëhet!" deleted_yourself: "Llogaria juaj u fshi me sukses." + delete_yourself_not_allowed: "Nuk mund t'a fshini llogarinë tuaj tani. Kontaktoni një admin për të fshirë llogarinë. " unread_message_count: "Mesazhet" admin_delete: "Fshi" users: "Anëtarët" @@ -683,6 +684,7 @@ sq: none: "Ju nuk keni ftuar askënd deri tani. Mund të dërgoni ftesa individuale ose mund të ftoni një grup personash duke ngarkuar skedarin." text: "Skedari për ftesat në grup" uploading: "Duke ngarkuar..." + success: "Skedari u ngarkua, do njoftoheni me mesazh kur procesi të mbarojë. " error: "Pati një gabi gjatë ngarkimit të skedarit '{{filename}}': {{message}}" password: title: "Fjalëkalimi" @@ -813,7 +815,7 @@ sq: enabled_description: "Po lexoni një përmbledhje të kësaj teme: postimet më interesante sipas vlerësimit të komunitetit." description: "Ka {{replyCount}} përgjigje." description_time: "Ka {{replyCount}} përgjigje, do ju duhen rreth {{readingTime}} minuta për t'i lexuar." - enable: 'Përmbidhë këtë temë' + enable: 'Përmblidhe këtë Temë' disable: 'Shfaq të gjithë postimet' deleted_filter: enabled_description: "Kjo temë përmban postime të fshira, që tani janë fshehur." @@ -864,6 +866,7 @@ sq: requires_invite: "Na vjen keq, ky forum është vetëm për anëtarë të ftuar. " not_activated: "Nuk mund të identifikoheni akoma. Ju kemi dërguar një email aktivizimi tek {{sentTo}}. Ndiqni udhëzimet në atë email për të aktivizuar llogarinë tuaj. " not_allowed_from_ip_address: "Nuk lejohet identifikimi nga kjo adresë IP." + admin_not_allowed_from_ip_address: "Nuk futesh dot si admin nga kjo adresë IP." resend_activation_email: "Klikoni këtu për të dërguar sërish email-in e aktivizimit." sent_activation_email_again: "Ju dërguam një email aktivizimi të ri tek adresa {{currentEmail}}. Emaili mund të vonohet disa minuta, verifikoni edhe dosjen \"spam\". " to_continue: "Ju lutemi, Identifikohuni" @@ -1089,6 +1092,7 @@ sq: not_logged_in_user: 'faqja e përdoruesit me një përmbledhje të aktivitetit dhe preferencave' current_user: 'shko tek profili yt' topics: + new_messages_marker: "vizita e fundit" bulk: unlist_topics: "Hiq temat nga lista" reset_read: "Rivendos leximet" @@ -1125,7 +1129,7 @@ sq: search: "Nuk ka rezultate nga kërkimi. " educate: new: '

Temat e reja shfaqen këtu.

Automatikisht, temat cilësohen si të reja dhe kanë një shënim i ri nëse janë krijuar gjatë dy ditëve të fundit.

Vizitoni preferencat për t''a ndryshuar këtë parametër.

' - unread: '

Temat e palexuara shfaqen këtu.

Automatkisht, temat klasifikohen si të palexuara dhe kanë etiketa me numër 1 nëse ju:

  • krijuat temën
  • iu përgjigjët temës
  • lexuat temën për më shumë se 4 minuta

Ose nëse keni zgjedhur të Gjurmoni ose Vëzhgoni temën duke klikuar në butonin përkatës në fund të çdo teme.

Vizitoni preferencat tuaja për të bër ndryshime.

' + unread: '

Temat e palexuara shfaqen këtu.

Automatikisht, temat klasifikohen si të palexuara dhe kanë etiketa me numër 1 nëse ju:

  • krijuat temën
  • iu përgjigjët temës
  • lexuat temën për më shumë se 4 minuta

Ose nëse keni zgjedhur të Gjurmoni ose Vëzhgoni temën duke klikuar në butonin përkatës në fund të çdo teme.

Vizitoni preferencat tuaja për të bërë ndryshime.

' bottom: latest: "Nuk ka më tema të reja." hot: "Nuk ka më tema të nxehta." @@ -1155,6 +1159,7 @@ sq: help: 'Riktheje mesazhin në inbox' list: 'Temat' new: 'temë e re' + unread: 'palexuar' new_topics: one: '1 temë e re' other: '{{count}} tema të reja' @@ -1294,19 +1299,26 @@ sq: success_message: 'Sinjalizimi juaj i kësaj teme u krye me sukses. ' feature_topic: title: "Temë në plan të parë" - pin: "Make this topic appear at the top of the {{categoryLink}} category until" + pin: "Shfaqe këtë temë në krye të kategorisë {{categoryLink}} deri më" confirm_pin: "Ju tashmë keni {{count}} tema të përzgjedhura. Shumë tema të përzgjedhura mund të bëhen barrë për përdorues të rinj dhe anonimë. A jeni i sigurtë që dëshironi ta përzgjidhni një temë tjetër në këtë kategori?" unpin: "Remove this topic from the top of the {{categoryLink}} category." unpin_until: "Remove this topic from the top of the {{categoryLink}} category or wait until %{until}." + pin_note: "Përdoruesit mund ta çngjitin këtë temë veçan sipas dëshirës." + pin_validation: "Kërkohet data për ta ngjitur këtë temë në krye." not_pinned: "Nuk ka tema të përzgjedhura në {{categoryLink}}." already_pinned: one: "Temat kryesore të momentit në {{categoryLink}}: 1" other: "Temat kryesore të momentit në {{categoryLink}}: {{count}}" + pin_globally: "Shfaqe këtë temë në krye të listës së të gjitha temave deri më" confirm_pin_globally: "Ju tashmë keni {{count}} tema të përzgjedhura. Shumë tema të përzgjedhura mund të bëhen barrë për përdorues të rinj dhe anonimë. A jeni i sigurtë që dëshironi ta përzgjidhni një temë tjetër të gjithanëshme?" + global_pin_note: "Përdoruesit mund ta çngjitin këtë temë veçan sipas dëshirës." not_pinned_globally: "Nuk ka tema të përzgjedhura kudo." already_pinned_globally: one: "Të gjitha temat kryesore të momentit: 1" other: "Të gjitha temat kryesore të momentit: {{count}}" + make_banner: "Ktheje këtë temë në një temë parrullë që shfaqet në krye të të gjitha faqeve." + banner_note: "Përdoruesit mund ta heqin temën parrullë duke e mbyllur atë. Vetëm një temë mund të kthehet në parrullë në një moment të caktuar." + no_banner_exists: "Nuk ka temë parrullë." banner_exists: "Për momentin ka një temë parrullë." automatically_add_to_groups: "Kjo ftesë përfshin edhe akses për këto grupe:" invite_private: @@ -1339,10 +1351,17 @@ sq: other: "{{count}} postime" cancel: "Hiq filtrin" split_topic: + title: "Ktheje në një temë të re" + action: "ktheje në një temë të re" + topic_name: "Titulli i temës së re" + error: "Pati një gabim gjatë transfertës drejt një teme të re." instructions: one: "Jeni duke krijuar një temë të re dhe duke e populluar atë me postimin që keni përzgjedhur." other: "Jeni duke krijuar një temë të re dhe duke e populluar atë me {{count}} postimet që keni përzgjedhur." merge_topic: + title: "Transfero tek një Temë tjetër" + action: "transfero tek një temë tjetër" + error: "Pati një gabim gjatë transfertës drejt një teme tjetër." instructions: one: "Ju lutem zgjidhni një temë ku do dëshironit ta zhvendosni këtë postim." other: "Ju lutem, zgjidhni një temë ku do të dëshironit të zhvendosni këto {{count}} postime." @@ -1364,9 +1383,11 @@ sq: instructions: "Ju lutem zgjidhni një datë postimi për temën. Postimet në temë do të përditësohen për të patur të njëjtën diferencë kohore." multi_select: select: 'zgjidh' + selected: 'të zgjedhura ({{count}})' delete: fshij të përzgjedhurat cancel: anulo përzgjedhjen select_all: përzgjidhi të gjitha + deselect_all: pastro zgjedhjen description: one: Keni përzgjedhur 1 postim. other: Keni përzgjedhur {{count}} postime. @@ -1805,7 +1826,7 @@ sq: lightbox: download: "shkarko" search_help: - title: 'Kërko faqet e ndihmës' + title: 'Opsionet e kërkimit' keyboard_shortcuts_help: title: 'Shkurtimet e tastierës ' jump_to: @@ -1975,14 +1996,19 @@ sq: moderator: 'Moderator' dashboard: title: "Paneli i kontrollit" + last_updated: "Rinovimi i fundit:" version: "Versioni" up_to_date: "Jeni të azhurnuar!" critical_available: "Përditësim i rëndësishëm." updates_available: "Ka përditësime." please_upgrade: "Ju lutem, azhornoje!" + no_check_performed: "Verifikimi i updejteve nuk është kryer. Sigurohuni që sidekiq punon. " + stale_data: "Verifikimi i updejteve nuk është kryer këto kohët e fundit. Sigurohuni që sidekiq punon. " version_check_pending: "Me sa shohim keni rinovuar faqen se fundmi. Fantastike!" installed_version: "Instaluar" latest_version: "Të fundit" + problems_found: "Gjetëm ca probleme me instalimin tuaj të sistemit Discourse." + last_checked: "Verifikimi i fundit" refresh_problems: "Rifresko" no_problems: "Nuk u gjet asnjë gabim." moderators: 'Moderatorët:' @@ -1994,7 +2020,12 @@ sq: mobile_title: "Mobile" space_free: "{{size}} lirë" uploads: "ngarkime" + 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" yesterday: "Dje" @@ -2006,6 +2037,10 @@ sq: all: "Të Gjithë" view_table: "tabelë" view_graph: "grafik" + refresh_report: "Rifresko raportin" + start_date: "Dita e fillimit" + end_date: "Dita e fundit" + groups: "Të gjitha grupet" commits: by: "nga" flags: @@ -2015,49 +2050,89 @@ sq: agree: "Pranoj" agree_title: "Konfirmo këtë sinjalizim si të vlefshëm do korrekt" agree_flag_modal_title: "Prano dhe..." + agree_flag_hide_post: "Dakord (fshi postimin + ço MP)" agree_flag_hide_post_title: "Fshihe këtë postim automatikisht dhe çoi postuesit një mesazh që t'a redaktojë postimin" + agree_flag_restore_post: "Dakord (rikthe postimin)" agree_flag_restore_post_title: "Rikthe këtë postim" agree_flag: "Bi dakord me sinjalizimin" agree_flag_title: "Dakord me sinjalizimin dhe lini postimin të pandryshuar" + defer_flag: "Shty" defer_flag_title: "Hiqe këtë sinjalizim; nuk ka nevojë për veprime në këtë moment. " delete: "Fshij" delete_title: "Fshini postimin e sinjalizuar." delete_post_defer_flag: "Fshini postimin dhe shtyni për më vonë sinjalizimin" + delete_post_defer_flag_title: "Fshini postimin; në qoftë postim i parë, fshihet tema" delete_post_agree_flag: "Fshini postimin dhe bini dakord me sinjalizimin" + delete_post_agree_flag_title: "Fshini postimin; në qoftë postim i parë, fshihet tema" + delete_flag_modal_title: "Fshi dhe..." delete_spammer: "Elimino Spammer" delete_spammer_title: "Fshijeni përdoruesin dhe të gjitha temat e postimet nga ky përdorues." + disagree_flag_unhide_post: "Jo dakord (anullo fshehjen e postimit)" disagree_flag_unhide_post_title: "Hiqni të gjitha sinjalizimet mbi këtë postim dhe ripublikojeni postimin" + disagree_flag: "Jo dakord" disagree_flag_title: "Refuzo sinjalizimin (është i pavlefshëm ose i pasaktë)" clear_topic_flags: "Përfundo" clear_topic_flags_title: "Kjo temë është shqyrtuar dhe problemet janë zgjidhur. Kliko Përfundo për të hequr sinjalizimet. " more: "(më shumë përgjigje...)" dispositions: agreed: "dakort" + disagreed: "nuk ishte dakord" + deferred: "shtyu" flagged_by: "Sinjalizuar nga" resolved_by: "Zgjidhur nga" + took_action: "Mori veprimin" system: "Sistemi" + error: "Pati një gabim" reply_message: "Përgjigju" no_results: "Nuk ka sinjalizime." topic_flagged: "Kjo temë është sinjalizuar." + visit_topic: "Vizito temën për të vepruar" was_edited: "Postimi është redaktuar pas sinjalizimit të parë" previous_flags_count: "Ky postim është sinjalizuar {{count}} herë." summary: + action_type_3: + one: "jashtë teme" + other: "jashtë teme x{{count}}" + action_type_4: + one: "e papërshtatshme" + other: "e papërshtatshme x{{count}}" + action_type_6: + one: "tjetër" + other: "tjetër x{{count}}" + action_type_7: + one: "tjetër" + other: "tjetër x{{count}}" action_type_8: one: "spam" other: "spam x{{count}}" groups: primary: "Grupi Parësor" + no_primary: "(asnjë grup parësor)" title: "Grupet" edit: "Redakto Grup" refresh: "Rifresko" new: "I Ri" + selector_placeholder: "vendos emrin e përdoruesit" + name_placeholder: "Emri i grupit, pa hapësira, si username-t" + about: "Modifiko anëtarët e grupit dhe emrin këtu" group_members: "Përdorues grupi" delete: "Fshij" + delete_confirm: "Fshije këtë grup?" + delete_failed: "Nuk e fshimë dot grupin. Nëse ky është një grup automatik, nuk fshihet dot. " + delete_member_confirm: "Do të heqësh '%{username}' nga grupi '%{group}'?" + delete_owner_confirm: "Hiqe privilegjin e pronarit për '%{username}'?" name: "Emri" add: "Shto" add_members: "Shto Anëtar" + custom: "Grupet e krijuara" + bulk_complete: "Përdoruesit iu shtuan grupit." + bulk: "Shto në masë tek grupi" + bulk_paste: "Ngjit një listë përdoruesisht ose adresash email, 1 për çdo rresht:" bulk_select: "(zgjidhni një grup)" automatic: "Automatik" + group_owners: Pronarët + add_owners: Shto pronarë + flair_preview: "Parashikimi" api: generate_master: "Gjenero Master API Key" none: "Për momentin, nuk ka çelësa API aktivë." @@ -2067,7 +2142,11 @@ sq: generate: "Gjenero" regenerate: "Rigjenero" revoke: "Revoko" + info_html: "Çelësi juaj API ju lejon të krijoni dhe updejtoni tema nëpërmjet thirrjeve JSON." all_users: "Gjithë Përdoruesit" + note_html: "Mbaje këtë çelës sekret, të gjithë përdoruesit që e kanë mund të krijojnë postime me të. " + web_hooks: + title: "Webhooks" plugins: title: "Pluginet" installed: "Pluginet e instaluar" @@ -2125,40 +2204,86 @@ sq: button_title: "Dërgo ftesa" customize: title: "Personalizo" + long_title: "Personalizimet" css: "CSS" + header: "Ballina" top: "Popullore" + footer: "Fundi i faqes" + embedded_css: "CSS e ngjitur" head_tag: text: "" + title: "HTML që do të vendoset para mbylles së tagut " body_tag: text: "" + title: "HTML që do të vendoset para mbylljes së tagut " + override_default: "Mos përfshi faqen e stilit CSS standarte." enabled: "Aktivizuar?" + preview: "parashiko" + undo_preview: "hiqe parashikimin" + rescue_preview: "stili normal" + explain_preview: "Shife faqen me këtë faqe stili" + explain_undo_preview: "Rithehu tek faqja e stilit që është e aktivizuar tani" + explain_rescue_preview: "Shikoje faqen me stilin normal." save: "Ruaj" new: "E Re" new_style: "Veshje e Re" import: "Importo" delete: "Fshij" + delete_confirm: "Fshije këtë personalizim?" + about: "Modifiko faqet e stilit CSS dhe HTML në këtë faqe. Shto një personalizim për të filluar. " color: "Ngjyra" opacity: "Opaciteti" copy: "Kopjo" email_templates: + title: "Shabllonët email" subject: "Subjekti" + multiple_subjects: "Ky shabllon ka disa tituj për mesazhin." + body: "Përmbajtja" none_selected: "Zgjidhni një shabllon emaili për të filluar redaktimin. " + revert: "Rikthe ndryshimet" + revert_confirm: "A jeni i sigurtë që doni të riktheni ndryshimet?" css_html: title: "CSS/HTML" + long_title: "Personalizime CSS dhe HTML" colors: title: "Ngjyrat" + long_title: "Skemat e ngjyrave" + new_name: "Një skemë e re ngjyrash" copy_name_prefix: "Kopje e" + delete_confirm: "Fshije këtë skemë ngjyrash?" undo: "rikthe" + undo_title: "Anullo ndryshimet e bëra në këtë skemë, rikthe versionin e ruajtur herën e fundit. " revert: "rikthe" + revert_title: "Zëvendëso këtë ngjyrë me ngjyrën standarte Discourse. " primary: name: 'parësor' + description: 'Shumica e tekstit, ikonave dhe bordurave. ' secondary: name: 'dytësor' + description: 'Ngjyra kryesore e sfondit, dhe teksti i ca butonave. ' + tertiary: + name: 'tretësore' + description: 'Linket, ca butona, njoftimet dhe ngjyrat për theks.' + quaternary: + name: "katërsore" + description: "Lidhjet e menusë." + header_background: + name: "sfondi i ballinës" + description: "Ngjyra në sfond të ballinës." + header_primary: + name: "primarja e ballinës" + description: "Teksti dhe ikonat në ballinë të faqes. " + highlight: + name: 'theksi' + description: 'Sfondi i elementëve të zgjedhur në faqe, si postimet dhe temat.' danger: name: 'rrezik' + description: 'Ngjyra e theksit për veprimet si fshirjen e postimeve apo temave.' success: name: 'sukses' + description: 'Përdoret për të treguar një veprim të kryer me sukses.' love: + name: 'zemra' description: "Ngjyra e butonit të pëlqimeve." email: title: "Emailat" @@ -2170,13 +2295,26 @@ sq: test_error: "Pati një problem gjatë dërgimit të emailit test. Verifiko parametrat e dërgimit dhe provo përsëri. " sent: "Dërguar" time: "Koha" + send_test: "Dërgo email test" sent_test: "u dërgua!" + delivery_method: "Metoda e dorëzimit" refresh: "Rifresko" format: "Formati" html: "html" text: "tekst" incoming_emails: + from_address: "Nga" + to_addresses: "Për" + cc_addresses: "Cc" + subject: "Subjekti" + error: "Gabim" none: "Nuk u gjetën emaila hyrës." + modal: + title: "Detajet e email të ardhur" + error: "Gabim" + headers: "Headers" + subject: "Subjekti" + body: "Përmbajtja" filters: from_placeholder: "from@example.com" to_placeholder: "to@example.com" @@ -2184,7 +2322,10 @@ sq: subject_placeholder: "Subjekti..." error_placeholder: "Gabim" logs: + none: "Nuk u gjet asnjë log." filters: + title: "Filtro" + user_placeholder: "username" address_placeholder: "emri@shembull.com" skipped_reason_placeholder: "arsye" logs: @@ -2230,6 +2371,7 @@ sq: title: "Ditar Gabimesh" impersonate: title: "Personifiko" + not_found: "Ai përdorues nuk u gjet. " users: title: 'Përdoruesit' create: 'Shto një përdorues admin' @@ -2283,34 +2425,57 @@ sq: suspend_reason: "Arsye" suspended_by: "Përjashtuar nga:" delete_all_posts: "Fshi gjithë postimet" + suspend: "Pezullo" + unsuspend: "Çpezullo" + suspended: "Pezulluar?" + moderator: "Moderator?" admin: "Admin?" blocked: "Bllokuar?" + staged: "Staged?" show_admin_profile: "Admin" edit_title: "Redakto Titullin" save_title: "Ruaj Titullin" refresh_browsers: "Forco rifreskimin e shfletuesit" refresh_browsers_message: "Mesazhi u dërgua tek të gjithë klientët!" show_public_profile: "Shfaq Profilin Publik" + impersonate: 'Personifiko' ip_lookup: "Shiko IP" log_out: "Shkëputu" + logged_out: "Përdoruesi i shkëput nga të gjitha paisjet" revoke_admin: 'Revoko Admin' + grant_admin: 'Jepi rolin admin' + revoke_moderation: 'Hiqi rolin moderator' + grant_moderation: 'Jepi rolin moderator' + unblock: 'Çblloko' block: 'Blloko' + reputation: Reputacioni + permissions: Të drejtat activity: Aktiviteti like_count: Pëlqime të dhëna / të marra last_100_days: 'në 100 ditët e fundit' private_topics_count: Diskutime Private + posts_read_count: Postime të lexuara + post_count: Postime të krijuara + topics_entered: Tema të shikuara flags_given_count: Sinjalizime të dhëna flags_received_count: Sinjalizime të marra + warnings_received_count: Paralajmërime të marra flags_given_received_count: 'Sinjalizime të dhëna / marra' approve: 'Aprovo' approved_by: "aprovuar nga" + approve_success: "Anëtari u aprovua dhe emaili u dërgua me udhëzimet e aktivizimit." + approve_bulk_success: "Sukses! Të gjithë anëtarët e zgjedhur janë aprovuar dhe notifikuar." time_read: "Koha e Leximit" + anonymize: "Anonimizo përdoruesin" + anonymize_yes: "Po, anonimizo këtë llogari" delete: "Fshi Përdoruesin" + delete_forbidden_because_staff: "Administratorët dhe moderatorët nuk fshihen dot. " delete_confirm: "E SIGURT që doni ta fshini këtë përdorues? Kjo është e përhershme!" delete_and_block: "Fshijeni dhe bllokoni këtë email dhe adresë IP" delete_dont_block: "Vetëm fshijeni" deleted: "Anëtari u fshi." send_activation_email: "Dërgo Emailin e Aktivizimit" + activation_email_sent: "Një email aktivizimi u dërgua. " activate: "Aktivizoni llogarinë" block_confirm: 'A jeni të sigurtë që doni të bllokoni këtë anëtar? Anëtari nuk do të ketë më të drejtën të krijojë postime ose tema të reja.' block_accept: 'Po, blloko anëtarin' @@ -2342,13 +2507,25 @@ sq: required: enabled: "i nevojshëm" disabled: "fakultativ" + editable: + enabled: "e modifikueshme" + disabled: "jo e modifikueshme" + show_on_profile: + title: "Trego në profilin publik" + enabled: "e treguar në profilin publik" + disabled: "nuk tregohet në profilin publik" show_on_user_card: title: "Trego në kartën e anëtarit?" enabled: "e treguar në kartën e anëtarit" disabled: "nuk tregohet në kartën e anëtarit" + field_types: + text: 'Fushë tekst' + confirm: 'Konfirmimi' + dropdown: "Listë Dropdown" site_text: description: "Mund të adaptoni çdo tekst në këtë faqe. Filloni duke bërë një kërkim më poshtë: " search: "Kërkoni për tekstin që dëshironi të redaktoni" + title: 'Tekstet' edit: 'redakto' revert: "Rikthe ndryshimet" revert_confirm: "A jeni të sigurtë se doni të riktheni mbrapsht ndryshimet e bëra?" @@ -2458,3 +2635,12 @@ sq: external_url: "URL e jashtme" form: label: "E Re:" + wizard_js: + wizard: + invites: + add_user: "shto" + none_added: "Nuk keni ftuar asnjë staf. Doni të vazhdoni?" + roles: + admin: "Admin" + moderator: "Moderator" + regular: "Përdorues i thjeshtë" diff --git a/config/locales/client.sv.yml b/config/locales/client.sv.yml index 64dbc42ca5..1f7a852edd 100644 --- a/config/locales/client.sv.yml +++ b/config/locales/client.sv.yml @@ -136,6 +136,7 @@ sv: enabled: 'listades %{when}' disabled: 'avlistades %{when}' topic_admin_menu: "administratörsåtgärder för ämne" + wizard_required: "Det är dags att konfigurera ditt forum! Starta installationsguiden!" emails_are_disabled: "All utgående e-post har blivit globalt inaktiverad av en administratör. Inga e-postnotifikationer av något slag kommer att skickas ut." bootstrap_mode_enabled: "Du är i bootstrap-läge för att göra lanseringen av din nya webbplats enklare. Alla nya användare kommer att beviljas förtroendenivå 1 och få dagliga sammanfattningar skickade via e-post. Det här stängs automatiskt av när det totala antalet användare överstiger %{min_users}." bootstrap_mode_disabled: "Bootstrap-läge otillgängliggörs i 24 timmar." @@ -796,6 +797,8 @@ sv: one: "1 fel/%{duration}" other: "%{count} fel/%{duration}" learn_more: "lär dig mer..." + all_time: 'totalt' + all_time_desc: 'totalt antal ämnen skapade' year: 'år' year_desc: 'ämnen skapade de senaste 365 dagarna' month: 'månad' @@ -908,6 +911,7 @@ sv: win10: "Win10" category_page_style: categories_only: "Endast kategorier" + categories_with_featured_topics: "Kategorier med framhävda ämnen" categories_and_latest_topics: "Kategorier med senaste ämnen" shortcut_modifier_key: shift: 'Shift' @@ -961,8 +965,10 @@ sv: show_preview: 'visa förhandsgranskning »' hide_preview: '« dölj förhandsgranskning' quote_post_title: "Citera hela inlägget" + bold_label: "B" bold_title: "Fet" bold_text: "fet text" + italic_label: "I" italic_title: "Kursiv" italic_text: "kursiv text" link_title: "Hyperlänk" @@ -980,6 +986,7 @@ sv: olist_title: "Numrerad lista" ulist_title: "Punktlista" list_item: "Listobjekt" + heading_label: "H" heading_title: "Rubrik" heading_text: "Rubrik" hr_title: "Horisontell linje" @@ -1095,6 +1102,7 @@ sv: not_logged_in_user: 'användarsida med sammanställning av aktuell aktivitet och inställningar' current_user: 'gå till din användarsida' topics: + new_messages_marker: "senaste besök" bulk: unlist_topics: "Avlista ämnen" reset_read: "Återställ lästa" @@ -1663,11 +1671,13 @@ sv: notifications: watching: title: "Bevakar" + description: "Du kommer automatiskt att bevaka alla ämnen i de här kategorierna. Du blir notifierad om varje nytt inlägg i alla ämnen, och en räknare över antalet nya inlägg visas. " watching_first_post: title: "Bevakar första inlägget" description: "Du kommer att bli notifierad om första inlägget i varje nytt ämne i de här kategorierna." tracking: title: "Följer" + description: "Du kommer automatiskt att följa alla ämnen i de här kategorierna. Du blir notifierad om någon nämner ditt @namn eller svarar på ditt inlägg, och en räknare över antalet nya inlägg visas." regular: title: "Normal" description: "Du notifieras om någon nämner ditt @namn eller svarar på ditt inlägg." @@ -1681,6 +1691,7 @@ sv: notify_action: 'Meddelande' official_warning: 'Officiell varning' delete_spammer: "Radera spammare" + delete_confirm_MF: "Du håller på att radera {POSTS, plural, one {1 inlägg} other {# inlägg}} och {TOPICS, plural, one {1 ämne} other {# ämnen}} från den här användaren, ta bort användarens konto, blockera registreringar från användarens IP-adress {ip_address}, och lägga till användarens e-postadress {email} till en permanent blockeringslista. Är du säker på att den här användaren verkligen är en spammare?" yes_delete_spammer: "Ja, radera spammare" ip_address_missing: "(N/A)" hidden_email_address: "(gömd)" @@ -1694,6 +1705,16 @@ sv: spam: "Det är spam" custom_placeholder_notify_user: "Var specifik, var konstruktiv och var alltid trevlig." custom_placeholder_notify_moderators: "Låt oss veta i detalj vad du är bekymrad över, och skicka med relevanta länkar och exempel om möjligt." + custom_message: + at_least: + one: "skriv åtminstone 1 tecken" + other: "skriv åtminstone {{count}} tecken" + more: + one: "1 till..." + other: "{{count}} till..." + left: + one: "1 kvar" + other: "{{count}} kvar" flagging_topic: title: "Tack för att du hjälper oss hålla forumet civiliserat!" action: "Flagga ämne" @@ -1702,6 +1723,7 @@ sv: title: "Sammanfattning av ämne" participants_title: "Flitiga skribenter" links_title: "Populära länkar" + links_shown: "visa fler länkar..." clicks: one: "1 klick" other: "%{count} klick" @@ -1942,6 +1964,7 @@ sv: tagging: all_tags: "Alla taggar" selector_all_tags: "alla taggar" + selector_no_tags: "inga taggar" changed: "taggar ändrade:" tags: "Taggar" choose_for_topic: "välj valfria taggar för det här ämnet" @@ -1957,14 +1980,18 @@ sv: filters: without_category: "%{filter} %{tag} ämnen" with_category: "%{filter} %{tag} ämnen i %{category}" + untagged_without_category: "%{filter} otaggade ämnen" + untagged_with_category: "%{filter} otaggade ämnen i %{category}" notifications: watching: title: "Bevakar" + description: "Du kommer automatiskt att bevaka alla ämnen i den här taggen. Du kommer att få notifieringar om alla nya inlägg och ämnen, och en räknare över olästa och nya inlägg kommer att visas brevid ämnen." watching_first_post: title: "Bevakar första inlägget" description: "Du kommer endast att bli notifierad om första inlägget i varje nytt ämne i den här taggen." tracking: title: "Bevakade" + description: "Du kommer automatiskt följa alla nya ämnen i den här taggen. En räknare över olästa och nya inlägg kommer att visas bredvid ämnen." regular: title: "Vanlig" description: "Du kommer att få en notifiering om någon nämner ditt @namn eller svarar på ditt inlägg." @@ -2161,6 +2188,9 @@ sv: add_owners: Lägg till ägare incoming_email: "Egenvald inkommande e-postadress" incoming_email_placeholder: "Ange e-postadress" + flair_bg_color_placeholder: "(Valfritt) Hexadecimal färgkod" + flair_color_placeholder: "(Valfritt) Hexadecimal färgkod" + flair_preview: "Förhandsgranska" api: generate_master: "Generera API-huvudnyckel" none: "Det finns inga aktiva API-nycklar just nu." @@ -2176,9 +2206,68 @@ sv: all_users: "Alla användare" note_html: "Håll denna nyckel hemlig, alla användare som har den kan skapa godtyckliga inlägg som alla användare." web_hooks: + title: "Webhookar" + none: "Det finns inga webhookar just nu." + new: "Ny webhook" + create: "Skapa" save: "Spara" destroy: "Radera" description: "Beskrivning" + controls: "Kontroller" + go_back: "Tillbaka till listan" + 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?" + wildcard_event: "Skicka mig allt." + individual_event: "Välj enskilda event." + active: "Aktiva" + active_notice: "Vi kommer att leverera detaljerna kring eventet när det händer." + categories_filter_instructions: "Relevanta webhookar kommer endast att utlösas om eventet är relaterat med specifika kategorier. Lämna blank för att utlösa webhookar för alla kategorier. " + categories_filter: "Utlösta kategorier" + groups_filter_instructions: "Relevanta webhookar kommer endast att utlösas om eventet är relaterat med specifierade grupper. Lämna blank för att utlösa webhookar för alla grupper." + groups_filter: "Utlösta grupper" + delete_confirm: "Ta bort den här webhooken?" + topic_event: + name: "Ämnesevent" + details: "När det finns ett nytt ämne, granskat, ändrat eller borttaget." + post_event: + name: "Inläggsevent" + details: "När det finns ett nytt svar, redigerat, borttaget eller återskapat." + user_event: + name: "Användarevent" + details: "När en användare är skapad eller godkänd." + delivery_status: + title: "Leveransstatus" + inactive: "Inaktiv" + failed: "Misslyckad" + successful: "Lyckad" + events: + none: "Det finns inga relaterade event." + redeliver: "Leverera igen" + incoming: + one: "Det finns ett nytt event." + other: "Det finns {{count}} nya event." + completed_in: + one: "Färdigställd på 1 sekund." + other: "Färdigställd på {{count}} sekunder." + request: "Förfrågning" + response: "Svar" + redeliver_confirm: "Är du säker på att du vill leverera samma nyttolast igen?" + headers: "Sidhuvuden" + payload: "Nyttolast" + body: "Huvuddel" + go_list: "Gå till listan" + go_details: "Redigera webhook" + go_events: "Gå till events" + ping: "Ping" + status: "Statuskod" + event_id: "ID" + timestamp: "Skapad" + completion: "Sluttid" + actions: "Åtgärder" plugins: title: "Tillägg" installed: "Installerade tillägg" @@ -2562,6 +2651,7 @@ sv: suspend_reason: "Anledning" suspended_by: "Avstängd av" delete_all_posts: "Radera alla inlägg" + delete_all_posts_confirm_MF: "Du håller på att radera {POSTS, plural, one {1 inlägg} other {# inlägg}} och {TOPICS, plural, one {1 ämne} other {# ämnen}}. Är du säker?" suspend: "Stäng av användare" unsuspend: "Lås upp användare" suspended: "Avstängd?" @@ -2657,6 +2747,9 @@ sv: unlock_trust_level: "Lås upp förtroendenivå" tl3_requirements: title: "Krav för förtroendenivå 3" + table_title: + one: "Den senaste dagen:" + other: "De senaste %{count} dagarna:" value_heading: "Värde" requirement_heading: "Krav" visits: "Besök" @@ -2756,6 +2849,7 @@ sv: developer: 'Utvecklare' embedding: "Inbäddning" legal: "Juridik" + user_api: 'Användar-API' uncategorized: 'Övrigt' backups: "Säkerhetskopior" login: "Inloggning" @@ -2844,6 +2938,7 @@ sv: sample: "Använd följande HTML-kod på din webbplats för att skapa och bädda in discourse-ämnen. Byt ut REPLACE_ME med den kanoniska URL-en för sidan som du bäddar in den i. " title: "Inbäddning" host: "Tillåtna värdar" + path_whitelist: "Sökväg vitlista" edit: "ändra" category: "Inlägg till kategori" add_host: "Lägg till värd" @@ -2855,6 +2950,7 @@ sv: embed_by_username: "Användarnamn för skapandet av ämne" embed_post_limit: "Högsta tillåtna antal inlägg att bädda in" embed_username_key_from_feed: "Nyckel för att hämta discourse användarnamn från flöde" + embed_title_scrubber: "Reguljära uttryck som används för att hitta och korrigera fel i inläggsrubriken" embed_truncate: "Trunkera de inbäddade inläggen" embed_whitelist_selector: "CSS-väljare för element som tillåts bäddas in" embed_blacklist_selector: "CSS-väljare för element som tas bort från inbäddningar" @@ -2877,3 +2973,22 @@ sv: label: "Ny:" add: "Lägg till" filter: "Sök (URL eller Extern URL)" + wizard_js: + wizard: + done: "Klar" + back: "Tillbaka" + next: "Nästa" + step: "%{current} av %{total}" + upload: "Ladda upp" + uploading: "Laddar upp..." + quit: "Kanske senare" + staff_count: + one: "Ditt forum har 1 personalmedlem." + other: "Ditt forum har %{count} personalmedlemmar." + invites: + add_user: "lägg till" + none_added: "Du har inte bjudit in någon personal. Är du säker på att du vill fortsätta?" + roles: + admin: "Administratör" + moderator: "Moderator" + regular: "Regelbunden användare" diff --git a/config/locales/client.tr_TR.yml b/config/locales/client.tr_TR.yml index 35eed31012..f8d44389dc 100644 --- a/config/locales/client.tr_TR.yml +++ b/config/locales/client.tr_TR.yml @@ -93,10 +93,10 @@ tr_TR: email: 'bu bağlantıyı e-posta ile gönderin' action_codes: public_topic: "bu konuyu %{when} herkese açık yaptı" - private_topic: "bu konuyu %{when} tarihinde özel yaptı" - split_topic: "bu konuyu ayır %{when}" + private_topic: "bu konuyu %{when} özel yaptı" + split_topic: "%{when} bu konuyu ayırdı " invited_user: "%{when} %{who} davet edildi" - invited_group: "%{who} %{when} devet edildi" + invited_group: "%{who} %{when} davet edildi" removed_user: "%{when} %{who} silindi" removed_group: "%{who} %{when} kaldırıldı" autoclosed: @@ -146,7 +146,7 @@ tr_TR: log_in: "Giriş Yap" age: "Yaş" joined: "Katıldı" - admin_title: "Yönetici" + admin_title: "Yönetim" flags_title: "Bildirilenler" show_more: "devamını göster" show_help: "seçenekler" @@ -196,7 +196,7 @@ tr_TR: user_count: "Yeni Kullanıcılar" active_user_count: "Etkin Kullanıcılar" contact: "Bize Ulaşın" - contact_info: "Bu siteyi etkileyen kritik bir problem ya da acil bir durum oluştuğunda, lütfen %{contact_info} adresi üzerinden bizimle iletişime geçin." + contact_info: "Bu siteyi etkileyen ciddi bir sorun ya da acil bir durum oluştuğunda, lütfen %{contact_info} adresi üzerinden bizimle iletişime geçin." bookmarked: title: "İmle" clear_bookmarks: "İmleneneri Temizle" @@ -332,10 +332,10 @@ tr_TR: description: "Bu grupta bulunan tüm konuların sadece ilk gönderilerinde bildirim alacaksınız." tracking: title: "Takip ediliyor" - description: "Biri @isim şeklinde sizden bahsederse ya da gönderinize cevap verirse bildirim alacaksınız ve yeni cevap sayısı gösterilecek." + description: "Birisi @isminizden bahsederse veya size cevap verirse bildirim alacaksınız ve yeni cevap sayısı gösterilecek." regular: title: "Olağan" - description: "Birisi @isminizden bahsederse ya da gönderinize cevap verirse bildirim alacaksınız." + description: "Birisi @isminizden bahsederse veya size cevap verirse bildirim alacaksınız." muted: title: "Susturuldu" description: "Bu gruptaki herhangi yeni bir konuyla ilgili asla bildirim almayacaksınız." @@ -353,7 +353,7 @@ tr_TR: '13': "Gelen Kutusu" '14': "Bekleyen" categories: - all: "Tüm Kategoriler" + all: "tüm kategoriler" all_subcategories: "hepsi" no_subcategory: "hiçbiri" category: "Kategori" @@ -402,7 +402,7 @@ tr_TR: new_private_message: "Yeni Mesaj" private_message: "Mesaj" private_messages: "Mesajlar" - activity_stream: "Aktivite" + activity_stream: "Etkinlik" preferences: "Tercihler" expand_profile: "Genişlet" bookmarks: "İmlenenler" @@ -539,7 +539,7 @@ tr_TR: instructions: "Profil arkaplanları ortalanacak ve genişlikleri 590px olacak. " email: title: "E-posta" - instructions: "Kimseye gösterilmeyecek." + instructions: "Herkese gösterilmeyecek" ok: "Onay için size e-posta atacağız" invalid: "Lütfen geçerli bir e-posta adresini giriniz" authenticated: "E-posta adresiniz {{provider}} tarafından doğrulanmıştır" @@ -548,7 +548,7 @@ tr_TR: other: "Sadece son {{count}} dakika içinde sizi görmediysek e-posta yollayacağız." name: title: "İsim" - instructions: "Tam adınız (zorunlu değil)" + instructions: "Tam adınız (isteğe bağlı)" instructions_required: "Tam adınız" too_short: "İsminiz çok kısa" ok: "İsminiz iyi görünüyor" @@ -558,8 +558,8 @@ tr_TR: short_instructions: "Kullanıcılar sizden @{{username}} olarak bahsedebilirler." available: "Kullanıcı adınız müsait" global_match: "E-posta kayıtlı kullanıcı adıyla eşleşiyor" - global_mismatch: "Zaten mevcut. {{suggestion}} deneyin?" - not_available: "Müsait değil. {{suggestion}} deneyin?" + global_mismatch: "Zaten kayıtlı. {{suggestion}} deneyin?" + not_available: "Uygun değil. {{suggestion}} deneyin?" too_short: "Kullanıcı adınız çok kısa" too_long: "Kullanıcı adınız çok uzun" checking: "Kullanıcı adı müsait mi kontrol ediliyor..." @@ -568,7 +568,7 @@ tr_TR: locale: title: "Arayüz dili" instructions: "Kullanıcı arayüzünün dili. Sayfayı yenilediğiniz zaman değişecektir." - default: "(varsayılan)" + default: "(öntanımlı)" password_confirmation: title: "Tekrar Parola" last_posted: "Son Gönderi" @@ -593,7 +593,7 @@ tr_TR: always: "her zaman" never: "asla" email_digests: - title: "Ben burda yokken popüler konu ve cevapların özetini e-posta olarak gönder" + title: "Ben burda yokken gözde konu ve cevapların özetini e-posta olarak gönder" every_30_minutes: "30 dakikada bir" every_hour: "saatte bir" daily: "günlük" @@ -642,7 +642,7 @@ tr_TR: pending_tab: "Bekleyen" pending_tab_with_count: "Beklemede ({{count}})" topics_entered: "Görüntülenmiş Konular" - posts_read_count: "Okunmuş Gönderiler" + posts_read_count: "Okunmuş Gönderi" expired: "Bu davetin süresi doldu." rescind: "Kaldır" rescinded: "Davet kaldırıldı" @@ -651,7 +651,7 @@ tr_TR: reinvited: "Davetiye tekrar yollandı" reinvited_all: "Tüm davetler tekrar gönderildi!" time_read: "Okunma Zamanı" - days_visited: "Ziyaret Edilen Günler" + days_visited: "Ziyaret Edilen Gün" account_age_days: "Hesabın gün olarak yaşı" create: "Davet Yolla" generate_link: "Davet bağlantısını kopyala" @@ -683,9 +683,9 @@ tr_TR: likes_received: other: " alınan " days_visited: - other: "ziyaret edilen günler" + other: "ziyaret edilen gün" posts_read: - other: "okunmuş gönderiler" + other: "okunmuş gönderi" bookmark_count: other: "imler" top_replies: "Başlıca Cevapları" @@ -700,7 +700,7 @@ tr_TR: top_links: "Önemli Bağlantılar" no_links: "Henüz bir bağlantı bulunmuyor." most_liked_by: "En Çok Beğenen" - most_liked_users: "Popüler Beğenmeler" + most_liked_users: "En Çok Beğenme" most_replied_to_users: "En Çok Cevaplanan" no_likes: "Henüz bir beğeni bulunmuyor." associated_accounts: "Girişler" @@ -784,7 +784,7 @@ tr_TR: enabled_description: "Bu konunun özetini görüntülemektesiniz: topluluğun en çok ilgisini çeken gönderiler" description: "{{replyCount}} adet cevap var." description_time: "Tahmini okuma süresi {{readingTime}} dakika olan {{replyCount}} cevap var." - enable: 'Bu Konuyu Özetle.' + enable: 'Bu Konuyu Özetle' disable: 'Tüm Gönderileri Göster' deleted_filter: enabled_description: "Bu konu gizlenen silinmiş gönderiler içeriyor." @@ -883,7 +883,7 @@ tr_TR: whisper: "fısıltı" unlist: "listelenmedi" add_warning: "Bu resmi bir uyarıdır." - toggle_whisper: "Fısıldamayı Göster/Gizle" + toggle_whisper: "Fısıldamayı Aç/Kapa" toggle_unlisted: "Listelenmemiş Olanları Değiştir" posting_not_on_topic: "Hangi konuyu cevaplamak istiyorsun?" saving_draft_tip: "kaydediliyor..." @@ -932,7 +932,7 @@ tr_TR: link_title: "Bağlantı" link_description: "buraya bağlantı açıklamasını girin" link_dialog_title: "Bağlantı ekle" - link_optional_text: "opsiyonel başlık" + link_optional_text: "isteğe bağlı başlık" link_url_placeholder: "http://ornek.com" quote_title: "Blok-alıntı" quote_text: "Blok-alıntı" @@ -956,7 +956,7 @@ tr_TR: yourself_confirm: title: "Alıcıları eklemeyi unuttun mu?" body: "Bu mesaj şu an sadece sana gönderiliyor!" - admin_options_title: "Bu konu için opsiyonel görevli ayarları" + admin_options_title: "Bu konu için isteğe bağlı görevli ayarları" auto_close: label: "Başlığı otomatik kapatma zamanı:" error: "Lütfen geçerli bir değer giriniz." @@ -989,7 +989,7 @@ tr_TR: moved_post: "

{{username}} taşıdı {{description}}

" linked: "

{{username}} {{description}}

" granted_badge: "

{{description}} rozeti kazandınız!

" - watching_first_post: "

Yeni Konu {{description}}

" + watching_first_post: "

Yeni Konu {{description}}

" group_message_summary: other: "

{{group_name}} isimli grubunuzun gelen kutusunda {{count}} adet mesaj var

" alt: @@ -1054,9 +1054,10 @@ tr_TR: hamburger_menu: "bir diğer konu ya da kategoriye git" new_item: "yeni" go_back: 'geri dön' - not_logged_in_user: 'güncel aktivitelerin ve tercihlerin özetinin bulunduğu kullanıcı sayfası' + not_logged_in_user: 'güncel etkinliklerin ve tercihlerin özetinin bulunduğu kullanıcı sayfası' current_user: 'kendi kullanıcı sayfana git' topics: + new_messages_marker: "son ziyaret" bulk: unlist_topics: "Konuları Listeleme" reset_read: "Okunmuşları Sıfırla" @@ -1088,20 +1089,20 @@ tr_TR: hot: "Sıcak bir konu yok." bookmarks: "Henüz bir konu imlememişsiniz." category: "{{category}} konusu yok." - top: "Popüler bir konu yok." + top: "Gözde bir konu yok." search: "Arama sonuçları yok." educate: - new: '

Yeni konularınız burada görünecektir.

Öntanımlı olarak son 2 gün içerisinde oluşturulmuş konular yeni olarak nitelendirilir ve yeni ibaresiyle işaretli olarak gösterilir.

tercihler sayfanızı ziyaret ederek bunu değiştirebilirsiniz.

' - unread: '

Okunmamış konularınız burada görünecektir.

Öntanımlı olarak, konuların okunmamış sayılması ve kaç tane okunmamış mesaj olduğunun gösterilmesi için 1 şunlar gerekir :

  • Konuyu oluşturduysanız
  • Konuya cevap verdiyseniz
  • Konuyu 4 dakikadan fazla okuduysanız

Veya konuyu, her konunun altında bulunan bildirim kontrol alanından Gözleniyor veya Takip Ediliyor olarak seçtiyseniz.

tercihler sayfanızı ziyaret ederek bunu değiştirebilirsiniz.

' + new: '

Yeni konular burada görünecektir.

Öntanımlı olarak son 2 gün içerisinde oluşturulmuş konular yeni olarak nitelendirilir ve yeni ibaresiyle işaretli olarak gösterilir.

tercihler sayfanızı ziyaret ederek bunu değiştirebilirsiniz.

' + unread: '

Okumadığınız konular burada görünecektir.

Öntanımlı olarak, konuların okunmamış sayılması ve kaç tane1 okunmamış mesaj olduğunun gösterilmesi için

  • Konuyu oluşturmuş olmanız
  • Konuya cevap vermiş olmanız
  • Konuyu 4 dakikadan fazla okumuş olmanız

Veya, konuyu her konunun altında bulunan bildirim kontrol alanından Gözleniyor veya Takip Ediliyor olarak seçmeniz durumlarından en az biri gerekir.

tercihler sayfanızı ziyaret ederek bunu değiştirebilirsiniz.

' bottom: latest: "Daha fazla son konu yok." hot: "Daha fazla sıcak bir konu yok." - posted: "Daha fazla konu yok." + posted: "Daha fazla gönderilmiş konu yok." read: "Daha fazla okunmuş konu yok." new: "Daha fazla yeni konu yok." unread: "Daha fazla okunmamış konu yok." category: "Daha fazla {{category}} konusu yok." - top: "Daha fazla popüler konu yok" + top: "Daha fazla gözde konu yok." bookmarks: "Daha fazla imlenmiş konu yok." search: "Daha fazla arama sonucu yok." topic: @@ -1183,7 +1184,7 @@ tr_TR: notifications: title: bu konu hakkında ne sıklıkla bildirim alacağını değiştir reasons: - mailing_list_mode: "e-posta liste modunu etkinleştirdin, böylece bu konuya gelen cevaplarla ilgili bildirimleri e-posta yoluyla alabileceksin. " + mailing_list_mode: "E-posta liste modunu etkinleştirdin, böylece bu konuya gelen cevaplarla ilgili bildirimleri e-posta yoluyla alabileceksin. " '3_10': 'Bu konuyla ilgili bir etiketi gözlediğin için bildirim alacaksın.' '3_6': 'Bu kategoriyi gözlediğiniz için bildirimlerini alacaksınız.' '3_5': 'Bu konuyu otomatik olarak gözlemeye başladığınız için bildirimlerini alacaksınız.' @@ -1194,8 +1195,8 @@ tr_TR: '2_4': 'Bu konuya cevap yazdığınız için bildirimlerini alacaksınız.' '2_2': 'Bu konuyu takip ettiğiniz için bildirimlerini alacaksınız.' '2': 'Bu konuyu okuduğunuz için bildirimlerini alacaksınız.' - '1_2': 'Birisi @isim şeklinde sizden bahsederse ya da gönderinize cevap verirse bildirim alacaksınız.' - '1': 'Birisi @isim şeklinde sizden bahsederse ya da gönderinize cevap verirse bildirim alacaksınız.' + '1_2': 'Birisi @isminizden bahsederse ya da size cevap verirse bildirim alacaksınız.' + '1': 'Birisi @isminizden bahsederse veya size cevap verirse bildirim alacaksınız.' '0_7': 'Bu kategoriye ait tüm bildirimleri görmezden geliyorsunuz.' '0_2': 'Bu konuya ait tüm bildirimleri görmezden geliyorsunuz.' '0': 'Bu konuya ait tüm bildirimleri görmezden geliyorsunuz.' @@ -1204,19 +1205,19 @@ tr_TR: description: "Bu mesajlaşmada ki her yeni gönderi için bir bildirim alacaksınız. Okunmamış ve yeni gönderilerin sayısı konunun yanında belirecek." watching: title: "Gözleniyor" - description: "Bu konudaki her yeni gönderi için bir bildirim alacaksınız. Okunmamış ve yeni gönderilerin sayısı konunun yanında belirecek." + description: "Bu konudaki her yeni gönderi için bildirim alacaksınız. Okunmamış ve yeni gönderilerin sayısı konunun yanında belirecek." tracking_pm: title: "Takip Ediliyor" - description: "Okunmamış ve yeni gönderi sayısı mesajın yanında belirecek. Birisi @isim şeklinde sizden bahsederse ya da gönderinize cevap verirse bildirim alacaksınız." + description: "Okunmamış ve yeni gönderi sayısı mesajın yanında belirecek. Birisi @isminizden bahsederse veya size cevap verirse bildirim alacaksınız." tracking: title: "Takip Ediliyor" - description: "Okunmamış ve yeni gönderi sayısı başlığın yanında belirecek. Birisi @isim şeklinde sizden bahsederse ya da gönderinize cevap verirse bildirim alacaksınız." + description: "Okunmamış ve yeni gönderi sayısı başlığın yanında belirecek. Birisi @isminizden bahsederse veya size cevap verirse bildirim alacaksınız." regular: title: "Olağan" - description: "Birisi @isim şeklinde sizden bahsederse ya da gönderinize cevap verirse bildirim alacaksınız." + description: "Birisi @isminizden bahsederse veya size cevap verirse bildirim alacaksınız." regular_pm: title: "Olağan" - description: "Birisi @isim şeklinde sizden bahsederse ya da gönderinize mesajla cevap verirse bildirim alacaksınız." + description: "Birisi @isminizden bahsederse veya size cevap verirse bildirim alacaksınız." muted_pm: title: "Susturuldu" description: "Bu mesajlaşmayla ilgili hiç bir bildirim almayacaksınız." @@ -1392,8 +1393,8 @@ tr_TR: 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 tipine izin verilmiyor. (izin verilen uzantılar: {{authorized_extensions}})." - image_upload_not_allowed_for_new_user: "Üzgünüz, yeni kullanıcılar resim yükleyemiyorlar." - attachment_upload_not_allowed_for_new_user: "Üzgünüz, yeni kullanıcılar dosya ekleyemiyorlar." + 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." abandon: confirm: "Gönderinizden vazgeçtiğinize emin misiniz?" @@ -1449,7 +1450,7 @@ tr_TR: inappropriate: "uygunsuz olarak bildirildi" notify_moderators: "moderatörler bilgilendirdi" notify_user: "mesaj gönderdi" - bookmark: "imlendi" + bookmark: "bunu imledi" like: "beğendi" vote: "oyladı" by_you: @@ -1542,7 +1543,7 @@ tr_TR: create_long: 'Yeni bir kategori oluştur' save: 'Kategoriyi Kaydet' slug: 'Kategori Kalıcı Bağlantısı' - slug_placeholder: '(Opsiyonel) bağlantı için tire ile ayırılmış kelimeler' + slug_placeholder: '(İsteğe bağlı) bağlantı için çizgi ile ayırılmış kelimeler' creation_error: Kategori oluşturulurken hata oluştu. save_error: Kategori kaydedilirken hata oluştu. name: "Kategori Adı" @@ -1575,10 +1576,10 @@ tr_TR: edit_permissions: "İzinleri Düzenle" add_permission: "İzin Ekle" this_year: "bu yıl" - position: "pozisyon" - default_position: "Varsayılan Pozisyon" + position: "konum" + default_position: "Öntanımlı Konum" position_disabled: "Kategoriler etkinlik sıralarına göre görünecekler. Listelerdeki kategorilerin sıralamalarını kontrol edebilmek için," - position_disabled_click: '"sabitlenmiş kategori pozisyonları" ayarını etklinleştirin.' + position_disabled_click: '"sabitlenmiş kategori konumları" ayarını etkinleştirin.' parent: "Üst Kategori" notifications: watching: @@ -1589,15 +1590,15 @@ tr_TR: description: "Bu kategorilerde bulunan tüm konuların sadece ilk gönderilerinde bildirim alacaksınız." tracking: title: "Takip Ediliyor" - description: "Bu kategorilerdeki tüm yeni konuları otomatik olarak takip edeceksiniz. Biri @isim şeklinde sizden bahsederse ya da gönderinize cevap verirse bildirim alacak, ayrıca yeni cevapların sayısını da konunun yanında görebileceksiniz." + description: "Bu kategorilerdeki tüm yeni konuları otomatik olarak takip edeceksiniz. Birisi @isminizden bahsederse veya gönderinize cevap verirse bildirim alacak, ayrıca yeni cevapların sayısını da konunun yanında görebileceksiniz." regular: title: "Olağan" - description: "Birisi @isim şeklinde sizden bahsederse ya da gönderinize cevap verirse bildirim alacaksınız." + description: "Birisi @isminizden bahsederse veya size cevap verirse bildirim alacaksınız." muted: title: "Susturuldu" description: "Bu kategorilerdeki yeni konular hakkında herhangi bir bildiri almayacaksınız ve en son gönderilerde gözükmeyecekler. " flagging: - title: 'Topluluğumuzun medeni kalmasına yardımcı olduğunuz için teşekkürler!' + title: 'Topluluğumuzun medeni kalmasına desteğiniz için teşekkürler!' action: 'Gönderiyi Bildir' take_action: "Harekete Geç" notify_action: 'Mesaj' @@ -1624,13 +1625,13 @@ tr_TR: left: other: "{{count}} kaldı" flagging_topic: - title: "Topluluğumuzun medeni kalmasına yardımcı olduğunuz için teşekkürler!" + title: "Topluluğumuzun medeni kalmasına desteğiniz için teşekkürler!" action: "Konuyu Bildir" notify_action: "Mesaj" topic_map: title: "Konu Özeti" participants_title: "Sıkça Yazanlar" - links_title: "Popüler bağlantılar" + links_title: "Gözde Bağlantılar" links_shown: "daha fazla bağlantı göster..." clicks: other: "%{count} tıklama" @@ -1674,7 +1675,7 @@ tr_TR: other: "gösterim" replies: "Cevap" views_long: "bu konu {{number}} defa görüntülendi" - activity: "Aktivite" + activity: "Etkinlik" likes: "Beğeni" likes_lowercase: other: "beğeni" @@ -1737,7 +1738,7 @@ tr_TR: other: "{{categoryName}} ({{count}})" help: "{{categoryName}} kategorisindeki en son konular" top: - title: "En Popüler" + title: "Gözde" help: "geçtiğimiz yıl, ay, hafta veya gündeki en etkin başlıklar" all: title: "Tüm Zamanlar" @@ -1811,11 +1812,11 @@ tr_TR: quote_post: 'q Gönderiyi alıntıla' like: 'l Gönderiyi beğen' flag: '! Gönderiyi bildir' - bookmark: 'b Gönderiyi işaretle' + bookmark: 'b Gönderiyi imle' edit: 'e Gönderiyi düzenle' delete: 'd Gönderiyi sil' mark_muted: 'm, m Konuyu sustur' - mark_regular: 'm, r Varsayılan konu' + mark_regular: 'm, r Öntanımlı konu' mark_tracking: 'm, t Konuyu takip et' mark_watching: 'm, w Konuyu gözle' badges: @@ -1866,7 +1867,7 @@ tr_TR: rename_tag: "Etiketi Yeniden Adlandır" rename_instructions: "Bu etiket için yeni bir ad seçin:" sort_by: "Sırala:" - sort_by_count: "say" + sort_by_count: "sayaç" sort_by_name: "ad" manage_groups: "Etiket Grubunu Yönet" manage_groups_description: "Etiket gurubunu yönetmek için grup tanımla" @@ -1883,11 +1884,11 @@ tr_TR: title: "İlk gönderi gözlemeniz" description: "Bu etikette bulunan tüm konuların sadece ilk gönderilerinde bildirim alacaksınız." tracking: - title: "Takip Etme" + title: "Takip ediliyor" description: "Bu etiketteki tüm konuları otomatik olarak takip ediyor olacaksınız. Okunmamış yeni gönderilerin bir kısmı konunun yanında görünecektir." regular: title: "Müdavim" - description: "Eğer bir kişi @isminiz şeklinde sizden bahsederse veya oluşturduğunuz konuya cevap yazarsa bildirim alacaksınız." + description: "Birisi @isminizden bahsederse veya gönderinize cevap verirse bildirim alacaksınız." muted: title: "Susturuldu" description: "Bu etikette beliren yeni konular hakkında bildirim almayacaksınız ve bunlar okunmamışlar sekmesinde belirmeyecek." @@ -1898,7 +1899,7 @@ tr_TR: tags_label: "Bu gruptaki etiketler:" parent_tag_label: "Üst etiket:" parent_tag_placeholder: "İsteğe Bağlı" - parent_tag_description: "Bu gruptaki etiketler aile etiketi yoksa kullanılamaz." + parent_tag_description: "Bu gruptaki etiketler üst etiketi olduğu sürece kullanılamaz." one_per_topic_label: "Bu etiket grubundan her konu için bir etiket ile sınırla" new_name: "Yeni Etiket Grubu" save: "Kaydet" @@ -1922,14 +1923,14 @@ tr_TR: read: "Okunacak daha fazla konu bulunmuyor." new: "Daha fazla yeni konu bulunmuyor." unread: "Daha fazla okunmamış konu bulunmuyor." - top: "Daha falza üst sıralarda konu bulunmuyor." + top: "Daha fazla üst sıralarda konu bulunmuyor." bookmarks: "Daha fazla imlenmiş konu bulunmuyor." search: "Daha fazla arama sonucu bulunmuyor." invite: custom_message: "Davetini daha özel hale getirmek için şunu yaz" custom_message_link: "kişiselleştirilmiş mesaj" custom_message_placeholder: "Kişiselleştirilmiş mesajınızı düzenleyin" - custom_message_template_forum: "Hey, bu foruma üye olsan iyi olur!" + custom_message_template_forum: "Hey, bu foruma katılmalısın!" custom_message_template_topic: "Hey, bu konu senin için eğleceli olabilir!" admin_js: type_to_filter: "süzgeç girin..." @@ -1937,8 +1938,8 @@ tr_TR: title: 'Discourse Yönetici Paneli' moderator: 'Moderatör' dashboard: - title: "Yönetici Paneli" - last_updated: "Yönetici panelinin son güncellenmesi:" + title: "Göstergeler" + last_updated: "Göstergelerin son güncellenmesi:" version: "Sürüm" up_to_date: "Sisteminiz güncel durumda!" critical_available: "Önemli bir güncelleme var." @@ -2058,7 +2059,7 @@ tr_TR: delete_confirm: "Grup silinsin mi?" delete_failed: "Grup silinemedi. Bu otomatik oluşturulmuş bir grup ise, yok edilemez." delete_member_confirm: "'%{username}' adlı kullanıcıyı '%{group}' grubundan çıkart?" - delete_owner_confirm: "'%{username}' için sahiplik imtiyazı kaldırılsın mı?" + delete_owner_confirm: "'%{username}' için sahiplik izni kaldırılsın mı?" name: "Ad" add: "Ekle" add_members: "Üye ekle" @@ -2070,7 +2071,7 @@ tr_TR: automatic: "Otomatik" automatic_membership_email_domains: "Bu listedeki bir e-posta alan adıyla kaydolan kullanıcılar otomatik olarak bu gruba eklenecekler:" automatic_membership_retroactive: "Varolan kayıtlı kullanıcıları eklemek için aynı e-posta alan adı kuralını uygula" - default_title: "Bu gruptaki tüm kullanıcılar için varsayılan başlık" + default_title: "Bu gruptaki tüm kullanıcılar için öntanımlı başlık" primary_group: "Otomatik olarak ana grup yap" group_owners: Sahipler add_owners: Sahiplik ekle @@ -2094,25 +2095,54 @@ tr_TR: all_users: "Tüm Kullanıcılar" note_html: "Bu anahtarı gizli tutun, anahtara sahip kullanıcılar her hangi bir kullanıcı adı altında istedikleri gönderiyi oluşturabilirler." web_hooks: + title: "Web Kancaları" + none: "Şu anda bir web kancası yok." + new: "Yeni Web Kancası" create: "Oluştur" save: "Kaydet" destroy: "Sil" description: "Açıklama" + controls: "Kontroller" go_back: "Listeye geri dön" + payload_url_placeholder: "https://ornek.com/gonderial" + 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" + content_type: "İçerik Türü" + secret: "Gizli" + wildcard_event: "Bana her şeyi gönder." + individual_event: "Belirli olayları seç" active: "Etkin" + delete_confirm: "Bu web kancasını sil?" + topic_event: + name: "Konu Olayı" + details: "Yeni bir konu oluşturulduğunda, düzenlendiğinde veya silindiğinde." + post_event: + name: "Gönderme Olayı" + details: "Yeni bir cevap oluşturulduğunda, düzenlendiğinde veya silindiğinde." + user_event: + name: "Kullanıcı Olayı" + details: "Kullanıcı oluşturulduğunda veya onaylandığında." delivery_status: title: "Teslim Durumu" inactive: "Etkin Değil" failed: "Başarısız" successful: "Başarılı" events: + none: "İlgili bir olay yok." + incoming: + other: "Şu anda {{count}} yeni olay var." completed_in: other: "{{count}} saniyede tamamlandı." request: "İstek" response: "Yanıt" headers: "Başlıklar" body: "İçerik" + go_list: "Listeye git" + go_details: "Web kancasını düzenle" + go_events: "Olaylara git" status: "Durum Kodu" + event_id: "Kimlik" timestamp: "Oluşturulma" completion: "Tamamlanma Zamanı" actions: "Eylemler" @@ -2122,7 +2152,7 @@ tr_TR: name: "İsim" none_installed: "Yüklenmiş herhangi bir eklentiniz yok." version: "Sürüm" - enabled: "Etkinleştirildi mi?" + enabled: "Etkin mi?" is_enabled: "E" not_enabled: "H" change_settings: "Ayarları Değiştir" @@ -2140,8 +2170,8 @@ tr_TR: label: "Yalnızca okumayı etkinleştir" confirm: "Yalnızca okuma modunu etkinleştirmek istediğinizden emin misiniz?" disable: - title: "Yalnızca okuma modunu durdur" - label: "Yalnızca okumayı durdur" + title: "Yalnızca okuma modunu kapatır" + label: "Yalnızca okumayı kapa" logs: none: "Henüz kayıt bulunmuyor..." columns: @@ -2149,7 +2179,7 @@ tr_TR: size: "Boyut" upload: label: "Yedek Yükle" - title: "Bu oluşuma bir yedekleme yükle" + title: "Bu oluşuma bir yedek yükle" uploading: "Yükleniyor..." success: "'{{filename}}' başarıyla yüklendi." error: "'{{filename}}': {{message}} yüklenirken bir hata oluştu" @@ -2211,22 +2241,22 @@ tr_TR: body_tag: text: "" title: " etiketinden önce eklenecek HTML" - override_default: "Standart stil sayfasını eklemeyin" - enabled: "Etkinleştirildi mi?" + override_default: "Standart biçim sayfasını eklemeyin" + enabled: "Etkin mi?" preview: "önizleme" undo_preview: "önizlemeyi kaldır" - rescue_preview: "varsayılan stil" - explain_preview: "Websitesine bu özelleştirilmiş stil sayfası ile bak" - explain_undo_preview: "Şu an etkin olan özelleştirilmiş stil sayfasına geri dön" - explain_rescue_preview: "Websitesine varsayılan stil sayfası ile bak" + rescue_preview: "öntanımlı biçim" + explain_preview: "Websitesine bu özelleştirilmiş biçim sayfası ile bak" + explain_undo_preview: "Şu an etkin olan özelleştirilmiş biçim sayfasına geri dön" + explain_rescue_preview: "Websitesine varsayılan biçim sayfası ile bak" save: "Kaydet" new: "Yeni" - new_style: "Yeni Stil" + new_style: "Yeni Biçim" import: "İçeri Aktar" import_title: "Bir dosya seçin ya da kopyalayıp yapıştırın" delete: "Sil" delete_confirm: "Bu özelleştirmeyi sil?" - about: "Websitesindeki CSS stil sayfalarını ve HTML başlıklarını değiştir. Özelleştirme ekleyerek başla." + about: "Sitedeki CSS biçim sayfalarını ve HTML başlıklarını değiştir. Özelleştirme ekleyerek başla." color: "Renk" opacity: "Opaklık" copy: "Kopyala" @@ -2235,7 +2265,7 @@ tr_TR: subject: "Konu" multiple_subjects: "Bu e-posta şablonunda birden fazla konu mevcut." body: "İçerik" - none_selected: "Düzenlemeye başlamak için bir e-posta içeriği seçin. " + none_selected: "Düzenlemeye başlamak için bir e-posta şablonu seçin. " revert: "Değişiklikleri Geri Al" revert_confirm: "Değişikliklerinizi geri almak istediğinize emin misiniz?" css_html: @@ -2244,7 +2274,7 @@ tr_TR: colors: title: "Renkler" long_title: "Renk Düzenleri" - about: "Websitesindeki renkleri CSS yazmadan değiştir. Renk düzeni ekleyerek başla." + about: "Sitede kullanılan renkleri CSS yazmadan değiştir. Renk düzeni ekleyerek başla." new_name: "Yeni Renk Düzeni" copy_name_prefix: "Kopyası" delete_confirm: "Bu renk düzenini sil?" @@ -2495,6 +2525,7 @@ tr_TR: suspend_reason: "Neden" suspended_by: "Uzaklaştıran" delete_all_posts: "Tüm gönderileri sil" + delete_all_posts_confirm_MF: "{POSTS, plural, one {1 gönderi} other {# gönderi}} ve {TOPICS, plural, one {1 konu} other {# konu}} silmek üzeresiniz. Emin misiniz?" suspend: "Uzaklaştır" unsuspend: "Uzaklaştırmayı geri al" suspended: "Uzaklaştırıldı mı?" @@ -2520,7 +2551,7 @@ tr_TR: block: 'Engelle' reputation: İtibar permissions: İzinler - activity: Aktivite + activity: Etkinlik like_count: Beğenileri / Beğendikleri last_100_days: 'son 100 günde' private_topics_count: Özel Konular @@ -2563,7 +2594,7 @@ tr_TR: deactivate_failed: "Kullanıcı deaktive edilirken bir sorun yaşandı." unblock_failed: 'Kullanıcının engeli kaldırılırken bir sorun yaşandı.' block_failed: 'Kullanıcı engellenirken bir sorun yaşandı.' - block_confirm: 'Bu kullanıcıyı bloklamak istediğinize emin misiniz? Bunu yaparsanız yeni başlık ya da gönderi oluşturamayacak.' + block_confirm: 'Bu kullanıcıyı engellemek istediğinize emin misiniz? Bunu yaparsanız yeni başlık ya da gönderi oluşturamayacak.' block_accept: 'Evet, bu kullanıcıyı engelle' bounce_score: "Geri Sekme Skoru" reset_bounce_score: @@ -2646,8 +2677,8 @@ tr_TR: disabled: "profilde gösterilmiyor" show_on_user_card: title: "Kullanıcı profilinde gösterilsin mi?" - enabled: "Kullanıcı profilinde göster" - disabled: "Kullanıcı profilinde gösterme" + enabled: "kullanıcı profilinde göster" + disabled: "kullanıcı kartında gösterilmiyor" field_types: text: 'Yazı Alanı' confirm: 'Onay' @@ -2771,15 +2802,15 @@ tr_TR: image: "Görsel" delete_confirm: ":%{name}: emojisini silmek istediğinize emin misiniz?" embedding: - get_started: "Eğer Discourse'u bir başka web sitesine gömmek istiyorsanız, bu sitenin hostunu ekleyerek başlayın." - confirm_delete: "Bu hostu silmek istediğinize emin misiniz?" + get_started: "Eğer Discourse'u bir başka web sitesine gömmek istiyorsanız, bu sitenin sunucusunu ekleyerek başlayın." + confirm_delete: "Bu sunucuyu silmek istediğinize emin misiniz?" sample: "Discourse konuları oluşturmak ve gömmek için aşağıdaki HTML kodunu sitenizde kullanın. REPLACE_ME'yi Discourse'u gömdüğünüz sayfanın tam URL'i ile değiştirin." title: "Gömme" - host: "İzin Verilen Hostlar" + host: "İzin Verilen Sunucular" path_whitelist: "Kabul edilen yol listesi" edit: "düzenle" category: "Kategoriye Gönder" - add_host: "Host Ekle" + add_host: "Sunucu Ekle" settings: "Ayarları Gömmek" feed_settings: "RSS Ayarları" feed_description: "Siteniz için bir RSS/ATOM beslemesi sağlamanız Discourse'un içeriğinizi içe aktarma yeteneğini geliştirebilir." @@ -2810,3 +2841,21 @@ tr_TR: label: "Yeni:" add: "Ekle" filter: "Ara (Bağlantı veya Harici Bağlantı)" + wizard_js: + wizard: + done: "Tamamlandı" + back: "Geri" + next: "İleri" + step: "%{current} / %{total}" + upload: "Yükle" + uploading: "Yükleniyor..." + quit: "Belki Sonra" + staff_count: + other: "Topluluğunuzda %{count} görevli üye var." + invites: + add_user: "ekle" + none_added: "Herhangi bir görevli davet etmediniz. Devam etmek istediğinize emin misiniz?" + roles: + admin: "Yönetici" + moderator: "Moderatör" + regular: "Müdavim Kullanıcı" diff --git a/config/locales/client.zh_CN.yml b/config/locales/client.zh_CN.yml index ea9a5e5193..df00b96aac 100644 --- a/config/locales/client.zh_CN.yml +++ b/config/locales/client.zh_CN.yml @@ -1037,6 +1037,7 @@ zh_CN: not_logged_in_user: '显示当前活动和设置的用户页面' current_user: '转到用户页面' topics: + new_messages_marker: "上次访问" bulk: unlist_topics: "未在列表的主题" reset_read: "设为未读" @@ -2068,6 +2069,74 @@ zh_CN: info_html: "API 密钥可以用来通过 JSON 调用创建和更新主题。" all_users: "所有用户" note_html: "请安全地保管密钥,任何拥有该密钥的用户可以使用它以论坛任何用户的名义发帖。" + web_hooks: + title: "Webhooks" + none: "当前没有 Webhooks。" + instruction: "Webhooks 让 Discourse 可以在特定事件发生时通知外部服务。当 webhook 事件触发时,一个 POST 请求将发向指定地址。" + detailed_instruction: "一个 POST 请求将在选定事件发生时发至指定 URL。" + new: "新建 Webhook" + create: "创建" + save: "保存" + destroy: "删除" + description: "描述" + controls: "控制" + go_back: "返回列表" + payload_url: "Payload URL" + payload_url_placeholder: "https://example.com/postreceive" + warn_local_payload_url: "你好像将 webhook 指向了一个本地地址。把相关事件发送到本地可能产生副作用或未预期的行为。继续吗?" + secret_invalid: "密钥不能包含空白字符。" + secret_too_short: "密钥必须至少有 12 个字符。" + secret_placeholder: "可选字符串,用于生成签名" + event_type_missing: "你必须设置一个事件类型。" + content_type: "内容格式" + secret: "密钥" + event_chooser: "你想要 webhook 发送哪些事件?" + wildcard_event: "发送任何事件。" + individual_event: "选择各个事件。" + verify_certificate: "检查 Payload URL 的 TLS 证书" + active: "启用" + active_notice: "我们将在事件发生时分发事件详情。" + categories_filter_instructions: "相关 Webhook 事件将在满足特定分类的情况下才发送。留空忽略分类限制。" + categories_filter: "触发的分类" + groups_filter_instructions: "相关 Webhook 事件将在满足特定群组的情况下才发送。留空忽略群组限制。" + groups_filter: "触发的群组" + delete_confirm: "删除这个 webhook?" + topic_event: + name: "主题事件" + details: "当有新主题、主题被修订、修改或者删除时。" + post_event: + name: "帖子事件" + details: "当有新回复、编辑、帖子被删除或者恢复时。" + user_event: + name: "用户事件" + details: "当用户被创建或者通过时。" + delivery_status: + title: "分发状态" + inactive: "不活跃" + failed: "失败" + successful: "成功" + events: + none: "没有相关事件。" + redeliver: "重新发送" + incoming: + other: "有 {{count}} 个新事件。" + completed_in: + 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: "插件" installed: "安装的插件" diff --git a/config/locales/server.de.yml b/config/locales/server.de.yml index 4f8503904f..dc54908aa1 100644 --- a/config/locales/server.de.yml +++ b/config/locales/server.de.yml @@ -111,6 +111,7 @@ de: operation_already_running: "Eine Arbeitsschritt wird momentan bearbeitet. Im Moment kann kein neuer Vorgang gestartet werden." backup_file_should_be_tar_gz: "Die Sicherungsdatei sollte ein .tar.gz-Archiv sein." not_enough_space_on_disk: "Es gibt nicht genügend freien Festplattenspeicher, um dieses Backup hochzuladen." + invalid_filename: "Der Dateiname für das Backup enthält ungültige Zeichen. Gültig sind: a-z 0-9 . - _." not_logged_in: "Dazu musst du angemeldet sein." not_found: "Die angeforderte URL oder Ressource konnte nicht gefunden werden." invalid_access: "Du hast nicht die Erlaubnis, die angeforderte Ressource zu betrachten." @@ -298,6 +299,10 @@ de: post_reply: base: different_topic: "Beitrag und Antwort müssen zum gleichen Thema gehören." + web_hook: + attributes: + payload_url: + invalid: "URL ist ungültig. URL sollte http:// oder https:// enthalten, Leerzeichen sind nicht erlaubt." <<: *errors user_profile: no_info_me: "
Das 'Über mich'-Feld deines Profils ist aktuell leer, möchtest du es ausfüllen?
" @@ -912,6 +917,7 @@ de: enable_facebook_logins: "Aktiviere Facebook-Authentifizierung (benötigt facebook_app_id und facebook_app_secret)." facebook_app_id: "App-ID für Facebook-Authentifizierung, registriert auf https://developers.facebook.com/apps" facebook_app_secret: "App Secret für Facebook-Authentifizierung, registriert auf https://developers.facebook.com/apps" + facebook_request_extra_profile_details: "Anfrage zu \"über mich\", Standort und Website von Facebook. (erfordert, dass Deine auth-Anwendung von Facebook genehmigt wurde)" enable_github_logins: "Aktiviere GitHub-Authentifizierung (benötigt github_client_id und github_client_secret)." github_client_id: "Client-ID für GitHub-uthentifizierung, registriert auf https://github.com/settings/applications" github_client_secret: "Client Secret für GitHub-Authentifizierung, registriert auf https://github.com/settings/applications" diff --git a/config/locales/server.fi.yml b/config/locales/server.fi.yml index fc85f5e122..c8077a0c4e 100644 --- a/config/locales/server.fi.yml +++ b/config/locales/server.fi.yml @@ -19,6 +19,10 @@ fi: date: month_names: [null, Tammikuu, Helmikuu, Maaliskuu, Huhtikuu, Toukokuu, Kesäkuu, Heinäkuu, Elokuu, Syyskuu, Lokakuu, Marraskuu, Joulukuu] <<: *datetime_formats + time: + am: "am" + pm: "pm" + <<: *datetime_formats title: "Discourse" topics: "Ketjut" posts: "viestit" @@ -2534,8 +2538,118 @@ fi: staff_tag_disallowed: "Tunnisteen \"%{tag}\" voi lisätä vain henkilökunta" staff_tag_remove_disallowed: "Tunnisteen \"%{tag}\" voi poistaa vain henkilökunta" rss_by_tag: "Ketjut tunnisteella %{tag}" - time: - <<: *datetime_formats + wizard: + title: "Discoursen asennus" + step: + locale: + title: "Tervetuloa Discourseesi!" + fields: + default_locale: + description: "Mikä on yhteisösi oletuskieli?" + forum_title: + title: "Nimi" + description: "Nimi on merkiitävä asia, sillä se on ensimmäinenasia jonka potentiaalinen vierailija saa tietää yhteisöstäsi. Mitä valitsemasi nimi kertoo yhteisöstä?" + fields: + title: + label: "Yhteisösi nimi" + placeholder: "Jennin mesta" + site_description: + label: "Kuvaile yhteisöä yhdellä lyhyellä lauseella" + placeholder: "Paikka, jossa Jenni ja hänen ystävänsä voivat keskustella kivoista jutuista" + introduction: + title: "Johdanto" + 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\".

" + one_paragraph: "Pidä tervetuloviesti yhden kappaleen mittaisena." + privacy: + 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.

" + fields: + privacy: + choices: + open: + label: "Julkinen" + description: "Kenellä tahansa on pääsy yhteisöön ja mahdollisuus käyttäjätunnuksen luomiseen" + restricted: + label: "Yksityinen" + description: "Vain kutsutuilla ja hyväksytyillä on pääsy yhteisöön" + contact: + title: "Yhteystiedot" + fields: + contact_email: + label: "Sähköposti" + placeholder: "name@example.com" + description: "Sähköpostiosoite, josta tavoittaa henkilön tai ryhmän, joka vastaa palstan ylläpidosta. Siihen lähetetään kriittisiä huomautuksia käsittelemättömistä liputuksista ja turvallisuuspäivityksistä, ja se näkyy Tietoja-sivulla yhteysosoitteena kiireellisiä yhteydenottoja varten." + contact_url: + label: "Internet-sivu" + placeholder: "http://www.example.com/contact-us" + description: "Internet-sivu, jonka kautta sinuun tai organisaatioosi voi ottaa yhteyttä. Näytetään Tietoja-sivulla." + site_contact: + label: "Automaattiset viestit" + 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." + fields: + company_short_name: + label: "Yrityksen nimi (lyhyesti)" + placeholder: "Initech" + company_full_name: + label: "Yrityksen nimi (kokonaan)" + placeholder: "Initech, Inc." + company_domain: + label: "Yrityksen verkkotunnuksen nimi" + placeholder: "initech.com" + colors: + title: "Värimaailma" + fields: + theme_id: + description: "Haluatko tumman vai vaalean värimaailman? Voit milloin vain muokata sivustosi ulkoasua navigoimalla Ylläpito --> Mukauta" + choices: + default: + label: "Yksinkertainen vaalea" + dark: + label: "Yksinkertainen tumma" + logos: + title: "Logot" + fields: + logo_url: + label: "Ensisijainen logo" + description: "Logo, joka näkyy sivustosi vasemmassa yläkulmassa. Tee siitä suorakulmion muotoinen." + logo_small_url: + label: "Tiivis logo" + description: "Tiivis versio sivustosi logosta, joka näkyy sivustosi vasemmassa yläkulmassa, kun vierittää alaspäin. Tee siitä neliön muotoinen." + icons: + title: "Ikonit" + fields: + favicon_url: + label: "Pieni ikoni" + description: "Ikoni, joka edustaa sivustoasi selaimissa ja joka näyttää hyvältä pienessäkin koossa kuten 32 px kertaa 32 px." + apple_touch_icon_url: + label: "Suuri ikoni" + description: "Ikoni, joka edustaa sivustoasi nykyaikaisemmilla laitteilla ja joka näyttää hyvältä isommassakin koossa. Suositeltu koko on vähintään 144 px kertaa 144 px." + homepage: + description: "Suosittelemme, että kotisivusi on Tuoreimmat-näkymä, mutta voit valita Keskustelualueet-näkymän (ketjut ryhmitelty aihepiirin mukaan) kotisivuksi, jos haluat." + title: "Kotisivu" + fields: + homepage_style: + choices: + latest: + label: "Tuoreimmat" + categories: + label: "Keskustelualueet" + emoji: + title: "Emojit" + description: "Minkä emojityylin haluat yhteisöösi? Voit milloin vain lisätä mukautettuja emojeita navigoimalla Ylläpito --> Mukauta --> Emoji." + invites: + title: "Kutsu henkiökuntaa" + description: "Melkein valmista! Kutsutaan muutama henkilökuntalainen auttamaan pohjustamaan keskusteluita kiintoisilla ketjunavauksilla ja vastauksilla, jotta yhteisö pääsee alkuun." + finished: + title: "Discoursesi on valmis!" + description: | +

Jos milloin tahansa haluat muuttaa asetuksia, käy ylläpito-osiossa; löydät sen jakoavainkuvakkeen vierestä sivuston valikosta.

+

Onnea ja menestystä uuden yhteisön rakentamiseen!

activemodel: errors: <<: *errors diff --git a/config/locales/server.fr.yml b/config/locales/server.fr.yml index 95cceecae4..15ef7309cf 100644 --- a/config/locales/server.fr.yml +++ b/config/locales/server.fr.yml @@ -40,7 +40,7 @@ fr: errors: empty_email_error: "Se produit quand le courriel reçu était vide." no_message_id_error: "Se produit quand le courriel n'a pas d'entête \"Message-Id\"." - auto_generated_email_error: "Se produit quand le header 'precedence' est : list, junk, bulk ou auto-reply, ou lorsque n'importe quel autre header contient : auto-submitted, auto-replied ou auto-generated." + auto_generated_email_error: "Se produit quand l'entête « precedence » est : list, junk, bulk ou auto-reply, ou lorsque n'importe quel autre entête contient : auto-submitted, auto-replied ou auto-generated." no_body_detected_error: "Se produit quand il est impossible d'extraire le corps du message et qu'il n'y a pas de pièces-jointes." inactive_user_error: "Se produit quand l'expéditeur n'est pas actif." blocked_user_error: "Se produit quand l'expéditeur a été bloqué." @@ -310,7 +310,7 @@ fr: vip_category_name: "Salon" vip_category_description: "Une catégorie réservée aux membres avec un niveau de confiance 3 et plus." meta_category_name: "Retours sur le site" - meta_category_description: "Discussion à propos du site, son organisation, son fonctionnement, et comment nous pouvons l'améliorer." + meta_category_description: "Discussions à propos du site, son organisation, son fonctionnement, et comment nous pouvons l'améliorer." staff_category_name: "Responsables" staff_category_description: "Catégorie privée pour les discussions de l'équipe du forum. Les sujets ne sont visibles que pour les administrateurs et les modérateurs." assets_topic_body: "Ceci est un sujet permanent, visible uniquement par l'équipe, pour stocker les images et fichiers utilisés pour le design du site. Ne pas le supprimer !\n\n\nMarche à suivre:\n\n1. Répondre à ce sujet\n2. Envoyer toutes les images que vous voulez utilisés comme logos, favicons, et tout ce que vous souhaitez. (Utiliser l'icone dans la barre d'édition ou glisser-déposer ou coller les images)\n3. Envoyer votre réponse\n4. Afin d'obtenir le chemin complet de votre image, faites un clic-droit dessus ou éditer votre message et copier le chemin.\n5. Coller le chemin de l'image dans les [paramètres requis](/admin/site_settings/category/required).\n\nDe plus, si vous souhaitez envoyer d'autres formats de fichier, modifier l'option `authorized_extensions` dans les [paramètres de fichier](/admin/site_settings/category/files)." @@ -355,7 +355,7 @@ fr: one: "Vous ne pouvez pas supprimer cette catégorie car elle contient 1 sujet. Le plus vieux sujet est %{topic_link}." other: "Vous ne pouvez pas supprimer cette catégorie car elle contient %{count} sujets. Le plus vieux sujet est %{topic_link}." topic_exists_no_oldest: "Vous ne pouvez pas supprimer cette catégorie car le nombre de sujet est de %{count}." - uncategorized_description: "Sujets sans catégorie, ou qui ne correspond à aucune catégorie existante." + uncategorized_description: "Sujets qui n'ont pas besoin d'une catégorie ou qui ne correspondent à aucune catégorie existante." trust_levels: newuser: title: "nouvel utilisateur" @@ -775,7 +775,7 @@ fr: title: "Le nom du site, utilisé dans la balise title." site_description: "Décrivez ce site en une seule phrase, utilisée dans le tag meta description." contact_email: "Adresse de courriel du contact clé pour ce site. Utilisée pour des notifications critiques telles que des signalements en attente ou des faits urgents en provenance du formulaire de contact de la page À propos." - contact_url: "Adresse de contact pour ce site. Utilisée sur la formulaire de contact sur la page 'a propos' pour les notifications critiques." + contact_url: "Adresse de contact pour ce site. Utilisée sur la formulaire de contact sur la page À propos pour les notifications critiques." queue_jobs: "SEULEMENT POUR LES DÉVELOPPEURS ! ATTENTION ! Par défaut, empiler les travaux dans sidekiq. Si désactivé, votre site sera cassé." crawl_images: "Récupérer les images provenant de sources tierces pour y insérer les dimensions correctes (hauteur et largeur)." download_remote_images_to_local: "Transformer les images distantes en images locales en les téléchargeant ; cela permet d'éviter les liens morts." @@ -816,7 +816,7 @@ fr: summary_max_results: "Nombre maximum de messages retournés par 'Résumé de ce sujet'" enable_private_messages: "Autoriser les utilisateurs de niveau de confiance 1 à créer des messages et à répondre (configurable via le niveau de confiance minimum pour envoyer des messages). Notez que les responsables peuvent toujours envoyer des messages." enable_long_polling: "Utiliser les requêtes longues pour le flux de notifications." - long_polling_base_url: "Racine de l'url utilisée pour les requêtes longues (dans le cas de l'utilisation d'un CDN pour fournir du contenu dynamique, pensez à le configurer en mode \"origin pull\") par exemple: http://origin.site.com" + long_polling_base_url: "Racine de l'URL utilisée pour les requêtes longues (dans le cas de l'utilisation d'un CDN pour fournir du contenu dynamique, pensez à le configurer en mode \"origin pull\") par exemple : http://origin.site.com" long_polling_interval: "Délai d'attente du serveur avant de répondre aux clients lorsqu'il n'y a pas de données à envoyer\n(réservé aux utilisateurs connectés)" polling_interval: "À quelle fréquence les clients connectés devraient-ils requêter le serveur, en millisecondes (sans utiliser les requêtes longues)" anon_polling_interval: "À quelle fréquence en millisecondes les clients anonymes doivent requêter le serveur" @@ -872,7 +872,7 @@ fr: enable_badges: "Activer le système de badges" enable_whispers: "Permettre la communication privée entre responsables au sein d'un sujet (expérimental)." allow_index_in_robots_txt: "Préciser dans robots.txt que le site est autorisé à être indexé par les robots des moteurs de recherche." - email_domains_blacklist: "Liste des domaines de courriel qui ne sont pas autorisé lors de la création de compte, délimités par un pipe. Exemple: mailinator.com|trashmail.net" + email_domains_blacklist: "Liste des domaines de courriel qui ne sont pas autorisés lors de la création de compte, délimitée par des pipes. Exemple : mailinator.com|trashmail.net" email_domains_whitelist: "Liste des domaines de courriel avec lesquelles les utilisateurs DOIVENT s'enregistrer, délimités par un pipe. ATTENTION : les utilisateurs ayant une adresse de courriel sur un autre domaine ne pourront pas s'enregistrer." forgot_password_strict: "Ne pas mentionner l'existence d'un compte utilisateur quand un utilisateur utilise le formulaire d'oubli de mot de passe." log_out_strict: "Lors de la déconnexion, déconnecter TOUTES les sessions pour l'utilisateur sur tous les appareils" @@ -889,15 +889,15 @@ fr: reserved_usernames: "Pseudos pour lesquels l'inscription n'est pas autorisée." min_password_length: "Longueur minimale du mot de passe." min_admin_password_length: "Longueur minimale du mot de passe pour l'administrateur." - block_common_passwords: "Ne pas autoriser les mots de passe qui font parti des 10 000 les plus utilisés." - enable_sso: "Activer l'authentification unique via un site externe (ATTENTION: LES ADRESSES EMAIL *DOIVENT* ÊTRE VALIDÉES PAR LE SITE EXTERNE !)" + block_common_passwords: "Ne pas autoriser les mots de passe qui font partie des 10 000 les plus utilisés." + enable_sso: "Activer l'authentification unique via un site externe (ATTENTION : LES ADRESSES COURRIEL *DOIVENT* ÊTRE VALIDÉES PAR LE SITE EXTERNE !)" verbose_sso_logging: "Conserver les diagnostics liés au SSO dans /logs" enable_sso_provider: "Implémenter le procotole Discourse de provider SSO à /session/sso_provider, requiert sso_secret" sso_url: "URL de l'authentification unique SSO (doit inclure http:// ou http://)" sso_secret: "Chaîne de caractères secrète utilisée pour authentifier les informations SSO par cryptographie, assurez-vous qu'elle est de 10 caractères ou plus" sso_overrides_bio: "Écrase la biographie du profil utilisateur et empêche son changement" sso_overrides_email: "Surcharger les emails locaux avec les emails externes d'un SSO à chaque connexion, et prévenir les modifications locales. (ATTENTION : Des écarts peuvent se produire dus aux règles locales sur les emails)" - sso_overrides_username: "Surcharger les pseudos locaux avec les pseudos externes d'un SSO à chaque connexion, et prévenir les modifications locales. (ATTENTION: Des écarts peuvent se produire dus aux différences de longueur et d'exigences sur les pseudos)" + sso_overrides_username: "Surcharger les pseudos locaux avec les pseudos externes d'un SSO à chaque connexion, et prévenir les modifications locales. (ATTENTION : des écarts peuvent se produire dûes aux différences de longueur et d'exigences sur les pseudos)" sso_overrides_name: "Surcharger les noms complets locaux avec les noms complets externes d'un SSO à chaque connexion, et prévenir les modifications locales." sso_overrides_avatar: "Surcharge les avatars des utilisateurs avec les avatars d'un SSO. Si activé, il est fortement recommandé de désactiver allow_uploaded_avatars." sso_not_approved_url: "Rediriger les comptes SSO non validés vers cette URL" @@ -926,11 +926,11 @@ fr: maximum_backups: "Nombre maximum de sauvegardes à conserver sur le disque. Les anciennes sauvegardes seront automatiquement supprimées" automatic_backups_enabled: "Activer les sauvegardes automatiques tels que définis dans les fréquences de sauvegarde" backup_frequency: "Fréquence de création des sauvegardes du site, en jours." - enable_s3_backups: "Envoyer vos sauvegardes à S3 lorsqu'elles sont terminées. IMPORTANT: Vous devez avoir renseigné vos identifiants S3 dans les paramètres de fichiers." + enable_s3_backups: "Envoyer vos sauvegardes à S3 lorsqu'elles sont terminées. IMPORTANT : Vous devez avoir renseigné vos identifiants S3 dans les paramètres de fichiers." s3_backup_bucket: "Bucket distant qui contiendra les sauvegardes. ATTENTION: Vérifiez que c'est un bucket privé" s3_disable_cleanup: "Désactiver la suppression des sauvegardes de S3 lors de leur suppression locale." - backup_time_of_day: "Heure de la sauvegarde, au format UTC." - backup_with_uploads: "Inclure les téléchargements dans les archivages. Si désactivé, seul la base de données sera archivée." + backup_time_of_day: "Heure (UTC) de planification de la sauvegarde." + backup_with_uploads: "Inclure les fichiers envoyés dans les sauvegardes. Si désactivé, seule la base de données sera sauvegardée." active_user_rate_limit_secs: "A quelle fréquence mettre à jour le champ 'last_seen_at' (Dernière vu à), en secondes." verbose_localization: "Afficher des informations de debug sur l'interface à coté des textes traduits." previous_visit_timeout_hours: "Combien d'heures pour qu'une visite soit considérée comme la visite « précédente »." @@ -1046,8 +1046,8 @@ fr: topic_post_like_heat_medium: "Après le dépassement de ce ratio J'aime/message, le compteur de messages est modérément mis en évidence." topic_post_like_heat_high: "Après le dépassement de ce ratio J'aime/message, le compteur de messages est fortement mis en évidence." faq_url: "Si vous disposez déjà d'une FAQ/Règles de la communauté, hébergée ailleurs, que vous souhaitez utiliser, vous pouvez renseigner l'URL complète ici." - tos_url: "Si vous disposez déjà de CGU, hébergées ailleurs, que vous souhaitez utiliser, vous pouvez renseigner leur URL complète ici." - privacy_policy_url: "Si vous disposez déjà d'une Politique de Confidentialité, hébergée ailleurs, que vous voulez utiliser, vous pouvez renseigner son URL complète ici." + tos_url: "Si vous disposez déjà de conditions générales d'utilisation hébergées ailleurs que vous souhaitez utiliser, vous pouvez renseigner leur URL complète ici." + privacy_policy_url: "Si vous disposez déjà d'une politique de confidentialité hébergée ailleurs que vous voulez utiliser, vous pouvez renseigner son URL complète ici." newuser_spam_host_threshold: "Combien de fois un nouvel utilisateur peut publier un lien vers le même hôte dans la limite de leur `newuser_spam_host_threshold` messages avant d'être considérés comme du spam." white_listed_spam_host_domains: "Une liste des domaines exclus des hôtes testés comme spam. Les nouveaux utilisateurs ne seront jamais restreint dans la création de message contenant des liens vers ses domaines. " staff_like_weight: "Quel poids supplémentaire donner aux J'aime de l'équipe." @@ -1161,7 +1161,7 @@ fr: embed_username_required: "Un pseudo d'utilisateur pour la création du sujet est nécessaire." embed_whitelist_selector: "Sélecteur CSS pour les éléments qui seront autorisés dans les contenus embarqués." embed_blacklist_selector: "Sélecteur CSS pour les éléments qui seront interdits dans les contenus embarqués." - notify_about_flags_after: "Si il y a des signalements qui n'ont pas été traités après ce nombre d'heure, envoyer un courriel à contact_email. Désactiver la fonctionnalité en indiquant: 0." + notify_about_flags_after: "Si il y a des signalements qui n'ont pas été traités après ce nombre d'heure, envoyer un courriel à contact_email. Désactiver la fonctionnalité en indiquan 0." enable_cdn_js_debugging: "Autoriser /logs à afficher correctement les erreurs en ajoutant des permissions de crossorigin sur toutes les inclusions de js." show_create_topics_notice: "Si le site contient moins de 5 sujets publics, afficher un message pour demander aux administrateurs de créer d'autres sujets." delete_drafts_older_than_n_days: Supprimer les brouillons plus vieux que (n) jours. @@ -1171,7 +1171,7 @@ fr: slug_generation_method: "Choisissez une méthode de génération d'identifiant. \"encodé\" générera des chaines de caractères encodées avec des pourcentages. \"aucune\" désactivera complètement les identifiants." enable_emoji: "Activer les emojis" emoji_set: "Comment aimeriez-vous vos emoji ?" - enforce_square_emoji: "Forcer tous les emojiis à être carrés." + enforce_square_emoji: "Forcer tous les Emojis à être carrés." approve_post_count: "Le nombre de messages d'un utilisateur nouveau ou basique devant être approuvés" approve_unless_trust_level: "Les messages des utilisateurs qui n'ont pas atteint ce niveau de confiance doivent être approuvés" notify_about_queued_posts_after: "Si des messages sont en attente de modération depuis ce nombre d'heures, un courriel sera envoyé à l'email de contact. Mettre 0 pour désactiver ces courriels." @@ -1221,6 +1221,9 @@ fr: min_trust_level_to_tag_topics: "Niveau de confiance minimum requis pour taguer des sujets" suppress_overlapping_tags_in_list: "Si des tags correspondent exactement à des mots du titre d'un sujet, ne pas afficher ces tags" remove_muted_tags_from_latest: "Ne pas afficher les sujets avec des tags silencieux dans la liste des sujets récents." + company_short_name: "Nom de société (court)" + company_full_name: "Nom de société (complet)" + company_domain: "Domaine de la société" errors: invalid_email: "Adresse de courriel invalide." invalid_username: "Il n'y a pas d'utilisateur ayant ce pseudo." @@ -1270,8 +1273,8 @@ fr: different_users: "Des messages appartenant à différents utilisateurs ne peuvent pas être fusionnés." move_posts: new_topic_moderator_post: - one: "Un message a été envoyé vers un nouveau sujet : %{topic_link}" - other: "%{count} messages ont été envoyés vers un nouveau sujet : %{topic_link}" + one: "Un message a été déplacé vers un nouveau sujet : %{topic_link}" + other: "%{count} messages ont été déplacés vers un nouveau sujet : %{topic_link}" existing_topic_moderator_post: one: "Un message a été intégré dans un sujet existant : %{topic_link}" other: "%{count} messages ont été intégrés dans un sujet existant : %{topic_link}" @@ -1335,6 +1338,7 @@ fr: something_already_taken: "Quelque chose c'est mal passé. Peut-être que votre pseudo ou votre adresse de courriel est déjà enregistré ? Essayez le lien : j'ai oublié mon mot de passe." omniauth_error: "Désolé, une erreur est survenue lors de l'autorisation de votre compte. Vous n'avez peut-être pas approuvé l'autorisation ?" omniauth_error_unknown: "Quelque chose s'est mal passé lors de votre connexion, merci de réessayer." + authenticator_error_no_valid_email: "Aucune adresse courriel associée à %{account] n'est autorisée. Vous devriez configurer votre compte avec une autre adresse." new_registrations_disabled: "La création de nouveau compte n'est pas autorisé pour le moment." password_too_long: "Les mots de passe sont limités à 200 caractères." email_too_long: "L'email renseigné est trop long. Les noms de boîte ne doivent pas dépasser 254 caractères, et les noms de domaines ne doivent pas dépasser 253 caractères." @@ -1358,7 +1362,7 @@ fr: email: not_allowed: "n'est pas autorisé pour ce fournisseur de courriels. Merci d'utiliser une autre adresse." blocked: "n'est pas autorisé." - revoked: "N'enverra plus de courriels à '%{email}' jusqu'à %{date}." + revoked: "N'enverra plus de courriels à « %{email} » jusqu'à %{date}." ip_address: blocked: "Les nouvelles inscriptions ne sont pas acceptées depuis votre adresse IP." max_new_accounts_per_registration_ip: "Les nouvelles inscriptions ne sont pas autorisées depuis votre adresse IP (limite atteinte). Contactez un responsable." @@ -1380,7 +1384,7 @@ fr: Si vous souhaitez continuer à recevoir ces courriels, vous pouvez ignorer ce message. invite_mailer: - subject_template: "%{invitee_name} vous a invité(e) à participer à '%{topic_title}' sur %{site_domain_name}" + subject_template: "%{invitee_name} vous a invité(e) à participer à « %{topic_title} » sur %{site_domain_name}" text_body_template: | %{invitee_name} vous a invité(e) dans une discussion @@ -1398,7 +1402,7 @@ fr: Cette invitation provient d'un utilisateur de confiance, vous pouvez donc répondre immédiatement. custom_invite_mailer: - subject_template: "%{invitee_name} vous a invité(e) à participer à '%{topic_title}' sur %{site_domain_name}" + subject_template: "%{invitee_name} vous a invité(e) à participer à « %{topic_title} » sur %{site_domain_name}" text_body_template: | %{invitee_name} vous a invité(e) dans une discussion @@ -1543,9 +1547,9 @@ fr: Des messages de nouveaux utilisateurs sont en attente de modération. [Approuvez ou rejetez-les ici](%{base_url}/queued-posts). flag_reasons: - off_topic: "Votre message a été signalé comme étant **hors sujet**: la communauté considère qu'il ne correspond au sujet en discussion, qui est fixé par son titre et son premier message." - inappropriate: "Votre message a été signalé comme étant **inapproprié**: la communauté considère que son contenu est offensif, abusif ou enfreint notre [charte](/guidelines)." - spam: "Votre message a été signalé comme étant du **spam**: la communauté considère qu'il s'agit d'une publicité, ou du contenu trop promotionnel au lieu d'être utile et à propos du sujet en discussion." + off_topic: "Votre message a été signalé comme étant **hors sujet** : la communauté considère qu'il ne correspond au sujet en discussion qui est défini par son titre et son premier message." + inappropriate: "Votre message a été signalé comme étant **inapproprié** : la communauté considère que son contenu est offensif, abusif ou enfreint notre [charte](/guidelines)." + spam: "Votre message a été signalé comme étant du **spam** : la communauté considère qu'il s'agit d'une publicité, ou du contenu trop promotionnel au lieu d'être utile et pertinent au sujet." notify_moderators: "Votre message a été **signalé aux modérateurs** : la communauté considère qu'il nécessite l'intervention d'un responsable." flags_dispositions: agreed: "Merci de nous en informer. Nous sommes en accord avec votre signalement et nous travaillons à sa résolution." @@ -1673,31 +1677,31 @@ fr: subject_template: "Échec de l'exportation des données " text_body_template: "Nous sommes désolés, l'exportation de vos données a échoué. Veuillez consulter les journaux ou contacter un responsable." email_reject_insufficient_trust_level: - subject_template: "[%{site_name}] Incident d'email -- Niveau de confiance insuffisant " + subject_template: "[%{site_name}] Problème de courriel -- Niveau de confiance insuffisant " text_body_template: | Nous sommes désolés, mais l'envoi de votre courriel à %{destination} (intitulé %{former_title}) n'a pas fonctionné. Votre compte n'a pas le niveau de confiance requis pour créer un nouveau sujet via cette adresse de courriel. Si vous pensez qu'il s'agit d'une erreur, contacter un responsable. email_reject_user_not_found: - subject_template: "[%{site_name}] Erreur de courriel -- L'utilisateur est introuvable" + subject_template: "[%{site_name}] Problème de courriel -- L'utilisateur est introuvable" text_body_template: | Nous sommes désolés, mais l'envoi de votre courriel à %{destination} (intitulé %{former_title}) n'a pas fonctionné. Votre réponse a été envoyée depuis une adresse inconnue. Essayez de l'envoyer depuis une autre adresse, ou contactez un responsable. email_reject_screened_email: - subject_template: "[%{site_name}] Erreur de courriel -- Courriel bloqué" + subject_template: "[%{site_name}] Problème de courriel -- Courriel bloqué" text_body_template: | Nous sommes désolés, mais l'envoi de votre courriel à %{destination} (intitulé %{former_title}) n'a pas fonctionné. Votre réponse a été envoyée depuis une adresse bloquée. Essayez de l'envoyer depuis une autre adresse ou contactez un responsable. email_reject_inactive_user: - subject_template: "[%{site_name}] Erreur de courriel -- Compte inactivé" + subject_template: "[%{site_name}] Problème de courriel -- Compte inactivé" text_body_template: | Malheureusement votre courriel à %{destination} (titled %{former_title}) a échoué. Le compte associé avec cette adresse existe n'est pas activé. Veuillez activer votre compte avant d'envoyer des courriels. email_reject_blocked_user: - subject_template: "[%{site_name}] Erreur de courriel -- Utilisateur bloqué" + subject_template: "[%{site_name}] Problème de courriel -- Utilisateur bloqué" text_body_template: | Malheureusement votre courriel à %{destination} (titled %{former_title}) a échoué. @@ -1741,13 +1745,13 @@ fr: La catégorie vers laquelle vous avez envoyé ce courriel autorise uniquement les réponses d'utilisateurs avec un compte valide et une adresse de courriel connue. Si vous pensez qu'il s'agit d'une erreur, contactez un responsable. email_reject_invalid_post: - subject_template: "[%{site_name}] Incident d'email -- Erreur d'envoi d'un message" + subject_template: "[%{site_name}] Problème de courriel -- Erreur d'envoi d'un message" text_body_template: | Nous sommes désolés, mais l'envoi de votre courriel à %{destination} (intitulé %{former_title}) n'a pas fonctionné. Cela peut-être à cause d'un format trop complexe, d'un message trop long ou trop court. Veuillez réessayer ou rédigez votre message directement sur le site si le problème persiste. email_reject_invalid_post_specified: - subject_template: "[%{site_name}] Incident d'email -- Erreur d'envoi d'un message" + subject_template: "[%{site_name}] Problème de courriel -- Erreur d'envoi d'un message" text_body_template: | Nous sommes désolés, mais l'envoi de votre courriel à %{destination} (intitulé %{former_title}) n'a pas fonctionné. @@ -1775,13 +1779,13 @@ fr: Aucune des adresses de destination n'est reconnue. Veuillez vérifier que vous envoyez bien à l'adresse de courriel fournie par les responsables. email_reject_topic_not_found: - subject_template: "[%{site_name}] Erreur de courriel -- Le sujet est introuvable" + subject_template: "[%{site_name}] Problème de courriel -- Le sujet est introuvable" text_body_template: | Nous sommes désolés, mais l'envoi de votre courriel à %{destination} (intitulé %{former_title}) n'a pas fonctionné. Le sujet à lequel vous répondez n'existe plus. Si vous pensez qu'il s'agit d'une erreur, contactez un responsable. email_reject_topic_closed: - subject_template: "[%{site_name}] Erreur de courriel -- Le sujet est fermé" + subject_template: "[%{site_name}] Problème de courriel -- Le sujet est fermé" text_body_template: | Nous sommes désolés, mais l'envoi de votre courriel à %{destination} (intitulé %{former_title}) n'a pas fonctionné. @@ -1793,7 +1797,7 @@ fr: Votre courriel a été marqué comme "automatiquement généré", ce qui signifie qu'il a été créé par un ordinateur au lieu d'être rédigé par un humain ; nous ne pouvons pas accepter ces types de courriel. Si vous pensez qu'il s'agit d'une erreur, contacter un responsable. email_error_notification: - subject_template: "[%{site_name}] Incident d'email -- Erreur d'authentification POP3" + subject_template: "[%{site_name}] Problème de courriel -- Erreur d'authentification POP3" text_body_template: | Malheureusement il y a eu un erreur d'authentification lors de la récupération des courriels depuis le serveur POP. @@ -1921,7 +1925,7 @@ fr: > %{site_title} -- %{site_description} user_invited_to_private_message_pm: - subject_template: "[%{site_name}] %{username} vous a invité dans la conversation '%{topic_title}'" + subject_template: "[%{site_name}] %{username} vous a invité dans la conversation « %{topic_title} »" text_body_template: | %{header_instructions} @@ -1929,7 +1933,7 @@ fr: %{respond_instructions} user_invited_to_private_message_pm_staged: - subject_template: "[%{site_name}] %{username} vous a invité à voir un message '%{topic_title}'" + subject_template: "[%{site_name}] %{username} vous a invité dans la conversation « %{topic_title} »" text_body_template: | %{header_instructions} @@ -1937,7 +1941,7 @@ fr: %{respond_instructions} user_invited_to_topic: - subject_template: "[%{site_name}] %{username} vous a invité dans le sujet '%{topic_title}'" + subject_template: "[%{site_name}] %{username} vous a invité dans « %{topic_title} »" text_body_template: | %{header_instructions} @@ -1955,7 +1959,7 @@ fr: %{respond_instructions} user_replied_pm: - subject_template: "[%{site_name}] [PM] %{topic_title}" + subject_template: "[%{site_name}] [MP] %{topic_title}" text_body_template: | %{header_instructions} @@ -2088,7 +2092,7 @@ fr: Sinon, cliquez sur ce lien pour vous connecter : %{base_url}/users/admin-login/%{email_token} account_created: - subject_template: "[%{site_name}] Votre Nouveau Compte" + subject_template: "[%{site_name}] Votre nouveau compte" text_body_template: | Un nouveau compte utilisateur a été créé pour vous sur {site_name} @@ -2152,7 +2156,7 @@ fr: popular_topics: "Populaires" recent_topics: "Récents" see_more: "Plus" - search_title: "Recherche dans ce site" + search_title: "Rechercher dans ce site" search_google: "Google" login_required: welcome_message: | @@ -2160,7 +2164,7 @@ fr: Un compte est requis. Veuillez créer un compte ou vous connecter pour continuer. terms_of_service: title: "Conditions générales d'utilisation" - signup_form_message: 'J''ai lu et j''accepte les Conditions Générales d''Utilisation.' + signup_form_message: 'J''ai lu et j''accepte les conditions générales d''utilisation.' deleted: 'supprimé' upload: edit_reason: "téléchargement d'une copie locale des images distantes" @@ -2186,7 +2190,7 @@ fr: seen_recently: "L'utilisateur a été vu récemment" post_not_found: "Impossible de trouver le message avec l'id %{post_id}" notification_already_read: "La notification de ce courriel a déjà été lue" - topic_nil: "post.topic est nul" + topic_nil: "post.topic vaut nil" post_deleted: "le message a été supprimé par l'auteur" user_suspended: "l'utilisateur a été suspendu" already_read: "l'utilisateur a déjà lu ce message" @@ -2310,7 +2314,7 @@ fr: tos_topic: title: "Conditions générales d'utilisation" privacy_topic: - title: "Protection des données" + title: "Politique de confidentialité" body: | @@ -2650,6 +2654,119 @@ fr: staff_tag_disallowed: "Le tag \"%{tag}\" ne peut être mis que par un responsable." staff_tag_remove_disallowed: "Le tag \"%{tag}\" ne peut être retiré que par un responsable." rss_by_tag: "Sujets avec le tag %{tag}" + wizard: + title: "Configuration de Discourse" + step: + locale: + title: "Bienvenue sur votre Discourse !" + fields: + default_locale: + description: "Quelle est la langue par défaut de votre communauté ?" + forum_title: + title: "Nom" + description: "Votre nom est un signe visible au loin, la first première chose que les visiteurs remarqueront à propos de votre communauté. Que disent votre nom et titre à propos de votre communauté ?" + fields: + title: + label: "Nom de votre communauté" + placeholder: "Le repaire de Jeanne" + site_description: + label: "Dévrivez votre communauté en une courte phrase" + placeholder: "Un endroit de discussion pour Jeanne et ses amis" + introduction: + title: "Introduction" + 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: + open: + label: "Public" + description: "Tout le monde peut accéder à cette communauté et créer un compte" + restricted: + label: "Privé" + description: "Uniquement les personnes que j'ai invitées ou approuvées peuvent accéder à cette communauté" + contact: + title: "Contact" + fields: + contact_email: + label: "Courriel" + placeholder: "nom@exemple.com" + description: "Adresse courriel de la personne ou groupe responsable de cette communauté. Utilisée pour des notifications critiques comme des signalements non réglés, des mises à jour de sécurité et sur la page À propos pour des contacts urgents. " + contact_url: + label: "Page Web" + placeholder: "http://www.exemple.com/contacter-nous" + description: "Page Web pour contacter votre organisation ou vous-même. Sera affiché dans la page À propos." + site_contact: + label: "Messages automatiques" + 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)" + placeholder: "Initech" + company_full_name: + label: "Nom de société (complet)" + placeholder: "Initech, Inc." + company_domain: + label: "Nom de domaine de la société" + placeholder: "initech.com" + colors: + 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" + dark: + label: "Sombre" + logos: + title: "Logos" + fields: + logo_url: + label: "Logo principal" + description: "L'image logo du coin supérieur gauche de votre site. Utilisez une forme rectangulaire large." + logo_small_url: + label: "Logo compact" + description: "Une version compacte de votre logo qui est affichée dans le coin supérieur gauche de votre site quand vous défilez la page vers le bas. Utilisez une forme carrée." + icons: + title: "Icônes" + fields: + favicon_url: + label: "Petite icône" + description: "Icône utilisée pour représenter le site dans les navigateurs Web et qui rend bien à de petites tailles comme 32px par 32px. " + apple_touch_icon_url: + 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: + choices: + latest: + label: "Sujets récents" + categories: + 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é." + finished: + title: "Votre Discourse est prêt !" + description: | +

Si vous souhaitez modifier ces paramètres, rendez-vous dans la section Administration ; trouvez la dans le menu du site.

+

Amusez-vous et bonne chance pour construire votre nouvelle communauté !

activemodel: errors: <<: *errors diff --git a/config/locales/server.he.yml b/config/locales/server.he.yml index 3b84fd8c70..6bc966f873 100644 --- a/config/locales/server.he.yml +++ b/config/locales/server.he.yml @@ -56,7 +56,7 @@ he: format: '%{attribute} %{message}' messages: too_long_validation: "מוגבל לאורך של %{max} תוים: אתם הקשתם %{length}." - invalid_boolean: "בוליאני לא חוקי." + invalid_boolean: "בוליאני לא תקין." taken: "כבר תפוס" accepted: חייב להתקבל blank: לא ניתן להשאיר ריק @@ -71,7 +71,7 @@ he: has_already_been_used: "כבר בשימוש" inclusion: לא נכלל ברשימה invalid: לא תקין - is_invalid: "אינו קביל; נסה להיות מעט יותר מפורט" + is_invalid: "אינו קביל; נסו להיות מעט יותר מפורטים" less_than: חייב להיות פחות מ-%{count} less_than_or_equal_to: חייב להיות פחות או שווה ל-%{count} not_a_number: אינו מספר @@ -99,17 +99,17 @@ he: embed: load_from_remote: "ארעה שגיאה בטעינת הפוסט הזה." site_settings: - min_username_length_exists: "לא ניתן לקבוע את אורך שם המשתמש המינימלי לארוך יותר משם משתמש שקיים כבר. " - min_username_length_range: "לא ניתן לקבוע את המינימום מעל המקסימום" - max_username_length_exists: "לא ניתן לקבוע את אורך שם המשתמש המקסימלי לקצר יותר משם משתמש שקיים כבר. " + min_username_length_exists: "לא ניתן לקבוע את אורך שם המשתמש המינימלי להיות ארוך יותר משם משתמש שכבר קיים." + min_username_length_range: "לא ניתן לקבוע את המינימום מעל המקסימום." + max_username_length_exists: "לא ניתן לקבוע את אורך שם המשתמש המקסימלי לקצר יותר משם משתמש שכבר קיים." max_username_length_range: "לא ניתן לקבוע את המקסימום מתחת למינימום." - default_categories_already_selected: "לא ניתן לבחור קטגוריה שהשתמשו בה ברשימה אחרת" + default_categories_already_selected: "לא ניתן לבחור קטגוריה שהשתמשו בה ברשימה אחרת." s3_upload_bucket_is_required: "אינכם יכולים להעלות ל-S3 ללא 's3_upload_bucket'." bulk_invite: file_should_be_csv: "הקובץ המועלה צריך להיות בפורמט csv או txt." backup: operation_already_running: "פעולה רצה כרגע. לא יכול להתחיל עבודה חדשה עכשיו." - backup_file_should_be_tar_gz: "קובץ הגיוי צריך להיות .tar.gz." + backup_file_should_be_tar_gz: "קובץ הגיבוי צריך להיות .tar.gz." not_enough_space_on_disk: "אין מספיק מקום על הדיסק כדי להעלות את הגיבוי הזה." invalid_filename: "שם קובץ הגיבוי מכיל תווים שגויים. תווים תקינים הם a-z 0-9 . - _." not_logged_in: "אתם צריכים להיות מחוברים כדי לעשות את זה." @@ -134,7 +134,7 @@ he: replies: one: "תגובה אחת" other: "%{count} תגובות" - no_mentions_allowed: "מצטערים, אך אינכם יכולים לאזכר משתמשים אחרים" + no_mentions_allowed: "מצטערים, אך אינכם יכולים לאזכר משתמשים אחרים." too_many_mentions: one: "מצטערים, אתם יכולים לאזכר רק משתמש אחד בפוסט" other: "מצטערים, אתם יכולים לאזכר רק %{count} משתמשים בפוסט" @@ -159,7 +159,7 @@ he: topic_not_found: "משהו השתבש אולי נושא זה נסגר או נמחק בזמן שקראתם אותו?" just_posted_that: "דומה מידי למה שפרסמתם לאחרונה" invalid_characters: "מכיל תווים לא תקניים" - is_invalid: "אינו תקין: נסה יותר פירוט" + is_invalid: "אינו תקין: נסו להיות יותר מפורטים" next_page: "עמוד הבא ←" prev_page: "→ עמוד קודם" page_num: "עמוד %{num}" @@ -167,7 +167,7 @@ he: topics_in_category: "נושאים בקטגוריה '%{category}'" rss_posts_in_topic: "תזרים RSS '%{topic}'" rss_topics_in_category: "תזרים RSS של נושאים בקטגוריה '%{category}'" - author_wrote: "%{author} כתב:" + author_wrote: "%{author} כתב/ה:" num_posts: "פוסטים:" num_participants: "משתתפים:" read_full_topic: "קראו נושא מלא" @@ -176,7 +176,7 @@ he: latest: "נושאים אחרונים" hot: "נושאים חמים" top: "נושאים מובילים" - posts: "פרסומים אחרונים" + posts: "פוסטים אחרונים" private_posts: "הודעות פרטיות אחרונות" group_posts: "פוסטים אחרונים מ %{group_name}" group_mentions: "איזכורים אחרונים מ %{group_name}" @@ -191,8 +191,8 @@ he: groups: errors: can_not_modify_automatic: "אינכם יכולים לערוך קבוצה אוטומטית" - member_already_exist: "'%{username}' הוא כבר חבר בקבוצה הזו." - invalid_domain: "'%{domain}' אינו דומיין תקף." + 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}'." @@ -211,14 +211,14 @@ he: one: "פוסט אחד" other: "%{count} פוסטים" new-topic: | - ברוכים באים ל%{site_name} — **תודה שהתחלת שיחה חדשה! ** + ברוכים באים ל%{site_name} — **תודה שהתחלתם שיחה חדשה! ** -הכותרת נשמעת מעניינת כשאתם קוראים אותה בקול רם? האם היא תקציר טוב? -מי יתעניין בזה? איזה סוג של תגובות את/ה רוצה? - -השתמשו במילים נפוצות בכותרת שלך כך שאחרים יוכלו למצוא אותה. כדי לשייך את הנושא שלך עם נושאים קשורים בחר קטגוריה. - -לעוד טיפים, [ראה את כללי התנהלות בקהילה] (/guidelines). - הפנל הזה יופיע רק עבור %{education_posts_text}. הראשונים. + -השתמשו במילים נפוצות בכותרת שלך כך שאחרים יוכלו למצוא אותה. כדי לשייך את הנושאים שלכם עם נושאים קשורים בחרו קטגוריה. + -לעוד טיפים, [ראו את כללי התנהלות בקהילה] (/guidelines). + הפנל הזה יופיע רק עבור %{education_posts_text} הראשונים. new-reply: | - ברוכים באים ל %{site_name} — ** תודה על תרומתך! ** + ברוכים הבאים ל %{site_name} — ** תודה על תרומתך! ** - האם התגובה שלך משפרת את השיחה בדרך כלשהיא? @@ -226,11 +226,14 @@ he: - ביקורת מבנה היא רצויה, אבל אנא בקרו *רעיונות*, לא אנשים. - למידע נוסף [ראו את הכללים המנחים שלנו]/guidelines). פאנל זה יופיע רק ב-%{education_posts_text} תגובות הראשונות שלך. + למידע נוסף [ראו את הכללים המנחים שלנו]/guidelines). פאנל זה יופיע רק ב-%{education_posts_text} התגובות הראשונות שלך. avatar: | - ###מה דעתך להוסיף תמונה לחשבון שלך? - כבר פרסמת כמה נושאים ותגובות, אבל תמונת הפרופיל שלך לא מיוחדת- היא רק אות. - שקלת **[להכנס לפרופיל משתמש שלך ](%{profile_path})** ולהעלות תמונה שמייצגת אותך? + ### מה דעתך להוסיף תמונה לחשבון שלך? + + כבר פרסמת כמה נושאים ותגובות, אבל תמונת הפרופיל שלך לא מיוחדת - היא רק אות. + + שקלת **[להכנס לפרופיל המשתמש שלך](%{profile_path})** ולהעלות תמונה שמייצגת אותך? + יותר קל לעקוב אחרי שיחות ולמצוא אנשים מעניינים כשלכולם יש תמונת פרופיל יחודית! sequential_replies: |+ ### שקלו להשיב לכמה פרסומים בבת אחת @@ -281,12 +284,12 @@ he: user: attributes: password: - common: "אחת מתוך 10000 הסיסמאות הנפוצות. אנא השתמשו בסיסמא בטוחה יותר." + common: "אחת מתוך 10000 הסיסמאות הנפוצות. אנא השתמשו בסיסמה בטוחה יותר." same_as_username: "זהה לשם המשתמש שלכם. אנא השתמשו בסיסמה בטוחה יותר." same_as_email: "זהה לכתובת הדוא\"ל שלכם. אנא השתמשו בסיסמה בטוחה יותר." same_as_current: "זהה לסיסמה הנוכחית שלכם." ip_address: - signup_not_allowed: " הרשמה אינו מורשית מהחשבון הזה." + signup_not_allowed: " הרשמה אינה מורשית מהחשבון הזה." color_scheme_color: attributes: hex: @@ -301,8 +304,8 @@ he: <<: *errors user_profile: no_info_me: "
שדה האודות של הפרופיל שלכם ריק כרגע, תרצו למלא אותו?
" - no_info_other: "
%{name} עדיין לא הזין דבר בשדה אודות של הפרופיל שלהם
" - vip_category_name: "לאונג' (סלון הכבוד)" + no_info_other: "
%{name} עדיין לא הזין/ה דבר בשדה אודות של הפרופיל שלו/ה
" + vip_category_name: "לאונג'" vip_category_description: "קטגוריה אקסקלוסיבית למשתמשים עם רמת אמון 3 או יותר." meta_category_name: "משוב לאתר" meta_category_description: "דיון אודות אתר זה, הארגון שמאחוריו, איך הוא פועל ואיך נוכל לשפר אותו." @@ -363,19 +366,19 @@ he: title: "מוביל" change_failed_explanation: "ניסיתם להוריד ברמה את %{user_name} ל- '%{new_trust_level}'. אולם רמת האמון שלהם היא כבר '%{current_trust_level}'. %{user_name} ישאר/תישאר ב-'%{current_trust_level}' - אם ברצונכם להוריד את המשתמש/ת נעלו קודם את רמת האמון" rate_limiter: - slow_down: "ביצעת פעולה זו מספר רב מדי של פעמים. נסה שוב מאוחר יותר." - too_many_requests: "יש לנו מגבלה יומית על מספר הפעמים שניתן לבצע פעולה זו. אנא המתן %{time_left} לפני ניסיון חוזר." + slow_down: "ביצעתם פעולה זו מספר רב מדי של פעמים. נסו שוב מאוחר יותר." + too_many_requests: "יש לנו מגבלה יומית על מספר הפעמים שניתן לבצע פעולה זו. אנא המתינו %{time_left} לפני ניסיון חוזר." by_type: - first_day_replies_per_day: "הגעת למספר המירבי של תגובות שמתמש חדש יכול ליצור ביומו הראשון. אנא המתן %{time_left} לפני ניסיון חוזר לבצע פעולה זו." - first_day_topics_per_day: "הגעת למספר המירבי של נושאים שמשתמש חדש יכול ליצור ביומו הראשון. אנא המתן %{time_left} לפני ניסיון חוזר לבצע פעולה זו." + first_day_replies_per_day: "הגעתם למספר המירבי של תגובות שמתמשים חדשים יכולים ליצור ביומם הראשון. אנא המתינו %{time_left} לפני ניסיון חוזר לבצע פעולה זו." + first_day_topics_per_day: "הגעתם למספר המירבי של נושאים שמשתמשים חדשים יכולים ליצור ביומם הראשון. אנא המתינו %{time_left} לפני ניסיון חוזר לבצע פעולה זו." create_topic: "אתם יוצרים נושא חדש מהר מדי. אנא המתנו %{time_left} לפני ניסיון חוזר לבצע פעולה זו." create_post: "אתם מגיבים מהר מדי. אנא המתינו %{time_left} לפני ניסיון חוזר לבצע פעולה זו." delete_post: "אתם מוחקים פוסטים מהר מידי. אנא המתינו %{time_left} לפני שאתם מנסים שוב." - topics_per_day: "הגעת למספר המירבי של נושאים חדשים היום. אנא המתן %{time_left} לפני ניסיון חוזר לבצע פעולה זו." + topics_per_day: "הגעתם למספר המירבי של נושאים חדשים היום. אנא המתינו %{time_left} לפני ניסיון חוזר לבצע פעולה זו." pms_per_day: "הגעתם למספר המירבי של הודעות היום. אנא המתינו %{time_left} לפני ניסיון חוזר לבצע פעולה זו." - create_like: "הגעת למספר המירבי של לייקים היום. אנא המתן %{time_left} לפני ניסיון חוזר לבצע פעולה זו." + create_like: "הגעתם למספר המירבי של לייקים היום. אנא המתינו %{time_left} לפני ניסיון חוזר לבצע פעולה זו." create_bookmark: "הגעתם למספר המירבי של סימניות להיום. אנא המתינו %{time_left} לפני ניסיון חוזר לבצע פעולה זו." - edit_post: "הגעת למספר המירבי של עריכות היום. אנא המתן %{time_left} לפני ניסיון חוזר לבצע פעולה זו." + edit_post: "הגעתם למספר המירבי של עריכות להיום. אנא המתינו %{time_left} לפני ניסיון חוזר לבצע פעולה זו." live_post_counts: "אתם מבקשים ספירה של פוסטים חיים מהר מידי. אנא המתינו %{time_left} לפני שאתם מנסים שוב." unsubscribe_via_email: "הגעתם למספר המקסימלי של בטולי מנוי באמצעות מייל להיום. אנא המתינו %{time_left} לפני שאתם מנסים שוב." topic_invitations_per_day: "הגעתם למספר המקסימלי של הזמנות לנושאים להיום. אנא המתינו %{time_left} לפני שאתם מנסים שוב." @@ -460,19 +463,19 @@ he: one: "לפני כמעט שנה" other: "לפני כמעט %{count} שנים" password_reset: - no_token: "מצטערים, הקישור לשינוי הסיסמא ישן מדי. לחצו על כפתור הכניסה ובחרו ב\"שכחתי את הסיסמה שלי\" כדי לקבל קישור חדש." - choose_new: "אנא בחר סיסמה חדשה" - choose: "אנא בחר סיסמה" - update: 'עדכן סיסמה' - save: 'שמור סיסה' - title: 'אפס סיסמה' + no_token: "מצטערים, הקישור לשינוי הסיסמה ישן מדי. לחצו על כפתור הכניסה ובחרו ב\"שכחתי את הסיסמה שלי\" כדי לקבל קישור חדש." + choose_new: "אנא ביחרו סיסמה חדשה" + choose: "אנא בחרו סיסמה" + update: 'עידכון סיסמה' + save: 'שמירת סיסמה' + title: 'איפוס סיסמה' success: "שיניתם את סיסמתכם בהצלחה ואתם עכשיו מחוברים." - success_unapproved: "שינית את הסיסמה שלך אוטומטית." + success_unapproved: "שינית את הסיסמה שלך בהצלחה." continue: "המשך ל-%{site_name}" change_email: confirmed: "כתובת הדואר האלקטרוני שלך עודכנה" - please_continue: "המשך ל-%{site_name}" - error: "הייתה שגאיה בעדכון כתובת הדואר האלקטרוני. אולי היא כבר בשימוש?" + please_continue: "המשיכו ל-%{site_name}" + error: "הייתה שגיאה בעדכון כתובת הדואר האלקטרוני. אולי היא כבר בשימוש?" error_staged: "התרחשה תקלה בהחלפת כתובת הדוא\"ל שלכם. הכתובת כבר בשימוש על ידי משתמש/ת מועמדים פעילים." already_done: "מצטערים, לינק אישור זה כבר אינו בתוקף. אולי המייל שלכם כבר השתנה?" authorizing_old: @@ -484,12 +487,12 @@ he: please_continue: "חשבונך החדש אושר; הנכם מועברים לעמוד הבית." continue_button: "המשך ל-%{site_name}" welcome_to: "ברוכים הבאים ל-%{site_name}!" - approval_required: "מנהל צריך לאשר את החשבון שלך ידנית לפני שתוכל להיכנס לפורום הזה. יישלח אליך דואר אלקטרוני כשהחשבון שלך יאושר!" + approval_required: "מנהל צריך לאשר את החשבון שלכם ידנית לפני שתוכלו להיכנס לפורום הזה. יישלח אליכם דואר אלקטרוני כשהחשבון שלכם יאושר!" missing_session: "אנחנו לא יכולים לזהות אם חשבונכם נוצר, אנא וודאו שיש לכם עוגיות (cookies) מאופשרות." post_action_types: off_topic: title: 'אוף-טופיק' - description: 'פרסום זה אינו רלוונטי לדיון הנוכחי כפי שהוגדר בכותרת ובפרסום הראשון, ולכן כנראה שעליו לעבור למקום אחר.' + description: 'פוסט זה אינו רלוונטי לדיון הנוכחי כפי שהוגדר בכותרת ובפרסום הראשון, ולכן כנראה שעליו לעבור למקום אחר.' long_form: 'דוגלל כאוף-טופיק' spam: title: 'ספאם' @@ -499,13 +502,13 @@ he: email_body: "%{link}\n\n%{message}" inappropriate: title: 'לא ראוי' - description: 'פרסום זה מכיל תוכן שאדם סביר היה רואה כפוגעני, מתעלל או הפרה של כללי הקהילה .' + description: 'פוסט זה מכיל תוכן שאדם סביר היה רואה כפוגעני, מתעלל או הפרה של כללי הקהילה .' long_form: 'דוגלל כלא ראוי' notify_user: title: 'שלחו הודעה ל @{{username}}' description: 'אנו מעוניינים לדבר עם אדם זה ישירות ובפרטיות בנוגע לפוסט שלו.' long_form: 'הודעה נשלחה למשתמש/ת' - email_title: 'הפרסום שלכם ב"%{title}"' + email_title: 'הפוסט שלכם ב"%{title}"' email_body: "%{link}\n\n%{message}" notify_moderators: title: "משהו אחר" @@ -538,11 +541,11 @@ he: title: "משהו אחר" description: 'נושא זה דורש תשומת לב של הצוות בהתאם להנחיות הקהילה, תנאי השירות, או מסיבה אחרת שאינה רשומה למעלה.' long_form: 'זה סומן לתשומת הלב של מנחה' - email_title: 'הנושא "%{title}" דורש תשומת לב של מנהל' + email_title: 'הנושא "%{title}" דורש תשומת לב של מנחה' email_body: "%{link}\n\n%{message}" flagging: you_must_edit: '

פוסט שלכם סומן על ידי הקהילה. בבקשה בדקו את ההודעות.

' - user_must_edit: '

פרסום זה סומן על ידי הקהילה וכרגע מוסתר באופן זמני.

' + user_must_edit: '

פוסט זה סומן על ידי הקהילה וכרגע מוסתר באופן זמני.

' archetypes: regular: title: "נושא רגיל" @@ -584,9 +587,9 @@ he: xaxis: "יום" yaxis: "מספר משתמשים חדשים" profile_views: - title: "צפיות בפרופיל משתמש" + title: "צפיות בפרופילי משתמשים" xaxis: "יום" - yaxis: "מספר פרופילי משתמש שנצפו" + yaxis: "מספר פרופילי משתמשים שנצפו" topics: title: "נושאים" xaxis: "יום" @@ -604,7 +607,7 @@ he: xaxis: "יום" yaxis: "מספר דגלים חדשים" bookmarks: - title: "מועדפים" + title: "סימניות" xaxis: "יום" yaxis: "מספר סימניות חדשות" starred: @@ -628,7 +631,7 @@ he: xaxis: "יום" yaxis: "מספר ההודעות" moderator_warning_private_messages: - title: "אזהרות מנהל" + title: "אזהרות מנחים" xaxis: "יום" yaxis: "מספר ההודעות" notify_moderators_private_messages: @@ -636,7 +639,7 @@ he: xaxis: "יום" yaxis: "מספר ההודעות" notify_user_private_messages: - title: "התרע למשתמש" + title: "הודעה למשתמש/ת" xaxis: "יום" yaxis: "מספר ההודעות" top_referrers: @@ -751,8 +754,8 @@ he: default_locale: "שפת ברירת המחדל עבור אתר Discourse זה (קוד ISO 639-1)" allow_user_locale: "אפשרו למשתמשים לבחור את הגדרות השפה שלהם בממשק המשתמש/ת" set_locale_from_accept_language_header: "קבעו את שפת הממשק עבור משתמשים אנונימיים לפי השפה בדפדפן. (נ-י-ס-י-ו-נ-י, לא עובד עם cache אנונימי)" - min_post_length: "מספר התווים המותר כאורך מינימלי לפרסום פוסט" - min_first_post_length: "אורך מינימלי מותר לפרסום ראשון (בגוף הנושא) בתווים " + min_post_length: "מספר התווים המותר כאורך מינימלי לפוסט" + min_first_post_length: "אורך מינימלי מותר לפוסט ראשון (בגוף הנושא) בתווים " min_private_message_post_length: "אורך הפוסט המינימלי המותר בתווים להודעות" max_post_length: "מספר התווים המקסימלי כאורך פוסט" min_topic_title_length: "מספר התווים המינימלי הנדרש לכותרת נושא" @@ -777,7 +780,7 @@ he: download_remote_images_max_days_old: "לא להוריד תמונות מרוחקות עבור פוסטים בני יותר מ n ימים." disabled_image_download_domains: "תמונות מרחוק לעולם לא יורדו ממתחמים (domains) אלו. " editing_grace_period: "ל (n) שניות לאחר פרסום, עריכה לא תיצור גרסה חדשה בהיסטוריית הפוסט." - post_edit_time_limit: "העורכים יכולים לערוך או למחוק את הפרסום שלהם במשך (n) דקות לאחר הפרסום. הזינו 0 כ\"תמיד\"." + post_edit_time_limit: "העורכים יכולים לערוך או למחוק את הפוסט שלהם במשך (n) דקות לאחר הפרסום. הזינו 0 כ\"תמיד\"." edit_history_visible_to_public: "אפשרו לכולם לראות גרסאות קודמות של פוסט ערוך. כאשר אפשרות זו מנוטרלת, רק חברי צוות יכולים לצפות בהן." delete_removed_posts_after: "פוסטים שהוסרו על ידי מחבריהם ימחקו באופן אוטומטי לאחר (n) שעות. אם הגדרה זו מכוונת ל-0, פוסטים ימחקו מיידית." max_image_width: "הרוחב המקסימלי של תצוגת תמונה מוקטנת בפוסט" @@ -786,7 +789,7 @@ he: show_subcategory_list: "הצגת רשימת תת-הקבוצות במקום רשימת הנושאים בעת הכניסה לקטגוריה." fixed_category_positions: "אם אפשרות זו מסומנת, תוכלו לארגן את הקטגוריות כך שיופיעו בסדר קבוע. אם האופציות אינן מסומנות, הקטגוריות יסודרו על פי סדר הפעילות שהתבצעה בהן." fixed_category_positions_on_create: "אם האפשרות תסומן, סדר הקטגוריות יוגדר בתפריט יצירת נושא (דורש fixed_category_positions)." - add_rel_nofollow_to_user_content: "הוספת התווית rel nofollow לכ תוכן ששודר על ידי המשתמש/ת, פרט לקישורים פנימיים (כולל דומיין הורה parent domains). אם תשנו אפשרות זו, עליכם \"לאפות מחדש\" את כל הפרסומים עם: \"rake posts:rebake\"" + add_rel_nofollow_to_user_content: "הוספת התווית rel nofollow לכל תוכן שפורסם על ידי המשתמש/ת, פרט לקישורים פנימיים (כולל מתחם הורה parent domains). אם תשנו אפשרות זו, עליכם לאפות מחדש את כל הפרסומים עם: \"rake posts:rebake\"" exclude_rel_nofollow_domains: "רשימת דומיינים שלקישורים אליהם לא יתווסף nofollow. לדומיין tld.com אוטומטית יצטרף sub.tld.com גם כן. בתור מינימום, כדאי לכם להוסיף את הדומיין העליון של אתר זה, כדי להקל על זחלני רשת למצוא תוכן. אם חלקים אחרים של האתר שלכם נמצאים בדומיינים אחרים, הוסיפו אותם גם כן." post_excerpt_maxlength: "אורך מקסימלי של קטע פוסט / סיכום." show_pinned_excerpt_mobile: "הצגת קטע בנושאים נעוצים במבט ניידים." @@ -799,7 +802,7 @@ he: favicon_url: "צלמית favicon לאתר שלכם, ראו http://en.wikipedia.org/wiki/Favicon, כדי שתעבוד כמו שצריך עם CDN חייבת להיות png" mobile_logo_url: "תמונת הלוגו הקבועה לצד ימין למעלה של האתר הנייד שלכם. אמורה להיות ריבועית. אם משאירים ריקה, ייעשה שימוש ב `logo_url`. למשל: http://example.com/uploads/default/logo.png" apple_touch_icon_url: "אייקון שמשמש למכשירי טאץ׳ של אפל. גודל מומלץ 144 על 144 פיקסלים." - notification_email: "הטופס: נעשה שימוש בכתובת הדוא\"ל כאשר שולחים את כל הודעות המערכת הנדרשות. כדי שהודעות הדוא\"ל יגיעו, המתחם (domain) המצויין כאן חייב לכלול SPF, DKIM ורשומות reverse PTR מוגדרים כהלכה." + notification_email: "מאת: נעשה שימוש בכתובת מייל זו כאשר שולחים את כל הודעות המערכת הנדרשות. כדי שהודעות הדוא\"ל יגיעו, המתחם (domain) המצויין כאן חייב לכלול SPF, DKIM ורשומות reverse PTR מוגדרים כהלכה." email_custom_headers: "רשימה מופרדת pipes (הסימון |) של כותרות מייל מותאמות אישית" email_subject: "התאמה עצמית של מבנה נושא למיילים סטנדרטיים. ראו:\nhttps://meta.discourse.org/t/customize-subject-format-for-standard-emails/20801" force_https: "הכריחו את אתרכם להשתמש אך ורק ב HTTPS. אזהרה: אל תאפשרו זאת עד שתוודאו ש HTTPS מותקן ועובד ממש בכל המקרים! וידאתם את הגדרות ה CDN שלכם, כל שירותי ההתחברות, וכל הלוגואים / תלויות החיצוניים - כדי לוודא שכולם עובדים גם כן עם HTTPS?" @@ -835,9 +838,9 @@ he: pending_users_reminder_delay: "הודיעו למנחים אם משתמשים חדשים ממתינים לאישור למעלה מכמות זו של שעות. קבעו ל -1 כדי לנטרל התראות." maximum_session_age: "משתמשים ישארו מחוברים ל n שעות מאז ביקורם האחרון" ga_tracking_code: "מיושן: קוד גוגל אנליטיקס (ga.js) למעקב, כגון: UA-12345678-9ֿ; ראו http://google.com/analytics" - ga_domain_name: "מיושן: שם דומיין לגוגל אנליטיקס (ga.js), למשל: mysite.com; ראו http://google.com/analytics" + ga_domain_name: "מיושן: שם מתחם (דומיין) לגוגל אנליטיקס (ga.js), למשל: mysite.com; ראו http://google.com/analytics" ga_universal_tracking_code: "קוד מעקב של Google Universal Analytics (analytics.js), למשל: UA-12345678-9; ראו http://google.com/analytics" - ga_universal_domain_name: "שם הדומיין של Google Universal Analytics (analytics.js), למשל: mysite.com; ראו http://google.com/analytics" + ga_universal_domain_name: "שם המתחם של (Google Universal Analytics analytics.js), למשל: mysite.com; ראו http://google.com/analytics" gtm_container_id: "מזהה קונטיינר של מנהל תגיות גוגל. למשל: GTM-ABCDEF" enable_escaped_fragments: "נסיגה ל Ajax-Crawling API של גוגל אם לא מתגלה זחלן-רשת. ראו https://developers.google.com/webmasters/ajax-crawling/docs/learn-more" enable_noscript_support: "אפשרו תמיכה בזחלן רשת סטנדרטי של מנועי חיפוש באמצעות התג noscript" @@ -847,15 +850,15 @@ he: top_menu: "החליטו אילו פריטים יופיעו בניווט עמוד הבית ובאיזה סדר לדוגמה |אחרונים|חדשים|קטגוריות|מובילים|נקראו|פורסמו|סימניות" post_menu: "החליטו אילו פריטים מופיעים בתפריט הפוסט, ובאיזה סדר. למשל like|edit|flag|delete|share|bookmark|reply" post_menu_hidden_items: "פריטי התפריט להסתרה כברירת מחדל בתפריט הפוסט, אלא אם כן נלחץ לחצן ההרחבה." - share_links: "החלט אילו פריטים יופיעו בתיבת השיתוף, ובאיזה סדר." + share_links: "החליטו אילו פריטים יופיעו בתיבת השיתוף, ובאיזה סדר." track_external_right_clicks: "עקבו אחר קישורים חיצוניים שעליהם נלחץ הכפתור הימני (למשל: פתיחה בטאב חדש) מנוטרל כברירת מחדל כיוון שזה כותב מחדש URLs" site_contact_username: "שם משתמש/ת תקין ממנו ישלחו הודעות פרטיות. אם ישאר ריק חשבון ברירת המחדל של המערכת ישמש לכך." send_welcome_message: "שלחו לכל המשתמשים החדשים הודעת \"ברוכים הבאים\" עם הדרכה ראשונית כיצד להתחיל." - suppress_reply_directly_below: "אל תציגו את סך התגובות המצטבר בפוסט כאשר ישנה תגובה ישירה אחת לפרסום זה." + suppress_reply_directly_below: "אל תציגו את סך התגובות המצטבר בפוסט כאשר ישנה תגובה ישירה אחת לפוסט זה." suppress_reply_directly_above: "אל תציגו את את אפשרות ההרחבה \"בתגובה ל..\" לפוסט כאשר יש רק תגובה אחת ישירה מעל לפוסט זה." - suppress_reply_when_quoting: "אל תציגו את הפרסום המקורי בפרסומים שמצטטים תגובות" + suppress_reply_when_quoting: "אל תציגו את הפוסט המקורי בפרסומים שמצטטים תגובות" max_reply_history: "מספר התגובות המקסימלי להרחבה כאשר מרחיבים \"בתגובה ל\"" - topics_per_period_in_top_summary: "מספר הנושאים המוצגים בבריכת המחדל של סיכום הנושאים." + topics_per_period_in_top_summary: "מספר הנושאים המוצגים בברירת המחדל של סיכום הנושאים." topics_per_period_in_top_page: "מספר הנושאים הראשונים המוצגים בתצוגה המורחבת של \"הצג עוד\"." redirect_users_to_top_page: "כוון באופן אוטומטי משתמשים חדשים וכאלה שנעדרו במשך זמן לראש העמוד." top_page_default_timeframe: "ברירת מחדל של פרק זמן להצגה בדף המובילים." @@ -878,9 +881,9 @@ he: invite_passthrough_hours: "כמה זמן, בשעות, יכול/ה משתמשים לעשות שימוש בהזמנה שנשלחה כדי להתחבר " invite_only: "הרשמה פתוחה מבוטלת, על כל המשתמשים החדשים להיות מוזמנים על ידי חבר/ת בצוות." login_required: "דרשו הזדהות לקריאת תוכן באתר זה, אל תאפשרו גישה אנונימית." - min_username_length: "אורך שם משתמש מינימילי בתווים. " + min_username_length: "אורך שם משתמש מינימילי בתווים." max_username_length: "אורך שם משתמש מקסימלי בתווים." - reserved_usernames: "שמות משתמש שלא ניתן להירשם איתם." + reserved_usernames: "שמות משתמשים שלא ניתן להירשם איתם." min_password_length: "אורך סיסמה מינימלי." min_admin_password_length: "אורך סיסמה מינימלית לאדמיניסטרטור." block_common_passwords: "אל תאפשרו סיסמאות מתוך 10,000 הסיסמאות הנפוצות ביותר." @@ -894,12 +897,12 @@ he: sso_overrides_username: "דורס שם משתמש מקומי עם שם משתמש של אתר חיצוני מתוכן SSO בכל התחברות, ומונע שינויים מקומיים. (אזהרה: אי-התאמות עלולות להתרחש בעקבות הבדלים בדרישות אורך לגבי שמות משתמשים)" sso_overrides_name: "דורס שם מלא מקומי עם שם מלא מאתר חיצוני מתוכן SSO בכל התחברות, מונע שינויים מקומיים." sso_overrides_avatar: "מעקף אווטאר של משתמש בעזרת אווטר אתרחיצוני מ-SSO Payload. אם אפשרות זו מופעלת, מומלץ מאוד לבטל את האפשרות להעלאת אווטר." - sso_not_approved_url: "Redirect unapproved SSO accounts to this URL" - enable_local_logins: "אפשרו שם חשבונות מבוססים על שן משתמש מקומי וסיסמאת התחברות. (שימו לב: אפשרות זו חייבת להיות מותרת כדי שהזמנות להצטרפות יפעלו)" + sso_not_approved_url: "SSO של חשבונות שלא אושרו יופנו ל URL זה" + enable_local_logins: "אפשרו שם חשבונות מבוססים על שן משתמש מקומי וסיסמת התחברות. (שימו לב: אפשרות זו חייבת להיות מותרת כדי שהזמנות להצטרפות יפעלו)" allow_new_registrations: "אפשרו הרשמות משתמשים חדשים. בטלו סימון זה כדי למנוע יצירת חשבונות חדשים." enable_signup_cta: "הציגו מודעה למשתמשים אנונימיים חוזרים שמציעה להם להרשם כדי לקבל חשבון." enable_yahoo_logins: "איפשור אימות של Yahoo" - enable_google_oauth2_logins: "אפשרו הזדהות באמצעות Oauth2 של גוגל. זהו מנגנון ההזדהות שנתמך כרגע על ידי גוגל. דורש מפתח וסיסמא." + enable_google_oauth2_logins: "אפשרו הזדהות באמצעות Oauth2 של גוגל. זהו מנגנון ההזדהות שנתמך כרגע על ידי גוגל. דורש מפתח וסיסמה." google_oauth2_client_id: "זהות לקוח (Client ID) של אפליקציית ה-Google שלך." google_oauth2_client_secret: "קוד סודי של לקוח (client secret) של אפליקציית Google." enable_twitter_logins: "אפשרו אימות Twitter, מצריך twitter_consumer_key ו twitter_consumer_secret" @@ -908,7 +911,7 @@ he: enable_instagram_logins: "אפשרו אימות אינסטגרם, מצריך instagram_consumer_key ו instagram_consumer_secret" instagram_consumer_key: "מפתח לאימות אינסטגרם" instagram_consumer_secret: "סוד לאימות אינסטגרם" - enable_facebook_logins: "Enable Facebook authentication, requires facebook_app_id and facebook_app_secret" + enable_facebook_logins: "איפשור אימות פייסבוק, מצריך facebook_app_id ו facebook_app_secret" facebook_app_id: "מזהה אפליקציה לאימות פייסבוק, רשום ב https://developers.facebook.com/apps" facebook_app_secret: "סוד אפליקציה לאימות פייסבוק, רשום ב https://developers.facebook.com/apps" facebook_request_extra_profile_details: "בקשה עלי, מיקום ואתר מפייסבוק. (מצריך שאפליקציית האימות שלכם תאושר על ידי פייסבוק)" @@ -917,13 +920,13 @@ he: github_client_secret: "סוד לקוח לאימות Github, רשום ב https://github.com/settings/applications" readonly_mode_during_backup: "אפשרו מצב של קריאה בלבד בזמן גיבוי" allow_restore: "אפשר שחזור, אשר יכול להחליף את כל(!) המידע באתר! הותירו על \"שלילי\"/false אלא אם כן אתם מתכננים לשחזר גיבוי." - maximum_backups: "The maximum amount of backups to keep on disk. Older backups are automatically deleted" + maximum_backups: "המספר המקסימלי של גיבויים לשמירה על הכונן. גיבויים ישנים יותר ימחקו אוטומטית" automatic_backups_enabled: "הרץ גיבויים אוטומטים כמו שמוגדר בתדירות הגיבויים" backup_frequency: "באיזו תכיפות אנחנו מגבים את האתר, בימים." enable_s3_backups: "העלאת גיבויים ל-S3 לאחר השלמתם. חשוב: דורש הזנת הרשאות S3 תקפות להגדרות הקבצים." s3_backup_bucket: "הדלי המרוחק שבו לשמור גיבויים. אזהרה: סימו לב שהוא דלי פרטי." s3_disable_cleanup: "בטלו את ההסרה של גיבויים מ S3 כאשר הם מוסרים מקומית." - backup_time_of_day: "הגדרת זמן לגיבוי בפורמט UTC." + backup_time_of_day: "הגדרת זמן לגיבוי לפי UTC." backup_with_uploads: "כללו העלאות בגיבויים התקופתיים. ביטול של אפשרות זו תגבה רק את בסיס הנתונים." active_user_rate_limit_secs: "כל כמה זמן אנחנו מעדכנים את השדה 'last_seen_at', בשניות" verbose_localization: "הצגת טיפים מורחבים של לוקליזציה בממשק המשתמש." @@ -939,11 +942,11 @@ he: max_likes_per_day: "מספר מקסימלי של likes למשתמש/ת ביום." max_flags_per_day: "מספר מקסימלי של דגלים מותרים למשתמשים ביום." max_bookmarks_per_day: "מספר מקסימלי של סימניות למשתמשים ביום." - max_edits_per_day: "מספר עריכות מקסימלי מותר למשתמש ליום." + max_edits_per_day: "מספר עריכות מקסימלי מותר למשתמשים ליום." max_topics_per_day: "מספר מקסימלי של נושאים שמשתמשים יכולים ליצור ביום." - max_private_messages_per_day: "מספר מקסימלי של הודעות שמשתמש/ת יכולים ליצור ביום." + max_private_messages_per_day: "מספר מקסימלי של הודעות שמשתמשים יכולים ליצור ביום." max_invites_per_day: "מספר מקסימלי של הזמנות שיכולים משתמש/ת לשלוח ביום." - max_topic_invitations_per_day: "מספר מירבי של הזמנות לנושא שמשתמש יכול לשלוח ביום. " + max_topic_invitations_per_day: "מספר מירבי של הזמנות לנושא שמשתמשים יכולים לשלוח ביום. " alert_admins_if_errors_per_minute: "מספר השגיאות בדקה לפני ששולחים התראה למנהל. ערך של 0 מנטרל אפשרות זו. שימו לב: מצריך הרצה מחדש." alert_admins_if_errors_per_hour: "מספר השגיאות בשעה לפני ששולחים התראה למנהל. ערך של 0 מנטרל אפשרות זו. שימו לב: מצריך הרצה מחדש." categories_topics: "מספר נושאים להצגה בדף /קטגוריות." @@ -961,10 +964,10 @@ he: s3_secret_access_key: "מפתח הגישה הסודי (secret access key) של Amazon S3 שישמש להעלאת תמונות." s3_region: "שם האזור (region name) של Amazon S3 שישמש להעלאת תמונות." s3_cdn_url: "CDN URL לכל ה assets ב s3 (למשל: https://cdn.somewhere.com). א-ז-ה-ר-ה: לאחר שינוי של הגדרה זו עליכם לאפות מחדש את כל הפוסטים הישנים." - avatar_sizes: "רשימה של גדלי אווטרים שנוצרת אוטומטית. " + avatar_sizes: "רשימה של גדלי דמויות שנוצרת אוטומטית." external_system_avatars_enabled: "שימוש בשירות של מערכת אווטארים חיצונית." external_system_avatars_url: "כתובת של שירות דמויות חיצוני. החלפות מותרות הן {username} {first_letter} {color} {size}" - default_opengraph_image_url: "כתובת של תמונת opengraph בברירת המחדל." + default_opengraph_image_url: "URL ברירת המחדל של תמונת opengraph." twitter_summary_large_image_url: "URL של תמונה מסיכום ברירת המחדל מטוויטר (צריכה להיות ברוחב לפחות 280 פיקסלים ובגובה של לפחות 150 פיקסלים)." allow_all_attachments_for_group_messages: "אפשרו צירוף קבצים להודעות לקבוצות." convert_pasted_images_to_hq_jpg: "המירו תמונות מודבקות לקבצי JPG באיכות גבוהה." @@ -972,16 +975,16 @@ he: enable_flash_video_onebox: "אפשרו הטמעת קישורי swf ו-flv (פלאש של אדובי) בפרסומים. אזהרה: עלול להביא לבעיות בטיחות באתר." default_invitee_trust_level: "ברירת מחדל של רמת אמון (0-4) של משתמשים מוזמנים." default_trust_level: "רמת אמון (0-4) לכל המשתמשים החדשים. אזהרה! שינוי של משתנה זה שם אתכם בסיכון רציני לספאם." - tl1_requires_topics_entered: "כמה נושאים משתמש חדש צריך להתחיל למערכת עד שישודרג לרמת אמון 1." - tl1_requires_read_posts: "כמה פרסומים משתמש צריך לקרוא לפני שישודרג לרמת אמון 1." - tl1_requires_time_spent_mins: "כמה דקות משתמש חדש צריך לקרוא פרסומים לפני שישודרג לרמת אמון 1." - tl2_requires_topics_entered: "כמה נושאים משתמש חדש צריך להתחיל עד שישודרג לרמת אמון 2." - tl2_requires_read_posts: "כמה פרסומים משתמש צריך לקרוא לפני שישודרג לרמת אמון 2." - tl2_requires_time_spent_mins: "כמה דקות משתמש חדש צריך לקרוא פרסומים לפני שישודרג לרמת אמון 2." - tl2_requires_days_visited: "כמה ימים שונים משתמש צריך לבקר באתר לפני שישודרג לרמת אמון 2." - tl2_requires_likes_received: "כמה \"לייקים\" משתמש צריך לקבל לפני שישודרג לרמת אמון 2." - tl2_requires_likes_given: "כמה לייקים משתמש צריך לתת לפני שישודרג לרמת אמון 2." - tl2_requires_topic_reply_count: "בכמה נושאים משתמש צריך לענות לפני שישודרג לרמת אמון 2." + tl1_requires_topics_entered: "כמה נושאים משתמשים חדשים צריכים להתחיל עד שישודרגו לרמת אמון 1." + tl1_requires_read_posts: "כמה פוסטים משתמשים צריכים לקרוא לפני שישודרגו לרמת אמון 1." + tl1_requires_time_spent_mins: "כמה דקות משתמשים חדשים צריכים לקרוא פוסטים לפני שישודרגו לרמת אמון 1." + tl2_requires_topics_entered: "כמה נושאים משתמשים חדשים צריכים להתחיל עד שישודרגו לרמת אמון 2." + tl2_requires_read_posts: "כמה פוסטים משתמשים צריכים לקרוא לפני שישודרגו לרמת אמון 2." + tl2_requires_time_spent_mins: "כמה דקות משתמשים חדשים צריכים לקרוא פוסטים לפני שישודרגו לרמת אמון 2." + tl2_requires_days_visited: "כמה ימים שונים משתמשים צריכים לבקר באתר לפני שישודרגו לרמת אמון 2." + tl2_requires_likes_received: "כמה \"לייקים\" משתמשים צריכים לקבל לפני שישודרגו לרמת אמון 2." + tl2_requires_likes_given: "כמה לייקים משתמשים צריכים לתת לפני שישודרגו לרמת אמון 2." + tl2_requires_topic_reply_count: "בכמה נושאים משתמשים צריכים לענות לפני שישודרגו לרמת אמון 2." tl3_time_period: "דרישות פרק זמן של רמת אמון 3 (בימים)" tl3_requires_days_visited: "מספר מינימלי של ימים שמשתמש צריך לבקר באתר ב (תקופת זמן רמת-אמון-3) הימים האחרונים כדי להיות מועמד לקידום לרמת אמון 3. קבעו ליותר מתקופת זמן של רמת-אמון-3 כדי לנטרל קידום ל רמת-אמון-3. (0 או יותר)." tl3_requires_topics_replied_to: "מספר מינימלי של נושאים שמשתמש צריך להגיב עליהם ב (תקופת זמן רמת-אמון-3) הימים האחרונים כדי להיות מועמד לקידום לרמת אמון 3. (0 או יותר)" @@ -989,10 +992,10 @@ he: tl3_requires_topics_viewed_cap: "המספר המקסימלי הנדרש של נושאים לצפייה ב (תקופת זמן רמת-אמון-3) הימים האחרונים." tl3_requires_posts_read: "אחוז הנושאים שנוצרו ב (תקופת זמן רמת-אמון-3) הימים האחרונים שעל משתמש לצפות בהם כדי להיות מועמד לרמת אמון 3. (0 עד 100)" tl3_requires_posts_read_cap: "המספר המקסימלי הנדרש של פוסטים לקריאה ב (תקופת זמן רמת-אמון-3) הימים האחרונים." - tl3_requires_topics_viewed_all_time: "מספר מינימלי של נושאים שמשתמש צריך לעיין בהם על מנת שיתאפשר לו להיות משודרג לרמת אמון 3." - tl3_requires_posts_read_all_time: "מספר מינימלי של פרסומים שמשתמש קרא על מנת שיוכל להיות משודרג לרמת אמון 3." + tl3_requires_topics_viewed_all_time: "מספר מינימלי של נושאים שמשתמשים צריכים לעיין בהם על מנת שיתאפשר להם להיות משודרגים לרמת אמון 3." + tl3_requires_posts_read_all_time: "מספר מינימלי של פוסטים שמשתמשים קראו על מנת שיוכלו להיות משודרגים לרמת אמון 3." tl3_requires_max_flagged: "אסור שלמשתמש ידוגלו למעלה מ x פוסטים על ידי x משתמשים שונים ב (תקופת זמן רמת-אמון-3) הימים האחרונים כדי להיות מועמד לקידום לרמת אמון 3, כאשר x הוא ערך ההגדרה. (0 או יותר)" - tl3_promotion_min_duration: "מספר הימים המינימלי ששדרוג לרמת אמון 3 תארך לפני שמשתמש יורד בדרגה לרמת אמון 2." + tl3_promotion_min_duration: "מספר הימים המינימלי ששדרוג לרמת אמון 3 אורך לפני שניתן להוריד משתמשים בדרגה בחזרה לרמת אמון 2." tl3_requires_likes_given: "המספר המינימלי של לייקים שצריכים להנתן ב (תקופת זמן רמת-אמון-3) הימים האחרונים כדי להיות מועמד לקידום לרמת אמון 3." tl3_requires_likes_received: "המספר המינימלי של לייקים שחייבים להתקבל ב (תקופת זמן רמת-אמון-3) הימים האחרונים כדי להיות מועמדים לקידום לרמת אמון 3." tl3_links_no_follow: "מניעת הסרת rel=nofollow מקישורים שמפורסמים על ידי משתמשים ברמת אמון 3." @@ -1003,7 +1006,7 @@ he: newuser_max_links: "כמה קישורים יכולים משתמשים חדשים להוסיף לפוסט." newuser_max_images: "כמה תמונות יכולים משתמשים להוסיף לפוסט." newuser_max_attachments: "כמה קבצים מצורפים יכולים משתמשים חדשים להוסיף לפוסט." - newuser_max_mentions_per_post: "מספר מקסימלי של התראות @שם_משתמש בהן יכולים להשתמש משתמש/ת חדשים בפרסום." + newuser_max_mentions_per_post: "מספר מקסימלי של התראות @שם_משתמש בהן יכולים להשתמש משתמש/ת חדשים בפוסט." newuser_max_replies_per_topic: "מספר התגובות המקסימלי שיכולים משתמש/ת חדשים לפרסם לנושא בודד לפני שיקבלו תגובה ממשתמשים אחרים." max_mentions_per_post: "מספר מקסימלי של התראות @שם_משתמש שיכול כל אחד/אחת להכליל בפוסט." max_users_notified_per_group_mention: "מספר מקסימלי של משתמשים שיכולים לקבל התראה אם מוזכרת קבוצה (אם מגיעים לסף זה לא תועלה התראה)" @@ -1018,7 +1021,7 @@ he: allow_uppercase_posts: "אפשרו אותיות אנגליות גדולות (Capitalized) בכותרת נושא או בגוף פוסט." title_fancy_entities: "המירו תווי ASCII ליישויות fancy HTML בכותרות נושאים, בסגנון SmartyPants http://daringfireball.net/projects/smartypants/" min_title_similar_length: "האורך המינימלי של כותרת לפני שהיא נבדקת עבור איתור נושאים דומים." - min_body_similar_length: "האורך המינימלי של גוף הפרסום לפני שהוא ייבדק לאיתור נושאים דומים." + min_body_similar_length: "האורך המינימלי של גוף הפוסט לפני שהוא ייבדק לאיתור נושאים דומים." desktop_category_page_style: "סגנון ויזואלי לדף /קטגוריות." category_colors: "רשימה של ערכי צבעים האקסדיצמלים מותרים לסימון קטגוריות." category_style: "סגנון ויזואלי עבור עיטורי קטגוריות." @@ -1026,21 +1029,21 @@ he: max_attachment_size_kb: "הגודל המקסימלי בקילובייטים (kBs) של קבצים להעלאה. הגדרה זו חייבת להיות מוגדרת ב-nginx (client_max_body_size) / apache או בפרוקסי." authorized_extensions: "רשימה של הרחבות מותרות להעלאה (השתמשו ב '*' כדי לאפשר את כל סוגי הקבצים)" max_similar_results: "כמה נושאים דומים להציג מעל לעורך כאשר מחברים נושא חדש. ההשוואה מבוססת על הכותרת וגוף הפוסט." - title_prettify: "Prevent common title typos and errors, including all caps, lowercase first character, multiple ! and ?, extra . at end, etc." + title_prettify: "מניעת טעויות נפוצות בכותרת, בכללן טעויות עם אותיות גדולות באנגלית, מספר ! ו ?, נקודה מיותרת בסוף, וכד׳" topic_views_heat_low: "לאחר כמות זו של צפיות,שדה הצפיות יהיה קצת יותר בהיר." topic_views_heat_medium: "לאחר כמות צפיות זו, שדה הצפיות יודגש באופן בינוני." topic_views_heat_high: "לאחר כמות צפיות זו, שדה הצפיות יודגש באופן בולט." - cold_age_days_low: "לאחר מספר זה של ימי שיחה, תאריך הפעילות האחרונה מאופר." - cold_age_days_medium: "לאחר מספר זה של ימי שיחה, תאריך הפעילות האחרונה מואפר יותר." - cold_age_days_high: "לאחר מספר זה של ימי שיחה, תאריך הפעילות האחרונה מאופר ממש." + cold_age_days_low: "לאחר מספר זה של ימי שיחה, תאריך הפעילות האחרונה מעט מוכהה." + cold_age_days_medium: "לאחר מספר זה של ימי שיחה, תאריך הפעילות האחרונה מוכהה יותר." + cold_age_days_high: "לאחר מספר זה של ימי שיחה, תאריך הפעילות האחרונה מוכהה מאוד." history_hours_low: "פוסט שנערך תוך כדי מספר שעות זה יופיע עם אינידקציית עריכה מודגשת קלות." history_hours_medium: "פוסט שנערך תוך כדי מספר שעות זה יופיע עם אינידקציית עריכה מודגשת באופן בינוני." - history_hours_high: "פרסום שנערך תוך כדי מספר שעות זה יופיע עם אינידקציית עריכה מודגשת באופן חזק." + history_hours_high: "פוסט שנערך תוך כדי מספר שעות זה יופיע עם אינידקציית עריכה מודגשת באופן חזק." topic_post_like_heat_low: "לאחר שהיחס בין לייקים למספר הפרסומים גבוהה מערך זה, שדה ספירת הפרסומים מודגש קלות." topic_post_like_heat_medium: "לאחר שהיחס בין לייקים למספר הפרסומים גבוהה מערך זה, שדה ספירת הפרסומים מודגש באופן בינוני." topic_post_like_heat_high: "לאחר שהיחס בין לייקים למספר הפרסומים גבוהה מערך זה, שדה ספירת הפרסומים מודגש באופן חזק." - faq_url: "If you have a FAQ hosted elsewhere that you want to use, provide the full URL here." - tos_url: "If you have a Terms of Service document hosted elsewhere that you want to use, provide the full URL here." + faq_url: "אם יש לכם שאלות ותשובות נפוצות שמאורחות במקום אחר ואתם רוצים להשתמש בהן, ספקו את ה URL המלא כאן." + tos_url: "אם יש לכם מסמך תנאי שימוש מאורח במקום אחר שהייתם רוצים להשתמש בו, ספקו את ה URL המלא כאן." privacy_policy_url: "אם יש לכם מסמך הצהרת פרטיות שמאוחסן במקום אחר ובו אתם מעוניינים להשתמש, ספקו URL מלא כאן." newuser_spam_host_threshold: "מספר הפעמים שמשתמשים חדשים יכולים לקשר לאותו מחשב במסגרת `newuser_spam_host_threshold` הפרסומים שלהם לפני שייחשבו ספאם." white_listed_spam_host_domains: "רשימה של מתחמים (domain) שיוחרגו מבדיקת הספאם. משתמשים חדשים לעולם לא יוגבלו ביצירת פרסומים חדשים עם קישורים למתחמים אלו." @@ -1098,8 +1101,8 @@ he: email_prefix: "ה[תווית] שתשמש כנושא של מיילים. אם לא יוגדר, ברירת המחדל תכוון ל'כותרת' אם לא יוגדר אחרת." email_site_title: "הכותרת של האתר שתשמש כשם השולח של דוא\"ל מהאתר. במידה ולא יוגדר ערך, תכוון ברירת המחדל ל\"כותרת\". אם ה\"כותרת\" שלכם מכילה תוים שאינם מותרים לשימוש במחרוזות \"שם השולח\" בדוא\"ל, השתמשו בהגדרה זו." minimum_topics_similar: "כמה נושאים צריכים להתקיים לפני שנושאים דומים יוצגו בעת חיפוש נושא חדש." - relative_date_duration: "מספר הימים לאחר פרסום בהם תאריך הפרסום מופיע כתאריך יחסי (7 ימים) לעומת תאריך רגיל (20 בפברואר)." - delete_user_max_post_age: "אל תפאשרו מחיקת משתמשים שהפרסום הראשון שלהם הוא בן יותר מ-(x) ימים." + relative_date_duration: "מספר הימים לאחר פרסום בהם תאריך הפוסט מופיע כתאריך יחסי (7 ימים) לעומת תאריך רגיל (20 בפברואר)." + delete_user_max_post_age: "אל תפאשרו מחיקת משתמשים שהפוסט הראשון שלהם הוא בן יותר מ-(x) ימים." delete_all_posts_max: "מספר הפוסטים המקסימלי שניתן למחוק בבת אחת עם כפתור המחיקה של כל הפוסטים. אם למשתמש יש יותר מהמספר הזה של פוסטים, הפוסטים לא יכולים להמחק כולם ביחד והמשתמש לא יכול להמחק." username_change_period: "מספר הימים לאחר הרישום שבהם חשבונות יכולים לשנות את שם המשתמש (0 כדי לא לאפשר שינוי שם משתמש)." email_editable: "אפשרו למשתמשים לשנות את כתובת המייל שלהם לאחר ההרשמה." @@ -1121,7 +1124,7 @@ he: enable_user_directory: "ספקו ספריייה של משתמשים לגלישה" allow_anonymous_posting: "אפשרו למשתמשים לעבור למצב אנונימי" anonymous_posting_min_trust_level: "רמת האמון המינמלית הנדרשת כדי לאפשר פרסום אנונימי" - anonymous_account_duration_minutes: "בכדי להגן על האנונימות צרו חשבון אנונימי כל N דקות לכ משתמש. לדוגמה: אם מכוון ל-600, כאשר יעברו 600 דקות מהפרסום האחרון והמשתמש/ת יחליפו לזהות אנונימית, חשבון אנונימי חדש יווצר." + anonymous_account_duration_minutes: "בכדי להגן על האנונימות צרו חשבון אנונימי כל N דקות לכל משתמש. לדוגמה: אם מכוון ל-600, כאשר יעברו 600 דקות מהפרסום האחרון והמשתמש/ת יחליפו לזהות אנונימית, חשבון אנונימי חדש יווצר." hide_user_profiles_from_public: "נטרלו כרטיסי משתמשים, פרופילי משתמשים ומדריך משתמשים למשתמשים אנונימיים." allow_profile_backgrounds: "אפשרו למשתמשים להעלות רקעים לפרופיל." sequential_replies_threshold: "מספר הפוסטים שעל משתמש לפרסם אחד-לאחר-השני בנושא לפני שמזכירים לו שהוא משאיר יותר מידי תגובות ברצף." @@ -1141,7 +1144,7 @@ he: show_time_gap_days: "אם שני פוסטים נוצרים מספר זה של ימים אחד מהשני, הציגו את מרווח הזמן בנושא." invites_per_page: "ברירת המחדל, הזמנות המוצגות בעמוד המשתמש." short_progress_text_threshold: "לאחר שמספר הפוסטים בנושא עוברים את המספר הזה, מד ההתקדמות יציג רק את המספר של הפוסט הנוכחי. אם תשנו את רוחב מד ההתקדמות, ייתכן שתצטרכו לשנות ערך זה." - default_code_lang: "Default programming language syntax highlighting applied to GitHub code blocks (lang-auto, ruby, python etc.)" + default_code_lang: "תחביר שפת תכנות שיסופק כברירת מחדל על קטעי קוד מגיטהאב (לאנג-אוטו, רובי, פיתון וכד׳)" warn_reviving_old_topic_age: "כאשר מישהם מתחילים להגיב לנושא שבו התגובה האחרונה היא בת יותר מכמה ימים, אזהרה תוצג. נטרלו באמצעות הזנה של 0." autohighlight_all_code: "לחייב שימוש בקוד הדגשה לכל קוד מעוצב מראש (preformatted code blocks) אפילו אם הם אינם מציינים את השפה." highlighted_languages: "כולל הדגשת כללי תחביר (syntax). (אזהרה: הכללת שפות רבות מידי עשויה להשפיע על הביצועים) ראו: https://highlightjs.org/static/demo/ להדגמה." @@ -1175,16 +1178,16 @@ he: default_email_digest_frequency: "באיזו תדירות משתמשים יקבלו סיכומי מיילים כברירת מחדל." default_include_tl0_in_digests: "כללו פרסומים ממשתמשים חדשים בדוא\"ל מסכם כברירת מחדל. משתמשים יוכלו לשנות זאת בהעדפות האישיות." default_email_private_messages: "שלח מייל כשמישהו שולח הודעה למשתמש, בתור ברירת מחדל." - default_email_direct: "שלח מייל כשמישהו מצטט/ מגיב ל/מזכיר או מזמין משתמש, בתור ברירת מחדל. " + default_email_direct: "שלח מייל כשמישהו מצטט/מגיב-ל/מזכיר או מזמין משתמש, בתור ברירת מחדל." default_email_mailing_list_mode: "שלח מייל עבור כל פוסט חדש בתור ברירת מחדל. " default_email_mailing_list_mode_frequency: "משתמשים שאיפשרו את מצב רשימת התפוצה יקבלו מיילים בתדירות זו כברירת מחדל." disable_mailing_list_mode: "לא לאפשר למשתמשים לעבור למצב רשימת תפוצה." - default_email_always: "שלח התרעות למייל גם כאשר המשתמש פעיל, בתור ברירת מחדל." + default_email_always: "שלח התראות למייל גם כאשר המשתמש פעיל, בתור ברירת מחדל." default_email_previous_replies: "כלילת תגובות קודמות במיילים כברירת מחדל." default_email_in_reply_to: "הכללת קטע של פוסט עליו עונים במיילים כברירת מחדל." default_other_new_topic_duration_minutes: "ברירת המחדל הגלובאלית עבור תנאי שבשבילו נושא ייחשב חדש." default_other_auto_track_topics_after_msecs: "ברירת המחדל הגלובאלית עבור הזמן לפני שנושא נעקב אוטומטית" - default_other_external_links_in_new_tab: "פתח קישורים חיצונים בטאב חדש, בתור ברירת מחדל. " + default_other_external_links_in_new_tab: "פתח קישורים חיצונים בטאב חדש, בתור ברירת מחדל." default_other_enable_quoting: "איפשור תגובות עם ציטוט לטקסט מצוטט כברירת מחדל." default_other_dynamic_favicon: "הציגו ספירה של נושאים חדשים/מעודכנים באייקון של הדפדפן כברירת מחדל." default_other_disable_jump_reply: "כברירת מחדל לא לקפוץ לפוסטים של משתמשים לאחר שהם עונים." @@ -1215,6 +1218,9 @@ he: min_trust_level_to_tag_topics: "רמת אמון מינימלית שדרושה כדי לתייג נושאים" suppress_overlapping_tags_in_list: "אם תגים תואמים בדיוק מילים בכותרות נושאים, אל תציגו את התגים" remove_muted_tags_from_latest: "אל תציגו נושאים מתוייגים עם תגים מושתקים ברשימת הנושאים האחרונים." + company_short_name: "שם חברה (קצר)" + company_full_name: "שם חברה (מלא)" + company_domain: "שם מתחם (דומיין) חברה" errors: invalid_email: "כתובת דוא\"ל לא קיימת." invalid_username: "אין משתמש/ת עם שם משתמש כזה." @@ -1275,11 +1281,11 @@ he: emoji: errors: name_already_exists: "מצטערים, השם '%{name}' כבר תפוס על ידי emoji אחר." - error_while_storing_emoji: "מצטער, היתה שגיאה בזמן שמירת ה-emoji." + error_while_storing_emoji: "מצטערים, היתה שגיאה בזמן שמירת ה-emoji." topic_statuses: archived_enabled: "הנושא הזה נכנס לארכיון. הוא קפוא ולא ניתן לשינוי בכל דרך." archived_disabled: "הנושא הזה הוצא מהארכיון. הוא כבר לא קפוא, וניתן לשינוי." - closed_enabled: "הנושא הזה נעול. לא ניתן להגיב תגובות חדשות." + closed_enabled: "הנושא הזה סגור. לא ניתן להגיב תגובות חדשות." closed_disabled: "הנושא הזה פתוח. ניתן להגיב תגובות חדשות." autoclosed_message_max_posts: one: "הודעה זו נסגרה אוטומטית אחרי שהגיעה למספר המקסימלי של תגובות: 1 ." @@ -1295,16 +1301,16 @@ he: other: "נושא זה נסגר אוטומטית לאחר %{count}. לא ניתן להוסיף תגובות חדשות." autoclosed_enabled_minutes: one: "הנושא הזה ננעל אוטומטית לאחר דקה. תגובות חדשות לא מתקבלות." - other: "הנושא הזה ננעל אוטומטית לאחר %{count} דקות. תגובות חדשות לא מתקבלות." + other: "הנושא הזה נסגר אוטומטית לאחר %{count} דקות. תגובות חדשות לא מתקבלות." autoclosed_enabled_lastpost_days: one: "נושא זה ננעל אוטומטית לאחר יום אחד מהתגובה האחרונה. תגובות חדשות לא מתקבלות." - other: "נושא זה ננעל אוטומטית לאחר %{count} ימים מהתגובה האחרונה. תגובות חדשות לא מתקבלות." + other: "נושא זה נסגר אוטומטית לאחר %{count} ימים מהתגובה האחרונה. תגובות חדשות לא מתקבלות." autoclosed_enabled_lastpost_hours: one: "נושא זה נסגר שעה לאחר התגובה האחרונה. תגובות נוספות אינן מותרות יותר." other: "נושא זה נסגר אוטומטית %{count} שעות לאחר התגובה האחרונה. תגובות נוספות אינן מותרות יותר." autoclosed_enabled_lastpost_minutes: one: "נושא זה ננעל אוטומטית לאחר דקה מהתגובה האחרונה. תגובות חדשות לא מתקבלות." - other: "נושא זה ננעל אוטומטית לאחר %{count} דקות מהתגובה האחרונה. תגובות חדשות לא מתקבלות." + other: "נושא זה נסגר אוטומטית לאחר %{count} דקות מהתגובה האחרונה. תגובות חדשות לא מתקבלות." autoclosed_disabled: "הנושא הזה נפתח. ניתן להגיב תגובות חדשות." autoclosed_disabled_lastpost: "הנושא הזה נפתח. ניתן להגיב תגובות חדשות." pinned_enabled: "הנושא הזה ננעץ. הוא יופיע בראש הקטגוריה שלו עד שיוסר מנעיצה על ידי מנהל או שכפתור נקה נעיצות נלחץ." @@ -1321,18 +1327,19 @@ he: activate_email: "

כמעט סיימנו! שלחנו מייל אקטיבציה אל %{email}. אנא עקבו אחר ההנחיות במייל כדי להפעיל את חשבונכם.

אם המייל לא יגיע, בדקו את תיקיית הספאם שלכם, או נסו להתחבר פעם נוספת כדי לשלוח מייל אקטיביזציה נוסף.

" not_activated: "אינכם יכולים להתחבר עדיין. שלחנו לכם הודעת דואר אלקטרוני לאישור. בבקשה עיקבו אחר ההוראות במייל כדי להפעיל את חשבונכם." not_allowed_from_ip_address: "אינכם יכולים להתחבר כ-%{username} מכתובת IP זו. " - admin_not_allowed_from_ip_address: "אינך יכול/ה להתחבר כמנהל מערכת מכתובת IP זו." + admin_not_allowed_from_ip_address: "אינכם יכולים להתחבר כמנהלי מערכת מכתובת IP זו." suspended: "אינך יכול להתחבר עד %{date}." suspended_with_reason: "חשבון הושעה עד %{date}: %{reason}" errors: "%{errors}" - not_available: "לא זמין. נסה %{suggestion}?" - something_already_taken: "משהו השתבש, אולי שם המשתמש או כתובת הדאור האלקטרוני כבר בשימוש. נסה את קישור שכחתי סיסמה." - omniauth_error: "סליחה, הייתה שגיאה בוידוא חשבונך. אולי לא אישרת את הוידוא? " - omniauth_error_unknown: "משהו השתבש במהלך עיבוד ההתחברות שלך, אנא נסה שנית." + not_available: "לא זמין. נסו %{suggestion}?" + something_already_taken: "משהו השתבש, אולי שם המשתמש או כתובת הדואר האלקטרוני כבר בשימוש. נסו את קישור שכחתי סיסמה." + omniauth_error: "סליחה, הייתה שגיאה בוידוא חשבונך. אולי לא אישרת את הוידוא?" + omniauth_error_unknown: "משהו השתבש במהלך עיבוד ההתחברות שלך, אנא נסו שנית." + authenticator_error_no_valid_email: "אף אחת מכתובות המייל שמקושרות ל %{account} אינה מותרת. ייתכן ותצטרכו לכוונן את חשבונכם עם כתובת מייל אחרת." new_registrations_disabled: "הוספת חשבונות חדשים אינה מותרת בעת זו." password_too_long: "סיסמאות מוגבלות ל-200 תווים." email_too_long: "המייל שהזנת ארוך מדי. שמות מייל צריכים להכיל לכל היותר 254 תוים, ושמות דומיין צריכים להכיל לכל היותר 253 תוים." - reserved_username: "שם משתמש זה אסור. " + reserved_username: "שם משתמש זה אינו מורשה." missing_user_field: "לא מילאת את כל שדות המשתמש/ת" close_window: "האימות הושלם. סגרו חלון זה כדי להמשיך." already_logged_in: "אופס, נראה שאתם מנסים לקבל הזמנה שנועדה למשתמש אחר. אם אתם לא %{current_user}, אנא התנתקו ונסו שוב." @@ -1347,15 +1354,15 @@ he: blank: "חייב להיות מלא" must_begin_with_alphanumeric_or_underscore: "חייב להתחיל באות, מספר, או קו תחתון" must_end_with_alphanumeric: "חייב להסתיים באות או מספר" - must_not_contain_two_special_chars_in_seq: "לא יכול להכיל רצף של 2 או יותר תווים מיוחדים (.-_)" + must_not_contain_two_special_chars_in_seq: "לא יכול להכיל רצף של 2 או יותר תווים מיוחדים (.-_)" must_not_end_with_confusing_suffix: "אסור שיסתיים עם סיומות מבלבלות כמו .json או .png וכד׳." email: not_allowed: "לא מורשה מכתובת הדואר האלקטרוני הזו. בבקשה השתמש בכתובת אחרת." blocked: "לא מורשה." revoked: "לא יישלחו מיילים ל '%{email}' עד %{date}." ip_address: - blocked: "הרשמות חדשות אסורות מכתובת ה-IP שלך. " - max_new_accounts_per_registration_ip: "הרשמות חדשות אסורות מכתובת ה-IP שלך. (עברת את הסף המותר) צרו קשר עם מנהל." + blocked: "הרשמות חדשות אסורות מכתובת ה-IP שלך." + max_new_accounts_per_registration_ip: "הרשמות חדשות אסורות מכתובת ה-IP שלך. (עברת את הסף המותר) צרו קשר עם איש צוות." flags_reminder: flags_were_submitted: one: "דגלים נשלחו לפני למעלה משעה. אנא סיקרו אותם." @@ -1445,7 +1452,7 @@ he: הזמנה זו נשלחה ממשתמשים מוכרים באתר, כך שהחשבון שלכם יווצר באופן אוטומטי. invite_password_instructions: - subject_template: "צרו סיסמא עבור חשבון ה-%{site_name} שלכם." + subject_template: "צרו סיסמה עבור חשבון ה-%{site_name} שלכם." text_body_template: | תודה שקיבלתם את ההזמנה שלכם ל %{site_name} -- ברוכים הבאים! לחצו על הקישור בשביל לבחור סיסמה: %{base_url}/users/password-reset/%{email_token} @@ -1525,23 +1532,23 @@ he: %{notes} queued_posts_reminder: subject_template: - one: "[%{site_name}] תגובה אחת מחכה לבדיקה" - other: "[%{site_name}] %{count} תגובות ממתינים לבדיקה" + one: "[%{site_name}] פוסט 1 מחכה לסקירה" + other: "[%{site_name}] %{count} פוסטים ממתינים לסקירה" text_body_template: | שלום, פוסטים של משתמשים חדשים הושהו לצורך בדיקה והם כרגע ממתינים לסקירה. [אשרו או דחו אותם כאן](%{base_url}/queued-posts). flag_reasons: off_topic: "הפוסט שלכם סומן כ **מחוץ לנושא**: הקהילה מרגישה שהוא לא מתאים לנושא, כפי שמוגדר על ידי הכותרת והפוסט הראשון. " - inappropriate: "התגובה שלך סומנה כ**לא מתאימה**: הקהילה מרגישה שהוא פוגעני או הפרה של [our community guidelines](/guidelines)" + inappropriate: "התגובה שלך סומנה כ**לא מתאימה**: הקהילה מרגישה שהיא פוגענית או הפרה של [הנחיות הקהילה](/guidelines)" spam: "הפוסט שלך סומן כ**ספאם**: הקהילה מרגישה שזה פרסומת, דבר שהוא קידום מכירות באופיו במקום להיות שימושי או רלוונטי לנושא. " notify_moderators: "הפוסט שלך דוגל **לתשומת לב מנחה**: הקהילה מרגישה שמשהו בפוסט דורש התערבות ידנית של צוות האתר. " flags_dispositions: agreed: "תודה שעדכנת אותנו. אנחנו מסכימים שיש כאן בעיה ואנחנו מנסים לבדוק את העניין." - agreed_and_deleted: "תודה שעדכנת אותנו. אנחנו מסכימים שישנה בעיה והסרנו את הפרסום." + agreed_and_deleted: "תודה שעדכנת אותנו. אנחנו מסכימים שישנה בעיה והסרנו את הפוסט." disagreed: "תודה שעדכנת אותנו. אנחנו בודקים את זה." - deferred: "תודה שעדכנתםאותנו. אנחנו בודקים את העניין." - deferred_and_deleted: "תודה שעדכנתם אותנו. הסרנו את הפרסום." + deferred: "תודה שעדכנתם אותנו. אנחנו בודקים את העניין." + deferred_and_deleted: "תודה שעדכנתם אותנו. הסרנו את הפוסט." temporarily_closed_due_to_flags: "נושא זה סגור באופן זמני בעקבות מספר רב של דגלים של הקהילה. " system_messages: post_hidden: @@ -1673,7 +1680,7 @@ he: 1. השתמשו תמיד **באותו חשבון מייל מההזמנה המקורית** בעת ההתחברות. אחרת לא נוכל לדעת שאלו אתם! - 2. צרו סיסמא ייחודית עבור [הפרופיל שלכם] [prefs] והשתמשו בה בשביל להתחבר. + 2. צרו סיסמה ייחודית עבור [הפרופיל שלכם] [prefs] והשתמשו בה בשביל להתחבר. %{new_user_tips} @@ -2170,7 +2177,7 @@ he: text_body_template: | חשבון חדש נוצר עבורך ב%{site_name} - הקישו על הקישור המצורף כדי להגדיר סיסמא לחשבונך החדש: + הקישו על הקישור המצורף כדי להגדיר סיסמה לחשבונכם החדש: %{base_url}/users/password-reset/%{email_token} confirm_new_email: subject_template: "[%{site_name}] אשרו את כתובת המייל החדשה שלכם" @@ -2244,7 +2251,7 @@ he: unauthorized: "מצטערים, הקובץ שאתם מנסים להעלות לא מורשה (סיומות מורשות: %{authorized_extensions})." pasted_image_filename: "תמונה שהודבקה" store_failure: "נכשלה שמירת העלאה #%{upload_id} עבור משתמש #%{user_id}." - file_missing: "סליחה, עליך לספק קובץ להעלות. " + file_missing: "סליחה, עליך לספק קובץ להעלות." attachments: too_large: "מצטערים, הקובץ שאתם מנסים להעלות גדול מידי (הגודל המקסימלי המותר הוא %{max_size_kb}KB)." images: @@ -2263,7 +2270,7 @@ he: seen_recently: "המשתמש נראה לאחרונה" post_not_found: "לא נמצא פוסט עם מזהה %{post_id}" notification_already_read: "ההתראה שעבורה נשלח מייל זה כבר נקראה" - topic_nil: "post.topic is nil" + topic_nil: "post.topic הוא nil" post_deleted: "הפוסט נמחק על ידי הכותב שלו" user_suspended: "המשתמש הושעה" already_read: "המשתמש כבר קרא פוסט זה" @@ -2286,10 +2293,331 @@ he: ערכו את הפוסט הראשון בנושא זה כדי לשנות את התכנים של העמוד %{page_name}. guidelines_topic: title: "שאלות נפוצות / הנחיות" + body: | + + + ## [זהו מקום מתורבת לדיונים פומביים](#civilized) + + אנא התייחסו לפורום זה באותה הצורה כפי שהייתם מתייחסים לפארק ציבורי. גם אנחנו משאב קהילתי משותף — מקום לחלוק בו יכולות, ידע ותחומי עיניין באמצעות שיחה. + + אלו אינם כללים נוקשים, אלא הנחיות לשיקול דעתה של הקהילה שלנו. השתמשו בהנחיות אלו כדי להשאיר את המקום הזה נקי, מואר, ונוח לדיון ציבורי. + + + + ## [שפרו את הדיון](#improve) + + עזרו לנו להפוך את הפורום הזה למקום נהדר לדיונים על ידי כך שתמיד נפעל לשיפור הדיון בצורה זו או אחרת, קטנה ככל שתהיה. אם אינכם בטוחים שהודעה שלכם מוסיפה לדיון, חישבו מה אתם מנסים לומר ונסו שוב מאוחר יותר. + + הנושאים שנידונים כאן חשובים לנו, ואנחנו רוצים שתנהגו בהתאם. כבדו את הנושאים ואת האנשים שדנים בהם, גם אם אינכם מסכימים עם חלק מהדברים שנאמרים. + + דרך אחת לשיפור הדיון היא על-ידי היכרות עם דיונים שכבר מתרחשים. אנא השקיעו קצת זמן בסיור בין הנושאים שכבר קיימים לפני שאתם מתחילים דיון חדש, וכך יגבר הסיכוי שתפגשו אנשים נוספים שחולקים איתכם תחומי עיניין. + + + + ## [אפשרו לאחרים להסכים איתכם, גם כשאינכם מסכימים](#agreeable) + + ייתכן ותרצו להגיב למשהו שאינכם מסכימים איתו. זה אחלה. אך, זיכרו לבקר רעיונות ולא אנשים. אנא המנעו מ: + + * קריאה בשמות. + * התקפות אד-הומינם (לגופו של אדם, ולא לגופו של עיניין). + * להגיב לנימה של הודעה ולא לתוכן שלה. + * Knee-jerk contradiction. + + במקום זאת, אנא ספקו נימוקים מושכלים שמשפרים את הדיון. + + + + ## [השתתפותכם משפיעה](#participate) + + הדיונים שאנחנו מקיימים כאן קובעים את הטון עבור כולם. עיזרו לנו להשפיע על עתיד הקהילה הזו על ידי בחירה להשתתף בדיונים שגורמים לפורום הזה להיות מקום מעניין - ולהמנע מדיונים שמרחיקים את הפורום משם. + + דיסקורס מספקת כלים שמאפשרים לקהילה לזהות ביחד את התרומות הכי טובות (וגרועות): פייבוריטים, סימניות, לייקים, דגלים, תגובות, עריכות, וכהנה וכהנה. השתמשו בכלים אלו כדי לשפר את החוויה שלכם, ושל כולם. + + בואו ננסה להשאיר את השטח נקי יותר מאיך שמצאנו אותו. + + + + ## [אם יש לכם בעיה, דווחו עליה](#flag-problems) + + לעורכים יש סמכות מיוחדת; הם אחראים על פורום זה. אך גם אתם. בעזרתכם, עורכים יכולים לאפשר לקהילה לפרוח, ולא רק להיות מנקים או שוטרים. + + כאשר אתם נתקלים בהתנהגות רעה, אל תגיבו. תגובות מעודדות התנהגויות רעות על-ידי קבלה שלהן, לוקחות לכם אנרגיה, ומבזבזות את הזמן של כולם. _אך ורק דגלו אותה_. אם מצטברים מספיק דגלים, תינקט פעולה אוטומטית או על ידי התערבות עורך. + + כדי לשמר את הקהילה שלנו, עורכים שומרים לעצמם את הזכות להסיר כל תוכן שהוא וכל חשבון משתמש מסיבה כלשהי ובכל זמן שהוא. עורכים לא קוראים מראש פוסטים חדשים בשום צורה; העורכים ומתפעלי האתר לא לוקחים שום אחריות על שום תוכן שפורסם על-ידי הקהילה. + + + + ## [Always Be Civil](#be-civil) + + אין דבר שפוגע יותר בדיון בריא מאשר גסות-רוח: + + * אזרחות טובה. אל תשאירו הודעות שאדם מהרחוב היה מחשיב כתוקפניות, נצלניות, או מסיתות. + * השאירו סביבה נקייה. אל תפרסמו דברים שעלולים להחשב פוגעניים או מטרידים מינית. + * כבדו את חבריכם. אל תטרידו, תתחזו, או תפרסמו מידע פרטי של אנשים אחרים. + * כבדו את הפורום שלנו. בבקשה לא להספים או לחבל בפורום. + + אלו אינם כללים מדוייקים — המנעו גם מ_מראית עין_ של כל אחד מהדברים האלו. אם אינכם בטוחים, שאלו את עצמכם כיצד תרגישו אם דבריכם היו מפורסמים בעמוד הראשון של Ynet. + + זהו פורום פומבי, ומנועי חיפוש מאנדקסים את הדיונים הללו. אנא שימרו על שפה, קישורים ותמונות כשרים למשפחה וחברים. + + + + ## [סדר וניקיון](#keep-tidy) + + עשו מאמץ לשים דברים במקום הנכון, כך שנוכל להשקיע יותר זמן בדיונים ופחות בניקיונות. כך: + + * אל תתחילו נושא בקטגוריה הלא-נכונה. + * אל תפרסמו את אותו התוכן בכמה נושאים. + * אל תפרסמו תגובות ללא תוכן. + * אל תסיטו את הדיון על ידי שינוי נושא באמצע. + * אל תחתמו — כל הודעה שלכם כבר מקושרת לפרופיל האישי שלכם. + + במקום לכתוב ״+1״ או ״מסכים״, אנא השתמשו בכפתור ה״Like״. במקום להסיט את הדיון לכיוון שונה, אנא השתמשו ב״תגובה בנושא קשור״. + + + + ## [פרסמו רק את החומרים של עצמכם](#stealing) + + אינכם רשאים לפרסם שום תוכן ששייך לאף אחד אחר ללא רשות. אינכם רשאים לפרסם תיאור על, קישורים ל, או שיטות לגניבה של קניין רוחני של מישהו אחר (תוכנה, וידאו, אודיאו, או תמונות), או להפרה של כל חוק שהוא. + + + + ## [מופעל על-ידיכם](#power) + + אתר זה מתופעל על ידי [הצוות](/about) ועל-ידיכם, הקהילה. אם יש לכם שאלות נוספות בנוגע לאיך דברים אמורים לעבוד כאן, פיתחו נושא חדש תחת [קטגוריית משוב לאתר](/c/site-feedback) ובואו נדבר! אם יש עיניינים קריטיים או דחופים שלא ניתן לטפל בהם על ידי מטא-נושא או סימון, פנו אלינו דרך [דף הצוות](/about). + + + + ## [תנאי שירות](#tos) + + כן, משפטנות היא משעממת, אך אנחנו מגינים על עצמנו – וכך גם עליכם, והמידע שלכם – מפני חברים לא נחמדים. יש לנו [תנאי שימוש](/tos) שמתארים את התנהגותכם (והתנהגותנו) וזכויות שנוגעות לתוכן, פרטיות, וחוקים. כדי להשתמש בשירות הזה, עליכם להסכים לציית ל[תנאי השירות](/tos). tos_topic: title: "תנאי השימוש" + body: | + התנאים והתניות שלהלן מסדירים את כל פרטי השימוש באתר %{company_domain} ובכל פריטי התוכן, השירותים והמוצרים הזמינים באתר או דרכו, כולל, בין השאר, את תוכנת הפורום של %{company_domain} (שיקראו ביחד ״האתר״ או ״אתר האינטרנט״). האתר שייך ומתופעל על-ידי %{company_full_name} (להלן ״%{company_name}״). אנו מציעים לכם את אתר האינטרנט, אך מתנים זאת בקבלת כל התנאים והתניות הכלולים כאן, ללא שינוי, וכל יתר כללי ההפעלה, העקרונות (כולל, ללא הגבלה, [מדיניות הפרטיות](/privacy) של %{company_name}, [הנחיות הקהילה](/faq) של %{company_name}) והנהלים ש%{company_name} עשויה לפרסם מעת לעת באתר האינטרנט (במקובץ, 'ההסכם'). + + יש לקרוא את ההסכם בעיון לפני הגישה לאתר או השימוש בו. הגישה לאתר או לחלק ממנו והשימוש בהם פירושם הסכמה מצדכם כי יחולו עליכם התנאים והתניות הכלולים בהסכם זה. הרשות לגשת אל אתר האינטרנט ולהשתמש בשירותים מותנית בהסכמתכם לכל התנאים והתניות שבהסכם. אם תנאים ותניות אלה נחשבים להצעה מטעם %{company_name}, קבלת התנאים מצדכם מוגבלת במפורש לתנאים אלה. + + האתר אינו מיועד למי שלא מלאו לו 13 שנים והשירות באתר מוצע אך ורק למשתמשים בני 13 ומעלה. משתמשים בני 13 ומטה מתבקשים לא להירשם לשימוש באתר. כל אדם שנרשם כמשתמש או מספק את פרטיו האישיים לאתר מצהיר בזאת כי הוא בן 13 ומעלה. + + + + ## [1. חשבונכם ב %{company_domain}](#1) + + אם אתם יוצרים חשבון באתר, אתם אחראים על שמירת האבטחה של חשבונכם ואתם אחראים לחלוטין על כל הפעילויות שמתרחשות בשמכם בחשבון. באחריותכם ליידע את %{company_name} מיידית על כל שימוש לא מורשה בחשבונכם ועל כל הפרה אחרת של האבטחה. לא תחול על %{company_name} חבות בגין מעשים או מחדלים מצידכם, לרבות נזק מכל סוג ומין שייגרם כתוצאה מאותם מעשים או מחדלים. + + + + ## [2. אחריות התורמים](#2) + + אם אתם מפרסמים חומרים באתר, קישורים באתר, או יוצרים (או מאפשרים לצד שלישי ליצור) חומרים שנעשים זמינים באמצעות האתר (כל חומר שהוא, להלן ״תוכן״), האחריות המלאה על התוכן הזה, כמו גם על כל נזק הנובע ממנו, תחול עליכם. האחריות חלה ללא תלות בסוג התוכן, לרבות, אך ללא הגבלה, טקסט, תמונה, סרטון וידאו, אודיו או קוד. כאשר אתם מנגישים תוכן, אתם מאשרים ש: + + * הורדה, העתקה ושימוש בתוכן לא יפרו זכויות קיניין, לרבות זכויות יוצרים, פטנטים, סימני מסחר או זכויות סודות מסחריים, של שום צד שלישי; + * אם למעסיק שלכם יש זכויות על קיניין רוחני שאתם יוצרים, או (i) שקיבלתם רשות מהמעסיק לפרסם או להפוך תוכן לנגיש, לרבות תוכנה, או (ii) שקיבלתם ויתור מהמעסיק לכל הזכויות על התוכן; + * אתם מתואמים לחלוטין עם כל רשיון צד שלישי שקשור לתוכן, ועשיתם את כל שנדרש כדי להעביר בהצלחה למשתמשי הקצה כל תנאי נדרש; + * התוכן אינו מכיל או מתקין שום וירוס, תולעת, רוגלה, סוס טרויאני או כל תוכן הרסני אחר; + * התוכן אינו ספאם, אינו מיוצר באקראי או על ידי מכונה, ואינו מכיל תוכן מסחרי שאינו אתי או בלתי רצוי שתוכנן כדי להזרים תנועה לאתרי צד שלישי או לשפר דירוגים של מנועי חיפוש של צדדים שלישיים, או כדי לקדם מעשים לא חוקיים (כגון פישינג) או להטעות נמענים בנוגע למקור של התוכן (כמו ספופינג); + * התוכן אינו פורנוגרפי, לא מכיל איומים או מסית לאלימות, ולא מפר את הפרטיות או זכויות הפרסום של שום צד שלישי; + * התוכן שלכם אינו מפורסם באמצעות הודעות אלקטרוניות בלתי רצויות כמו קישורי ספאם בקבוצות דיון, רשימות מיילים, בלוגים ואתרים, ודרכי קידום בלתי רצויות אחרות; + * לתוכן לא ניתן שם בצורה שמטעה את הקוראים שלכם וגורמת להם לחשוב שאתם אדם אחר או חברה אחרת; ו + * במקרה שהתוכן מכיל קוד מחשב, קיטלגתם במדוייק ו/או תיארתם את הסוג, אופי, שימושים והשפעות של החומרים שפרסמתם, בין שנתבקשתם לעשות זאת על ידי %{company_name} או שלא. + + + + ## [3. רשיון תוכן משתמשים](#3) + + תרומות תוכן של משתמשים הן תחת [רשיון קריאייטיב קומונס ייחוס-שימוש_לא_מסחרי-שיתוף_זהה 3.0 לא-מותאם](http://creativecommons.org/licenses/by-nc-sa/3.0/deed.he). מבלי להגביל אף אחת מהמצגים והערובות, ל%{company_name} יש את הזכות (אך לא את החובה), לפי שיקול דעתה הבלעדי (i) לסרב לקבל או להסיר כל תוכן שלפי דעתה הסבירה של %{company_name}, מפר איזשהי מהמדיניויות של %{company_name} או שהוא פוגעני או שהוא מעורר התנגדות, או (ii) לסגור או למנוע כניסה ו/או שימוש באתר לכל אדם או יישות מכל סיבה שהיא, לפי שיקול דעתה הבלעדי של %{company_name}. על %{company_name} לא תחול שום חובה להחזיר איזה מהסכומים ששולמו בעבר. + + + + ## [4. תשלומים וחידוש](#4) + + ### תנאים כלליים + + שירותים אופציונליים ושידרוגים יכולים להיות זמינים באתר. כאשר אתם משתמשים בשירות או שדרוג אופציונליים, אתם מסכימים לשלם ל%{company_name} את דמי המנוי החודשיים או שנתיים. תשלומים יגבו מראש ביום שתתחילו להשתמש בשירות או בשדרוג ויכסו את השימוש בשירות או בשדרוג למנוי תקופתי חודשי או שנתי כפי שמצויין. תשלומים אלו לא ניתנים להחזרה. + + ### חידוש אוטומטי + + אלא אם תודיעו ל%{company_name} לפני סיום תקופת המנוי הרלוונטית שאתם מעוניינים לבטל את השירות או השדרוג, המנוי שלכם יתחדש אוטומטית ואתם מאשרים לנו לגבות את דמי המנוי החודשיים השנתיים (וכן מיסים) באמצעות כרטיס אשראי או אמצעי תשלום אחר שברשותנו. ניתן לבטל מנויים בכל עת. + + + + ## [5. שירותים](#5) + + ### אירוח, שרותי תמיכה + + שירותי אירוח ותמיכה אופציונליים עלולים להיות מסופקים על ידי %{company_name} תחת התנאים וההתניות לכל אחד מהשירותים הללו. על ידי הרשמה לאירוח/תמיכה או חשבון שירותי תמיכה, אתם מסכימים לציית לכל התנאים וההתניות. + + + + ## [6. אחריות מבקרים](#6) + + %{company_name} לא סקרה, ולא יכולה לסקור, את כל החומר, כולל תוכנות מחשב, שפורסמו באתר, ולכן לא יכולה להיות אחראית לתכנים, שימושם או השפעתם. על ידי הפעלת האתר, %{company_name} לא מייצגת או רומזת שהיא תומכת בחומר שפורסם בו, או שהיא מאמינה שהחומר מדוייק, שימושי או לא-מזיק. אתם האחראים על נקיטת אמצעים לפי הצורך כדי להגן על עצמכם ועל מערכות המחשב שלכם בפני וירוסים, תולעים, סוסים טרויאנים, ותכנים מזיקים או הרסניים אחרים. האתר עלוללהכיל תכנים פוגעניים, לא-ראויים, או נתונים לביקורת בצורה אחרת, כמו גם מכילים אי-דיוקים טכניים, טעויות טיפוגרפיות, ואחרות. האתר עלול להכיל גם תכנים שמפרים את הפרטיות או זכויות הפרסום, או מפרים את זכויות הקניין וזכויות רכוש אחרות, של צדדים שלישיים, או הורדות, העתקות או שימוש שעליו חלים תנאים והתניות, מצויינים או שאינם מצויינים. %{company_name} לא לוקחת כל אחריות לכל נזק שייגרם מהשימוש על ידי מבקרים באתר, או מכל הורדה על ידי מבקרים שתכניהם מפורסמים. + + + + ## [7. תכנים שמפורסמים באתרים אחרים](#7) + + לא סקרנו, ואנחנו לא יכולים לסקור, את כל החומר, כולל תוכנות מחשב, שמוצעים דרך האתרים ודפי האינטרנט אליהם %{company_domain} מקשר, ואשר מקשרים אל %{company_domain}. ל%{company_name} אין שליטה על אתרים ודפים אלו שאינם %{company_domain} והיא אינה אחראית על התוכן והשימוש שלהם. על ידי קישור לאתר או דף שאינו חלק מ %{company_domain}, %{company_name} לא מייצגת או רומזת שהיא תומכת באתרים ודפים כאלו. אתם אחראים לנקוט באמצעי זהירות לפי הצורך כדי להגן על עצמכם ועל מערכות המחשוב שלכם מוירוסים, תולעים, סוסים טרוינים, ותכנים פוגעניים או הרסניים אחרים. %{company_name} פוטרת עצמה מכל אחריות לכל נזק שנגרם כתוצאה משימוש באתרים ודפים שאינם %{company_domain}. + + + + ## [8. הפרת זכויות יוצרים ומדיניות DMCA](#8) + + כשם ש%{company_name} מבקשת מאחרים לכבד את זכויות הקניין הרוחני שלה, היא מכבדת את זכויות הקניין הרוחני של אחרים. אם אתם מאמינים שחומר שנמצא ב או מקושר מ %{company_domain} מפר את זכויות היוצרים שלכם, ואם אתר זה שוכן בארה״ב, %{company_name} מעודדת אתכם להודיע לה בהתאם למדיניות [Digital Millennium Copyright Act](http://en.wikipedia.org/wiki/Digital_Millennium_Copyright_Act) ("DMCA") של %{company_name}. %{company_name} תגיב להודעות כאלו, כפי שנדרש או ראוי על ידי הסרה של תכנים מפרים או ביטול כל הקישורים לחומרים המפרים. %{company_name} תבטל גישה ותחסום שימוש באתר אם, תחת נסיבות מתאימות, המבקר נחוש להיות מפר סדרתי של זכויות יוצרים או זכויות קניין רוחני אחרות של %{company_name} או אחרים. במקרה של סיום התקשרות שכזה, ל%{company_name} לא תהיה שום מחוייבות לספק החזר של שום סכום ששולם לפני כן ל%{company_name}. + + + + ## [9. קיניין רוחני](#9) + + הסכם זה לא מעביר אליכם מ%{company_name} או מצד שלישי שום קניין רוחני, וכל זכות, קניין ועיניין בקניין זה יישאר (כפי שבין הצדדים) ב%{company_name} בלבד. %{company_name}, %{company_domain}, הלוגו של %{company_domain}, וכל שאר סימני המסחר, סימני השירות, גרפיקות ולוגואים שנעשה בהם שימוש בקשר ל %{company_domain}, או האתר הם סימני מסחר או סימנים רשומים של %{company_name} או זכייניה. סימני מסחר אחרים, סימני שירות, גרפיקות ולוגואים שנעשה בהם שימוש בהקשר של האתר יכולים להיות סימני מסחר של צדדים שלישיים אחרים. השימוש שלכם באתר לא מקנה לכם זכות או רישיון לייצר או להשתמש בשום סימני מסחר של %{company_name} או צד שלישי. + + + + ## [10. פרסום](#10) + + %{company_name} שומרת על זכותה להציג פרסומות על גבי התכנים שלך, אלא אם רכשת שדרוג 'ללא פרסומות' או שברשותך חשבון מיוחד. + + + + ## [11. ייחוס](#11) + + %{company_name} שומרת לעצמה את הזכות להציג קישורי ייחוס כמו ״מופעל על ידי %{company_domain}״, ייחוס לתמה, כותב וייחוס פונט בתחתית או בבאר הכלים של התכנים שלכם. קרדיטים בתחתית ובבאר הכלים של %{company_domain} לא מותרים להסרה בלי קשר לשדרוגים שנרכשו. + + + + ## [12. שינויים](#12) + + אנו מעדכנים את השירותים שלנו ללא הרף ופירוש הדבר, שלעתים אנו נדרשים לשנות את התנאים המשפטיים שבכפוף להם אנו מציעים את שירותינו. באחריותך לבדוק מפעם לפעם הסכם זה בנוגע לשינויים בו. המשך השימוש שלך ב-%{company_domain} יהיה בכפוף לתנאים החדשים ומשקף הסכמה אליהם. עם זאת, %{company_name} יכולה בהמשך להציע שירותים נוספים, עליהם יחול הסכם זה. + + + + ## [13. סיום](#13) + + %{company_name} רשאית להפסיק את הגישה שלך לאתר האינטרנט בכל עת, באופן מלא או חלקי, עם או בלי סיבה, עם או בלי התראה, ובתוקף מיידי. אם ברצונך לסיים את ההסכם או לסגור את חשבונך ב-%{company_domain} (אם קיים), עליך פשוט להפסיק את השימוש באתר האינטרנט. כל הוראות הסכם זה אשר מעצם טבען אמורות לשרוד סיום כאמור ישרדו אותו, כולל, ללא הגבלה, הוראות בדבר בעלות, תניות פטור וסעיפי הסתייגות מאחריות, סעיפי שיפוי וסעיפי הגבלת חבות. + + + + ## [14. הגבלת אחריות](#14) + + האתר מוגש ״כמו שהוא״. %{company_name} והספקים שלה והגורמים המעניקים לה רשיונות מתנערים מכל אחריות מכל סוג שהוא, מוצהרת או מרומזת, ובכללה, מבלי להגביל, אחריות מסחרית, התאמה למטרה כלשהי ואחריות לאי-הפרה. לא %{company_name} ולא הספקים או הגורמים המעניקים לה רשיונות, מתחייבים שבאתר לא יהיו שגיאות או שהגישה אליו תהיה רציפה וללא שיבושים. אם אתם באמת קוראים זאת, הנה [הפתעה](http://www.newyorker.com/online/blogs/shouts/2012/12/the-hundred-best-lists-of-all-time.html). אתם מבינים שאתם מורידים, או מקבלים תכנים או שירותים מהאתר על אחריותכם וסיכונכם בלבד. + + + + + ## [15. הגבלת חבות](#15) + + בשום מקרה %{company_name}, או הספקים שלה או בעלי הרשיון שלה, יהיו אחראים לכל דבר ועיניין שקשורים להסכם זה תחת כל חוזה, התרשלות, אחריות קפידה או דין אחר או תיאוריית יושר בעבור: (i) נזקים מיוחדים, מקריים או תוצאתיים; (ii) מחיר רכש של מוצרים תחליפיים או שירותים; (iii) בעבור הפרעה בשימוש או אבדן או השחתה של מידע; או (iv) כל סכום שעולה על המחיר ששילמתם ל%{company_name} תחת הסכם זה במהלך שנים עשר (12) החודשים שלפני סיבת הפעולה. ל%{company_name} לא תהיה אחריות לכל תקלה או איחור בעקבות עיניינים שמחוץ לשליטתה הסבירה. האמור לעיל לא תקף מעבר למה שנאסר בחוק. + + + + ## [16. ייצוג כללי ואחריות](#16) + + אתם מייצגים ומאשרים ש (i) שימושכם באתר יתאם בקפידה עם [מדיניות הפרטיות](/privacy) של %{company_name}, [הנחיות הקהילה](/guidelines), עם הסכם זה ועם כל החוקים והתקנות הרלוונטיים (כולל, מבלי להגביל, כל החוקים המקומיים או התקנות בארצכם, מדינתכם, עירכם, או אזור ממשלתי אחר, בנוגע להתנהלות מקוונת ותכנים קבילים, וכולל כל החוקים הרלוונטיים בנוגע למשלוח מידע טכני מהמדינה בה אתר זה נמצא או המדינה בה אתם נמצאים) ו (ii) שימושכם באתר לא מפר או מועל בזכויות קניין רוחני של כל צד שלישי. + + + + ## [17. שיפוי](#17) + + הסכמתכם נתונה לכך שתחול עליכם החובה לפצות ולשפות את %{company_name}, קבלניה והגורמים המעניקים לה רישיונות, ואת המנהלים, בעלי התפקידים, העובדים והסוכנים של כל אלה, מפני וכנגד כל תביעה והוצאה, כולל הוצאות הגנה משפטית כתוצאה מהשימוש שלכם באתר האינטרנט, כולל אך לא רק, הפרה מצדכם של האמור בהסכם זה. + + + + ## [18. שונות](#18) + + הסכם זה מהווה את כלל ההסכם בין %{company_name} לבינכם בנוגע לעיניין הנדון, והוא יכול להשתנות על ידי תיקון כתוב חתום על ידי מנהל מורשה של %{company_name}, או על ידי פרסום מטעם %{company_name} של גרסה מתוקנת. למעט במידה המותרת בחוק הרלוונטי, אם יש, הסכם זה, הגישה לאתר האינטרנט והשימוש בו יוסדרו על פי חוקי מדינת ישראל, והמקום לבירור מחלוקות שיתעוררו מתוך או בנוגע לכל אלה יהיה בתי המשפט המדינתיים שבתל אביב, ישראל. למעט תביעות לסעד באמצעות צו מניעה או מן הדין, או תביעות בנוגע לזכויות קניין רוחני (אשר מותר להגישן בכל בית משפט מוסמך ללא תשלום ערבות), כל מחלוקת שתיווצר כתוצאה מהסכם זה תיושב באופן סופי בהתאם לכללי הבוררות הנהוגים בישראל, באמצעות שלושה בוררים שימונו בהתאם לאותם כללים. הבוררות תתקיים בתל אביב, ישראל, בשפה העברית, ויהיה אפשר לאכוף את פסיקת הבוררות בכל בית משפט. הצד שייצא וידו על העליונה בכל תביעה או הליך לאכיפת הסכם זה יהא זכאי להחזר בגין עלויות ודמי הגנה משפטית. היה וייקבע כי חלק כלשהו בהסכם זה אינו תקף או בלתי אכיף, אותו חלק יפורש כך שישקף את הכוונה המקורית של הצדדים ויתר חלקי ההסכם ישמרו על מלוא תוקפם וחלותם. ויתור של צד מן הצדדים על תנאי או תניה הכלולים בהסכם זה או על הפרה של תנאי/תניה כאמור בהזדמנות נתונה, ייחשב לוויתור באותה הזדמנות בלבד ולא יחול על אף הפרה נוספת/עתידית. מותר לכם להסב את זכויותיכם במסגרת הסכם זה לזכות כל גורם שיסכים כי האמור בתנאים ובתניות שהוא כולל יחולו עליו. %{company_name} רשאית להסב את זכויותיה במסגרת הסכם ללא שום תנאי. הסכם זה יחייב את הצדדים וייזקף לזכות הצדדים, יורשיהם ונמחיהם המורשים. + + ## [19. תרגום](#19) + + תנאי שירות אלה נוסחו במקור בשפה האנגלית (ארה"ב). אפשר שנתרגם את התנאים לשפות אחרות. במקרה של סתירה בין גרסה מתורגמת של תנאי השירות לבין הגרסה באנגלית, תינתן עדיפות לגרסה בשפה האנגלית. + + מסמך זה הוא CC-BY-SA. הוא עודכן ב 2 באוקטובר, 2016. + + הותאם במקור מ[תנאי השירות של Wordpress](http://en.wordpress.com/tos/). privacy_topic: title: "מדיניות פרטיות" + body: | + + + ## [איזה מידע אנחנו אוספים?](#collect) + + אנחנו אוספים מכם מידע כאשר אתם נרשמים לאתר שלנו ואוספים מידע מכם כאשר אתם משתתפים בפורום על ידי קריאה, כתיבה, והערכת התוכן שמשותף כאן. + + כאשר אתם נרשמים לאתר שלנו, ייתכן ותיתבקשו להכניס את שמכם וכתובת המייל שלכם. יחד עם זאת אתם יכולים לבקר באתר שלנו מבלי להרשם. כתובת המייל שלכם תאומת באמצעות מייל שמכיל קישור ייחודי. אם הקישור הזה מבוקר, אנחנו יודעים שאתם שולטים בכתובת המייל. + + כאשר אתם רשומים ומפרסמים, אנחנו שומרים את כתובת ה IP ממנה פורסם הפוסט. אנחנו יכולים גם לשמור יומני שרת שכוללים את כתובת ה IP של כל קריאה לשרת שלנו. + + + + ## [למה אנחנו משתמשים במידע שלכם?](#use) + + כל מידע שאנחנו אוספים מכם יכול לשמש בכל אחת מהדרכים הבאות: + + * כדי להתאים אישית את החוויה שלכם — המידע שלכם עוזר לנו לענות טוב יותר על צרכיכם האישיים. + * כדי לשפר את האתר שלנו — אנחנו כל הזמן שואפים לשפר את מה שהאתר שלנו מציע בהתחשב במידע ובמשוב שאנחנו מקבלים מכם. + * כדי לשפר את שירות הלקוחות — המידע שלכם מסייע לנו להגיב בצורה אפקטיבית יותר לבקשות שירות הלקוחות שלכם וצרכי התמיכה. + * כדי לשלח מיילים תקופתיים — כתובת המייל שאתם מספקים יכולה לשמש כדי לשלוח לכם אינפורמציה, התראות שביקשתם לגבי שינויים בנושאים או בתגובה לשם המשתמש שלכם, לענות לשאלות, ו/או בקשות או שאלות אחרות. + + + + ## [כיצד אנחנו מגנים על האינפורמציה שלכם?](#protect) + + אנחנו נוקטים במגוון של אמצעי אבטחה כדי לשמור על הבטיחות של המידע הפרטי שלכם כאשר אתם נכנסים, שולחים, או ניגשים למידע הפרטי שלכם. + + + + ## [מה מדיניות שמירת המידע שלכם?](#data-retention) + + אנחנו נעשה מאמץ בתום לב: + + * לשמור יומנים שמכילים כתובות IP של כל הבקשות לשרת זה לא יותר מ 90 יום. + * לשמור על כתובות IP שמקושרות עם משתמשים רשומים ופוסטים שלהם לא יותר מ 5 שנים. + + + + ## [האם אנחנו משתמשים בעוגיות?](#cookies) + + כן. עוגיות הן קבצים קטנים שאתר או מספק השירות שלו מעביר לכונן הקשיח של מחשבכם דרך הדפדפן שלכם (אם אתם מרשים). עוגיות אלו מאפשרות לאתר להכיר את הדפדפן שלכם ו, אם יש לכם חשבון רשום, לקשר אותו עם חשבונכם הרשום. + + אנחנו משתמשים בעוגיות כדי להבין ולשמור את ההעדפות שלכם לביקורים עתידיים ולהכין נתונים מצרפיים בנוגע לתנועה באתר ואינטראקציה באתר כדי שנוכל להציע חוויית משתמש טובה יותר וכלים בעתיד. אנחנו יכולים לכרות חוזים עם מספקי שירות שהם צד-שלישי כדי לסייע לנו להבין טוב יותר את מבקרי האתר שלנו. נותני שרותים אלו לא מורשים להשתמש בנתונים שנאספים בשמנו למעט כדי לסייע לנו לקיים ולשפר את השירות שלנו. + + + + ## [האם אנחנו מוסרים אינפורמציה כלשהי לצדדים שלישיים?](#disclose) + + איננו מוכרים, סוחרים, או מעבירים בצורה אחרת לצדדים שלישיים מידע אישי מזוהה שלכם. זה אינו כולל צדדים שלישיים עליהם אנחנו סומכים שמסייעים לנו בתפעול האתר שלנו, לתפעל את העסק שלנו, או לשרת אתכם, כל עוד צדדים אלו מסכימים לשמור על מידע זה סודי. אנחנו יכולים גם לשחרר את המידע שלכם כאשר אנחנו מאמינים ששחרור שלו הולם כדי לעמוד בחוק, לקיים את מדיניות האתר שלנו, או כדי להגן על זכויות שלנו או של אחרים, לשמור על רכוש או בטיחות. עם זאת, מידע של מבקרים שאינו מזוהה אישית עלול להיות מסופק לצדדים אחרים לצורך שיווק, פרסום או שימושים אחרים. + + + + ## [קישורי צד שלישי](#third-party) + + לעיתים, לפי שיקול דעתנו, אנחנו יכולים לכלול או להציע מוצרים של צדדים שלישיים באתר שלנו. לאתרי צד שלישי אלו יש מדיניות פרטיות נפרדת ובלתי-תלויה. לכן אין לנו כל אחריות או התחייבות לתכנים או פעילויות של אתרים מקושרים אלו. יחד עם זאת אנחנו מבקשים לשמור על השלמות של האתר שלנו ומברכים כל משוב בנוגע לאתרים אלו. + + + + ## [תאימות ל Children's Online Privacy Protection Act](#coppa) + + האתר שלנו, המוצרים, והשירותים - כולם מוכוונים לאנשים מגיל 13 ומעלה. אם שרת זה נמצא בארה״ב, ואתם מתחת לגיל 13, לפי דרישות COPPA כאן - [Children's Online Privacy Protection Act](https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act), אל תשתמשו באתר זה. + + + + ## [מדיניות פרטיות מקוונת בלבד](#online) + + מדיניות פרטיות מקוונת זו חלה רק על מידע שנאסף באמצעות האתר שלנו ולא על מידע שנאסף בצורה בלתי-מקוונת. + + + + ## [הסכמתכם](#consent) + + על ידי שימוש באתר שלנו, אתם מסכימים למדיניות הפרטיות של האתר. + + + + ## [שינויים למדיניות הפרטיות](#changes) + + אם נחליט לשנות את מדיניות הפרטיות שלנו, נפרסם שינויים אלו בדף זה. + + מסמך זה הוא CC-BY-SA. הוא עודכן לאחרונה ב 25 לספטמבר 2016. static: search_help: |

טיפים

@@ -2528,7 +2856,7 @@ he: first_onebox: name: Onebox ראשון description: פרסמו קישור שנעשה לו onebox - long_description: תג זה מוענק בפעם הראשונה שמפרסמים קישור בשורהנפרדת, מה שיגרום לו להתרחב לתיבת onebox עם תקציר של העמוד המקושר, כותרת ותמונה (כאשר ישנה תמונה בעמוד המקושר). + long_description: עיטור זה מוענק בפעם הראשונה שמפרסמים קישור בשורה נפרדת, מה שיגרום לו להתרחב לתיבת onebox עם תקציר של העמוד המקושר, כותרת ותמונה (כאשר ישנה תמונה בעמוד המקושר). first_reply_by_email: name: תגובה ראשונה במייל description: השיבו לפוסט באמצעות מייל @@ -2551,6 +2879,119 @@ he: staff_tag_disallowed: "התג \"%{tag}\" ניתן רק על ידי הצוות." staff_tag_remove_disallowed: "התג \"%{tag}\" ניתן להסרה רק על ידי הצוות." rss_by_tag: "נושאים מתוייגים %{tag}" + wizard: + title: "הקמת Discourse" + step: + locale: + title: "ברוכים הבאים ל Discourse!" + fields: + default_locale: + description: "מה השפה של הקהילה שלכם?" + forum_title: + title: "שם" + description: "השם שלכם נראה למרחוק, הדבר הראשון שמבקרים פוטנציאליים יבחינו בו בנוגע לקהילה שלכם. מה השם והכותרת שלכם אומרים על הקהילה?" + fields: + title: + label: "שם הקהילה שלכם" + placeholder: "המקום של ג׳יין" + site_description: + label: "תארו את הקהילה שלכם במשפט קצר אחד" + placeholder: "מקום לג׳יין וחבריה לשוחח על דברים מגניבים" + introduction: + title: "פתיחה" + fields: + welcome: + label: "נושא ברוכים-הבאים" + description: "

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

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

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

" + one_paragraph: "אנא הגבילו את הודעת הברוכים-הבאים שלכם לפסקה אחת." + privacy: + title: "גישה" + description: "

האם הקהילה שלכם פתוחה לכולם, או שהיא מוגבלת על ידי חברות, הזמנה, או אישור? אם תעדיפו, תוכלו להקים אותה כפרטית ובהמשך להפוך אותה לפומבית.

זיכרו שתמיד תוכלו לשלוח הזמנות גם מנושאים, ומפרופיל המשתמש שלכם.

" + fields: + privacy: + choices: + open: + label: "פומבי" + description: "כל אחד יכול לגשת לקהילה זו ולהרשם כדי לפתוח חשבון" + restricted: + label: "פרטי" + description: "רק אנשים שהזמנתי או אישרתי יכולים לגשת לקהילה זו" + contact: + title: "איש/אשת קשר" + fields: + contact_email: + label: "מייל" + placeholder: "name@example.com" + description: "כתובת מייל לאדם או קבוצה שאחראים על קהילה זו. משמשת להתראות קריטיות כמו דגלים שלא טופלו, עידכוני אבטחה, ובדף האודות שלכם ליצירת קשר דחופה עם איש הקשר של הקהילה." + contact_url: + label: "דף ווב" + placeholder: "http://www.example.com/contact-us" + description: "דף אינטרנט כללי ליצירת קשר איתכם או הארגון שלכם. יוצג בדף האודות." + site_contact: + label: "הודעות אוטומטיות" + description: "כל ההודעות הפרטיות והאוטומטיות של Discourse יישלחו ממשתמש זה. הכי חשוב, משתמש זה יהיה השולח הנבחר של כל הודעת ברוכים הבאים שנשלחת אוטומטית למשתמשים חדשים." + corporate: + title: "ארגון" + description: "שמות אלו יוכנסו למדיניות הפרטיות שלכם ולתנאי השימוש, שתוכלו לערוך בכל זמן בקטגוריית הצוות. אם אין לכם חברה, הרגישו חופשי לדלג על שלב זה לעת עתה." + fields: + company_short_name: + label: "שם החברה (קצר)" + placeholder: "Initech" + company_full_name: + label: "שם החברה (מלא)" + placeholder: "Initech, Inc." + company_domain: + label: "שם המתחם (דומיין) של החברה" + placeholder: "initech.com" + colors: + title: "תמה" + fields: + theme_id: + description: "האם אתם מעדיפים להתחיל עם סכמת צבעים בהירה או כהה? תמיד תוכלו להמשיך ולהתאים את המראה של האתר שלכם באמצעות ״ניהול״ > ״התאמה-אישית״." + choices: + default: + label: "בהיר פשוט" + dark: + label: "כהה פשוט" + logos: + title: "לוגואים" + fields: + logo_url: + label: "לוגו ראשי" + description: "תמונת הלוגו בצד הימני העליון של האתר שלכם. השתמשו בצורה מלבנית רחבה." + logo_small_url: + label: "לוגו קומפקטי" + description: "גירסה קומפקטית של הלוגו שלכם, מוצגת בצד ימין למעלה של האתר שלכם כאשר גוללים למטה. השתמשו בצורה ריבועית." + icons: + title: "אייקונים" + fields: + favicon_url: + label: "אייקון קטן" + description: "תמונה שמשמשת לייצוג האתר שלכם בדפדפנים שנראית טוב בגדלים קטנים כמו 32 על 32 פיקסלים." + apple_touch_icon_url: + label: "אייקון גדול" + description: "תמונה שמשמשת לייצוג האתר שלכם במכשירים מודרניים ונראית טוב בגדלים גדולים יותר. הגודל המומלץ הוא לפחות 144 על 144 פיקסלים." + homepage: + description: "אנחנו ממליצים להציג את הנושאים האחרונים בדף הבית שלכם, אבל אתם יכולים לבחור להראות קטגוריות (קבוצות של נושאים) על דף הבית אם אתם מעדיפים." + title: "דף הבית" + fields: + homepage_style: + choices: + latest: + label: "נושאים אחרונים" + categories: + label: "קטגוריות" + emoji: + title: "אמוג׳י" + description: "איזה סגנון אמוג׳י אתם מעדיפים עבור הקהילה שלכם? תמיד תוכלו להוסיף עוד אמוג׳י בהמשך באמצעות ״ניהול״ > ״התאמה״ > ״אמוג׳י״." + invites: + title: "הזמינו צוות" + description: "כמעט סיימתם! בואו נזמין כמ חברי צוות כדי לסייע לזרוע את הדיונים עם נושאים מעניינים ותגובות שיניעו קדימה את הקהילה שלכם." + finished: + title: "ה Discourse שלכם מוכן!" + description: | +

אם אתם אי פעם מרגישים שאתם צריכים לשנות הגדרות אלו, בקרו באזור הניהול שלכם; מיצאו אותו ליד האייקון של מפתח הברגים בתפריט האתר.

+

תהנו, ובהצלחה בבניית הקהילה החדשה שלכם!

activemodel: errors: <<: *errors diff --git a/config/locales/server.pt_BR.yml b/config/locales/server.pt_BR.yml index 2c0577510e..82d3b7b927 100644 --- a/config/locales/server.pt_BR.yml +++ b/config/locales/server.pt_BR.yml @@ -1188,6 +1188,100 @@ pt_BR: deferred_and_deleted: "Obrigado por nos avisar. Nós removemos o post." temporarily_closed_due_to_flags: "Este tópico foi temporariamente fechado devido a um grande número de sinalizações da comunidade." system_messages: + usage_tips: + text_body_template: | + Eis algumas dicas rápidas para iniciar: + + ## Leitura + + Para ler mais, **basta continuar rolando a página para baixo!** + + À medida que novas respostas ou tópicos forem chegando, eles irão aparecer automaticamente -- não há necessidade de refrescar a página. + + ## Navegação + + + - For search, your user page, or the menu, use the **icon buttons at upper right**. + + - Selecting a topic title will always take you to your **next unread reply** in the topic. To enter at the top or bottom instead, select the reply count or last reply date. + + + + - While reading a topic, use the timeline on the right to jump to the top, bottom, or your last read position. On smaller screens, select the progress bar at bottom right to expand it: + + + + You can also press ? on your keyboard for a list of super-speedy keyboard shortcuts. + + ## Replying + + To insert a quote, select the text you wish to quote, then press any Reply button to open the editor. Repeat for multiple quotes. + + + + You can always continue reading while you compose your reply, and we automatically save drafts as you write. + + To notify someone about your reply, mention their name. Type `@` to begin selecting a username. + + + + To use [standard Emoji](http://www.emoji.codes/), just type `:` to match by name, or use the traditional smileys `;)` + + + + To generate a summary for a link, paste it on a line by itself: + + + + Your reply can be formatted using simple HTML, BBCode, or [Markdown](http://commonmark.org/help/): + + This is bold. + This is [b]bold[/b]. + This is **bold**. + + For more formatting tips, [try our fun 10 minute interactive tutorial!](http://commonmark.org/help/tutorial/) + + ## Actions + + There are action buttons at the bottom of each post: + + + + - To let someone know that you enjoyed and appreciated their post, use the **like** button. Share the love! + + - Grab a copy-pasteable link to any reply or topic via the **link** button. + + - Use the show more button to reveal more actions. **Flag** to privately let the author, or [our staff](%{base_url}/about), know about a problem. **Bookmark** to find this post later on your profile page. + + ## Notifications + + When someone replies to you, quotes your post, mentions your `@username`, or even links to your post, a number will immediately appear at the top right of the page. Select it to access your **notifications**. + + + + Don't worry about missing a reply – you'll be emailed any notifications that arrive when you are away. + + ## Preferences + + - All topics less than **two days old** are considered new. + + - Any topic you've **actively participated in** (by creating it, replying to it, or reading it for an extended period) will be automatically tracked on your behalf. + + You will see the new and unread number indicators next to these topics: + + + + You can change your notifications for any topic via the notification control at the bottom, and right hand side, of each topic. + + + + You can also set notification state per category, if you want to watch or mute every new topic in a specific category. + + To change any of these settings, see [your user preferences](%{base_url}/my/preferences). + + ## Community Trust + + It's great to meet you! As you participate here, over time we'll get to know you, and your temporary new user limitations will be lifted. Keep participating, and over time you'll gain new [trust levels](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) that include special abilities to help us manage our community together. welcome_user: subject_template: "Bem-vindo ao %{site_name}!" text_body_template: | @@ -1566,6 +1660,8 @@ pt_BR: welcome: name: Bem-Vindo description: Recebeu uma curtida + long_description: | + Este emblema é concedido quando você recebe sua primeira curtida numa mensagem. Parabéns, você postou algo que sua comunidade achou interessante, legal ou divertido! autobiographer: name: Autobiógrafo description: Preencheu as informações do perfil @@ -1696,6 +1792,14 @@ pt_BR: staff_tag_disallowed: "A marcação \"%{tag}\" pode ser aplicada somente pelo pessoal de apoio." staff_tag_remove_disallowed: "A marcação \"%{tag}\" pode ser removida somente pelo pessoal de apoio." rss_by_tag: "Tópicos marcados com %{tag}" + wizard: + step: + locale: + title: "Bem-vindo ao seu Discourse!" + introduction: + fields: + welcome: + label: "Tópico de Boas Vindas" activemodel: errors: <<: *errors diff --git a/config/locales/server.ro.yml b/config/locales/server.ro.yml index d9935c7d80..9d92993d66 100644 --- a/config/locales/server.ro.yml +++ b/config/locales/server.ro.yml @@ -12,7 +12,7 @@ ro: long_date: "MMMM D, YYYY h:mma" datetime_formats: &datetime_formats formats: - short: "%d.%m.%Y" + short: "%d-%m-%Y" short_no_year: "%B %-d" date_only: "%B %-d, %Y" long: "%B %-d, %Y, %l:%M%P" @@ -24,19 +24,19 @@ ro: pm: "PM" <<: *datetime_formats title: "Discourse" - topics: "Discuții" + topics: "Subiecte" posts: "postări" loading: "Se încarcă" - powered_by_html: 'Prin intermediul Discourse, Vizualizare optimă cu JavaScript activat' + powered_by_html: 'Propulsat de Discourse, Vizualizare optimă cu JavaScript activat' log_in: "Autentificare" purge_reason: "Cont șters automat, ca fiind abandonat, dezactivat." disable_remote_images_download_reason: "Descărcarea de imagini la distanţă a fost dezactivată deoarece nu mai era spaţiu pe disc suficient." - anonymous: "Anonim" + anonymous: "Anonime" emails: incoming: default_subject: "Email primit de la %{email}" show_trimmed_content: "Arată conținut restrâns." - maximum_staged_user_per_email_reached: "Număr maxim de utilizatori tratați, pe email." + maximum_staged_user_per_email_reached: "Număr maxim de utilizatori în așteptare, pe email." errors: empty_email_error: "Apare atunci când mailul brut pe care l-am primit este gol." no_message_id_error: "Apare atunci când mailul nu are header 'Message-Id'." @@ -50,15 +50,15 @@ ro: reply_user_not_matching_error: "Apare atunci când un răspuns a venit de la o adresă de email diferită de cea la care a fost trimisă notificarea." topic_not_found_error: "Apare atunci când un răspuns a venit dar subiectul aferent a fost șters." topic_closed_error: "Apare atunci când un răspuns a venit dar subiectul aferent a fost închis." - bounced_email_error: "Emailul este un raport de email reflectat." - screened_email_error: "Apare atunci când adresa de email a expeditorului a fost deja trecută în revistă." + bounced_email_error: "Emailul este un raport de email ricoșat." + screened_email_error: "Apare atunci când adresa de email a expeditorului a fost deja verificată." errors: &errors format: '%{attribute} %{message}' messages: - too_long_validation: "este limitat la %{max} de caractere; ați introdus %{length}." - invalid_boolean: "Valoare logică invalidă." + too_long_validation: "este limitat la %{max} de caractere; ai introdus %{length}." + invalid_boolean: "Valoare logică nevalidă." taken: "nu este disponibil" - accepted: trebuie să fie acceptat + accepted: trebuie acceptat blank: nu poate fi gol present: trebuie să fie gol confirmation: "nu se potrivește cu %{attribute}" @@ -68,10 +68,10 @@ ro: exclusion: este rezervat greater_than: trebuie să fie mai mare decât %{count} greater_than_or_equal_to: trebuie să fie mai mare sau egal cu %{count} - has_already_been_used: "deja este folosit" + has_already_been_used: "a fost deja folosit" inclusion: nu este inclus in listă invalid: nu este valid - is_invalid: "este invalid; încercați o descriere mai detaliată" + is_invalid: "este invalid; încearcă o descriere mai detaliată" less_than: trebuie să fie mai mic decât %{count} less_than_or_equal_to: trebuie să fie mai mic sau egal cu %{count} not_a_number: nu este un număr @@ -79,114 +79,114 @@ ro: odd: trebuie sa fie impar record_invalid: 'Validare a eşuat: %{errors}' restrict_dependent_destroy: - one: "Înregistrarea nu poate fi ştearsă pentru că există %{record} înregistrări dependente" - many: "Înregistrarea nu poate fi ştearsă pentru că există %{record} înregistrări dependente" + one: "Înregistrarea nu poate fi ştearsă pentru că există %{record} (de) înregistrări dependente" + many: "Înregistrarea nu poate fi ştearsă pentru că există %{record} (de) înregistrări dependente" too_long: - one: este prea lung (maximum 1 caracter) - few: este prea lung (maximum %{count} caractere) - other: este prea lung (maximum %{count} caractere) + one: este prea lung (maximum un caracter) + few: este prea lung (maximum %{count} (de) caractere) + other: este prea lung (maximum %{count} (de) caractere) too_short: - one: este prea scurt (minimum 1 caracter) - few: este prea scurt (minimum %{count} caractere) - other: este prea scurt (minimum %{count} caractere) + one: este prea scurt (minimum un caracter) + few: este prea scurt (minimum %{count} (de) caractere) + other: este prea scurt (minimum %{count} (de) caractere) wrong_length: - one: este lungimea greşită (trebuie sa fie 1 caracter) - few: este lungimea greşită (trebuie sa fie %{count} caractere) - other: este lungimea greşită (trebuie sa fie %{count} caractere) - other_than: "trebuie sa fie diferite de %{count}" + one: are lungimea greşită (trebuie sa fie un caracter) + few: are lungimea greşită (trebuie sa fie %{count} (de) caractere) + other: are lungimea greşită (trebuie sa fie %{count} (de) caractere) + other_than: "trebuie sa fie diferit de %{count}" template: body: 'Au apărut probleme cu următoarele câmpuri:' header: one: O eroare a împiedicat acest %{model} să fie salvat - few: '%{count} erori au împiedicat acest %{model} să fie salvat' - other: '%{count} erori au împiedicat acest %{model} să fie salvat' + few: '%{count} (de) erori au împiedicat acest %{model} să fie salvat' + other: '%{count} (de) erori au împiedicat acest %{model} să fie salvat' embed: - load_from_remote: "S-a semnalat o eroare la încarcarea postării." + load_from_remote: "A apărut o eroare la încărcarea postării." site_settings: - min_username_length_exists: "Nu puteți seta numărul minim de caractere din nume_utilizator la o valoare mai mare decât cea a celui mai scurt nume_utilizator." - min_username_length_range: "Nu puteți seta minimum cu o valoare mai mare decât a maximului." - max_username_length_exists: "Nu puteți seta numărul maxim de caractere pentru nume_utilizator la o valoare mai mică decât a celui mai lung nume_utilizator." - max_username_length_range: "Nu puteți seta maximum cu o valoare mai mică decât a minimului." - default_categories_already_selected: "Nu puteți selecta o categorie folosită într-o altă listă." - s3_upload_bucket_is_required: "Nu puteți activa încărcările pe S3 dacă nu ați introdus 's3_upload_bucket'." + min_username_length_exists: "Nu poți seta numărul minim de caractere din nume utilizator la o valoare mai mare decât cea a celui mai scurt nume utilizator." + min_username_length_range: "Nu poți seta minimum cu o valoare mai mare decât a maximului." + max_username_length_exists: "Nu poți seta numărul maxim de caractere pentru nume utilizator la o valoare mai mică decât a celui mai lung nume utilizator." + max_username_length_range: "Nu poți seta maximum cu o valoare mai mică decât a minimului." + default_categories_already_selected: "Nu poți selecta o categorie folosită într-o altă listă." + s3_upload_bucket_is_required: "Nu poți activa încărcările pe S3 dacă nu ai introdus 's3_upload_bucket'." bulk_invite: - file_should_be_csv: "Fișierul încărcat ar trebuii să fie de formatul csv sau txt." + file_should_be_csv: "Fișierul încărcat ar trebui să fie în format csv sau txt." backup: - operation_already_running: "O operație este în plină desfășurare. Nu puteți începe alta nouă." - backup_file_should_be_tar_gz: "Copia de siguranță ar trebui să fie arhivată cu extensia .tar.gz." - not_enough_space_on_disk: "Nu este suficient spațiu pe disc pentru a încărca această copie de siguranță." + operation_already_running: "O operație este în plină desfășurare. Nu poți începe alta nouă." + backup_file_should_be_tar_gz: "Fișierul backup ar trebui să fie arhivat cu extensia .tar.gz." + not_enough_space_on_disk: "Nu este suficient spațiu pe disc pentru a încărca backup." invalid_filename: "Numele fișierului backup conține caractere invalide. Caracterele valide sunt a-z 0-9 . - _." not_logged_in: "trebuie să fii autentificat pentru a executa această acțiune." - not_found: "Adresa URL sau resursă cerută nu pot fi găsite." - invalid_access: "Nu aveţi permisiunea să vedeţi această resursă." - read_only_mode_enabled: "Site-ul este în modul doar-citire. Interacțiunile sunt dezactivate." + not_found: "Adresa URL sau resursa necesară nu poate fi găsită." + invalid_access: "Nu ai permisiunea să vezi această resursă." + read_only_mode_enabled: "Site-ul este în modul exclusiv-citire. Interacțiunile sunt dezactivate." reading_time: "Durata citirii" likes: "Aprecieri" too_many_replies: one: "Ne pare rău, dar utilizatori noi sunt limitaţi la 1 răspuns pe discuţie." - few: "Ne pare rău, dar utilizatori noi sunt limitaţi la %{count} răspunsuri pe discuţie." - other: "Ne pare rău, dar utilizatori noi sunt limitaţi la %{count} răspunsuri pe discuţie." + few: "Ne pare rău, dar utilizatori noi sunt limitaţi la %{count} (de) răspunsuri pe discuţie." + other: "Ne pare rău, dar utilizatori noi sunt limitaţi la %{count} (de)răspunsuri pe discuţie." embed: - start_discussion: "Pornește Discuție" - continue: "Continuă Discuție" + start_discussion: "Pornește discuție" + continue: "Continuă discuție" more_replies: one: "Încă un răspuns" - few: "Încă %{count} răspunsuri" - other: "Încă %{count} răspunsuri" + few: "Încă %{count} (de) răspunsuri" + other: "Încă %{count} (de) răspunsuri" loading: "Încarcă discuția..." - permalink: "Adresă permanentă" + permalink: "Link permanent" imported_from: "Acesta este un subiect de discuție adăugat la discuția originală de la %{link}" in_reply_to: "▶ %{username}" replies: one: "Un răspuns" - few: "%{count} răspunsuri" - other: "%{count} de răspunsuri" - no_mentions_allowed: "Ne pare rău, nu puteți menționa alți utilizatori." + few: "%{count} (de) răspunsuri" + other: "%{count} (de) răspunsuri" + no_mentions_allowed: "Ne pare rău, nu poți menționa alți utilizatori." too_many_mentions: - one: "Ne pare rău, puteți menționa doar un utilizator într-o postare." - few: "Ne pare rău, puteți menționa doar %{count} utilizatori într-o postare." - other: "Ne pare rău, puteți menționa doar %{count} de utilizatori într-o postare." + one: "Ne pare rău, poți menționa doar un utilizator într-o postare." + few: "Ne pare rău, poți menționa doar %{count} (de) utilizatori într-o postare." + other: "Ne pare rău, poți menționa doar %{count} (de) utilizatori într-o postare." no_mentions_allowed_newuser: "Ne pare rău, noii utilizatori nu pot menționa alți utilizatori." too_many_mentions_newuser: one: "Ne pare rău, noii utilizatori pot menționa doar un utilizator într-o postare." - few: "Ne pare rău, noii utilizatori pot menționa doar %{count} utilizatori într-o postare." - other: "Ne pare rău, noii utilizatori pot menționa doar %{count} utilizatori într-o postare." - no_images_allowed: "Ne pare rău, nu puteți pune imagini în postări." + few: "Ne pare rău, noii utilizatori pot menționa doar %{count} (de) utilizatori într-o postare." + other: "Ne pare rău, noii utilizatori pot menționa doar %{count} (de) utilizatori într-o postare." + no_images_allowed: "Ne pare rău, nu poți pune imagini în postări." too_many_images: one: "Ne pare rău, noii utilizatori pot pune numai o imagine într-o postare." - few: "Ne pare rău, noii utilizatori pot pune numai %{count} imagini într-o postare." - other: "Ne pare rău, noii utilizatori pot pune numai %{count} imagini într-o postare." + few: "Ne pare rău, noii utilizatori pot pune numai %{count} (de) imagini într-o postare." + other: "Ne pare rău, noii utilizatori pot pune numai %{count} (de) imagini într-o postare." no_attachments_allowed: "Ne pare rău, noii utilizatori nu pot pune atașamente la postări." too_many_attachments: one: "Ne pare rău, noii utilizatori pot pune doar un atașament la o postare." - few: "Ne pare rău, noii utilizatori pot pune doar %{count} atașamente la o postare." - other: "Ne pare rău, noii utilizatori pot pune doar %{count} atașamente la o postare." + few: "Ne pare rău, noii utilizatori pot pune doar %{count} (de) atașamente la o postare." + other: "Ne pare rău, noii utilizatori pot pune doar %{count} (de) atașamente la o postare." no_links_allowed: "Ne pare rău, noii utilizatori nu pot pune link-uri în postări." too_many_links: one: "Ne pare rău, noii utilizatori pot pune doar un link într-o postare." - few: "Ne pare rău, noii utilizatori pot pune doar %{count} link-uri într-o postare." - other: "Ne pare rău, noii utilizatori pot pune doar %{count} link-uri într-o postare." + few: "Ne pare rău, noii utilizatori pot pune doar %{count} (de) link-uri într-o postare." + other: "Ne pare rău, noii utilizatori pot pune doar %{count} (de) link-uri într-o postare." spamming_host: "Nu poți adăuga un link pentru acest domeniu." user_is_suspended: "Utilizatorii suspendați nu au dreptul de a posta." - topic_not_found: "Ceva a mers greșit. Poate că acest subiect a fost închis sau șters în timp ce vă uitați la el?" + topic_not_found: "Ceva a n-a mers bine. Poate că acest subiect a fost închis sau șters în timp ce te uitai la el?" just_posted_that: "este prea similar cu ceea ce ați postat recent" invalid_characters: "conține caractere invalide" - is_invalid: "este invalid; încercați o descriere mai detaliată" + is_invalid: "este invalid; încearcă o descriere mai detaliată" next_page: "pagina următoare →" prev_page: "← pagina precedentă" page_num: "Pagina %{num}" home_title: "Acasă" - topics_in_category: "Discuții în categoria '%{category}'" + topics_in_category: "Subiecte în categoria '%{category}'" rss_posts_in_topic: "RSS din '%{topic}'" - rss_topics_in_category: "RSS de discuții din categoria '%{category}'" + rss_topics_in_category: "RSS de subiecte din categoria '%{category}'" author_wrote: "%{author} a scris:" - num_posts: "Postări:" + num_posts: "Mesaje:" num_participants: "Participanți:" - read_full_topic: "citește întreaga discuție" + read_full_topic: "Citește întregul subiect" private_message_abbrev: "Msg" rss_description: - latest: "Ultimele discuții" - hot: "Discuții interesante" + latest: "Ultimele subiecte" + hot: "Subiecte fierbinți" top: "Subiecte fierbinți" posts: "Ultimele postări" private_posts: "Ultimele mesaje private" @@ -195,18 +195,19 @@ ro: user_posts: "Ultimele postări ale lui @%{username}" user_topics: "Ultimele subiecte ale lui @%{username}" tag: "Subiecte etichetate" - too_late_to_edit: "Acea discuție a fost creată acum prea mult timp. Nu mai poate fi editată sau ștearsă." - revert_version_same: "Versiunea curenta este identică cu cea la care încercați să reveniți." + too_late_to_edit: "Acea postare a fost creată acum prea mult timp. Nu mai poate fi editată sau ștearsă." + revert_version_same: "Versiunea curenta este identică cu cea la care încerci să revii." excerpt_image: "imagine" queue: delete_reason: "Şters via coadă de moderare" groups: errors: - can_not_modify_automatic: "Nu puteți modifica un grup automat" + can_not_modify_automatic: "Nu poți modifica un grup automat" member_already_exist: "'%{username}' este deja membru al acestui grup" invalid_domain: "'%{domain}' nu este un domeniu valid." invalid_incoming_email: "'%{email}' nu este o adresa validă de email." email_already_used_in_group: "'%{email}' este deja folosit de grupul '%{group_name}'." + email_already_used_in_category: "%{email}' este deja folosit de categoria '%{category_name}'." default_names: everyone: "toată lumea" admins: "administratori" @@ -219,61 +220,61 @@ ro: trust_level_4: "nivel_de_încredere_4" education: until_posts: - one: "O postare" - few: "%{count} postări" - other: "%{count} de postări" + one: "o postare" + few: "%{count} (de) postări" + other: "%{count} (de) postări" new-topic: | - Bun venit pe %{site_name} — **mulțumim că ați început o nouă conversație!** + Bun venit pe %{site_name} — **îți mulțumim că ai început o nouă conversație!** - - Titlul sună interesant atunci când îl citiți cu voce tare? Rezumă el bine conținutul? + - Atunci când îl citești cu voce tare, titlul sună interesant ? Rezumă bine conținutul? - - Cine ar fi interesat de subiectul ăsta? De ce e el important? Ce fel de răspunsuri așteptați? + - Cine ar fi interesat de subiectul ăsta? De ce e el important? Ce fel de răspunsuri vrei? - - Includeți în subiect cuvinte folosite în mod obișnuit pentru a le da altora posibilitatea să îl *găsească*. Pentru a grupa subiectul dvs. laolaltă cu alte subiecte înrudite, selectați o anumită categorie. + - Include în subiect cuvinte folosite în mod obișnuit pentru a le da altora posibilitatea să îl *găsească*. Pentru a grupa subiectul tău laolaltă cu alte subiecte asemănătoare, alege o anumită categorie. - Pentru mai multe îndrumări, [citiți ghidul comunității](/guidelines). Această secțiune de pagină va apare doar pentru prima %{education_posts_text}. + Pentru mai multe îndrumări, [citește ghidul comunității](/guidelines). Această secțiune de pagină va apărea doar pentru prima/primele %{education_posts_text}. new-reply: | - Bine ai venit la %{site_name} — **Mulțumim pentru contribuție!** + Bine ai venit la %{site_name} — **îți mulțumim pentru contribuție!** - Răspunsul tău îmbunatațește discuția în vreun fel? - - Fii amabil cu membri comunității. + - Fii amabil cu membrii comunității. - - Critica constructivă e binevenită, criticați *ideea*, nu oamenii. + - Critica constructivă e binevenită, critică *ideea*, nu oamenii. Pentru detalii, [verifică regulile comune](/reguli). Acest panel va apărea doar pentru prima %{education_posts_text}. avatar: | - ### Ce părere aveți să adăugați o poză contului dvs.? + ### Ce părere ai să adaugi o poză contului tău? - Ați postat câteva subiecte și răspunsuri, dar poza dvs. de profil nu este tot atât de unică pe cât sunteți dvs. - e doar o literă. + Ai postat câteva subiecte și răspunsuri, dar poza ta de profil nu este tot atât de unică pe cât ești tu - e doar o simplă literă. - V-ați gândit să vă **[vizitați profilul utilizator](%{profile_path})** și să încărcați o poză care să vă reprezinte? + Te-ai gândit să îți **[vizitezi profilul utilizator](%{profile_path})** și să încarci o poză care să te reprezinte? - Când fiecare are o poză unică de profil, sunt mai ușor de urmărit discuțiile și de găsit oameni interesanți în conversații! + Subiectele sunt mai ușor de urmărit și oamenii interesanți sunt mai ușor de găsit atunci când fiecare are o poză unică de profil, în conversații! sequential_replies: | - ### Luați în considerare ideea de a răspunde la câteva postări simultan + ### Ia în considerare ideea de a răspunde la câteva postări simultan - În loc să răspundeți secvențial la un subiect, puteți să dați un singur răspuns care include citate din postări precedente sau referințe la @nume. + În loc să răspunzi secvențial la un subiect, poți să dai un singur răspuns care include citate din postări precedente sau referințe la @nume. - Vă puteți edita răspunsul precedent pentru a adăuga un citat, după cum urmează: selectați textul și apăsați butonul citează replica care apare. + Îți poți edita răspunsul precedent pentru a adăuga un citat, după cum urmează: selectează textul și - când apare - apasă butonul citează replica. - E mai ușor pentru toată lumea să citească subiectele care au răspunsuri mai puține și de substanță, decât pe cele formate dintr-o grămadă de răspunsuri individuale, micuțe. + E mai ușor pentru toată lumea să citească subiecte care au răspunsuri mai puține și de substanță, decât subiecte formate dintr-o grămadă de răspunsuri individuale, micuțe. dominating_topic: | ### Permite și altora să se alăture la conversație - Această discuție este importantă pentru tine și – Ai postat mai mult de %{percent}% din răspunsuri aici. + Acest subiect este important pentru tine și – Ai postat mai mult de %{percent}% din răspunsuri aici. - Ești sigur că dai destul timp și altora să-și exprime punctul de vedere? + Ești sigur că acorzi destul timp și altora ca să-și exprime punctul de vedere? too_many_replies: | - ### Ați atins limita maximă de răspunsuri pentru aceasta discuție + ### Ai atins limita maximă de răspunsuri pentru acest subiect - Ne pare rău, dar utilizatorii noi au un număr limitat de %{newuser_max_replies_per_topic} într-o discuție. + Ne pare rău, dar utilizatorii noi au un număr limitat de %{newuser_max_replies_per_topic} răspunsuri într-un subiect. - Nu adăugați un nou răspuns, încercați mai bine să editați un răspuns precedent, sau să vizitați o altă discuție. + Nu adăuga un nou răspuns, încearcă mai bine să editezi un răspuns precedent, sau să vizitează o altă discuție. reviving_old_topic: | - ### Reînvie această discuție? + ### Reînvie acest subiect? - Ultimul răspuns la această discuție a fost dat acum %{days} de zile. Toată lumea ce a fost implicată în discuție va fi notificată iar discuția va fi ajunge pe prima pagină. + Ultimul răspuns la acest subiect a fost dat acum %{days} de zile. Răspunsul tău va promova subiectul în vârful listei și va notifica pe toată lumea ce a fost implicată anterior în conversație. Ești sigur că dorești să continui această conversație? activerecord: @@ -285,7 +286,7 @@ ro: post: raw: "Corp" user_profile: - bio_raw: "Despre Mine" + bio_raw: "Despre mine" errors: models: topic: @@ -293,14 +294,14 @@ ro: base: warning_requires_pm: "Puteţi ataşa avertizări doar la mesajele private." too_many_users: "Puteţi trimite avertizări la un singur utilizator odată." - cant_send_pm: "Ne pare rău, nu puteți trimite un mesaj privat acelui utilizator." + cant_send_pm: "Ne pare rău, nu poți trimite un mesaj privat acestui utilizator." no_user_selected: "Trebuie selectat un nume de utilizator valid." user: attributes: password: - common: "Este una din 10.000 cele mai cunoscute parole. Folosiți vă rugăm o parolă mai sigură." - same_as_username: "este identic cu nume_utilizator. Vă rugăm să folosiți o parolă mai sigură." - same_as_email: "este identic cu emailul. Vă rugăm să folosiți o parolă mai sigură." + common: "este una din cele mai cunoscute 10.000 de parole. Te rugăm să folosești o parolă mai sigură." + same_as_username: "este identic cu nume utilizator. Te rugăm să folosești o parolă mai sigură." + same_as_email: "este identic cu emailul. Te rugăm să folosești o parolă mai sigură." same_as_current: "este identică cu parola curentă." ip_address: signup_not_allowed: "Înscrierea de pe acest cont nu este permisă." @@ -314,147 +315,149 @@ ro: web_hook: attributes: payload_url: - invalid: "URL-ul este invalid. URL-ul trebuie să includă http:// sau https://. Și caracterul spațiu nu este permis." + invalid: "URL-ul este invalid. URL-ul trebuie să includă http:// sau https:// , iar caracterul spațiu nu este permis." <<: *errors user_profile: - no_info_me: "
câmpul despre mine din profilul dvs este gol momentan, Doriți să-l completați?
" - no_info_other: "
%{name} nu a introdus înca nimic în câmpul despre mine din profil
" - vip_category_name: "Lounge" + no_info_me: "
câmpul Despre mine din profilul tau este momentan gol. Dorești să-l completezi?
" + no_info_other: "
%{name} încă nu a introdus nimic în câmpul Despre mine din profilul său
" + vip_category_name: "Sufragerie" vip_category_description: "O categorie dedicată exclusiv celor cu nivelul de încredere 3 sau mai mare" - meta_category_name: "Feedback Site" - meta_category_description: "Discuții despre acest forum, organizare, funcționare și cum îl putem îmbunătății." - staff_category_name: "Personalul" - staff_category_description: "Categorie privată pentru discuțiile personalului. Discuțiile sunt vizibile doar adminilor și moderatorilor." - assets_topic_body: "Aceasta e o discuție permanentă, vizibilă doar pentru admini și personal, pentru stocat imaginile folosite la designul forumului. Vă rugăm nu ștergeți!\n\n\nIată cum:\n\n\n1. Răspunde la această discuție.\n2. Încărcați toate imaginile dorite pentru logouri , iconițe și așa mai departe. (Folosiți iconița de încarcare din bara editorului de discuție, sau trageți și aruncați sau lipiți imaginile.)\n3. Aprobați răspunsul pentru a-l posta.\n4. Click dreapta pe imaginile din noua postare pt a ajunge la sursa imaginii încărcate, sau click icoana de editare pt a edita postarea și a obține calea la imagini. Copiază adrsa imaginii.\n5. Lipiți imaginile acelea în [Setări principale](/admin/site_settings/category/required).\n\n\n și dacă doriți să activați diferite feluri de fișiere încărcate, editați `extensii_autorizate` în secțiunea [setări fișiere](/admin/site_settings/category/files)." + meta_category_name: "Feedback la site" + meta_category_description: "Discuții despre acest forum, organizare, funcționare și cum îl putem îmbunătăți." + staff_category_name: "Echipa" + staff_category_description: "Categorie privată pentru discuțiile personalului. Subiectele sunt vizibile numai pentru admini și moderatori." + assets_topic_body: "Acesta este un subiect permanent, vizibil doar pentru admini și echipă, care are ca scop stocarea imaginilor și fișierelor folosite la designul forumului. Nu îl șterge!\n\n\nIată cum se lucrează:\n\n\n1. Răspunde la acest subiect.\n2. Încărcă aici toate imaginile dorite pentru logouri , iconițe și așa mai departe. (Folosește iconița de încărcare din bara editorului de discuție, folosește drag-and-drop sau lipește imaginile.)\n3. Aprobă răspunsul pentru a-l posta.\n4. Click dreapta pe imaginile din noua postare pentru a obține calea spre imaginile încărcate, sau click icoana de editare pentru a edita postarea și a obține calea către imagini. Copiază calea imaginii.\n5. Lipește calea imaginii în [Setări principale](/admin/site_settings/category/required).\n\n\nDacă dorești să activezi încărcarea unor tipuri multiple de fișiere, editează `extensii_autorizate` în secțiunea [setări fișiere](/admin/site_settings/category/files)." lounge_welcome: - title: "Bine ați venit în Lounge" + title: "Bine ai venit în sufragerie" body: |2 - Congratulations! :confetti_ball: + Felicitări! :confetti_ball: - Dacă poți vedea această discuție, ai fost promovat recent la [nivel de încredere 3 (lider)][încredere]. + Dacă poți vedea acest subiect, ai fost promovat recent la **clientul casei** (nivel de încredere 3). - > Liderii sunt cei mai activi contribuitori. Ei dau un exemplu pozitiv comunității prin acțiunile și postările lor. + Acum poți să … - Acum poți să … + * Editezi titlul oricărui subiect + * Schimbi categoria oricărui subiect + * Setezi ca toate link-urile tale să fie urmărite ([automatic nofollow](http://en.wikipedia.org/wiki/Nofollow) este dezactivat) + * Accesezi secțiunea privată din categoria Sufragerie unde au acces numai utilizatorii de nivel 3 sau mai mare + * Ascunzi spam-ul folosind un singur marcaj de avertizare - * Editează titlul oricărei discuții - * Schimbă categoria oricărei discuții - * Toate adresele tale sunt urmărite ([automatic nofollow](http://en.wikipedia.org/wiki/Nofollow) este dezactivat) - * Accesul permis la secțiunea privată din Lounge unde au acces numai utilizatorii de nivel 3 sau mai mare + Aici este [lista colegilor utilizatori ce au ajuns la nivelul de încredere 3](/badges/3/regular). Salută-i! - Aici este [lista utilizatorilor ce au ajuns la nivelul de încredere 3](/insigne/3/lider). Salută-i! + Îți mulțumim că ești o parte importantă a acestei comunități! - Mulțumim că ești o parte importantă a acestei comunități! - - (Pentru mai multe informații despre nivelele de încredere, [vedeți discuția aceasta][încredere]. Luați aminte că doar membrii ce împlinesc criteriile rămân la nivelul de încredere 3. ) + (Pentru mai multe informații cu privire la nivelurile de încredere, [vezi subiectul ăsta][încredere]. Luați aminte că doar membrii ce continuă să îndeplinească criteriile pe tot parcursul, vor rămâne la nivelul de încredere 3.) [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 category: topic_prefix: "Despre categoria %{category}" + replace_paragraph: "(Înlocuiește acest prim paragraf cu o scurtă descriere a noii tale categorii. Acest îndreptar va apărea în zona de selecție a categoriei, asa că încercă să îl limitezi sub 200 de caractere. **Această categorie nu va apărea în pagina categoriilor până ce nu editezi această descriere sau până ce nu creezi subiecte**)" + post_template: "%{replace_paragraph}\n\nFolosește următoarele paragrafe pentru a scrie o descriere mai lungă sau pentru a seta regulile ori îndreptarul categoriei:\n\n- De ce să folosească lumea această categorie? Care e destinația ei?\n\n- Cum anume e ea diferită de alte categorii pe care le avem deja?\n\n- Care ce ar trebui să conțină, în general, subiectele din această categorie?\n\n- Chiar avem nevoie de aceasta categorie? N-am putea-o combina cu o altă categorie sau subcategorie deja existentă?\n" errors: - uncategorized_parent: "ce nu este categorisit nu poate avea categorie părinte" - self_parent: "Părintele unei subcategorii nu poate fi ea însăși" - depth: "Nu poți așeza o subcategorie sub o altă" + uncategorized_parent: "Necategorizate nu pot avea categorie părinte" + self_parent: "O subcategorie nu poate fi propriul ei părinte" + depth: "Nu poți îngloba o subcategorie într-alta." invalid_email_in: "'%{email}' nu este o adresă validă de email." email_already_used_in_group: "'%{email}' este deja folosit de grupul '%{group_name}'." email_already_used_in_category: "'%{email}' este deja folosit de categoria '%{category_name}'." cannot_delete: - uncategorized: "Nu pot șterge ceva necategorisit" + uncategorized: "Nu pot șterge Necategorizat" has_subcategories: "Nu putem șterge categoria aceasta pentru că are sub-categorii." topic_exists: one: "Nu putem șterge categoria aceasta pentru că are un subiect. Cel mai vechi subiect este %{topic_link}." - few: "Nu putem șterge categoria aceasta pentru că are %{count} subiecte. Cel mai vechi subiect este %{topic_link}." - other: "Nu putem șterge categoria aceasta pentru că are %{count} subiecte. Cel mai vechi subiect este %{topic_link}." - topic_exists_no_oldest: "Nu pot șterge categoria fiindcă numărul discuțiilor este de %{count}." + few: "Nu putem șterge categoria aceasta pentru că are %{count} (de) subiecte. Cel mai vechi subiect este %{topic_link}." + other: "Nu poți șterge categoria aceasta pentru că are %{count} subiecte. Cel mai vechi subiect este %{topic_link}." + topic_exists_no_oldest: "Nu poți șterge categoria fiindcă numărul subiectelor este de %{count}." uncategorized_description: "Subiecte care nu au nevoie de o categorie, sau care nu se potrivesc în nicio categorie deja existentă." trust_levels: newuser: title: "utilizator nou" basic: - title: "utilizator de bază" + title: "utilizator simplu" member: title: "membru" regular: - title: "obișnuit" + title: "clientul casei" leader: title: "lider" - change_failed_explanation: "Ați încercat să retrogradați utilizatorul %{user_name} la nivelul '%{new_trust_level}'. Totuși nivelul este deja '%{current_trust_level}'. %{user_name} va rămâne la '%{current_trust_level}'" + change_failed_explanation: "Ai încercat să retrogradezi utilizatorul %{user_name} la nivelul '%{new_trust_level}'. Însă nivelul este deja '%{current_trust_level}'. %{user_name} va rămâne la '%{current_trust_level}' - dacă dorești să retrogradezi utilizatorul, trebuie să îi blochezi întăi nivelul de încredere." rate_limiter: - slow_down: "Ați executat această acțiune de prea multe ori. Încercați mai târziu." - too_many_requests: "Există o limită zilnică de executare a acelei acțiuni. Vă rugăm așteptați %{time_left} până încercați iar." + slow_down: "Ai executat această acțiune de prea multe ori. Încearcă mai târziu." + too_many_requests: "Există o limită zilnică de executare a acelei acțiuni. Te rugăm așteptă %{time_left} până să încerci iar." by_type: - first_day_replies_per_day: "Ați atins numărul maxim de răspunsuri pe care un nou utilizator le poate crea în prima sa zi. Vă rugăm să așteptați %{time_left} înainte să încercați din nou." - create_topic: "Ați atins numărul maxim de subiecte. Vă rugăm să așteptați %{time_left} înainte să încercați din nou." - create_post: "Răspundeți prea rapid. Vă rugăm să așteptați %{time_left} înainte să încercați din nou." - delete_post: "Ștergeți postările prea rapid. Vă rugăm să așteptați %{time_left} înainte să încercați din nou." - topics_per_day: "Ați atins numărul maxim de subiecte noi pe ziua de azi. Vă rugăm să așteptați %{time_left} înainte să încercați din nou." - pms_per_day: "Ați atins numărul maxim de mesaje pe ziua de azi. Vă rugăm să așteptați %{time_left} înainte să încercați din nou." - create_like: "Ați atins numărul maxim de like-uri pe ziua de azi. Vă rugăm să așteptați %{time_left} înainte să încercați din nou." - create_bookmark: "Ați atins numărul maxim de semne de carte pe ziua de azi. Vă rugăm să așteptați %{time_left} înainte să încercați din nou." - edit_post: "Ați atins numărul maxim de editări pe ziua de azi. Vă rugăm să așteptați %{time_left} înainte să încercați din nou." - live_post_counts: "Cereți contorizarea live a numărului de posturi prea rapid. Vă rugăm să așteptați %{time_left} înainte să încercați din nou." - unsubscribe_via_email: "Ați atins numărul maxim de dezabonări prin email pe ziua de azi. Vă rugăm să așteptați %{time_left} înainte să încercați din nou." - topic_invitations_per_day: "Ați atins numărul maxim de invitații la subiecte pe ziua de azi. Vă rugăm să așteptați %{time_left} înainte să încercați din nou." + first_day_replies_per_day: "Ai atins numărul maxim de răspunsuri pe care un nou utilizator le poate crea în prima sa zi. Te rugăm să aștepți %{time_left} înainte să încerci din nou." + first_day_topics_per_day: "Ai atins numărul maxim de subiecte pe care un nou utilizator poate să le creeze în prima sa zi. Te rugăm să aștepți %{time_left} înainte să încerci din nou." + create_topic: "Ai atins numărul maxim de subiecte. Te rugăm să aștepți %{time_left} înainte să încerci din nou." + create_post: "Răspunzi prea rapid. Te rugăm să aștepți %{time_left} înainte să încerci din nou." + delete_post: "Ștergi postările prea rapid. Te rugăm să aștepți %{time_left} înainte să încerci din nou." + topics_per_day: "Ai atins numărul maxim de subiecte noi pe ziua de azi. Te rugăm să aștepți %{time_left} înainte să încerci din nou." + pms_per_day: "Ai atins numărul maxim de mesaje pe ziua de azi. Te rugăm să aștepți %{time_left} înainte să încerci din nou." + create_like: "Ai atins numărul maxim de aprecierii pe ziua de azi. Te rugăm să aștepți %{time_left} înainte să încerci din nou." + create_bookmark: "Ai atins numărul maxim de semne de carte pe ziua de azi. Te rugăm să aștepți %{time_left} înainte să încerci din nou." + edit_post: "Ai atins numărul maxim de editări pe ziua de azi. . Te rugăm să aștepți %{time_left} înainte să încerci din nou." + live_post_counts: "Ceri prea rapid contorizarea live a numărului de postări. Te rugăm să aștepți %{time_left} înainte să încerci din nou." + unsubscribe_via_email: "Ai atins numărul maxim de dezabonări prin email pe ziua de azi. Te rugăm să aștepți %{time_left} înainte să încerci din nou." + topic_invitations_per_day: "Ai atins numărul maxim de invitații la subiecte pe ziua de azi. Te rugăm să aștepți %{time_left} înainte să încerci din nou." hours: - one: "1 oră" - few: "%{count} ore" - other: "%{count} ore" + one: "o oră" + few: "%{count} (de) ore" + other: "%{count} (de) ore" minutes: - one: "1 minut" - few: "%{count} minute" - other: "%{count} minute" + one: "un minut" + few: "%{count} (de) minute" + other: "%{count} (de) minute" seconds: - one: "1 secundă" - few: "%{count} secunde" - other: "%{count} secunde" + one: "o secundă" + few: "%{count} (de) secunde" + other: "%{count} (de) secunde" datetime: distance_in_words: - half_a_minute: "< 1m" + half_a_minute: "de < 1m" less_than_x_seconds: - one: "< 1s" - few: "< %{count}s" - other: "< %{count}s" + one: "de < 1s" + few: "de < %{count}s" + other: "de < %{count}s" x_seconds: - one: "1s" - few: "%{count}s" - other: "%{count}s" + one: "de 1s" + few: "de %{count}s" + other: "de %{count}s" less_than_x_minutes: - one: "< 1m" - few: "< %{count}m" - other: "< %{count}m" + one: "de < 1m" + few: "de < %{count}m" + other: "de < %{count}m" x_minutes: - one: "1m" - few: "%{count}m" - other: "%{count}m" + one: "de 1m" + few: "de %{count}m" + other: "de %{count}m" about_x_hours: - one: "1h" - few: "%{count}h" - other: "%{count}h" + one: "de 1h" + few: "de %{count}h" + other: "de %{count}h" x_days: - one: "1z" - few: "%{count}z" - other: "%{count}z" + one: "de 1z" + few: "de %{count}z" + other: "de %{count}z" about_x_months: - one: "1lună" - few: "%{count}luni" - other: "%{count}luni" + one: "de o lună" + few: "de %{count} (de) luni" + other: "d e%{count} (de) luni" x_months: - one: "1lună" - few: "%{count}luni" - other: "%{count}luni" + one: "de o lună" + few: "de %{count}luni" + other: "de %{count}luni" about_x_years: - one: "%{count}an" - few: "%{count}ani" - other: "%{count}ani" + one: "de %{count}an" + few: "de %{count}ani" + other: "de %{count}ani" over_x_years: - one: "> 1an" - few: "> %{count}ani" - other: "> %{count}ani" + one: "de > 1an" + few: "de > %{count}ani" + other: "de > %{count}ani" almost_x_years: - one: "1an" - few: "%{count}ani" - other: "%{count}ani" + one: "de un an" + few: "de %{count} (de) ani" + other: "de %{count} (de) ani" distance_in_words_verbose: half_a_minute: "chiar acum" less_than_x_seconds: @@ -462,90 +465,106 @@ ro: few: "chiar acum" other: "chiar acum" x_seconds: - one: "1 secundă în urmă" - few: "%{count} secunde în urmă" - other: "%{count} secunde în urmă" + one: "cu o secundă în urmă" + few: "cu %{count} (de) secunde în urmă" + other: "cu %{count} (de) secunde în urmă" less_than_x_minutes: - one: "mai puţin de 1 minut în urmă" - few: "mai puţin de %{count} minute în urmă" - other: "mai puţin de %{count} minute în urmă" + one: "cu mai puţin de 1 minut în urmă" + few: "cu mai puţin de %{count} (de) minute în urmă" + other: "mai puţin de %{count} (de) minute în urmă" x_minutes: - one: "acum 1 minut" - few: "acum %{count} minute" - other: "acum %{count} minute" + one: "acum un minut" + few: "acum %{count} (de) minute" + other: "acum %{count} (de) minute" about_x_hours: one: "acum o ora" - few: "acum %{count} ore" - other: "acum %{count} ore" + few: "acum %{count} (de) ore" + other: "acum %{count} (de) ore" x_days: one: "acum o zi" - few: "acum %{count} zile" - other: "acum %{count} zile" + few: "acum %{count} (de) zile" + other: "acum %{count} (de) zile" about_x_months: - one: "aproape o lună în urmă" - few: "aproape %{count} luni în urmă" - other: "aproape %{count} luni în urmă" + one: "cu aproape o lună în urmă" + few: "cu aproape %{count} (de) luni în urmă" + other: "cu aproape %{count} (de) luni în urmă" x_months: - one: "o lună în urmă" - few: "%{count} luni în urmă" - other: "%{count} luni în urmă" + one: "acum o lună" + few: "acum %{count} (de) luni" + other: "acum %{count} (de) luni" about_x_years: - one: "aproape un an în urmă" - few: "aproape %{count} ani în urmă" - other: "aproape %{count} ani în urmă" + one: "cu aproape un an în urmă" + few: "cu aproape %{count} (de) ani în urmă" + other: "cu aproape %{count} (de) ani în urmă" over_x_years: - one: "peste un an în urmă" - few: "peste %{count} ani în urmă" - other: "peste %{count} ani în urmă" + one: "cu peste un an în urmă" + few: "cu peste %{count} (de) ani în urmă" + other: "cu peste %{count} (de) ani în urmă" almost_x_years: - one: "aproape un an în urmă" - few: "aproape %{count} ani în urmă" - other: "aproape %{count} ani în urmă" + one: "cu aproape un an în urmă" + few: "cu aproape %{count} (de) ani în urmă" + other: "cu aproape %{count} (de) ani în urmă" password_reset: - choose_new: "Alegeți o parolă nouă" - choose: "Alegeți o parolă" - update: 'Actualizați parola' - save: 'Fixează parola' - title: 'Resetează Parola' + no_token: "Ne pare rău, dar link-ul de schimbare a parolei este prea vechi. Selectează butonul Înregistrare și folosește 'Mi-am uitat parola' pentru a obține un nou link." + choose_new: "Alege o parolă nouă" + choose: "Alege o parolă" + update: 'Actualizează parola' + save: 'Setează parola' + title: 'Resetează parola' success: "Ți-ai schimbat cu succes parola și acum ești autentificat." success_unapproved: "Ți-ai schimbat cu succes parola." - continue: "Continuă cu %{site_name}" + continue: "Continuă spre %{site_name}" change_email: - confirmed: "Emailul tău s-a reactualizat." - please_continue: "Continuă cu %{site_name}" - error: "S-a semnalat o eroare la schimbarea adresei de Email. Poate adresa deja e folosită?" + confirmed: "Emailul tău a fost actualizat." + please_continue: "Continuă la %{site_name}" + error: "A apărut o eroare la schimbarea adresei de email. Poate adresa deja e folosită?" + error_staged: "A apărut o eroare la schimbarea adresei tale de email. Adresa este deja folosită de un utilizator în așteptare." + already_done: "Ne pare rău, dar acest link de confirmare nu mai este valid. Poate că emailul tău a fost deja schimbat?" + authorizing_old: + title: "Îți mulțumim că ne-ai confirmat noua ta adresă de email." + description: "Acum îți un email la noua ta adresă, pentru confirmare." activation: - already_done: "Ne pare rău, această adresă pentru confirmarea contului nu mai este valabilă. Poate contul dvs este deja activ?" - please_continue: "Contul este confirmat. Vei fi redirectat spre prima pagină." - continue_button: "Continuă cu %{site_name}" - welcome_to: "Bine ați venit la %{site_name}!" - approval_required: "Un moderator trebuie să aprobe manual contul înaine să puteți accesa forumul. Vei primi un email când acesta a fost aprobat!" + action: "Click aici pentru a-ți activa contul" + already_done: "Ne pare rău, această adresă pentru confirmarea contului nu mai este valabilă. Poate contul tău este deja activ?" + please_continue: "Contul este confirmat. Vei fi redirecționat spre pagina principală." + continue_button: "Continuă pe %{site_name}" + welcome_to: "Bine ai venit pe %{site_name}!" + approval_required: "Un moderator trebuie să aprobe manual contul înainte să poți accesa forumul. Vei primi un email imediat ce contul ți-a fost aprobat!" + missing_session: "Nu putem detecta dacă contul tău a fost deja creat. Te rugăm să verifici că ai cookie-urile activate. " post_action_types: off_topic: - title: 'În afară discuției' - description: 'Această postare este total în afara discuției în curenta discuție și probabil ar trebui mutată. Dacă aceasta e o discuție, poate că nu aparține aici.' - long_form: 'marcat ca în afara discuției' + title: 'În afara subiectului' + description: 'Această postare nu este relevantă în contextul discuției așa cum este definită prin titlu și prin prima postare din subiect, așa că probabil ar trebui mutată în altă parte.' + long_form: 'marcat cu marcaj de avertizare ca fiind în afara subiectului' spam: title: 'Spam' - description: 'Această postare este o reclamă. Nu este folositoare sau relevantă în discuția curentă, doar de natură promoțională.' - long_form: 'marchează aceasta ca spam' + description: 'Această postare este o reclamă. Nu este folositoare sau relevantă în subiectul curent, ci are o natură promoțională.' + long_form: 'marchează ca spam' + email_title: '"%{title}" a fost marcat cu marcaj de avertizare spam' + email_body: "%{link}\n\n%{message}" inappropriate: title: 'Necorespunzător' - description: 'Această postare are conținut ce ar putea fi considerat drept ofesator, abuziv, sau o violare a regulilor comune.' + description: 'Această postare are un conținut pe care o persoană rezonabilă l-ar putea considera drept ofensator, abuziv, sau o violare a ghidului comunității.' long_form: 'marcat ca necorespunzător' notify_user: - email_title: 'Despre postarea dvs din "%{title}"' + title: 'Trimite-i un mesaj lui @{{username}}' + description: 'Vreau să îi vorbesc direct și în mod privat acestei persoane cu privire la postarea sa.' + long_form: 'utilizator căruia i-a fost trimis mesaj' + email_title: 'Postarea ta din "%{title}"' email_body: "%{link}\n\n%{message}" notify_moderators: - title: "Notifică moderatorii" + title: "Altceva" + description: 'Această postare necesită atenția echipei pentru un motiv diferit ce nu este menționat anterior.' + long_form: 'marcat cu mesaj de avertizare necesitând atenția echipei' + email_title: 'O postare din "%{title}" necesită atenția echipei' email_body: "%{link}\n\n%{message}" bookmark: title: 'Semn de carte' description: 'Adaugă postarea la semne de carte' long_form: 'postarea a fost adăugată la semne de carte' like: - title: 'Apreciează' - description: 'Apreciează această postare' + title: 'Apreciere' + description: 'Apreciază această postare' long_form: 'a apreciat asta' vote: title: 'Votează' @@ -554,54 +573,69 @@ ro: topic_flag_types: spam: title: 'Spam' - description: 'Această discuție este o reclamă. Nu este folositoare site-ului și nici relevantă, doar de natură promoțională.' - long_form: 'Marchează asta ca spam' + description: 'Acest subiect este o reclamă. Nu este folositor site-ului și nici relevant, este doar ceva de natură promoțională.' + long_form: 'Marchează ca spam' inappropriate: title: 'Necorespunzător' - description: 'Această discuție are conținut ce ar putea fi considerat drept ofesantor, abuziv, sau o violare a regulilor comune.' - long_form: 'marcat ca necorespunzător' + description: 'Acest subiect are conținut ce ar putea fi considerat drept ofensator, abuziv, sau o violare a regulilor comunității.' + long_form: 'marcat cu marcaj de avertizare ca inadecvat' notify_moderators: - title: "Notifică moderatori" - long_form: 'moderatori notificați' - email_title: 'discuția "%{title}" necesită atenția moderatorilor' + title: "Alt motiv" + description: 'Acest subiect necesită atenția generală a echipei pe baza ghidului, CGU, sau pentru un alt motiv care nu este menționat anterior.' + long_form: 'marcat cu marcaj de avertizare în atenția moderatorilor' + email_title: 'Subiectul "%{title}" necesită atenția moderatorilor' email_body: "%{link}\n\n%{message}" flagging: - user_must_edit: '

Conținutul marcat ascuns temporar.

' + you_must_edit: '

Postarea ta a fost marcată cu marcaj de avertizare de către comunitate. Te rugăm să verifici mesajele.

' + user_must_edit: '

Această postare a fost marcată de către comunitate cu marcaj de avertizare și a fost ascuns temporar.

' archetypes: regular: - title: "Discuție normală" + title: "Subiect obișnuit" banner: - title: "Subiect Banner" + title: "Subiect banner" message: - make: "Această discuție este de acum o discuție cu stindard. Va apărea în capătul fiecărei ferestre până când va fi înlăturată de către utilizator." - remove: "Această discuție nu mai este una cu stindard. Nu va mai apărea în capătul fiecărei pagini." + make: "Acest subiect este de acum un banner. Va apărea în capătul fiecărei pagini până când opțiunea va fi anulată de către utilizator." + remove: "Acest subiect nu mai este un banner. Nu va mai apărea în capătul fiecărei pagini." unsubscribed: - title: "V-ați dezabonat!" + title: "Te-ai dezabonat!" + description: "Te-ai dezabonat. Pentru a-ți schimba adresa de email vizitează preferințe utilizator." + topic_description: "Pentru a te reabona la %{link}, folosețte controlul de notificări din partea de dreaptă-jos a subiectului" unsubscribe: title: "Dezabonare" - disable_digest_emails: "Nu îmi mai trimite emailuri rezumat" + stop_watching_topic: "Încează să urmăești activ acest subiect, %{link}" + mute_topic: "Setează pe silențios toate notificările cu privire la acest subiect, %{link}" + unwatch_category: "Încează să urmărești activ toate subiectele din categoria %{category}" + mailing_list_mode: "Dezactivează modul mailing list" + disable_digest_emails: "Nu îmi mai trimite emailuri-rezumat" all: "Nu îmi trimite nici un mail de la %{sitename}" + different_user_description: "Pe moment, ești înregistrat cu un utilizator diferit de cel căruia i-am trimis email. Te rugăm sa ieși sau să intri în modul anonim, și apoi să încerci din nou." + not_found_description: "Ne pare rău, nu am putut găsi acest link de dezabonare. Poate că linkul de dezabonare pe care l-ai primit pe email a expirat?" log_out: "Ieșire" user_api_key: - title: "Autorizați accesul aplicației" - authorize: "Autorizați" + title: "Autorizează accesul aplicației" + authorize: "Autorizează" read: "citire" read_write: "citire/scriere" + description: "Dorești să îi acorzi aplicației \"%{application_name}\" %{access} acces la contul tău?" + no_trust_level: "Ne pare rău, nu ai nivelul de încredere necesar pentru a accesa API utilizator" + generic_error: "Ne pare rău, nu putem să emitem chei API utilizator: această funcționalitate este probabil dezactivată din administrarea site-ului" reports: visits: title: "Vizite de utilizatori" xaxis: "Zi" yaxis: "Număr de vizite" signups: - title: "Utilizatori Noi" + title: "Utilizatori noi" xaxis: "Zi" yaxis: "Număr de noi utilizatori" profile_views: + title: "Vizualizări profil utilizator" xaxis: "Zi" + yaxis: "Număr de profiluri utilizator vizualizate" topics: - title: "Discuții" + title: "Subiecte" xaxis: "Zi" - yaxis: "Număr de discuții noi" + yaxis: "Număr de subiecte noi" posts: title: "Postări" xaxis: "Zi" @@ -611,34 +645,35 @@ ro: xaxis: "Zi" yaxis: "Număr de aprecieri noi" flags: - title: "Marcaje" + title: "Marcaje de avertizare" xaxis: "Zi" - yaxis: "Număr de maraje" + yaxis: "Număr de marcaje de avertizare" bookmarks: title: "Semne de carte" xaxis: "Zi" - yaxis: "Număr de semne de carte" + yaxis: "Număr de semne de carte noi" starred: - title: "Participări" + title: "Marcat cu steluță" xaxis: "Zi" - yaxis: "Număr de noi participări" + yaxis: "Număr de subiecte noi marcate cu steluță" users_by_trust_level: title: "Utilizatori pe nivel de încredre" xaxis: "Nivel de încredere" - yaxis: "Număr de utilizator" + yaxis: "Număr de utilizatori" emails: title: "Emailuri trimise" xaxis: "Zi" - yaxis: "Numărul de Emailuri" + yaxis: "Numărul de emailuri" user_to_user_private_messages: title: "De la utilizator la utilizator" xaxis: "Zi" + yaxis: "Număr de mesaje" system_private_messages: title: "Sistem" xaxis: "Zi" yaxis: "Număr de mesaje" moderator_warning_private_messages: - title: "Avertismente moderatori" + title: "Avertizează moderatori" xaxis: "Zi" yaxis: "Număr de mesaje" notify_moderators_private_messages: @@ -650,42 +685,52 @@ ro: xaxis: "Zi" yaxis: "Număr de mesaje" top_referrers: - title: "Top refernințe" + title: "Top referenți" xaxis: "Utilizatori" num_clicks: "Click-uri" - num_topics: "Discuții" + num_topics: "Subiecte" top_traffic_sources: title: "Top surse de trafic" xaxis: "Domeniu" num_clicks: "Click-uri" - num_topics: "Discuții" + num_topics: "Subiecte" num_users: "Utilizatori" top_referred_topics: - title: "Top referințe discuții" - xaxis: "Discuție" + title: "Top subiecte la care se face referire" + xaxis: "Subiect" num_clicks: "Click-uri" page_view_anon_reqs: - title: "Anonim" + title: "Anonimi" xaxis: "Zi" + yaxis: "Vizualizări de pagină anonime " page_view_logged_in_reqs: - title: "Autentificat" + title: "Autentificați" xaxis: "Zi" + yaxis: "Vizualizări de pagină înregistrate" page_view_crawler_reqs: + title: "Roboți web" xaxis: "Zi" + yaxis: "Vizualizări de pagină făcute de roboți web" page_view_total_reqs: title: "Total" xaxis: "Zi" + yaxis: "Total vizualizări de pagină" page_view_logged_in_mobile_reqs: + title: "Vizualizări de pagină înregistrate " xaxis: "Zi" + yaxis: "Vizualizări de pagină înregistrate de pe mobil" page_view_anon_mobile_reqs: + title: "Vizualizări de pagină anonime" xaxis: "Zi" + yaxis: "Vizualizări de pagină anonime de pe mobil" http_background_reqs: title: "Fundal" xaxis: "Zi" + yaxis: "Interogări folosite pentru actualizare în timp real și urmărire." http_2xx_reqs: title: "Status 2xx (OK)" xaxis: "Zi" - yaxis: "Cereri cu succes (Status 2xx)" + yaxis: "Cerei cu succes (Status 2xx)" http_3xx_reqs: title: "HTTP 3xx (Redirectare)" xaxis: "Zi" @@ -695,273 +740,702 @@ ro: xaxis: "Zi" yaxis: "Erori Client (Status 4xx)" http_5xx_reqs: + title: "HTTP 5xx (Eroare server)" xaxis: "Zi" + yaxis: "Erori server (Status 5xx)" http_total_reqs: title: "Total" xaxis: "Zi" yaxis: "Total cereri" time_to_first_response: + title: "Timpul până la primul răspuns" xaxis: "Zi" yaxis: "Timp mediu (ore)" topics_with_no_response: + title: "Subiecte fără răspuns" xaxis: "Zi" yaxis: "Total" mobile_visits: + title: "Vizite utilizator" xaxis: "Zi" yaxis: "Număr de vizite" dashboard: rails_env_warning: "Serverul funcționează în modul %{env}." - host_names_warning: "Fișierul config/database.yml folosește din oficiu numele gazdei locale. Reactualizați pt a folosii numele de gazdă al site-ului." - gc_warning: 'Serverul dvs funcționează pe parametrii de colecție de gunoi ruby, ceea ce nu oferă cea mai bună performanță. Citiți această discuție despre setările performanței: Modificarea Ruby și Rails pentru Discourse.' - sidekiq_warning: 'Sidekiq nu este pornit. Multe acțiuni, cum ar fi trimiterea de emailuri, sunt executate în nesincronizare de către sidekiq. Asigurați-vă că măcar un porces din sidekiq este pornit. Învață despre Sidekiq aici.' - memory_warning: 'Serverul dvs lucrează cu mai puțin de 1 gb memorie. Cel puțin 1 GB memorie e recomandat.' - google_oauth2_config_warning: 'Serverul e configurat să permită logarea cu Google OAuth2 (enable_google_oauth2_logins), dar valorile secrete ale clientului precum și id-ul clientului nu sunt setate. Mergeți la Setările siteului și modificați setările. Vizualizați ghidul pentru mai multe informații.' - facebook_config_warning: 'Serverul e configurat să permită autentificarea și logarea cu Facebook (enable_facebook_logins), dar id-ul app și valoarea app secretă nu sunt setate. Mergeți la Setările site-ului și modificați setările. Vizualizați ghidul pentru mai multe informații.' - twitter_config_warning: 'Serverul e configurat să permită autentificarea și logarea cu Twitter (enable_twitter_logins),dar cheia și valoarea secretă nu este setată. Mergeți la Setările site-ului și modificați setarea. Vizualizați ghidul pentru mai multe informații.' - github_config_warning: 'Serverul e configurat să permită autentificarea și logarea cu GitHub (enable_github_logins), dar id-ul de client și valorile secrete nu sunt setate. Mergeți la Setările site-ului și modificați setarea. Vizualizați ghidul pentru mai multe informații.' - s3_config_warning: 'Serverul este configurat să încarce fișierele cître s3, dar cel puțin una din următoarele setări nu sunt potrivite: id_cheie_acces_s3, cheia_acces_secret_s3 sau loc_încărcare_s3. Mergeți la setările site-ului și modificați setările. Vedeți "Cum să potrivesc imaginea încărcată la S3?" pentru a învăța mai multe.' - image_magick_warning: 'Serverul este configurat să creeze thumbnail-uri din imagini mari, dar ImageMagick nu e instalat. Instalați ImageMagick downlodați ultima versiune.' - default_logo_warning: "Nu ați ales imaginile logo pentru site-ul dvs. Reactualiza-ți logo_url, logo_small_url și favicon_url în Setările site-ului." - contact_email_invalid: "Emailul de contact al site-ului este invalid. Vă rugăm reactualizați emailul de contact în setările site-ului." - title_nag: "Opțiunea titlul de site este încă la valoarea inițială. Vă rugăm reactualiza-ți cu titlul site-ului în setările site-ului." + host_names_warning: "Fișierul config/database.yml folosește numele implicit al localhost. Actualizează pentru a folosi numele de gazdă al site-ului." + gc_warning: 'Serverul tău funcționează pe parametrii de colecție de gunoi ruby, ceea ce nu oferă cea mai bună performanță. Citește această discuție despre setările performanței: Modificarea Ruby și Rails pentru Discourse.' + sidekiq_warning: 'Sidekiq nu este pornit. Multe acțiuni, cum ar fi trimiterea de emailuri, sunt executate în nesincronizare de către sidekiq. Asigură-te că măcar un preces din sidekiq este pornit. Învață despre Sidekiq aici.' + queue_size_warning: 'Numărul de sarcini aflate în lista de așteptare este de %{queue_size}, ceea ce e mult. Asta poate indica o problema cu procesul(ele) Sidekiq, sau că e necesar să adăugi mai multi Sidekiq workers.' + memory_warning: 'Serverul tău lucrează cu mai puțin de 1 GB memorie. Se recomandă cel puțin 1 GB memorie.' + google_oauth2_config_warning: 'Serverul e configurat să permită autentificarea cu Google OAuth2 (enable_google_oauth2_logins), dar valorile secrete ale clientului precum și id-ul clientului nu sunt setate. Mergi la Setările site-ului și modifică setările. Vizualizează ghidul pentru mai multe informații.' + facebook_config_warning: 'Serverul e configurat să permită autentificarea și autentificarea cu Facebook (enable_facebook_logins), dar app id și valoarea app secret nu sunt setate. Mergi la Setările site-ului și modifică setările. Vizualizează ghidul pentru mai multe informații.' + twitter_config_warning: 'Serverul e configurat să permită autentificarea și autentificarea cu Twitter (enable_twitter_logins),dar cheia și valoarea secretă nu sunt setate. Mergi la Setările site-ului și modifică setarea. Vizualizează ghidul pentru mai multe informații.' + github_config_warning: 'Serverul e configurat să permită autentificarea și autentificarea cu GitHub (enable_github_logins), dar id-ul de client și valorile secrete nu sunt setate. Mergi la Setările site-ului și modifică setarea. Vizualizează ghidul pentru mai multe informații.' + s3_config_warning: 'Serverul este configurat să încarce fișierele către s3, dar cel puțin una din următoarele setări nu este potrivită: id_cheie_acces_s3, cheia_acces_secret_s3 sau loc_încărcare_s3. Mergi la Setările site-ului și actualizează setările. Vezi "Cum se fac încărcările de imagine pe S3?" pentru a afla mai multe.' + s3_backup_config_warning: 'Serverul este configurat să încarce backup-urile pe opțiunea s3, dar cel puțin una dintre setările următoare nu este completată: s3_access_key_id, s3_secret_access_key sau s3_backup_bucket. Mergi la Setările site-ului și actualizează setările. Pentru mai multe informații, vizualizează "Cum să setezi încărcările de imagini pe opțiunea S3".' + image_magick_warning: 'Serverul este configurat să creeze thumbnail-uri din imagini mari, dar ImageMagick nu e instalat. Instalează ImageMagick descarcă ultima versiune.' + failing_emails_warning: 'Există %{num_failed_jobs} (de) sarcini email care au eșuat. Verifică app.yml și asigură-te că setările serverului de mail sunt corecte. Vizualizează sarcini eșuate în Sidekiq.' + default_logo_warning: "Nu ai ales imaginile logo pentru site-ul tău. Reactualizează-ți logo_url, logo_small_url și favicon_url în Setările site-ului." + contact_email_missing: "Introdu o adresa de email de contact pentru site, astfel încât să poți fi contactat pentru chestiuni urgente legate de site-ul tău. Actualizează în Setările site-ului." + contact_email_invalid: "Emailul de contact al site-ului este invalid. Te rugăm reactualizează emailul de contact în Setările site-ului." + title_nag: "Introdu numele site-ul Actualizează titlul site-ului în setările site-ului." site_description_missing: "Opțiunea descriere_site nu este completată. Scrieți o scurtă descriere a forum-ului în setările site-ului." - consumer_email_warning: "Site-ul dvs e configurat să folosească Gmail(sau alt serviciu de email) pentru a trimite emailuri. Gmail limitează numărul de email-uri trimise. Folosiți un provider de mailuri ca mandrill.com pentru a asigura trimiterea mail-urilor." - notification_email_warning: "Opțiunea notificare_email este goală. Vă rugăm modificați-o în Setările site-ului." + consumer_email_warning: "Site-ul tău e configurat să folosească Gmail (sau alt serviciu de email) pentru a trimite emailuri. Gmail limitează numărul de email-uri trimise. Folosește un provider de mailuri ca mandrill.com pentru a asigura trimiterea mail-urilor." + site_contact_username_warning: "Introdu numele unui cont utilizator prietenos de pe care să fie trimise mesaje automate. Actualizează în site_contact_username în Setările site-ului." + notification_email_warning: "Adresa de email de pe domeniul tău, de pe care se transmit emailurile de notificare, nu este validă și livrarea emailurilor se face haotic și nesigur. Te rugăm să setezi notification_email cu o adresa de email locala valida în Setările site-ului." + subfolder_ends_in_slash: "Setările subfolderului sunt incorecte; DISCOURSE_RELATIVE_URL_ROOT se termină cu slash." + email_polling_errored_recently: + one: "Email polling a generat o eroare în ultimele 24 de ore. Vizualizează rapoartele pentru mai multe detalii." + few: "Email polling a generat %{count} (de) de erori în ultimele 24 de ore. Vizualizează rapoartele pentru mai multe detalii." + other: "Retragerea de emailuri generat %{count} (de) de erori în ultimele 24 de ore. Vizualizează rapoartele pentru mai multe detalii." + missing_mailgun_api_key: "Serverul este configurat să trimită emailuri printr-un mailgun dar nu ai furnizat nici o cheie API folosită pentru a verifica mesajele webhook." + bad_favicon_url: "Favicon a eșuat să se încarce. Verifică setarea favicon_url în Setările site-ului." + poll_pop3_timeout: "Conexiunea la serverul POP3 a dat time-out. Mailurile primite nu au putut fi retrase. Te rugăm să verifici setările POP3 și furnizorul de servicii." + poll_pop3_auth_error: "Conexiunea la serverul POP3 a eșuat cu o eroare de autentificare. Te rugăm să verifici setările POP3." site_settings: - default_locale: "Limba oficială a acestei instanțe de discurs (ISO 639-1 Code)" - allow_user_locale: "Permite utilizatorilor să aleagă preferința de limbă pentru interfață" - min_post_length: "Minimul de carctere permis per postare" - max_post_length: "Maximul de carctere permis per postare" - min_topic_title_length: "Minimul de caractere permis per discuție" - max_topic_title_length: "Maximul de caractere permis per discuție" - min_search_term_length: "Minimul de caractere permis pentru o căutare validă" - allow_duplicate_topic_titles: "Permite discuții cu titluri duplicate sau identice." - unique_posts_mins: "Câte minute până un utilizator poate posta iar cu același conținut" + censored_words: "Cuvintele for fi înlocuite automat cu ■■■■" + delete_old_hidden_posts: "Șterge automat toate postările ascunse care stau ascunse mai mult de 30 de zile." + default_locale: "Limba implicită a acestei instanțe de discurs (ISO 639-1 Code)" + allow_user_locale: "Permite utilizatorilor să-și aleagă singuri limba pentru interfață" + set_locale_from_accept_language_header: "setează limba interfeței pentru utilizatorii anonimi pe baza header-elor de limbă ale web browser-elor lor. (EXPERIMENTAL, nu funcționează cu cache anonim)" + min_post_length: "Lungimea minimă a postării, în caractere" + min_first_post_length: "Numărul minim de caractere permis pentru prima postare (în corpul mesajului)" + min_private_message_post_length: "Numărul minim de caractere permis pentru mesaje, pe postare" + max_post_length: "Lungimea maximă permisă a postării, în caractere" + min_topic_title_length: "Minimul de caractere permis în titlul unui subiect" + max_topic_title_length: "Maximul de caractere permis în titlul unui subiect" + min_private_message_title_length: "Numărul minim de caractere permis în titlul unui mesaj" + min_search_term_length: "Lungimea minimă a unui termen de căutare valid, în caractere." + search_tokenize_chinese_japanese_korean: "Forțează căutarea să utilizeze tokens chineză/japoneză/coreană chiar și pe site-uri care nu sunt CJK." + search_prefer_recent_posts: "Dacă ai un forum mare și cătarea este prea lentă, această opțiune încearcă să indexeze mai multe postări recente întâi." + search_recent_posts_size: "Câte postări recente să fie ținute în index" + allow_uncategorized_topics: "Permite crearea de subiecte fără categorie. ATENȚIE: Dacă o să ai postări fără categorie, va trebui să le identifici înainte sa poți dezactiva din nou această setare." + allow_duplicate_topic_titles: "Permite subiecte cu titluri duplicat sau identice." + unique_posts_mins: "Câte minute până ce un utilizator poate posta din nou o postare cu același conținut" educate_until_posts: "Când utilizatorul începe să scrie primele (n) postări, arată panelul de instruire în spațiul pentru compunere." - title: "Titlul scurt al siteului, folosit în titlul tag." - site_description: "Descrieți acest site într-o scurtă propoziție, folosit în tagul meta-descriere." - queue_jobs: "PENTRU DEVELOPER! ATENȚIE! Din oficiu, pune operațiile în coadă în sidekiq. Dacă e dezactivat, Site-ul nu va mai funcționa." - crawl_images: "Recuperați imaginile de legătura din URL-uri pentru a insera dimensiunile corecte de înălțime și lățime." - download_remote_images_to_local: "Transformă imaginile de legătură în imagini locale downloadându-le; asta previne stricarea imaginilor." - download_remote_images_threshold: "Spațiul mimin necesar pentru download-ul imaginilor de legătura local (în procente)" - disabled_image_download_domains: "Imagini de legătură nu vor mai fi downloadate din aceste domenii. Listă delimitata-vertical." - post_edit_time_limit: "Autorul poate edita sau șterge postarea până la (n) minute după postare. Setați 0 pentru totdeauna." - edit_history_visible_to_public: "Permite oricui să vadă versiunea precedentă a unei postări editate. Când e dezactivat, doar membrii personalului pot vedea." - delete_removed_posts_after: "Postările înlăturate de către autor vor fi automat șterse după (n) de ore." + title: "Titlul scurt al site-ului, folosit în tag-ul title." + site_description: "Descrieți acest site într-o singură frază, precum se folosește în tagul meta-descriere." + contact_email: "Adresa de email a persoanei de contact principale pentru acest site. Folosită pentru notificări critice precum marcaje de avertizare negestionate și pentru chestiuni urgente trimise prin formularul de contact din /despre" + contact_url: "URL-ul de contact pentru acest site. Folosit pentru chestiuni urgente trimise prin formularul de contact din /despre" + queue_jobs: "PENTRU DEVELOPER! ATENȚIE! Implicit, pune operațiile în coadă în sidekiq. Dacă e dezactivat, site-ul nu va mai funcționa." + crawl_images: "Recuperează imaginile din URL-uri la distanță pentru a insera dimensiunile corecte de înălțime și lățime." + download_remote_images_to_local: "Transformă imaginile la distanță în imagini locale descărcându-le; asta previne imaginile stricate." + download_remote_images_threshold: "Spațiul mimin necesar pentru descărcarea imaginilor la distanță pe local (în procente)" + download_remote_images_max_days_old: "Nu descarca imaginile de la distanță pentru postări care sunt mai vechi de n zile." + disabled_image_download_domains: "Imaginile la distanță nu vor mai fi descărcate de pe aceste domenii. Listă delimitata de pipe." + editing_grace_period: "Pentru (n) secunde după postare, editarea nu va crea o versune nouă în istoricul postării." + post_edit_time_limit: "Autorul poate edita sau șterge postarea până la (n) minute după postare. Setează 0 pentru permanent." + edit_history_visible_to_public: "Permite tuturor să vadă versiunile precedente ale unei postări editate. Când e dezactivat, numai ele pot fi văzute doar de membrii echipei." + delete_removed_posts_after: "Postările șterse de către autor vor fi automat șterse după (n) de ore. Dacă este setat la 0, postările vor fi șterse imediat." max_image_width: "Maximul lățimii unui thumbnail într-o postare" max_image_height: "Maximul înălțimii unui thumbnail într-o postare" - category_featured_topics: "Numărul discuțiilor afișate după categorie pe /pagina de categorii. După schimbarea valorii, e nevoie de până la 15 minute până ce pagină se va actualiza." - show_subcategory_list: "Arată lista de sub-categorii în locul listei de discuții când se introduce categoria." + category_featured_topics: "Numărul subiectelor afișate după categorie pe /pagina de categorii. După schimbarea valorii, e nevoie de până la 15 minute până ce pagina de categorii se va actualiza." + show_subcategory_list: "Arată lista de sub-categorii în loc de lista de subiecte când se introduce o categorie." fixed_category_positions: "Dacă e bifat, veți putea aranja categoriile într-o ordine fixă. Dacă e nebifat, categoriile sunt listate în ordinea activității." - add_rel_nofollow_to_user_content: "Adaugă atributul rel nofollow la contextul acceptat de utilizator, în afară de adresele de uz intern (incluzând domeniile părinte). Dacă se schimbă, postările trebuiesc refăcute cu: \"rake posts:rebake\"" - post_excerpt_maxlength: "Lungimea maximă a unui extras / sumar dintr-o postare." + fixed_category_positions_on_create: "Dacă este bifat, ordonarea categoriilor va fi menținută în dialogul de creare a subiectelor (presupune fixed_category_positions)." + add_rel_nofollow_to_user_content: "Adaugă atributul rel nofollow la toate conținuturile transmise de către utilizator, cu excepția link-urilor interne (includiv domeniile părinte). Dacă schimbi această setare, postările trebuiesc refăcute cu: \"rake posts:rebake\"" + exclude_rel_nofollow_domains: "O listă a domeniilor unde nofollow nu trebuie adăugat la link-uri. tld.com va permite automat și sub.tld.com. Ca cerință minimă, va trebui să adaugi domeniul top-level al acestui site pentru a permite roboților web să îi găsească tot conținutul. Dacă există părți ale site-ul tău care se află pe alte domenii, adăugă-le și pe acestea." + post_excerpt_maxlength: "Lungimea maximă a unui fragment / rezumat dintr-o postare." + show_pinned_excerpt_mobile: "Arată fragmente din subiectele țintuite în vizualizarea de mobil." + show_pinned_excerpt_desktop: "Arată fragmente din subiectele țintuite în vizualizarea de desktop." post_onebox_maxlength: "Limgimea maximă a unui post afișat în Onebox (în caractere)" - onebox_domains_whitelist: "O listă de domenii permise pentru discursul-scurt; aceste domenii ar trebuii să permită OpenGraph sau oEmbed. Testați-le la http://iframely.com/debug" - apple_touch_icon_url: "Iconiță folosită pentru dispozitivele Apple. Mărimea recomandată este 144px pe 144px." - notification_email: "Adresa autorului emailu-ului este folosită când se trimit emailuri esențiale de sistem. Domeniul specificat aici trebuie să aibă SPF, DKIM și rapoarte PTR inversate, setate corect pentru că email-ul să ajungă la destinație." - email_custom_headers: "O listă delimitată vertical a capetelor de email preferențiale" - summary_score_threshold: "Scorul mimim necesar pentru o postare să fie inclus în 'Sumarul acestei postări'" - summary_posts_required: "Minimul de postări într-o discuție înainte de 'Sumarul acestei discuții' este activat" - summary_likes_required: "Minimul de aprecieri într-o discuție înainte de 'Sumarul acestei discuții' este activat" - summary_percent_filter: "Când un utilizator face click pe 'Sumarul acestei discuții', arată primele % de postări" - cooldown_minutes_after_hiding_posts: "Numărul de minute pr care un utilizator trebuie să le aștepte până când poate edita sau ascunde o postare prin marcajele comune" - notify_mods_when_user_blocked: "Dacă un utilizator este blocat automat , trimite un mesaj tuturor moderatorilor." - flag_sockpuppets: "Dacă un utilizator nou răspunde unei discuții de la același IP ca utilizatorul ce a pornit discuția, marchează ambele postări ca potențial spam." - post_undo_action_window_mins: "Numarum de minute în care utilizatorii pot anula acțiunile recente într-o postare (aprecieri, marcări, etc)." - ga_universal_tracking_code: "Codul de urmarie al Google Universal Analytics (analytics.js), ex: UA-12345678-9; see http://google.com/analytics" - ga_universal_domain_name: "Numele de domeniu al Google Universal Analytics (analytics.js) , ex: mysite.com; see http://google.com/analytics" - enable_noscript_support: "Activează căutarea standardă a webcrawler-ului prin tagul noscript" + onebox_domains_whitelist: "O listă de domenii permise pentru oneboxing; aceste domenii ar trebui să suporte OpenGraph sau oEmbed. Testează-le la http://iframely.com/debug" + logo_url: "Imaginea logo din partea din dreapta sus a site-ul tău trebuie să aibă o formă dreptunghiulară. Dacă este lăsată liberă, va fi afișat în locul ei un titlu al site-ului în formă text." + digest_logo_url: "Imaginea logo alternativă folosită în partea de sus a emailurilor-rezumat de pe site-ul tău. Trebuie să aibă o forma de dreptunghi lat. Trebuie să nu fie o imagine SVG. Dacă e lăsată liberă, va fi folosit în locul ei - `logo_url` ." + logo_small_url: "Imaginea logo mică din partea de sus-stânga a site-ului tău va trebui să aibă o formă dreptunghiulară, vizibilă când se face scroll down. Dacă e lăsată liberă, va fi afișat un pictograf." + favicon_url: "Un favicon pentru site-ul tău, vedeți http://en.wikipedia.org/wiki/Favicon, pentru a funcționa corect peste un CDN trebuie să fie png" + mobile_logo_url: "Imaginea logo cu poziție fixă folosită în partea de sus-stânga a site-ului tău mobil. Trebuie să aibă o formă pătrată. dacă este lăsată liberă, va fi folosit `logo_url` . De ex.: http://example.com/uploads/default/logo.png" + apple_touch_icon_url: "Iconiță folosită pentru dispozitivele touch Apple. Mărimea recomandată este 144px pe 144px." + notification_email: "Forma: adresa de email folosită cînd se trimit toate emailurile esențiale ale sistemului. Domeniul specificat aici trebuie să aibe setate corect SPF, DKIM și reverse PTR pentru ca emailul să poată fi livrat." + email_custom_headers: "O listă delimitată cu pipe a header-elor personalizate de email" + email_subject: "Format de subiecte ce se poate personaliza pentru emailurile standard. Vedeți https://meta.discourse.org/t/customize-subject-format-for-standard-emails/20801" + force_https: "Forțează site-ul să folosească exclusiv HTTPS. ATENȚIE: NU activa această opțiune până nu ai verificat că HTTPS este setat în întregime și funcționează absolut peste tot. Ai verificat, de asemenea, dacă și CND-ul, toate autentificările sociale și toate logo-urile și dependințele externe sunt compatibile cu HTTPS?" + summary_score_threshold: "Scorul minim necesar pentru ca o postare să fie inclusă în 'Rezumă acest subiect'" + summary_posts_required: "Minimul de postări într-un subiect înainte de a se activa 'Rezumă acest subiect'." + summary_likes_required: "Minimul de aprecieri într-un subiect înainte de a se activa 'Rezumă acest subiect'." + summary_percent_filter: "Când un utilizator face click pe 'Rezumatul acestui subiect', arată primele % de postări" + summary_max_results: "Numărul maxim de postări returnate de \"Rezumatul acestui subiect\"" + enable_private_messages: "Acordați nivelul de încredere 1 (configurabil via nivel minim de încredere pentru trimiterea de mesaje) utilizatorilor, pentru a le permite să creeze și să răspundă la mesaje. Observați că echipa poate oricând să trimită mesaje, indiferent ce." + enable_long_polling: "Bus-ul de mesaje folosit pentru notificări poate utiliza long polling." + long_polling_base_url: "URL de bază folosit pentru long polling (atunci când un CDN servește conținut dinamic, asigură-te că setezi asta pe origin pull) ex: http://origin.site.com" + long_polling_interval: "Durata timpului cât serverul va trebui să aștepte înainte de a răspunde clienților atunci când nu există date de trimis (exclusiv utilizatori autentificați)" + polling_interval: "Atunci când nu fac long polling, cât de des ar trebui ca clienții autentificați să facă interogări, în milisecunde." + anon_polling_interval: "Cât de frecvent să interogheze clienții anonimi, în milisecunde" + background_polling_interval: "Cât de des să interogheze clienții, în milisecunde (când fereastra este fundal)" + flags_required_to_hide_post: "Număr de marcaje de avertizare care fac ca o postare să fie automat ascunsă și utilizatorului să îi fie trimis automat un mesaj (0 pentru niciodată)" + cooldown_minutes_after_hiding_posts: "Numărul de minute pe care un utilizator trebuie să le aștepte până când va putea edita o postare ascunsă prin marcaje de avertizare ale comunității." + max_topics_in_first_day: "Numărul maxim de subiecte pe care un utilizator are voie să le creeze într-o perioadă de 24 de ore după ce și-a creat prima postare" + max_replies_in_first_day: "Numărul maxim de răspunsuri pe care un utilizator are voie să le creeze într-o perioadă de 24 de ore după ce și-a creat prima postare" + tl2_additional_likes_per_day_multiplier: "Crește numărul maxim de aprecieri pe zi pentru (membrii cu) nivelul de încredere 2, multiplicând acest număr" + tl3_additional_likes_per_day_multiplier: "Crește numărul maxim de aprecieri pe zi pentru (membrii cu) nivelul de încredere 3, multiplicând acest număr" + tl4_additional_likes_per_day_multiplier: "Crește numărul maxim de aprecieri pe zi pentru (membrii cu) nivelul de încredere 4, multiplicând acest număr" + num_spam_flags_to_block_new_user: "Dacă postările unui nou utilizator primesc atâtea marcaje de avertizare ca spam de la num_users_to_block_new_user utilizatori diferiți, ascunde-le toate postările și împiedică-i să mai posteze. 0 pentru dezactivare." + num_users_to_block_new_user: "Dacă mesajele unui nou utilizator obțin num_spam_flags_to_block_new_user marcaje de avertizare de la atâția utilizatori diferți, ascunde toate mesajele sale și blochează-i posibilitatea de a posta. 0 pentru dezactivare." + num_tl3_flags_to_block_new_user: "Dacă postările unui nou utilizator primesc atâtea marcaje de avertizare de la num_tl3_users_to_block_new_user de utilizatori diferiți cu nivel de încredere 3, ascunde toate postările sale și blochează-i posibilitatea de a posta pe viitor. 0 pentru dezactivare." + num_tl3_users_to_block_new_user: "Dacă postările unui utilizator nou primesc num_tl3_flags_to_block_new_user marcaje de avertizare de la atâția utilizatori diferiți cu nivelul de încredere 3, ascunde-le toate postările și blochează-le posibilitatea de a posta pe viitor. 0 pentru dezactivare." + notify_mods_when_user_blocked: "Dacă un utilizator este blocat automat, trimite un mesaj tuturor moderatorilor." + flag_sockpuppets: "Dacă un utilizator nou răspunde unui subiect de la același IP ca utilizatorul ce a pornit subiectul, marchează ambele postări ca potențial spam." + traditional_markdown_linebreaks: "Folsește capete de linie tradiționale în Markdown, ceea ce necesită doua spații pentru un capăt de linie. " + allow_html_tables: "Permite introducerea de tabele în Markdown prin folosirea de etichete HTML. HEAD, TD, TR, TH vor fi autorizate (necesită un rebake pe toate postările vechi ce conțin tabele)" + post_undo_action_window_mins: "Numărul de minute în care utilizatorii pot anula acțiunile recente asupra unei postări (aprecieri, marcări cu marcaje de avertizare, etc)." + must_approve_users: "Membrii echipei trebuie să aprobe toate conturile noilor utilizatori înainte ca aceștia să poată accesa site-ul. ATENȚIE: activarea acestei opțiuni pentru un site în producție va revoca accesul tuturor utilizatorilor care nu sunt membri ai echipei!" + pending_users_reminder_delay: "Notifică moderatorii dacă noi utilizatori sunt în așteptarea aprobării de mai mult de atâtea ore. Setează la -1 pentru a dezactiva notificările." + maximum_session_age: "Utilizatorul va rămâne autentificat pentru n ore de la ultima vizită" + ga_tracking_code: "ÎNVECHIT: Google analytics (ga.js) cod de urmărire, eg: UA-12345678-9; see http://google.com/analytics" + ga_domain_name: "ÎNVECHIT: numele domeniului Google Analytics (ga.js), de exemplu: siteulmeu.com ; vezi http://google.com/analytics" + ga_universal_tracking_code: "Codul de urmărire Google Universal Analytics (analytics.js), ex: UA-12345678-9; vezi http://google.com/analytics" + ga_universal_domain_name: "Numele de domeniu Google Universal Analytics (analytics.js) , ex: mysite.com; vezi http://google.com/analytics" + gtm_container_id: "ID-ul containerului Google Tag Manager. De ex: GTM-ABCDEF" + enable_escaped_fragments: "Întoarce-te la Google's Ajax-Crawling API dacă nu e detectat webcrawler-ul. Vezi https://developers.google.com/webmasters/ajax-crawling/docs/learn-more" + enable_noscript_support: "Activează suportul pentru roboții de căutare web prin tag-ul noscript" allow_moderators_to_create_categories: "Permite moderatorilor să creeze noi categorii" - post_menu: "Determină ce elemente apar în meniul de postare și în ce ordine . Exemple apreciere|editează|marchează|șterge|distribuie|semne de carte|răspunde" - post_menu_hidden_items: "Meniul de elemente de ascuns din oficiu în meniul de postări numai dacă elipsa este activată prin click." - share_links: "Determină ce elemente apar în dialogul distribuit și în ce ordine." - track_external_right_clicks: "Urmărește adresele externe ce sunt activate prin click-dreapta (ex: deschide în tab nou) dezactivate din oficiu fiindcă rescrie URL-uri" - suppress_reply_directly_below: "Nu arăta numărul expadabil de răspunsuri într-o postare când există doar un sigur răspuns sub acesta." - suppress_reply_directly_above: "Nu arăta numărul expadabil de răspunsuri_la într-o postare când există doar un sigur răspuns sub acesta." - suppress_reply_when_quoting: "Nu arata numărul expadabil de răspunsuri_la într-o postare când postarea este un raspuns-citat." - redirect_users_to_top_page: "Redirecționează automat utilizatorii noi și cei absenți de mult în vârful paginii." - email_token_valid_hours: "Parola uitată / activează tokenii de cont valizi pentru (n) ore." - email_token_grace_period_hours: "Parola uitată / activează tokenii de cont ce sunt încă valizi pe o perioadă de (n) ore după ce au fost redobândiți." - enable_badges: "Activează sistemul insigna (experimental)" - version_checks: "Verifică Hub-ul Discourse pentru actualizări și arată mesaje pentru versiuni mai noi în Spatiul de lucru" - new_version_emails: "Trimite un email la adresa de contact_email când o nouă versiune de Discourse este disponibilă." - port: "PENTRU DEVELOPER! ATENȚIE! Folosiți acest port HTTP decât cel din oficiu , portul 80. lăsați liber pentru portul 80." - force_hostname: "PENTRU DEVELOPER! ATENȚIE! Specificați un nume de gazdă âne URL. Lăsați liber pentru cel din oficiu." + cors_origins: "Origini permise pentru interogările inter-origini (CORS). Fiecare origine trebuie să includă http:// sau https://. Variabila env DISCOURSE_ENABLE_CORS trebuie setată pe true pentru a activa CORS." + use_admin_ip_whitelist: "Admini se pot autentifica numai dacă se află la o adresă de IP definită în lista de IP-uri verificate (Admin > Rapoarte > IP-uri verificate) " + top_menu: "Determină ce elemente apar în navigare pe pagina principală și în ce ordine. Exemplu: ultimele|noi|necitite|categorii|top|citite|semnedecarte" + post_menu: "Determină ce elemente apar în meniul de postare și în ce ordine . Exemplu: apreciere|editează|marchează|șterge|distribuie|semne de carte|răspunde" + post_menu_hidden_items: "Meniul de elemente care să fie ascuns în mod implicit în meniul de postări dacă nu se dă click pe partea de extindere a meniului." + share_links: "Determină ce elemente apar în dialogul de distribuire și în ce ordine." + track_external_right_clicks: "Urmărește link-urile externe ce sunt dezactivate prin click-dreapta (ex: deschide în tab nou) în mod implicit fiindcă rescriu URL-uri" + site_contact_username: "Un nume utilizator valid al unui membru al echipei de la care să se trimită toate mesajele. Dacă e lăsat liber se va folosi contul implicit System." + send_welcome_message: "Trimite tuturor utilizatorilor un mesaj de bun venit cu un ghid rapid de inițiere." + suppress_reply_directly_below: "Nu arăta contorul expandabil de răspunsuri la o postare atunci când nu există decât un singur răspuns direct sub această postare." + suppress_reply_directly_above: "Nu arăta elementul expandabil „ca răspuns la” aferent unei postări, atunci când nu există decât un singur răspuns direct deasupra acestei postări." + suppress_reply_when_quoting: "Nu arăta elementul expandabil „ca răspuns la” aferent unei postări, atunci când postarea citează răspunsul." + max_reply_history: "Număr maxim de răspunsuri care să fie expandate atunci când se expandează un \"răspuns la\"" + topics_per_period_in_top_summary: "Numărul celor mai bune subiecte afișate în rezumatul implicit al celor mai bune subiecte." + topics_per_period_in_top_page: "Numărul celor mai bune subiecte afișat când se selectează 'Afișează mai multe' cele mai bune subiecte." + redirect_users_to_top_page: "Redirecționează automat noii utilizatorii noi și cei absenți de multă vreme, către vârful paginii." + top_page_default_timeframe: "Perioada implicită pentru pagina cea mai vizualizată" + show_email_on_profile: "Afișează adresa de email a unui utilizator în pagina sa de utilizator (vizibilă numai pentru el și pentru membrii echipei)" + prioritize_username_in_ux: "Afișează întâi nume utilizator pe pagina utilizator, pe cardul utilizator și în postări (dacă e dezactivat, se afișează întâi numele)" + email_token_valid_hours: "Tokenii uitat parlolă / activează cont sunt valizi pentru (n) ore." + email_token_grace_period_hours: "Tokenii Parola uitată / activează cont sunt încă valizi pe o perioadă de grație de (n) ore după ce au fost redobândiți." + enable_badges: "Activează sistemul de ecusoane" + enable_whispers: "Permite membrilor echipei să comunice privat în cadrul unui subiect. (experimental)" + allow_index_in_robots_txt: "Specifică în robots.txt că acestui site îi este permis să fie indexat de motoarele de căutare web." + email_domains_blacklist: "O listă de domenii de email separate cu pipă ai căror utilizatori nu au permisiunea să înregistreze conturi. Exemplu: mailinator.com|trashmail.net" + email_domains_whitelist: "O listă de domenii de email (delimitate cu pipă) cu care utilizatorii TREBUIE să se înregistreze. ATENȚIE: utilizatorii cu alte domenii de email decât cele listate nu vor avea permisiunea să se înregistreze." + forgot_password_strict: "Nu informa utilizatorii despre existența unui cont atunci când folosesc dialogul pentru parolă uitată." + log_out_strict: "La ieșire, închide TOATE sesiunile pentru utilizator, pe toate dispozitivele." + version_checks: "Verifică Hub-ul Discourse pentru actualizări și arată notificările de versiuni noi pe spațiul de lucru /admin ." + new_version_emails: "Trimite un email la adresa contact_email când o nouă versiune de Discourse este disponibilă." + port: "PENTRU DEVELOPER! ATENȚIE! Folosește acest port HTTP în locul portul 80 care este implicit. Lasă liber pentru a folosi portul 80, ca implicit." + force_hostname: "PENTRU DEVELOPER! ATENȚIE! Specifică un nume de gazdă în URL. Lasă liber pentru cel implicit." invite_expiry_days: "Cat timp sun valabile cheile de invitație ale utilizatorilor, în zile" invite_passthrough_hours: "Cât timp un utilizator poate folosii o cheie de invitație recuperată anterior pentru autentificare, în ore" invite_only: "Înregistrarea publică este dezactivată, toți utilizatorii noi trebuie să fie exclusiv invitați de un alt membru sau personalul site-ului." - login_required: "Autentificarea este necesară pentru a citi conținutul site-ului, nu permite accesul anonim." - min_password_length: "Lungimea minimă de caractere pentru parolă." - block_common_passwords: "nu permite parole ce sunt în cele 10,000 cele mai cunoscute parole." - enable_local_logins: "Activează numele de utilizator local și a conturilor bazate pe logare cu parola. (Notă: Aceasta trebuie activiată pentru invitații pt a funcționa)" + login_required: "Cere autentificare pentru a citi conținutul acestui site, blochează accesul anonim." + min_username_length: "Numărul minim de caractere pe care poate să îl aibă nume utilizator." + max_username_length: "Numărul maxim de caractere pe care poate să îl aibă nume utilizator." + reserved_usernames: "Nume utilizator pentru care înregistrarea nu este permisă." + min_password_length: "Lungimea minimă a parolei." + min_admin_password_length: "Lungimea maximă a parolei pentru Admin." + block_common_passwords: "Nu permite parole ce sunt printre cele 10,000 cele mai cunoscute parole." + enable_sso: "Enable single sign on via an external site (WARNING: USERS' EMAIL ADDRESSES *MUST* BE VALIDATED BY THE EXTERNAL SITE!)" + verbose_sso_logging: "Raportează diagnosticele legate de SSO în /logs" + enable_sso_provider: "Implementează protocolul furnizorului SSO Discourse la punctul de terminare /session/sso_provider , presupune ca sso_secret să fie setat." + sso_url: "URL pentru autentificare unică pe punct de terminare (trebuie să includă http:// or https://)" + sso_secret: "Șir secret folosit pentru autentificarea criptografică a SSO, asigură-te că este de minim 10 caractere" + sso_overrides_bio: "Suprascrie biografia utilizatorului în profil utilizator și îl împiedică pe acesta să o modifice" + sso_overrides_email: "Suprascrie emailul local cu un email de pe un site extern din încărcătura SSO la fiecare autentificare și, împiedică schimbările locale. (ATENȚIE: pot apărea discrepanțe din cauza normalizării emailurilor locale)" + sso_overrides_username: "Suprascrie numele de utilizator local cu numele utilizator de pe site-ul extern din încărcătura SSO la fiecare autentificare și, împiedică schimbările locale (ATENȚIE: pot apărea discrepanțe din cauza diferențelor în lungimea/pre-condițiile numelui utilizator)" + sso_overrides_name: "Suprascrie numele întreg de pe local cu numele întreg din încărcătura SSO la fiecare autentificare și, împiedică schimbările locale." + sso_overrides_avatar: "Suprascrie avatarul utilizatorului cu avatarul din încărcătura SSO. Dacă este activat, se recomandă călduros dezactivarea allow_uploaded_avatars" + sso_not_approved_url: "Redirecționează conturile neaprobate SSO către acest URL" + enable_local_logins: "Activează numele de utilizator local și conturile bazate pe autentificare cu parola. (Notă: Pentru ca invitațiile să funcționeze, această opțiune trebuie să fie activată)" allow_new_registrations: "Permite înregistrarea noilor utilizatori . Debifați pentru a restricționa oricui să creeze un cont nou." + enable_signup_cta: "Arată o notificare către utilizatorii anonimi care revin prin care să le ceri să se înscrie pentru a obține un cont." enable_yahoo_logins: "Activează autentificarea cu Yahoo" - enable_google_oauth2_logins: "Activează autentificarea cu Google Oauth2 . Aceasta e metoda de autentificarea suportată de Google momentan. Necesită cheie și secret." - google_oauth2_client_id: "ID-ul client al aplicației Google." - google_oauth2_client_secret: "Secretul clientului din aplicația Google." - enable_twitter_logins: "Activează autentificarea cu Twitter, necesită cheia_de_consumator+twitter și secretul_de_consumator_twitter" - twitter_consumer_key: "Cheia de consumator pentru autentificarea cu Twitter , înregistrată la http://dev.twitter.com" - twitter_consumer_secret: "Secretul de consumator pentru autentificarea cu Twitter, înregistrat la http://dev.twitter.com" - enable_facebook_logins: "Activează autentificarea cu Facebook, neceistă facebook_app_id și facebook_app_secret" + enable_google_oauth2_logins: "Activează autentificarea cu Google Oauth2 . Aceasta e metoda de autentificare pe care o suportă Google. Necesită cheie și secret." + google_oauth2_client_id: "ID client al aplicației tale Google." + google_oauth2_client_secret: "Secret client al aplicației tale Google." + enable_twitter_logins: "Activează autentificarea cu Twitter, necesită witter_consumer_key and twitter_consumer_secret" + twitter_consumer_key: "Cheie consumator pentru autentificarea cu Twitter , înregistrată la http://dev.twitter.com" + twitter_consumer_secret: "Secret consumator pentru autentificarea cu Twitter, înregistrat la http://dev.twitter.com" + enable_instagram_logins: "Activează autentificarea prin Instagram, necesită instagram_consumer_key și instagram_consumer_secret" + instagram_consumer_key: "Cheie consumator pentru autentificarea Instagram" + instagram_consumer_secret: "Autentificare Instagram pe bază de secret consumator" + enable_facebook_logins: "Activează autentificarea cu Facebook, necesită facebook_app_id și facebook_app_secret" facebook_app_id: "ID-ul aplicației pentru autentificarea cu Facebook, înregistrată la https://developers.facebook.com/apps" - facebook_app_secret: "Secretul aplicației pentru autentificarea cu Facebook, înregistrat la https://developers.facebook.com/apps" + facebook_app_secret: "App secret pentru autentificarea cu Facebook, înregistrat la https://developers.facebook.com/apps" + facebook_request_extra_profile_details: "Solicită informațiile despre mine, locație și website de la Facebook. (necesită ca aplicația ta de autentificare să fie aprobată de Facebook)" enable_github_logins: "Activează autentificarea cu Github, requires github_client_id and github_client_secret" - github_client_id: "ID-ul clientului pentru autentificarea cu Github, înregistrat la https://github.com/settings/applications" + github_client_id: "ID client pentru autentificarea cu Github, înregistrat la https://github.com/settings/applications" github_client_secret: "Secretul clientului pentru autentificarea cu Github, înregistrat la https://github.com/settings/applications" - allow_restore: "Bifează-l doar dacă dorești să restaurezi o copie de siguranță. Atenție, restaurarea poate șterge/înlocui TOATE datele din site!" - maximum_backups: "Maximul de copii de siguranță păstrate. Copiile de siguranță vechi sunt șterse automat" - enable_s3_backups: "Încarcă copiile de siguranță pe s3 când sunt complete. IMPORTANT: sunt necesare date de autentificare valide pentru S3 în secțiunea FIȘIERE." + readonly_mode_during_backup: "Activează modul exclusiv-citire în timpul operațiunii de backup" + allow_restore: "Bifează-l doar dacă dorești să restaurezi un fișier de backup. Atenție, restaurarea poate șterge/înlocui TOATE datele din site!" + maximum_backups: "Maximul de fișiere backup păstrate. Fișierele backup vechi sunt șterse automat" + automatic_backups_enabled: "Rulează automat operațiuni de backup după cum este definit la frecvența de backup" + backup_frequency: "Cât de frecvent facem backup la site, în zile." + enable_s3_backups: "Încarcă fișierele backup pe s3 când sunt complete. IMPORTANT: sunt necesare date de autentificare valide pentru S3 în secțiunea FIȘIERE." + s3_backup_bucket: "Găleata de la la distanță care ține backupurile. ATENȚIE: Asgură-te că e o găleată privată." + s3_disable_cleanup: "Dezactivează eliminarea backup-urilor de pe S3 când sunt șterse local." + backup_time_of_day: "Ora din zi in format UTC la care să înceapă operațiunea de backup." + backup_with_uploads: "Include încărcări în backup-urile programate. Dezactivarea acestei opțiuni va face backup doar la baza de date." active_user_rate_limit_secs: "Cât de de se actializează câmpul 'last_seen_at', în secunde" - previous_visit_timeout_hours: "Cât de mult durează o vizită până când e considerată vizita'precedentă', în ore" - rate_limit_create_topic: "După crearea unei discuții, utilizatorul trebuie să aștepte (n) secunde înainte de a începe una nouă." + verbose_localization: "Arată pe larg sfaturile de localizare în UI" + previous_visit_timeout_hours: "Durata unei vizite până ce va fi considerată drept vizită 'precedentă', în ore" + top_topics_formula_log_views_multiplier: "valoarea multiplicatorului (n) de vizualizări rapoarte în formula celor mai bune subiecte:\n`log(views_count) * (n) + op_likes_count * 0.5 + LEAST(likes_count / posts_count, 3) + 10 + log(posts_count)`" + top_topics_formula_first_post_likes_multiplier: "valoarea multiplicatorului (n) de prime aprecieri la postări în formula celor mai bune subiecte:\n`log(views_count) * 2 + op_likes_count * (n) + LEAST(likes_count / posts_count, 3) + 10 + log(posts_count)`" + top_topics_formula_least_likes_per_post_multiplier: "valoarea multiplicatorului (n) de cele mai puține aprecieri în formula celor mai bune subiecte:\n`log(views_count) * 2 + op_likes_count * 0.5 + LEAST(likes_count / posts_count, (n)) + 10 + log(posts_count)`" + rebake_old_posts_count: "Numărul de postări care să fie regenerate la fiecare 15 minute." + rate_limit_create_topic: "După crearea unui subiect, utilizatorul trebuie să aștepte (n) secunde până pot crea unul nou." rate_limit_create_post: "După postare, utilizatorii trebuie să aștepte (n) de secunde până să creeze alta postare." - rate_limit_new_user_create_topic: "După crearea unei discuții, utilizatorii noi trebuie să aștepte (n) secunde până pot crea altă nouă." + rate_limit_new_user_create_topic: "După crearea unui subiect, utilizatorii noi trebuie să aștepte (n) secunde până pot crea unul nou." rate_limit_new_user_create_post: "După ce postează, utilizatorii noi trebuie să aștepte (n) secunde până pot crea altă postare." - max_likes_per_day: "Numărul maxim de aprecieri per utilizator zilnic." - max_flags_per_day: "Numărul maxim de marcaje per utilizator zilnic." - max_bookmarks_per_day: "Numărul maxim de semne de carte per utilizator, zilnic." - max_edits_per_day: "Numărul maxim de editări per utilizator, zilnic." - max_topics_per_day: "Numărul maxim de discuții pe care un utilizator le poare crea zilnic." - suggested_topics: "Numărul de discuții sugerate la sfârșitul unei discuții." - limit_suggested_to_category: "Arată doar discuțiile din aceiași categoriie în cele sugerate." + max_likes_per_day: "Numărul maxim zilnic de aprecieri per utilizator." + max_flags_per_day: "Numărul maxim zilnic de marcaje de avertizare per utilizator." + max_bookmarks_per_day: "Numărul maxim zilnic de semne de carte per utilizator." + max_edits_per_day: "Numărul maxim zilnic de editări per utilizator." + max_topics_per_day: "Numărul maxim de subiecte pe care un utilizator le poare crea zilnic." + max_private_messages_per_day: "Număr maxim de mesaje pe care utilizatorii le pot crea pe zi." + max_invites_per_day: "Număr maxim de invitații pe care un utilizator le poate trimite pe zi." + max_topic_invitations_per_day: "Numărul maxim de invitații la subiect pe care un utilizator le poate trimite pe zi." + alert_admins_if_errors_per_minute: "Numărul de erori pe minut la care să se declanșeze o alerta admin. Valoarea 0 dezactivează această funcționalitate. NOTA: presupune restartare. " + alert_admins_if_errors_per_hour: "Numărul de erori pe oră la care să se declanșeze o alertă admin. Valoarea 0 dezactivează această funcționalitate. NOTĂ: necesită restart." + categories_topics: "Numărul de subiecte care să fie afișat în pagina /categories ." + suggested_topics: "Numărul de subiecte sugerate în partea de jos a unui subiect." + limit_suggested_to_category: "Arată doar subiectele din aceiași categoriie, în subiecte sugerate." + suggested_topics_max_days_old: "Subiectele sugerate nu trebuie să fie mai vechi de n zile." + clean_up_uploads: "Șterge încărcările ne-referențiate orfane pentru a preveni găzduirea ilegală. ATENȚIE: înainte de a activa această setare faceți un backup la directorul /uploads ." clean_orphan_uploads_grace_period_hours: "Perioada de grație (în ore) înainte ca o reîncarcare orfană să fie ștearsă." purge_deleted_uploads_grace_period_days: "Perioada de grație (în zile) înainte ca o încărcare ștearsă să fie eliminată." - enable_s3_uploads: "Pune încărcările pe spațiul Amazon S3." - s3_upload_bucket: "Numele compartimentului Amazon S3 unde fișierele vor fi încărcate. ATENȚIE: cu litere mici, fără puncte." - s3_access_key_id: "Id-ul cheie de acces Amazon S3 ce va fi folosită la încărcarea imaginilor." - s3_secret_access_key: "Cheia secretă de acces Amazon S3 ce va fi folosită la încărcarea imaginilor." - s3_region: "Numele regional Amazon S3 ce va fi folosit la încărcarea imaginilor." - enable_flash_video_onebox: "Activează încastrarea adreselor swf și flv (Adobe Flash) în cutii. ATENȚIE: poate aduce riscuri de securitate." + purge_unactivated_users_grace_period_days: "Perioada grație (în zile) înainte ca un utilizator care nu și-a activat contul să fie șters." + enable_s3_uploads: "Pune încărcările pe spațiul Amazon S3. IMPORTANT: necesită un acces valid (atât identificatorul cheii de acces cât și cheia secretă)." + s3_use_iam_profile: 'Folosește rolul AWS EC2 IAM pentru retragerea cheilor. NOTĂ: activarea va suprascrie setările pentru "s3 access key id" și "s3 secret access key".' + s3_upload_bucket: "Numele găleții Amazon S3 unde vor fi încărcate fișierele. ATENȚIE: trebuie să fie scris cu litere mici, fără puncte și fără underscore." + s3_access_key_id: "Id cheie de acces Amazon S3 ce va fi folosit la încărcarea imaginilor." + s3_secret_access_key: "Cheie secretă de acces Amazon S3 ce va fi folosită la încărcarea imaginilor." + s3_region: "Numele regiunii Amazon S3 ce va fi folosit la încărcarea imaginilor." + s3_cdn_url: "URL-ul CDN care să fie folosit pentru toate resursele s3 (de exemplu: https://cdn.somewhere.com). ATENȚIE: după schimbarea acestui parametru trebuie regenerate toate postările existente." + avatar_sizes: "Lista mărimilor avatarurilor generate automat." + external_system_avatars_enabled: "Folosiți un serviciu extern de sisteme de avataruri" + external_system_avatars_url: "URL-ul serviciului extern de sisteme de avataruri. Înlocuirile permise sunt {username} {first_letter} {color} {size}" + default_opengraph_image_url: "URL-ul pentru imaginea implicită pentru Open Graph" + twitter_summary_large_image_url: "URL-ul pentru imaginea implicită pentru imaginea card cu rezumatul Twitter (trebuie să aibă minim 280px lățime și 150px înălțime)." + allow_all_attachments_for_group_messages: "Permite toate atașamentele de email pentru mesajele de grup." + convert_pasted_images_to_hq_jpg: "Convertiți imaginile lipite în fișiere JPG de înaltă calitate." + convert_pasted_images_quality: "Calitatea fișierului JPG convertit (1 este cea mai slabă calitate, 100 este cea mai bună calitate)." + enable_flash_video_onebox: "Activează încastrarea adreselor swf și flv (Adobe Flash) în onebox. ATENȚIE: poate aduce riscuri de securitate." default_invitee_trust_level: "Nivelul de încredere implicit (0-4) pentru utilizatorii invitați." - min_trust_to_create_topic: "Nivelul de încredere minim necesar pentru a creea o discuție nouă." + default_trust_level: "Nivelul de încredere implicit (0-4) pentru toți noi utilizatori. ATENȚIE! Schimbarea acestui parametru crește serios riscul de spam." + tl1_requires_topics_entered: "Câte subiecte trebuie să posteze un utilizator nou înainte să fie promovat la nivelul de încredere 1." + tl1_requires_read_posts: "Câte postări trebuie să citească un utilizator nou înainte să fie promovat la nivelul de încredere 1." + tl1_requires_time_spent_mins: "Câte minute trebuie să petreacă un utilizator nou citind postări înainte să fie promovat la nivelul de încredere 1." + tl2_requires_topics_entered: "Câte subiecte trebuie să posteze un utilizator înainte să fie promovat la nivelul de încredere 2." + tl2_requires_read_posts: "Câte postări trebuie să citească un utilizator înainte să fie promovat la nivelul de încredere 2." + tl2_requires_time_spent_mins: "Câte minute trebuie să petreacă un utilizator citind postări înainte să fie promovat la nivelul de încredere 2." + tl2_requires_days_visited: "Câte zile trebuie să viziteze un utilizator site-ul înainte să fie promovat la nivelul încredere 2." + tl2_requires_likes_received: "Câte aprecieri trebuie să primească un utilizator înainte să fie promovat la nivelul încredere 2." + tl2_requires_likes_given: "Câte aprecieri trebuie să acorde un utilizator înainte să fie promovat la nivelul încredere 2." + tl2_requires_topic_reply_count: "La câte subiecte trebuie să răspundă un utilizator înainte să fie promovat la nivelul de încredere 2." + tl3_time_period: "Cerințele (în zile) cu privire la perioada de timp pentru nivelul de încredere 3" + tl3_requires_days_visited: "Numărul minim de zile pe care un utilizator trebuie să le fi petrecut vizitând site-ul în ultimele (tl3 time period) zile pentru ase califica la promovarea la nivelul de încredere 3. Setați o valoare mai mare decât perioada de timp pentru nivelul de încredere 3 pentru a dezactiva promovarea la nivelul de încredere 3 (0 sau mai mult)" + tl3_requires_topics_replied_to: "Numărul minim de subiecte la care trebuie să răspundă un utilizator în ultimele (tl3 time period) zile pentru a se putea califica la promovarea la nivelul de încredere 3. (0 sau mai mult)." + tl3_requires_topics_viewed: "Procentul de subiecte create în ultimele (tl3 time period) zile pe care un utilizator trebuie să le fi vizualizat pentru a se califica la promovarea la nivelul de încredere 3. (0 la 100)" + tl3_requires_topics_viewed_cap: "Numărul maxim necesar de subiecte vizualizate în ultimele (tl3 time period) zile." + tl3_requires_posts_read: "Procentul de postări create în ultimele (tl3 time period) zile pe care un utilizator trebuie să le vizualizeze pentru a fi promovat la nivelul de încredere 3. (0 la 100)" + tl3_requires_posts_read_cap: "Numărul maxim necesar de postări citite în ultimele (tl3 time period) ziile." + tl3_requires_topics_viewed_all_time: "Numărul minim de subiecte pe care un utilizator trebuie să le vizualizeze pentru a fi promovat la nivelul de încredere 3." + tl3_requires_posts_read_all_time: "Numărul minim de postări pe care un utilizator trebuie să le citească pentru a fi promovat la nivelul de încredere 3." + tl3_requires_max_flagged: "Utilizatorul trebuie să nu fi citit mai mult de x postări marcate cu marcaje de avertizare de x utilizatori în ultimele (tl3 time period) zile pentru a fi promovat la nivelul de încredere 3, unde x este valoarea acestei setări. (0 lau mai mult)" + tl3_promotion_min_duration: "Numărul minim de zile cât durează promovarea la nivelul de încredere 3, înainte ca utilizatorul să fie retrogradat la nivelul de încredere 2." + tl3_requires_likes_given: "Numărul minim de aprecieri care trebuie să fie acordate în ultimele (tl3 time period) zile pentru promovarea la nivelul de încredere 3." + tl3_requires_likes_received: "Numărul minim de aprecieri care trebuie să fie primite în ultimele (tl3 time period) zile pentru promovarea la nivelul de încredere 3." + tl3_links_no_follow: "Nu scoate parametrul rel=nofollow din linkurile postate de utilizatori cu nivelul de încredere 3." + min_trust_to_create_topic: "Nivelul de încredere minim necesar pentru a crea un subiect nou." min_trust_to_edit_wiki_post: "Nivelul de încredere minim necesar pentru a edita o postare marcată ca wiki." - newuser_max_links: "Câte adrese poare un utilizator nou adauga la o postare." - newuser_max_images: "Câte imagini poate un utilizator nou adauga la o postare." - newuser_max_attachments: "Câte atașamente poate un utilizator nou adauga la o postare." - newuser_max_mentions_per_post: "Numărul maxim de notificări de @nume poate folosii un utilizator nou într-o postare." - newuser_max_replies_per_topic: "Numărul maxim de răspunsuri un utilizator nou poate adăuga într-o singură discuție până când cineva le răspunde." - max_mentions_per_post: "Numărul maxim de notificări de @nume oricine poate folosii într-o postare." - create_thumbnails: "Creează previzualizari de tipul thumbnail și lightbox ale imaginilor ce sunt prea mari să încapă într-o postare." + min_trust_to_allow_self_wiki: "Nivelul de încredere minim necesar pentru transformarea propriilor mesaje în wiki." + min_trust_to_send_messages: "Nivelul minim de încredere necesar pentru a crea noi mesaje private." + newuser_max_links: "Câte linkuri poate adăuga un nou utilizator într-o postare." + newuser_max_images: "Câte imagini poate adăuga un nou utilizator într-o postare." + newuser_max_attachments: "Câte atașamente poate adăuga un nou utilizator într-o postare." + newuser_max_mentions_per_post: "Numărul maxim de notificări @nume pe care le poate folosi un nou utilizator într-o postare." + newuser_max_replies_per_topic: "Numărul maxim de răspunsuri pe care un utilizator nou le poate adăuga într-un singur subiect înainte ca cineva să răspundă." + max_mentions_per_post: "Numărul maxim de notificări de @nume pe are le poate folosi oricine într-o postare." + max_users_notified_per_group_mention: "Numărul maxim de utilizatori care pot primi o notificare dacă un grup este menționat (dacă pragul este atins, nici o notificare nu va fi trimisă)" + create_thumbnails: "Creează previzualizări de tipul thumbnail și lightbox ale imaginilor ce sunt prea mari să încapă într-o postare." email_time_window_mins: "Așteaptă (n) minute până să trimiți orice email de notificare, pentru a da utilizatorilor șansa să-și editeze și să-și finalizeze postările." - email_posts_context: "Câte răspunsuri precedente să fie incluse ca context în email-urile de notificare." - flush_timings_secs: "Cât de frecvent se resetează timpul de pe server, în secunde." - title_min_entropy: "Minimul de entropie (caractere unice, non-engelze ce definesc mai multe elemente) necesară pentru un titlu de discuție." - body_min_entropy: "Minimul de entropie (caractere unice, non-engleze ce definesc mai multe elemente) necesară pentru conținutul unei postari." - title_fancy_entities: "Convertește caracterele ASCII cunoscute în entități HTML în titluri de discuție, ex SmartyPants http://daringfireball.net/projects/smartypants/" - min_title_similar_length: "Lungimea minimă a unui titlu înainte să fie verificat pentru discuții similare." - min_body_similar_length: "Lungimea minimă a conțin utului unei postări până să fie verificată pentru discuții similare." - category_colors: "O listă de culori în sistemul hexadecimal permise pentru categorii." + private_email_time_window_seconds: "Așteaptă (n) secunde înainte de a trimite orice emailuri de notificare privată, pentru a-i da utilizatorului șansa să își editeze sau finalizeze mesajele." + email_posts_context: "Câte răspunsuri precedente să fie incluse drept context în email-urile de notificare." + flush_timings_secs: "Cât de frecvent se resetează datele legate de timp de pe server, în secunde." + title_max_word_length: "Numărul maxim de caractere din titlul unui subiect." + title_min_entropy: "Minimul de entropie (exprimată în număr de caractere unice, cele non-englezești contând ca mai multe caractere) necesară pentru un titlu de subiect." + body_min_entropy: "Entropia minimă (caractere unice, cele ne-englezești contează mai mult) necesară în conținutul unei postări." + allow_uppercase_posts: "Permite toate caracterele majuscule în titlul subiectului sau în conținutul postării." + title_fancy_entities: "Convertește caracterele ASCII cunoscute în entități HTML în titluri de subiect, ex SmartyPants http://daringfireball.net/projects/smartypants/" + min_title_similar_length: "Lungimea minimă a unui titlu înainte să fie verificat pentru subiecte similare." + min_body_similar_length: "Lungimea minimă a conținutului unei postări până să fie verificată pentru subiecte similare." + desktop_category_page_style: "Stil vizual pentru pagina /categories ." + category_colors: "O listă hexazecimală de valori de culori permise pentru categorii." + category_style: "Stil vizual pentru categoria ecusoane." max_image_size_kb: "Mărimea maximă a unei imagini încărcate în kB. Aceasta trebuie configurată în nginx (client_max_body_size) / apache sau proxy." - max_attachment_size_kb: "arimea maximă a unui atașament de fișiere încărcate în Kb. Aceasta trebuie configurata în nginx (client_max_body_size) / apache sau proxy." - authorized_extensions: "O listă de extensii de fișiere permise pentru încărcare (folosiți '*' to pentru activarea tuturor tipurilor de fișiere)" - max_similar_results: "Câte discuții similare vor fi afișate atunci când se începe o discuție nouă? Comparația se face pe titlu și pe conținut." - title_prettify: "Preveniți greșelile comune și erorile , incluzând toate majuscule, literă mică pentru primul caracter, multtiple ! și ?, extra . la sfârșit, etc." - topic_views_heat_low: "După atât de multe vizualizări, discuția este parțial luminată." - topic_views_heat_medium: "După atât de multe vizualizări, discuția este moderat luminată." - topic_views_heat_high: "După atât de multe vizualizări, discuția este puternic luminată." - faq_url: "Dacă aveți un FAQ găzduit în altă parte pe care doriți să-l folosiți, postați întregul URL aici." - tos_url: "Dacă aveți un document Termeni și condiții găzduit în altă parte pe care doriți să-l folosiți, postați întregul URL aici." - privacy_policy_url: "Dacă aveți un document de Politica de Confidențialitate găzduit în altă parte, pe care a-ți dorii să-l folosiți, postați întregul URL aici." - white_listed_spam_host_domains: "O listă de domenii exclusă pentru testarea spam. Utilizatorii nu vor fi niciodată restricționați în a crea postări cu adrese către aceste domenii." - staff_like_weight: "Cat de mare este factorul de adaos pentru a trimite aprecieri personalului." - levenshtein_distance_spammer_emails: "Când se face potrivirea email-urilor spam, numărul de caractere diferite care permit o potrivire aproximată." - reply_by_email_enabled: "Activează răspunsurile către discuții prin email." - reply_by_email_address: "Șablonul pentru răspunsuri prin email la email-urile de venire, de exemeplu: %{reply_key}@reply.example.com sau răspunsuri+%{reply_key}@example.com" - email_prefix: "[Eticheta] e folosită în subiectul email-ului. Va fi din oficiu \"titlul\" dacă nu este modificată." - email_site_title: "Titlul site-ului folosit ca expeditor de email-uri trimsie de site. Din oficiu ca 'titlu' dacă nu este setat. Dacă 'titlul' conține caractere care nu sunt permise în email , folosiți această setare." - minimum_topics_similar: "Câte discuții este nevoie să existe până ce câmpul discuții similare este prezent când se compune o discuție nouă." - relative_date_duration: "Numărul de zile după postare când datele de postare vor fi relative (7z) în loc de absolute (20 Feb)." - delete_user_max_post_age: "Nu permite ștergerea utilizatorilor ale căror prima postare e mai veche de (x) de zile." - delete_all_posts_max: "Numărul maxim de postări ce pot fi șterse deodată folosind butonul Șterge toate postările. Dacă un utilizator are mai multe postări decât această valoare, postările nu pot fi șterse toate odată și utilizatorul nu poate fi șters." + max_attachment_size_kb: "Mărimea maximă a unui atașament de fișiere încărcate în Kb. Aceasta trebuie configurata în nginx (client_max_body_size) / apache sau proxy." + authorized_extensions: "O listă de extensii de fișiere permise la încărcare (folosiți '*' pentru activarea tuturor tipurilor de fișiere)" + max_similar_results: "Câte subiecte similare vor fi afișate deasupra editorului atunci când se compune un subiect nou. Comparația se face după titlu și pe conținut." + title_prettify: "Previn-o greșelile comune și erorile , incluzând toate majuscule, literă mică pentru primul caracter, multtiple ! și ?, extra . la sfârșit, etc." + topic_views_heat_low: "După acest număr de vizualizări, câmpul vizualizări este ușor evidențiat." + topic_views_heat_medium: "După acest număr de vizualizări, câmpul vizualizări este moderat evidențiat." + topic_views_heat_high: "După acest număr de vizualizări, câmpul vizualizări este puternic evidențiat." + cold_age_days_low: "După acest număr de zile de conversație, data ultimei activități este ușor estompată." + cold_age_days_medium: "După acest număr de zile de conversație, data ultimei activități este moderat estompată." + cold_age_days_high: "După acest număr de zile de conversație, data ultimei activități este puternic estompată." + history_hours_low: "Numărul de ore în cadrul cărora o postare editată are indicatorul de editare ușor pus în evidență." + history_hours_medium: "Numărul de ore în cadrul cărora o postare editată are indicatorul de editare moderat pus în evidență." + history_hours_high: "Numărul de ore în cadrul cărora o postare editată are indicatorul de editare puternic pus în evidență." + topic_post_like_heat_low: "După ce raportul aprecieri/postare depășește această valoare, câmpul contor de postări va fi ușor pus în evidență." + topic_post_like_heat_medium: "După ce raportul aprecieri/postare depășește această valoare, câmpul contor de postări va fi moderat pus în evidență." + topic_post_like_heat_high: "După ce raportul aprecieri/postare depășește această valoare, câmpul contor de postări va fi puternic pus în evidență." + faq_url: "Dacă ai un FAQ găzduit în altă parte pe care dorești să-l folosești, postează-i întregul URL aici." + tos_url: "Dacă ai un document Condițiile generale de utilizare găzduit în altă parte pe care dorești să-l folosești, postează-i întregul URL aici." + privacy_policy_url: "Dacă ai un document cu Politica de Confidențialitate găzduit în altă parte, pe care dorești să-l folosești, postează-i întregul URL aici." + newuser_spam_host_threshold: "De câte ori poate un utilizator nou să posteze un link către aceeași gazdă în limita de `newuser_spam_host_threshold` postări înainte ca să fie considerat spam." + white_listed_spam_host_domains: "O listă de domenii excluse de la testarea gazdelor spam. Noii utilizatori nu vor fi niciodată restricționați să creeze postări cu linkuri către aceste domenii." + staff_like_weight: "Ce pondere adițională să aibă aprecierile de la membrii echipei." + topic_view_duration_hours: "Contorizează încă o vizualizare a unui subiect nou o singură dată per IP/Utilizator la fiecare N ore." + user_profile_view_duration_hours: "Contorizează câte vizualizare de profil utilizator o singură dată per IP/Utilizator la fiecare N ore" + levenshtein_distance_spammer_emails: "Când se face detectarea spam pe bază de potrivire cu un set de criterii, care este diferența de numere de caractere care încă mai permite o potrivire aproximativă (fuzzy match)." + max_new_accounts_per_registration_ip: "Dacă există deja (n) conturi cu nivelul de încredere 0 de la acest IP (și nici unul nu este un membru al echipei sau la NÎ2 sau mai mare), blochează acceptarea de noi înregistrări de la acest IP." + min_ban_entries_for_roll_up: "Când apeși pe butonul Consolidare, dacă există cel puțin (N) înregistrări, se va crea o nouă înregistrare de subrețea blocată" + max_age_unmatched_emails: "Șterge înregistrările emailurilor verificate, care nu corespund, după (N) zile." + max_age_unmatched_ips: "Șterge adresele de IP verificate, care nu corespund, după (N) zile." + num_flaggers_to_close_topic: "Numărul minim de marcaje de avertizare unice care este necesar pentru a suspenda un subiect în vederea intervenției." + num_flags_to_close_topic: "Numărul minim de marcaje de avertizare active care este necesar pentru a suspenda un subiect în vederea intervenției" + auto_respond_to_flag_actions: "Activează răspunsul automat la gestionarea unui marcaj de avertizare." + min_first_post_typing_time: "Durata de timp minima în milisecunde cât este nevoie ca un utilizator să tasteze la prima postare, dacă acest prag nu este atins postarea va intra automat în coada mesajelor care necesită aprobare. Valoarea 0 dezactivează (nerecomandat)" + auto_block_fast_typers_on_first_post: "Blochează automat utilizatorii care nu întrunesc min_first_post_typing_time" + auto_block_fast_typers_max_trust_level: "Nivelul maxim de încredere pentru a-i auto bloca pe cei care scriu rapid la tastatură" + auto_block_first_post_regex: "Un regex care nu ține cont de majuscule și minuscule va determina prima postare a utilizatorului să fie blocată și trimisă în coada de aprobare. Exemplu: raging|a[bc]a va determina toate postările care conțin raging sau aba sau aca să fie blocate din prima. Se aplică doar la prima postare." + reply_by_email_enabled: "Activează răspunsurile către subiecte prin email." + reply_by_email_address: "Șablon pentru răspuns prin email de intrare, de exemplu: %{reply_key}@reply.example.com sau răspunsuri+%{reply_key}@example.com" + alternative_reply_by_email_addresses: "Listă de șabloane alternative pentru adresele de email primite cu răspunsuri prin email. Exemplu: %{reply_key}@reply.example.com|replies+%{reply_key}@example.com" + incoming_email_prefer_html: "Folosește HTML în loc de text pentru emailurile primite. Poate provoca anumite probleme de formatare neașteptate!" + disable_emails: "Oprește Discourse să trimite absolut orice fel de emailuri" + strip_images_from_short_emails: "Scoate imaginile din emailurile care au mai puțin de 2800 de Bytes" + short_email_length: "Lungime de email scurt în Bytes" + display_name_on_email_from: "Afișează numele complete în câmpul From din email" + unsubscribe_via_email: "Permite utilizatorilor să se dezaboneze de la emailuri prin trimiterea unui email cu cuvântul 'unsubscribe' în subiect sau în corpul mesajului." + unsubscribe_via_email_footer: "Include un link de dezabonare prin email mailto: în partea de jos a emailurilor trimise." + delete_email_logs_after_days: "Șterge rapoartele dupa (N) zile. 0 pentru a le ține nedeterminat. " + max_emails_per_day_per_user: "Numărul maxim de emailuri de trimis utilizatorilor pe zi. 0 pentru a dezactiva limita" + enable_staged_users: "Creează în mod automat utilizatori în așteptare pe parcursul procesării emailurilor primite." + maximum_staged_users_per_email: "Numărul maxim de utilizatori în așteptare creați la procesarea unui email primit." + auto_generated_whitelist: "Lisă de adrese de email care nu vor fi verificate dacă au conținut autogenerat. Exemplu: foo@bar.com|discourse@bar.com" + block_auto_generated_emails: "Blochează emailurile care sunt identificate ca fiind auto-generate." + ignore_by_title: "Ignoră emailurile care sosesc, pe baza titlurilor lor." + mailgun_api_key: "Cheie API secretă pentru Mailgun folosită la verificarea mesajelor webhook." + soft_bounce_score: "Rata de ricoșeu adăugată unui utilizator atunci când se produce un ricoșeu temporar." + hard_bounce_score: "Rata de ricoșeu adăugată unui utilizator atunci când se produce un ricoșeu permanent." + bounce_score_threshold: "Rata maximă de ricoșeu înainte să nu îi mai trimitem emailuri utilizatorului." + bounce_score_threshold_deactivate: "Rata maximă de ricoșeu înainte să dezactivăm utilizatorul." + reset_bounce_score_after_days: "Resetează automat rata de ricoșeu după X zile." + attachment_content_type_blacklist: "Lista cuvintelor cheie folosite pentru filtrarea atașamentelor în funcție de tipul de conținut." + attachment_filename_blacklist: "Lista cuvintelor cheie folosite la filtrarea atașamentelor în funcție de numele fișierului." + manual_polling_enabled: "Trimite emailuri folosind API-ul pentru răspunsuri prin email." + pop3_polling_enabled: "Folosește POP3 pentru răspunsuri prin email." + pop3_polling_ssl: "Folosește SSL pentru conexiunile cu serverul POP3. (Recomandat)" + pop3_polling_period_mins: "Prioada în minute între fiecare verificare a contului POP3 pentru emailuri. NOTA: necesită restart." + pop3_polling_port: "Portul pentru retragerea emailurilor din contul POP3." + pop3_polling_host: "Gazda pentru retragerea emailurilor prin POP3." + pop3_polling_username: "Numele de utilizator al contului POP3 pentru retragerea emailurilor." + pop3_polling_password: "Parola contului de POP3 pentru retragerea emailurilor." + log_mail_processing_failures: "Înregistrează toate erorile de procesare la http://yoursitename.com/logs" + email_in: "Permite utilizatorilor să posteze noi subiecte prin email (necesită retragere de emailuri prin POP3). Configurează adresa în tab-ul \"Setări\" al fiecărei categorii." + email_in_min_trust: "Nivelul minim de încredere de care are nevoie un utilizator pentru a i se permite să posteze noi subiecte prin email." + email_prefix: "[Eticheta] e folosită în subiectul email-ului. Implicit va fi \"titlul\", dacă nu este setată altfel." + email_site_title: "Titlul site-ului folosit ca expeditor de email-uri trimise de site. Implicit va fi 'titlu', dacă nu este setat altfel. Dacă 'titlul' conține caractere care nu sunt permise în email, folosiți această setare." + minimum_topics_similar: "Câte subiecte este nevoie să existe deja până ce câmpul subiecte similare este prezent când se compune o discuție nouă." + relative_date_duration: "Numărul de zile după crearea unei postări cât data postării vor sta afișată în format relativ (7z) în loc de format absolut (20 Feb)." + delete_user_max_post_age: "Nu permite ștergerea utilizatorilor a căror prima postare e mai veche de (x) de zile." + delete_all_posts_max: "Numărul maxim de postări ce pot fi șterse deodată folosind butonul Șterge toate postările. Dacă un utilizator are mai multe postări decât această valoare, postările sale nu pot fi șterse dintr-o dată și utilizatorul nu poate fi șters." username_change_period: "Numărul de zile după înregistrare în care conturile își pot schimba numele de utilizator (0 la nu permite schimbarea numelui de utilizator)." - email_editable: "Permite utilizatorilor să schimbe propria adresa de email după înregistrare." - automatically_download_gravatars: "Descarcă Gravatare pentru utilizatori la crearea contului sau schimbarea email-ului." - max_daily_gravatar_crawls: "Numărul maxim de verificări făcute de Discourse pentru existența unui gravatar preferențial într-o zi" + email_editable: "Permite utilizatorilor să își schimbe adresa de email după înregistrare." + logout_redirect: "URL-ul spre care să fie redirecționat browserul după ieșire (ex: http://somesite.com/logout)" + allow_uploaded_avatars: "Permite utilizatorilor să încarce o poze de profil personalizate." + allow_animated_avatars: "Permite utilizatorilor să folosească gif-uri animate în pozele de profil. ATENȚIE: după schimbarea acestei opțiuni trebuie să lansezi un rake task specific, respectiv - avatars:refresh " + allow_animated_thumbnails: "Generează thumbnails animate pentru gif-uri animate." + default_avatars: "URL-urile avatarelor care vor fi folosite implicit pentru noii utilizatori până ce aceștia le vor schimba." + automatically_download_gravatars: "Descarcă Gravatare pentru utilizatori după crearea contului sau schimbarea email-ului." + digest_topics: "Numărul maxim de subiecte care să fie afișat în emailul-rezumat." + digest_min_excerpt_length: "Lungimea minimă (în caractere) a extraselor de postări, ce vor fi incluse în emailul-rezumat." + delete_digest_email_after_days: "Nu trimite emailuri-rezumat utilizatorilor care nu au fost văzuți pe site de mai mult de (n) zile." + digest_suppress_categories: "Nu include aceste categorii în emailurile-rezumat." + disable_digest_emails: "Dezactivează emailurile-rezumat pentru toți utilizatorii." + detect_custom_avatars: "Dacă sau nu să verifice dacă utilizatorii și-au încărcat poze de profil personalizate." + max_daily_gravatar_crawls: "Numărul maxim zilnic de verificări pe care Discourse le va face pe Gravatar pentru a vedea dacă există avatare personalizate." + public_user_custom_fields: "O listă albă cu câmpuri personalizate pentru utilizator, ce se pot afișa public." + staff_user_custom_fields: "O listă albă cu câmpuri personalizate pentru utilizator care pot fi vizualizate de membrii echipei." + enable_user_directory: "Furnizează un „carte de telefon” cu utilizatorii" + allow_anonymous_posting: "Permite utilizatorilor să comute pe modul anonim" + anonymous_posting_min_trust_level: "Nivelul minim de încredere necesar pentru a putea activa postarea anonimă." + anonymous_account_duration_minutes: "Pentru protejarea anonimității, creează un nou cont anonim la fiecare N minute pentru fiecare utilizator. Exemplu: dacă e setat la 600, imediat ce au trecut 600 de minute de la ultima postare ȘI utilizatorul a comutat pe anonim, va fi creat un nou cont anonim." + hide_user_profiles_from_public: "Dezactivează cardurile, profilurile și „cartea de telefon” pentru utilizatorii anonimi." allow_profile_backgrounds: "Permite utilizatorilor să încarce fundaluri de profil." - enable_mobile_theme: "Dispozitivele mobile folosesc o temă cu abilitatea de a schimba la întregul site. Dezactivați pentru a folosii un foiae de stil preferențiala ce este total compatibilă." - dominating_topic_minimum_percent: "Ce procent din postări într-o discuție trebuie să facă un utilizator înainte de ai fi amintit că domină discuția." - suppress_uncategorized_badge: "Nu arăta insigna pentru discuțiile fără categorie în lista de discuții." - global_notice: "Arata un banner GLOBAL ,de URGENȚĂ pentru notificarea tuturor vizitatorilor, lasă nebifat pentru a-l ascunde (HTML permis)." - disable_edit_notifications: "Folosit la dezactivarea notificărilor de editare când se activează funcția 'downloadeaya_imagini_legatură_local' din setările siteului." - display_name_on_posts: "Arată numele complet al utilizatorului pe postare adițional @numelui de utilizator." - invites_per_page: "Invitațiile din oficiu sunt arătate pe pagina utilizatorului." - short_progress_text_threshold: "După ce numărul de postări într-o discuție e mai mare decât acest număr, bară de progres va afișa doar numărul postări. Dacă schimbați lățimea barei de progres, va fi nevoie să schimbați valoarea." - default_code_lang: "Sintaxa de limbaj de programare aplicată la blocarea de cod GitHub (limba-auto, ruby, python etc.)" - warn_reviving_old_topic_age: "Când cineva răspunde la o discuție unde ultimul răspuns e mai vechi decât atâtea zile, un mesaj va fi arătat. dezactivați prin alegerea cifrei 0." - autohighlight_all_code: "Forțează aplicarea de iluminat cod către toate preformatările de blocări de cod chiar când este explicit specificată limba." - feed_polling_enabled: "DOAR ÎNCORPOREAZĂ: Să încorporeze un RSS/ATOM ca postare." - feed_polling_url: "DOAR ÎNCORPOREAZĂ: URL de RSS/ATOM să încorporeze." - embed_by_username: "Utilizatorul care creează subiecte embedded." - embed_username_key_from_feed: "Discourse username of the user who creates the embedded topics.." - embed_truncate: "Truncate the embedded posts." - embed_post_limit: "Numărul maxim de postări de încorporat." + sequential_replies_threshold: "Numărul de postări succesive pe care un utilizator trebuie sa le facă într-un subiect înainte să i se reamintească că a postat un număr excesiv de postări succesive." + enable_mobile_theme: "Dispozitivele mobile folosesc o temă cu abilitatea de a schimba la întregul site. Dezactivează pentru a folosi o foiae de stil personalizată ce este total responsivă." + dominating_topic_minimum_percent: "Ce procent din postările unui subiect trebuie să scrie un utilizator înainte de i se aminti că domină excesiv subiectul." + disable_avatar_education_message: "Dezactivează mesajul educațional pentru schimbarea avatarului." + suppress_uncategorized_badge: "Nu arăta ecusonul pentru subiectele fără categorie în lista de subiecte." + permalink_normalizations: "Aplică următorul regex înainte de a detecta permalink-urile, de exemplu: /(topic.*)\\?.*/\\1 va elimina șirurile de interogare din căile subiectelor. Formatul este regex+șir folosește \\1 etc.pentru a capturarea secvențelor" + global_notice: "Afișează o notificare de tip banner global URGENT, URGENȚĂ pentru toți vizitatori, lasă gol pentru a-l ascunde (HTML permis)." + disable_edit_notifications: "Deactivează editarea notificărilo de către utilizator atunci când setarea 'download_remote_images_to_local' este activată." + automatically_unpin_topics: "Desprinde automat subiecte când utilizatorul ajunge la sfârșitul paginii." + read_time_word_count: "Contor de cuvinte pe minut pentru calcularea timpului estimat de citire." + topic_page_title_includes_category: "Titlul paginii subiectului include un nume de categorie." + full_name_required: "Numele întreg este un câmp obligatoriu în profilul utilizator." + enable_names: "Afișează numele întreg al utilizatorului în profilul său, în cardul utilizator și în emailuri. Dezactivează pentru ascunde numele peste tot." + display_name_on_posts: "Arată atât numele complet cât și numele de utilizator în postări." + show_time_gap_days: "Dacă două postări sunt create la acest număr de zile distantă una de alta, afișează decalajul în subiect." + invites_per_page: "Invitațiile implicite sunt afișate pe pagina utilizatorului." + short_progress_text_threshold: "După ce numărul de postări într-un subiect devine mai mare decât acest număr, bara de progres va afișa doar numărul postării curente. Dacă schiimbi lățimea barei de progres, va trebui să schimbi această valoare." + default_code_lang: "Evidențierea de sintaxa de limbaj de programare aplicată implicit blocurilor de cod GitHub (lang-auto, Ruby, Python etc.)" + warn_reviving_old_topic_age: "Când cineva răspunde la un subiect unde ultimul răspuns e mai vechi decât atâtea zile, va fi afișată o avertizare. Dezactivează prin alegerea cifrei 0." + autohighlight_all_code: "Forțează aplicarea de punere în evidență cod pe toate blocurile de cod preformatate, chiar și atunci când nu le este explicit specificată limba." + highlighted_languages: "Regulile e evidențiere sintactică. (Atenție: includerea de prea multe limbaje va avea un impact asupra performanței) vezi: https://highlightjs.org/static/demo/ pentru un demo" + feed_polling_enabled: "EXCLUSIV ÎNCORPORARE: Dacă să încorporeze un flux RSS/ATOM ca postări." + feed_polling_url: "EXCLUSIV ÎNCORPORARE: URL fluxului RSS/ATOM care să fie încorporat." + embed_by_username: "Numele utilizator Discourse al utilizatorului care creează subiecte embedded." + embed_username_key_from_feed: "Cheie pentru extragerea numelui utilizator din flux." + embed_title_scrubber: "Expresie regulată pentru curățarea titlurile integrabile." + embed_truncate: "Retează postările încorporate." + embed_post_limit: "Numărul maxim de postări care să fie încorporate." + embed_username_required: "Numele utilizator pentru acest subiect este obligatoriu." embed_whitelist_selector: "Selector CSS pentru elementele ce sunt permise în încorporări." - embed_blacklist_selector: "Selector CSS pentru elementele ce sunt scoase din încorporări" - notify_about_flags_after: "Dacă sunt marcaje ce nu au fost aranjate după atâtea ore, Trimite un email la email-ul de contact . Setați 0 pentru a dezactiva." - enable_cdn_js_debugging: "Permite /rapoarte să afișeze erori adăugând permisiune crossorigin tuturor js-urilor incluse." - show_create_topics_notice: "Dacă site-ul are mai puțin de 5 discuții publice, afișează o notificare ce cere adminilor să creeze discuții." + embed_blacklist_selector: "Selector CSS pentru elementele ce sunt șterse din încorporări" + notify_about_flags_after: "Dacă sunt marcaje ce nu au fost aranjate după atâtea ore, trimite un email către email-ul de contact . Setează la 0 pentru a dezactiva." + enable_cdn_js_debugging: "Permite /logs să afișeze corect erorile adăugând permisiuni crossorigin pe toate js includes." + show_create_topics_notice: "Dacă site-ul are mai puțin de 5 subiecte publice, afișează o notificare ce cere adminilor să creeze subiecte." + delete_drafts_older_than_n_days: Șterge drafturile mai vechi de (n) zile. + bootstrap_mode_min_users: "Numărul minim de utilizatori necesar pentru dezactivarea modului bootstrap (0 pentru dezactivare)" + vacuum_db_days: "Rulează VACUUM ANALYZE pentru a recupera spațiul din baza de date după o migrare (0 pentru dezactivare)" + prevent_anons_from_downloading_files: "Blochează utilizatorii anonimi de la descărcarea de atașamente. ATENȚIE: aceasta va face ca toate resursele site-ului care sunt postate ca atașamente să nu mai meargă." + slug_generation_method: "Alege o metodă de generare de identificator. 'encodat' va genera șir de caractere encodate cu procentaje. 'nimic' va dezactiva complet identificatorii." enable_emoji: "Activează emoji" + emoji_set: "Cum ți-ar placea să fie emoji tăi?" + enforce_square_emoji: "Forțează un aspect pătrățos la toti emoji." + approve_post_count: "Numărul de postări de la un utilizator simplu trebuie să fie aprobat" + approve_unless_trust_level: "Postările utilizatorilor care au un nivel de încredere mai mic decât acesta trebuie să fie aprobate." + notify_about_queued_posts_after: "Dacă există postări care au așteptat să fie verificate mai mult decât atâtea ore, un email va fi trimis către contact_email. Setează la 0 pentru a dezactiva aceste emailuri." + auto_close_messages_post_count: "Numărul maxim de postări permise într-un mesaj privat înainte să fie închis automat (0 pentru dezactivare) " + auto_close_topics_post_count: "Numărul maxim de postări permise într-un subiect înainte ca acesta să fie închis automat (0 pentru dezactivare)" + code_formatting_style: "Butonul Cod din cadrul editorului va fi setat cu opțiunea implicită pe acest stil de formatare cod " + default_email_digest_frequency: "Frecvența implicită cu care utilizatorii primesc emailuri-rezumat." + default_include_tl0_in_digests: "Implicit, include postări de la utilizatori noi în emailurile-rezumat. Utilizatorii pot schimba această opțiune din preferințele lor." + default_email_private_messages: "Implicit, trimite un email atunci când cineva trimite un mesaj unui utilizator." + default_email_direct: "Implicit, trimite un mesaj când cineva citează/răspunde/menționează sau invită un utilizator." + default_email_mailing_list_mode: "Implicit, trimite un email pentru fiecare nou mesaj." + default_email_mailing_list_mode_frequency: "Implicit, utilizatorii care activează modul mailing list vor primi emailuri cu această frecvență." + disable_mailing_list_mode: "Ridică utilizatorilor permisiunea de a activa modul mailing list." + default_email_always: "Implicit, trimite o notificare prin email chiar și atunci când utilizatorul este activ." + default_email_previous_replies: "Implicit, include răspunsurile anterioare în emailuri." + default_email_in_reply_to: "Implicit, include în email un extras postarea căreia i se răspunde." + default_other_new_topic_duration_minutes: "Condiție implicită globală referitoare la durata timpului pentru care subiectul este considerat nou" + default_other_auto_track_topics_after_msecs: "Durata de timp implicită la nivel global înainte ca un subiect să fie urmărit în mod automat." + default_other_external_links_in_new_tab: "Implicit, deschide link-urile externe în taburi noi." + default_other_enable_quoting: "Implicit, activează citarea textului evidențiat." + default_other_dynamic_favicon: "Implicit, arată contorul de subiecte noi/actualizate în icoana browserului." + default_other_disable_jump_reply: "Implicit, nu sări la postarea utilizatorului după ce a răspuns." + default_other_like_notification_frequency: "Implicit, notifică utilizatorul la primirea de aprecieri." + default_topics_automatic_unpin: "Desprinde automat subiecte din țintuite la vîrf, atunci când utilizatorul ajunge la sfârșitul paginii." + default_categories_watching: "Implicit, listează categoriile care sunt urmărite în mod activ." + default_categories_tracking: "Implicit, listează categoriile care sunt urmărite." + default_categories_muted: "Implicit, listează categoriile care sunt setate pe silențios." + max_user_api_reqs_per_day: "Numărul maxim de interogări API utilizator pe cheie, pe zi. " + max_user_api_reqs_per_minute: "Numărul maxim de interogări API utilizator pe cheie, pe minut. " + allow_read_user_api_keys: "Permite generarea de chei API utilizator în mod exclusiv-citire." + allow_write_user_api_keys: "Permite generarea de chei API utilizator în mod scriere." + allow_push_user_api_keys: "Permite generarea de chei API utilizator pentru utilizarea serviciului push." + max_api_keys_per_user: "Numărul maxim de chei API utilizator pe utilizator" + min_trust_level_for_user_api_key: "Nivelul de încredere necesar pentru generarea de chei API utilizator" + allowed_user_api_auth_redirects: "URL permis pentru redirecționarea autentificării pentru cheile API utilizator " + allowed_user_api_push_urls: "URL-uri permise pentru serviciul push al serverului la API utilizator" + tagging_enabled: "Activează etichetele la subiecte?" + min_trust_to_create_tag: "Nivelul minim de încredere necesar pentru crearea unei etichete." + max_tags_per_topic: "Numărul maxim de etichete care pot fi aplicate unui subiect." + max_tag_length: "Numărul maxim de caractere care poate fi folosit într-o etichetă." + max_tag_search_results: "La căutarea de etichete, numărul maxim de rezultate care să fie afișat." + show_filter_by_tag: "Afișează un drop-down pentru filtrarea unei liste de subiecte după etichetă." + max_tags_in_filter_list: "Numărul maxim de etichete care să se afișeze într-un drop-down filtru. Vor fi afișate etichetele cele mai folosite." + tags_sort_alphabetically: "Afișează etichetele în ordine alfabetică. Implicit, etichetele sunt afișate în ordinea popularității." + tag_style: "Stil vizual pentru ecusoanele etichetă." + staff_tags: "O listă de etichete care nu poate fi aplicată decât de către membrii echipei." + min_trust_level_to_tag_topics: "Nivelul minim de încredere necesar pentru a pune etichete pe subiecte." + suppress_overlapping_tags_in_list: "Dacă etichetele corespund exact cu cuvintele din titlul subiectelor, nu mai afișa aceste etichete." + remove_muted_tags_from_latest: "Nu afișa în lista subiectelor recente, subiectele ce au fost etichetate cu etichete setate pe silențios" + company_short_name: "Numele firmei (scurt)" + company_full_name: "Numele firmei (întreg)" + company_domain: "Domeniul firmei" errors: invalid_email: "Adresa de email invalidă." - invalid_username: "Nu există utilizator cu acest nume de utilizator." + invalid_username: "Nu există nici un utilizator cu acest nume de utilizator." invalid_integer_min_max: "Valoarea trebuie să fie între %{min} și %{max}." invalid_integer_min: "Valoarea trebuie să fie %{min} sau mai mare." invalid_integer_max: "Valoarea nu poate fi mai mare de %{max}." invalid_integer: "Valoarea trebuie să fie un întreg." regex_mismatch: "Valoare nu se potrivește formatului cerut." + must_include_latest: "Meniul de sus trebuie să includă tab-ul \"recente\"." invalid_string: "Valoare invalidă." + invalid_string_min_max: "Trebuie să aibă între %{min} și %{max} caractere." + invalid_string_min: "Trebuie să aibă %{min} caractere." + invalid_string_max: "Nu trebuie să depășească %{max} caractere." + invalid_reply_by_email_address: "Valoarea trebuie să conțină '%{reply_key}' și să fie diferită de emailul de notificare." + invalid_alternative_reply_by_email_addresses: "Toate valorile trebuie să conțină '%{reply_key}' și să fie diferite de emailul de notificare." + pop3_polling_host_is_empty: "Trebuie să setezi „numele serverului de POP3” înainte să poți activa retragerea de emailuri prin POP3" + pop3_polling_username_is_empty: "Trebuie să setezi „numele utilizator pe serverul POP3” înainte să poți activa retragerea de emailuri prin POP3." + pop3_polling_password_is_empty: "Trebuie să setezi „parola pe serverul POP3” înainte să poți activa retragerea de emailuri prin POP3." + pop3_polling_authentication_failed: "Autentificarea POP3 a eșuat. Te rugăm să verifici detaliile din setările POP3." + reply_by_email_address_is_empty: "Trebuie să setezi o adresă pentru „răspunde prin email” înainte să poți activa răspunsul prin email." + email_polling_disabled: "Trebuie să setezi fie retragerea manuala fie cea prin POP3 înainte să activezi răspunsul prin email." + user_locale_not_enabled: "Trebuie să activezi întâi „permite locale utilizator” înainte de activa această setare." search: - within_post: "#%{post_number} după %{username}: %{excerpt}" + within_post: "#%{post_number} de %{username}:" types: category: 'Categorii' topic: 'Rezultate' user: 'Utilizatori' - original_poster: "Autorul Original" + sso: + not_found: "Contul tău nu a putut fi găsit. Te rugăm contactează administratorul site-ului." + account_not_approved: "Contul tău este în așteptarea aprobării. Vei primi un email de notificare imediat ce va fi aprobat." + unknown_error: "Există o problema legată de contul tău. Te rugăm contactează administratorul site-ului." + timeout_expired: "Autentificarea în cont a expirat, te rugăm să încerci din să te autentifici din nou." + original_poster: "Creatorul unui subiect" most_posts: "Cele mai multe postări" - most_recent_poster: "Cele mai recente postări" - frequent_poster: "postări frecvente" + most_recent_poster: "Cel mai recent autor" + frequent_poster: "Autor prodigios" redirected_to_top_reasons: - new_user: "Bine ați venit la comunitatea noastră! Aici sunt cele mai populare discuții." + new_user: "Bine ai venit în comunitatea noastră! Aici sunt cele mai populare subiecte." + not_seen_in_a_month: "Bun venit! Nu te-am mai văzut de ceva vreme. Aici sunt cele mai populare subiecte ce au apărut în timpul absenței tale." + merge_posts: + edit_reason: + one: "o postare fost adunată laolaltă de către %{username}" + few: "%{count} (de) postări au fost adunate laolaltă de către %{username}" + other: "%{count} (de) postări au fost adunate laolaltă de către %{username}" + errors: + different_topics: "Postările care aparțin unor subiecte diferite nu pot fi adunate laolaltă." + different_users: "Postările care aparțin unor utilizatori diferiți nu pot fi adunate laolaltă." + move_posts: + new_topic_moderator_post: + one: "o postare a fost mutată într-un nou subiect: %{topic_link}" + few: "%{count} (de) postări au fost mutate într-un nou subiect: %{topic_link}" + other: "%{count} (de) postări au fost mutate într-un nou subiect: %{topic_link}" + existing_topic_moderator_post: + one: "o postare a fost adunată laolaltă într-un subiect existent: %{topic_link}" + few: "%{count} (de) postări au fost adunate laolaltă într-un subiect existent: %{topic_link}" + other: "%{count} (de) postări au fost adunate laolaltă într-un subiect existent: %{topic_link}" change_owner: - post_revision_text: "Apartententa transferată de la %{old_user} la %{new_user}" + post_revision_text: "Autor schimbat din %{old_user} în %{new_user}" + deleted_user: "un utilizator șters" + emoji: + errors: + name_already_exists: "Ne pare rău, numele '%{name}' este deja folosit de un alt emoji." + error_while_storing_emoji: "Ne pare rău, a apărut o eroare la stocarea acestui emoji." topic_statuses: - archived_enabled: "Această discuție este acum arhiva. Este închetată și nu poate fi schimbată în niciun fel." - archived_disabled: "Această discuție este acum dezarhivată. Nu mai este înghețată și poate fi modificată." - closed_enabled: "Această discuție este închisă. Răspunsurile noi nu mai sunt permise." - closed_disabled: "Această discuție este acum deschisă. Răspunsurile noi sunt permise." - autoclosed_disabled: "Această discuție este deschisă. Răspunsurile noi sunt permise." - pinned_enabled: "Această discuție este fixă. Va apărea în vârful propriei categorii până când nu va mai fi fixată, de către personal pentru toată lumea, sau individual de către utilizatori pentru ei înșiși." - pinned_disabled: "Această discuție nu mai este fixată. Nu va mai apărea în topul propriei categorii." - pinned_globally_enabled: "Această discuție este acum fixată global. Va apărea în vârful listei de categorii până când nu va mai fi fixată, de către personal pentru toată lumea, sau individual de către utilizatori pentru ei înșiși ." - pinned_globally_disabled: "Această discuție nu mai este fixată. Nu va mai apărea în topul propriei categorii." - visible_enabled: "Această discuție este acum viziblă. Va fi afișată în lista discuțiilor." - visible_disabled: "Această discuție este acum invizibilă. Nu va mai apărea în nicio listă de discuții. Singura cale de acces va fi prin adresa directă." + archived_enabled: "Acest subiect este acum arhivat. Este înghețat și nu mai poate fi schimbat în nici un fel." + archived_disabled: "Acest subiect este acum dezarhivat. Nu mai este înghețat și poate fi modificat." + closed_enabled: "Acest subiect este acum închis. Nu mai sunt permise răspunsuri noi." + closed_disabled: "Acest subiect este acum deschis. Sunt permise răspunsuri noi." + autoclosed_message_max_posts: + one: "Acest mesaj va fi închis automat după ce atinge limita de maximă de un răspuns." + few: "Acest mesaj va fi închis automat după ce atinge limita de maximă de %{count} (de) răspunsuri." + other: "Acest mesaj va fi închis automat după ce atinge limita de maximă de %{count} (de) răspunsuri." + autoclosed_topic_max_posts: + one: "Acest subiect a fost închis automat după ce a atins limita maximă de un răspuns." + few: "Acest subiect a fost închis automat după ce a atins limita maximă de %{count} (de) răspunsuri." + other: "Acest subiect a fost închis automat după ce a atins limita maximă de %{count} (de) răspunsuri." + autoclosed_enabled_days: + one: "Acest subiect a fost închis automat după o zi. Nu mai sunt permise răspunsuri noi." + few: "Acest subiect a fost închis automat după %{count} (de) zile. Nu mai sunt permise răspunsuri noi." + other: "Acest subiect a fost închis automat după %{count} (de) zile. Nu mai sunt permise răspunsuri noi." + autoclosed_enabled_hours: + one: "Acest subiect a fost închis automat după o oră. Nu mai sunt permise răspunsuri noi." + few: "Acest subiect a fost închis automat după %{count} (de) ore. Nu mai sunt permise răspunsuri noi." + other: "Acest subiect a fost închis automat după %{count} (de) ore. Nu mai sunt permise răspunsuri noi." + autoclosed_enabled_minutes: + one: "Acest subiect a fost închis automat după un minut. Nu mai sunt permise răspunsuri noi." + few: "Acest subiect a fost închis automat după %{count} (de) minute. Nu mai sunt permise răspunsuri noi." + other: "Acest subiect a fost închis automat după %{count} (de) minute. Nu mai sunt permise răspunsuri noi." + autoclosed_enabled_lastpost_days: + one: "Acest subiect a fost închis automat după o zi de la primul răspuns. Nu mai sunt permise răspunsuri noi." + few: "Acest subiect a fost închis automat după %{count} (de) zile de la primul răspuns. Nu mai sunt permise răspunsuri noi." + other: "Acest subiect a fost închis automat după %{count} (de) zile de la primul răspuns. Nu mai sunt permise răspunsuri noi." + autoclosed_enabled_lastpost_hours: + one: "Acest subiect a fost închis automat după o oră de la primul răspuns. Nu mai sunt permise răspunsuri noi." + few: "Acest subiect a fost închis automat după %{count} (de) ore de la primul răspuns. Nu mai sunt permise răspunsuri noi." + other: "Acest subiect a fost închis automat după %{count} (de) ore de la primul răspuns. Nu mai sunt permise răspunsuri noi." + autoclosed_enabled_lastpost_minutes: + one: "Acest subiect a fost închis automat după un minut de la primul răspuns. Nu mai sunt permise răspunsuri noi." + few: "Acest subiect a fost închis automat după %{count} (de) minute de la primul răspuns. Nu mai sunt permise răspunsuri noi." + other: "Acest subiect a fost închis automat după %{count} (de) minute de la primul răspuns. Nu mai sunt permise răspunsuri noi." + autoclosed_disabled: "Acest subiect este acum deschis. Sunt permise răspunsuri noi." + autoclosed_disabled_lastpost: "Acest subiect este acum deschis. Sunt permise răspunsuri noi." + pinned_enabled: "Acest subiect este fixat. Va apărea în vârful listei de categorii până când echipa îl va dezactiva opțiunea de fixare pentru toată lumea odată, sau până când utilizatorii vor dezactiva opțiunea, individual, pentru ei înșiși." + pinned_disabled: "Acest subiect nu mai este fixat. Nu va mai apărea în vârful propriei categorii." + pinned_globally_enabled: "Acest subiect este acum fixat global. Va apărea în vârful listei de categorii până când echipa îi va dezactiva opțiunea de fixare pentru toată lumea odată, sau până când utilizatorii vor dezactiva opțiunea, individual, pentru ei înșiși." + pinned_globally_disabled: "Acest subiect nu mai este fixat. Nu va mai apărea în capul propriei categorii." + visible_enabled: "Acest subiect este acum vizibil. Va fi afișat în lista subiectelor." + visible_disabled: "Acest subiect este acum invizibil. Nu va mai apărea în nicio listă de subiecte. Singura cale de acces va fi prin link direct." login: - not_approved: "Contul dumneavoastră nu a fost aprobat încă. Veți fi notificat prin email când sunteți gata să vă autentificați." - incorrect_username_email_or_password: "Nume de utilizator incorect, email sau parola" - wait_approval: "Mulțumim pentru autentificare. Vă vom notifica când contul dumneavoastră a fost aprobat." - active: "Contul dvs a fost activat și e gata să fie folosit." - activate_email: "Sunteți aproape gata! Am trimis un email de activare către %{email}. Vă rugăm urmați instrucțiunile din email pentru a vă activa contul." - not_activated: "Nu vă puteți încă autentifica. Am trimis un email de autentificare către dumneavoastră.Vă rugăm urmați instrucțiunile din email pentru a vă activa contul." - suspended: "Nu vă puteți autentifica până la data de %{date}." + not_approved: "Contul tău nu a fost aprobat încă. Vei fi notificat prin email când ești gata să te autentifici." + incorrect_username_email_or_password: "Nume de utilizator, email sau parolă încorecte" + wait_approval: "Îți mulțumim pentru autentificare. Vă vom notifica când contul dumneavoastră a fost aprobat." + active: "Contul tău a fost activat și e gata să fie folosit." + activate_email: "Ești aproape gata! Am trimis un email de activare către %{email}. Te rugăm să urmezi instrucțiunile din email pentru a-ți activa contul." + not_activated: "Nu te poți încă autentifica. Ți-am trimis un email de autentificare. Te rugăm să urmezi instrucțiunile din email pentru a-ți activa contul." + not_allowed_from_ip_address: "Nu te poți conecta ca %{username} de la această adresa de IP." + admin_not_allowed_from_ip_address: "Nu te poți conecta ca administrator de la această adresa de IP." + suspended: "Nu te poți autentifica până la data de %{date}." + suspended_with_reason: "Acest cont este suspendat până la data de %{date}: %{reason}" errors: "%{errors}" - not_available: "Nu este valabil. Încercați %{suggestion}?" - something_already_taken: "Ceva nu a funcționat, poate numele de utilizator sau emailul este deja înregistrat. încercați opțiunea parola uitată." - omniauth_error_unknown: "Ceva a mers greșit la procesarea autentificării, vă rugăm încercați." - new_registrations_disabled: "Înregistrări de conturi noi nu sunt permise deocamdată." - password_too_long: "Parolă este limitată la 200 caractere." + not_available: "Nu este disponibil. Încearcă %{suggestion}?" + something_already_taken: "Ceva nu a funcționat, poate numele de utilizator sau emailul este deja înregistrat. Încearcă opțiunea parola uitată." + omniauth_error: "Ne pare rău, a apărut o eroare la autorizarea contului tău. Poate că nu ai aprobat autorizarea?" + omniauth_error_unknown: "Ceva a mers greșit la procesarea autentificării, te rugăm să încerci din nou." + authenticator_error_no_valid_email: "Nu este permisă nicio adresă de email asociată cu %{account}. Ar trebui să îți configurezi contul cu o adresă de email diferită." + new_registrations_disabled: "Înregistrarea de conturi noi nu este momentan permisă." + password_too_long: "Parole sunt limitate la 200 caractere." + email_too_long: "Adresa de email pe care ai introdus-o este prea lungă. Numele de căsuțe poștale nu trebuie să depășească 254 de caractere, și numele de domenii nu trebuie să depășească 253 de caractere." + reserved_username: "Acest nume utilizator nu este permis." + missing_user_field: "Nu ai completat toate câmpurile utilizatorului" + close_window: "Autentificarea este completă. Închide această fereastră pentru a continua." + already_logged_in: "Oops, se pare că încerci să accepți o invitație de la un alt utilizator. Dacă nu ești %{current_user}, te rugăm ieși și intră din nou." user: + no_accounts_associated: "Nu sunt conturi asociate" + deactivated: "A fost dezactivat din cauza pre a multor emailuri ricoșate la '%{email}'." username: short: "trebuie să fie cel puțin %{min} de caractere" - long: "nu trebuie să fie mai mult de %{max} caractere" + long: "trebuie să nu aibă mai mult de %{max} caractere" characters: "trebuie să includă doar numere, litere și underscor-uri" - unique: "trebuie să fie unice" - blank: "trebuie să fie completat" + unique: "trebuie să fie unic" + blank: "trebuie să fie prezent" + must_begin_with_alphanumeric_or_underscore: "trebuie să înceapă ci o literă, un număr sau un underscore" + must_end_with_alphanumeric: "trebuie să se termine cu o literă sau un număr" + must_not_contain_two_special_chars_in_seq: "trebuie să nu conțină o secvență de 2 sau mai multe caractere speciale (.-_)" + must_not_end_with_confusing_suffix: "trebuie să nu se termine cu un sufix interpretabil, ca de ex. .json, .png etc." email: - not_allowed: "nu este permis din partea acelui furnizor de servicii email. Vă rugăm folosiți altă adresă email." + not_allowed: "nu este permis din partea acelui furnizor de servicii email. Te rugăm folosește altă adresă email." blocked: "nu este permis." + revoked: "No se vor trimite emailuri către '%{email}' până la data de %{date}." + ip_address: + blocked: "Nu sunt permise noi înregistrări de la adresa ta de IP." + max_new_accounts_per_registration_ip: "Nu sunt permise noi înregistrări de la adresa ta de IP (limita maximă a fost atinsă). Contactează un membru al echipei." + flags_reminder: + flags_were_submitted: + one: "Au fost trimise marcaje de avertizare acum mai bine de o oră. Te rugăm, trece-le în revistă. " + few: "Au fost trimise marcaje de avertizare acum mai bine de %{count} (de) ore. Te rugăm, trece-le în revistă. " + other: "Au fost trimise marcaje de avertizare acum mai bine de %{count} (de) ore. Te rugăm, trece-le în revistă. " + subject_template: + one: "un marcaj de avertizare așteptând să fie gestionat" + few: "%{count} (de) marcaje de avertizare așteptând să fie gestionate" + other: "%{count} (de) marcaje de avertizare așteptând să fie gestionate" + unsubscribe_mailer: + subject_template: "Confirmă că nu mai vrei să primești actualizări pe email de la %{site_title}" + text_body_template: | + Cineva (posibil tu?) a cerut să nu mai fie trimise actualizări pe email de la %{site_domain_name} către această adresă. + Dacă dorești să confirmi, te rugăm dă click pe acest link: + %{confirm_unsubscribe_link} + + Dacă dorești să primești în continuare actualizări pe email, poți ignora acest mesaj. invite_mailer: - subject_template: "%{invitee_name} te-a invitat la '%{topic_title}' pe %{site_domain_name}" + subject_template: "%{invitee_name} te-a invitat la subiectul '%{topic_title}' pe %{site_domain_name}" text_body_template: | %{invitee_name} te-a invitat la o discuție @@ -971,117 +1445,857 @@ ro: la - > %{site_title} -- %{site_description} + > %{site_title} -- %{descriere_site} - Dacă sunteți interesat, click pe adresa dedesubt: + Dacă ești interesat, click pe adresa dedesubt: %{invite_link} - Aceasta invitație este de la un utilizator de încredere, deci puteți răspunde discuției cât mai curând. + Aceasta invitație este de la un utilizator de încredere, deci poți răspunde discuției de îndată ce dorești. + custom_invite_mailer: + subject_template: "%{invitee_name} te-a invitat la subiectul '%{topic_title}' pe %{site_domain_name}" + text_body_template: | + %{invitee_name} te-a invitat la o discuție + + > **%{topic_title}** + > + > %{topic_excerpt} + + pe + + > %{site_title} -- %{descriere_site} + + Mesaj de la %{invitee_name}: + + %{user_custom_message} + + Dacă te interesează, dă click pe link-ul de mai jos: + %{invite_link} + + 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 %{site_domain_name}" + 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: "Setaţi parolă pentru contul dvs. %{site_name}" + subject_template: "Setează parolă pentru contul tău %{site_name}" + text_body_template: | + Îți mulțumim că ai acceptat invitația pe %{site_name} -- bun venit! + + Acum dă click pe acest link pentru a-ți alege o parolă: + %{base_url}/users/password-reset/%{email_token} + + (Dacă linkul de mai sus a expirat, alege "Mi-am uitat parola" la autentificarea cu adresa ta de email.) test_mailer: - subject_template: "[%{site_name}] Testul de trimitere Email" + subject_template: "[%{site_name}] Test de capacitate de livrare email" + text_body_template: | + Acesta este un email de test de la + + [**%{base_url}**][0] + + A te asigura că emailul se poate livra este o chestiune complicată. Aici sunt câteva lucruri pe care ar trebui să le verifici înainte de toate: + + - Asigură-te *cu rigurozitate* că la setările site-ului, câmpul from: din `emailul de notificare` are adresa corectă. **Domeniul menționat în adresa din câmpul "from" al emailurilor pe care le trimiți este domeniul în raport cu care se va face validarea emailului tău**. + + - Ști cum să vizualizezi sursa brută a emailului în clientul tău de mail, astfel încât să poți extrage indicii prețioase din header. În Gmail, acest lucru se face cu opțiunea "arată originalul" din meniu drop-down aflat în partea din dreapta-sus a fiecărui mail. + + - **IMPORTANT:** ISP-ul tău are introdusă înregistrarea pentru reverse DNS astfel încât sa asocieze numele domeniilor cu adresele IP de pe care trimiți mailuri? [Verifică-ți înregistrarea Reverse PTR][2] aici. Dacă ISP-ul tău nu a introdus corect înregistrarea reverse DNS, este foarte puțin probabil că emailul ți se va livra corect. + + - [Înregistrarea SPF][8] a domeniului tău este corectă? [Verifică-ți înregistrarea SPF][1] aici. Observă că TXT reprezintă tipul de înregistrare corect pentru SPF. + + - [Înregistrarea DKIM][3] a domeniului tău este corectă? Aceasta îți poate crește semnificativ capacitatea emailului de a fi livrat. [Verifică-ți înregistrarea DKIM][7] aici. + + - Dacă operezi propriul tău server de mail, asigură-te că IP-urile sale nu sunt listate pe [nicio listă neagră de emailuri][4]. Verifică, de asemenea, că trimite un hostname calificat în întregime, care se rezolvă în DNS prin mesajul său HELO. În caz contrar, multe servicii de mail îți vor respinge emailul. + + - Îți recomandăm călduros să **trimiți un mail de probă [mail-tester.com][mt]** pentru a verifica dacă toate cele de mai sus funcționează corect. + + (Modalitatea *ușoară* de a face asta este să îți faci un cont gratuit pe [SendGrid][sg], [SparkPost][sp], [Mailgun][mg] sau pe [Mailjet][mj], care au planuri generoase de email gratuit și suficiente pentru comunități mici. Însă tot va trebui să îți setezi înregistrările SPF și DKIM în DNS!) + + Sperăm că vei primi acest test de livrare a emailurilor cu calificativul OK! + + Mult noroc, + + Prietenii tăi de la [Discourse](http://www.discourse.org) + + [0]: %{base_url} + [1]: http://www.kitterman.com/spf/validate.html + [2]: http://mxtoolbox.com/ReverseLookup.aspx + [3]: http://www.dkim.org/ + [4]: http://whatismyipaddress.com/blacklist-check + [7]: https://www.mail-tester.com/spf-dkim-check + [8]: http://www.openspf.org/SPF_Record_Syntax + [sg]: https://goo.gl/r1WMF6 + [sp]: https://www.sparkpost.com/ + [mg]: http://www.mailgun.com/ + [mj]: https://www.mailjet.com/pricing + [mt]: http://www.mail-tester.com/ new_version_mailer: - subject_template: "[%{site_name}] O nouă versiune de Discourse, reactializare valabilă" + subject_template: "[%{site_name}] O nouă versiune de Discourse, actualizare disponibilă" + text_body_template: | + Uraaa, o nouă versiune de [Discourse](http://www.discourse.org) este acum disponibilă! + + Versiunea curentă: %{installed_version} + Noua versiune: **%{new_version}** + + - Actualizează folosind metoda noastră de **[actualizare cu un singur click în browser](%{base_url}/admin/upgrade)** + + - Află ce e nou în [raportul de schimbări GitHub](https://github.com/discourse/discourse/commits/master) + + - Vizitează [meta.discourse.org](https://meta.discourse.org) pentru știri, discuții și suport pentru Discourse new_version_mailer_with_notes: - subject_template: "[%{site_name}] update Actualizare valabilă" + subject_template: "[%{site_name}] actualizare disponibilă" + text_body_template: | + Uraaa, o nouă versiune de [Discourse](http://www.discourse.org) este acum disponibilă! + + Versiunea curentă: %{installed_version} + Noua versiune: **%{new_version}** + + - Actualizează folosind metoda noastră de **[actualizare cu un singur click în browser](%{base_url}/admin/upgrade)** + + - Află ce e nou în [raportul de schimbări GitHub](https://github.com/discourse/discourse/commits/master) + + - Vizitează [meta.discourse.org](https://meta.discourse.org) pentru știri, discuții și supot pentru Discourse + + ### Note de versiune + + %{notes} + queued_posts_reminder: + subject_template: + one: "[%{site_name}] o postare așteptând să fie verificată" + few: "[%{site_name}] %{count} (de) postări așteptând să fie verificate" + other: "[%{site_name}] %{count} (de) postări așteptând să fie verificate" + text_body_template: | + Salutare, + + Există postări de utilizatori noi care așteaptă să fie moderate. [Aprobă-le sau respinge-le aici](%{base_url}/queued-posts). + flag_reasons: + off_topic: "Postarea ta a fost marcată cu marcaj de avertizare **în afara subiectului**: comunitatea simte că nu se potrivește subiectului, așa cum e el momentan definit de titlu și de prima postare." + inappropriate: "Postarea ta a fost marcată cu marcaj de avertizare **inadecvat**: comunitatea simte că este ofensatoare, abuzivă sau în contradicție cu [ghidul comunității noastre](/guidelines)." + spam: "Postarea ta a fost marcată cu marcaj de avertizare **spam**: comunitatea simte că reprezintă o reclamă, ceva ce este de natura excesiv de promoțională, în loc să fie o postare utilă sau relevantă pentru subiect după cum se presupune." + notify_moderators: "Postarea ta a fost marcată cu marcaj de avertizare **în atenția moderatorului**: comunitatea simte că există ceva legat de această postare care necesită intervenția manuală a unui membrul al echipei." flags_dispositions: - agreed: "Mulțumim pentru avertizare. Suntem de acord că există o problemă și ne vom interesa." - agreed_and_deleted: "Mulțumim pentru avertizare. Suntem de acord că este o problemă și postarea va fi eliminată." - disagreed: "Mulțumim pentru avertizare. Ne vom interesa." + agreed: "Îți mulțumim pentru avertizare. Suntem de acord că există o problemă și ne vom interesa." + agreed_and_deleted: "Îți mulțumim pentru avertizare. Suntem de acord că este o problemă și postarea va fi eliminată." + disagreed: "Îți mulțumim pentru avertizare. O să aruncăm o privire." + deferred: "Îți mulțumim că ne-ai informat. O să aruncăm o privire." + deferred_and_deleted: "Îți mulțumim că ne-ai informat. Am șters postarea." + temporarily_closed_due_to_flags: "Acest subiect este temporar închis din cauza numărului mare de marcaje de avertizare primite din partea comunității." system_messages: + post_hidden: + subject_template: "Postare ascunsă din cauza marcajelor de avertizare ale comunității" + text_body_template: | + Salut, + + Acesta este un mesaj automat de pe %{site_name} pentru a te informa că mesajul tău a fost ascuns. + + %{base_url}%{url} + + %{flag_reason} + + Mai mulți membri ai comunității au marcat acestă postare cu marcaje de avertizare înainte ca ea să fie ascunsă, așa că te rugăm să îți revizuiești postarea pentru a ține cont de feedback-ul primit. **Îți poți edita postarea după %{edit_delay} minute, și ea va fi automat re-afișată** + + Totuși dacă postarea este ascunsă de comunitate pentru a doua oară, va rămâne așa până ce va fi gestionată de un membru al echipei -- și asta ar putea atrage și alte consecințe, inclusiv posibilitatea suspendării contului tău.. + + Pentru îndreptări suplimentare, te rugăm să citești [ghidul comunității](%{base_url}/guidelines). + usage_tips: + text_body_template: | + Aici sunt câteva sfaturi rapide pentru început: + + ## Citirea + + Pentru a citi mai mult, **dă scroll în jos!** + + Pe măsură ce sunt postate noi răspunsuri și noi subiecte, ele vor apărea în mod automat - nu e nevoie să reîmprospătezi pagina. + + ## Navigarea + + - Pentru a folosi căutarea, pentru a accesa pagina ta de utilizator, sau meniul , folosește **butoanele icoană din dreapta-sus**. + + - Selectarea unui titlu de subiect te va duce întotdeauna la **următorul răspuns necitit** din subiect. Pentru a intra la începutul sau la sfârșitul listei de mesaje, selectează contorul de răspunsuri sau data ultimului răspuns. + + + + - Atunci când citești un subiect, poți folosi bara temporală din dreapta pentru a sări la începutul listei de mesaje, la sfârșitul ei sau la ultima poziție citită. Pe ecranele mai mici, selectează bara de progres din dreapta-jos pentru a o expanda: + + + + De asemenea, poți apăsa tasta ? pentru o lista ultra-rapidă de scurtături de tastatură. + + ## Răspunsul + + Pentru a introduce un citat, sleceează textul pe care dorești să îl citezi, apoi apasă orice buton Răspunde pentru a deschide editorul. Pentru mai multe citate repetă operațiunea. + + + + Întotdeauna poți să continui să citești în timp ce ăți compui răspunsul, iar noi vom salva automat drafturile, pe măsură ce scrii. + + Pentru a notifica pe cineva cu privire la răspunsul tău, menționează-i numele. Apasă `@` pentru a selecta un utilizator. + + + + Pentru a folosi [Emoji standard](http://www.emoji.codes/), apasă pur și simplu `:` pentru a sorta după nume, sau folosește tradiționalele smileys `;)` + + + + Pentru a genera un onebox pentru un link anume, lipiți-l pe o linie, de unul singur: + + + + Răspunsul tău poate fi formatat folosind HTML simplu, BBCode, sau [Markdown](http://commonmark.org/help/): + + Acesta este bold. + Acesta este [b]bold[/b]. + Acesta este **bold**. + + Pentru mai multe sfaturi privind formatarea, [încearcă tutorialul nostru interactiv și amuzant de numai 10 minute!](http://commonmark.org/help/tutorial/) + + ## Acțiunile + + Există butoane de acțiune în partea de jos a fiecărei postări: + + + + - Pentru a-i spune cuiva că ți-a făcut plăcere și ai apreciat postarea sa, folosește butonul **apreciere**. Împărtășește apreciere! + + - Folosind butonul **Distribuie** poți prelua un link ce se poate copia-lipi. + + - Folosește butonul arată mai mult pentru a descoperi mai multe acțiuni **Marchează cu marcaj de avertizare** pentru a informa în mod privat autorul, sau [echipa noastră](%{base_url}/about), cu privire la o anumită problemă. Folosește **Semn de carte** pentru a găsi această postare mai târziu, în pagina ta de profil. + + ## Notificările + + Când cineva îți răspunde la o postare, te citează, te menționează `@nume utilizator`, sau pune un link la un post al tău, îți va apărea imediat un număr în partea din dreapta-sus a paginii. Selectează-l pentru a-ți accesa **notificările**. + + + + Nu îți face griji că ai putea pierde vreun răspuns - vei primi pe email orice notificări apar cât ești plecat. + + ## Preferințele + + - Toate subiectele mai **recente de doua zile** sunt considerate noi. + + - Orice subiect la care **ai participat în mod activ** (creându-l, răspunzând la el, sau citindu-l pe o perioadă mai îndelungată) va fi urmărit în mod automat pentru uzul tău. + + Vei vedea indicatoarele "nou" și "număr necitite" alături de următoarele subiecte: + + + + Poți schimba notificările pentru fiecare subiect prin controlul de notificări aflat jos, în partea dreapta, la fiecare subiect. + + + + Poți de asemenea să alegi starea notificărilor pe categorii, dacă vrei să urmărești sau să ignori fiecare nou subiect dintr-o categorie specifică. + + Pentru a schimba oricare dintre aceste preferințe, mergi la [preferințe utilizator](%{base_url}/my/preferences). + + ## Încrederea comunității + + Ne bucurăm de cunoștință! Pe măsură ce vei participa aici, de-a lungul timpului te vom cunoaște mai bine și limitările temporare de nou utilizator ce ți se aplică, vor fi ridicate. Continua să participi și, cu timpul, vei câștiga noi [niveluri de încredere](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) ce vor include abilități speciale pentru a ne ajuta să gestionăm împreună această comunitate. welcome_user: - subject_template: "Bine ați venit la %{site_name}!" + subject_template: "Bine ai venit pe %{site_name}!" + text_body_template: | + Îți mulțumim că te-ai alăturat pe %{site_name}, și bun venit! + + %{new_user_tips} + + Noi credem într-un [comporament civilizat al comunității](%{base_url}/guidelines) indiferent de circumstante. + + Ș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.) welcome_invite: - subject_template: "Bine ați venit la %{site_name}!" + 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: | + Backup-ul a reușit. + + Vizitează [secțiunea admin > backup](%{base_url}/admin/backups) pentru a descărca noul backup. + + Acesta este raportul: + + ```text + %{logs} + ``` backup_failed: subject_template: "Backup eşuat" + text_body_template: | + Backup-ul a eșuat. + + Acesta e raportul: + + ```text + %{logs} + ``` + restore_succeeded: + subject_template: "Restaurarea terminată cu succes." + text_body_template: | + Restaurarea s-a terminat cu succes. + + Acesta este raportul: + + ```text + %{logs} + ``` restore_failed: subject_template: "Restaurare eşuată" + text_body_template: | + Restaurarea a eșuat. + + Acesta este raportul: + + ```text + %{logs} + ``` bulk_invite_succeeded: subject_template: "Invitația multiplă a fost procesată cu succes" - text_body_template: "Fișierul dvs de invitații multiple a fost procesat, %{sent} de invitații trimise." + text_body_template: "Fișierul tău de invitații multiple a fost procesat, %{sent} (de) invitații trimise." bulk_invite_failed: subject_template: "Invitația multiplă a fost procesată cu erori" text_body_template: | - Fișierul dvs de invitații multiple a fost procesat, %{sent} de invitații trimise cu %{failed} de erori. + Fișierul tău de invitații multiple a fost procesat, %{sent} (de) invitații trimise cu %{failed} (de) erori. Aici este raportul: ``` %{logs} ``` + csv_export_succeeded: + subject_template: "Exportul datelor s-a terminat" + text_body_template: | + Exportul datelor tale a reușit! :dvd: + + %{file_name} (%{file_size}) + + Link-ul de deasupra este disponibil 48 de ore. + csv_export_failed: + subject_template: "Exportul datelor a eșuat" + text_body_template: "Ne pare rău, dar exportul datelor tale a eșuat. Te rugăm să verifici rapoartele sau să contactezi un membru al echipei." + email_reject_insufficient_trust_level: + subject_template: "[%{site_name}] Problemă de email -- Nivelul de încredere este insuficient" + text_body_template: | + Ne pare rău, dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Contul tău nu are nivelul de încredere necesar pentru a crea noi subiecte, de la această adresă de email. Dacă ți se pare că aste e o eroare, contactează un membru al echipei. + email_reject_user_not_found: + subject_template: "[%{site_name}] Problemă de email -- Utilizatorul nu a fost găsit" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Răspunsul tău a fost trimis de pe o adresă de email necunoscută. Încearcă să îl trimiți de pe o altă adresă de email, sau contactează un membru al echipei. + email_reject_screened_email: + subject_template: "[%{site_name}] Problemă de email -- Email blocat" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Răspunsul tău a fost trimis de pe o adresă de email blocată. Încearcă să îl trimiți de pe o altă adresă, sau contactează un membru al echipei. + email_reject_inactive_user: + subject_template: "[%{site_name}] Problemă de email -- Cont dezactivat" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Contul tău asociat acestei adrese de email nu este activat. Te rugăm să îți activezi contul înainte de a trimite emailuri. + email_reject_blocked_user: + subject_template: "[%{site_name}] Problemă de email -- Utilizator blocat" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Contul asociat acestei adrese de email este blocat. + email_reject_reply_user_not_matching: + subject_template: "[%{site_name}] Problemă de email -- Adresă de răspuns neasteptată" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Răspunsul tău a fost trimis de pe o adresă de email diferită de cea așteptată, așa că nu suntem siguri că este aceeași persoană. Încearcă să trimiți de pe altă adresă de email, sau contactează un membru al echipei. + email_reject_no_account: + subject_template: "[%{site_name}] Problemă de email -- Cont utilizator necunoscut" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Nu putem găsi nici un cont care să corespundă adresei tale de email. Încearcă să trimiți de pe o adresă diferită de email, sau contactează un membru al echipei. + email_reject_empty: + subject_template: "[%{site_name}] Problemă de email -- Fără conținut" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Nu am putut găsi nimic scris în conținutul emailului. + + Dacă primești acest mesaj și _ai inclus_ un răspuns, încercă din nou cu o formatare mai simplă. + email_reject_parsing: + subject_template: "[%{site_name}] Problemă de email -- Conținut nerecunoscut" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Nu am putu găsi răspunsul tău în email. **Asigură-te că răspunsul tău este în partea de sus a emailului** -- nu putem procesa răspunsuri intercalate. + email_reject_invalid_access: + subject_template: "[%{site_name}] Problemă de email -- Acces invalid" + text_body_template: |+ + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Contul tău nu are drepturile necesare pentru a posta noi subiecte în acea categorie. Dacă ți se pare că asta e o eroare, contactează un membru al echipei. + + email_reject_strangers_not_allowed: + subject_template: "[%{site_name}] Problemă de email -- Acces invalid" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Categoria căreia i-ai trimis acest email nu permite răspunsuri decât de la utilizatori cu conturi valide și adrese de email cunoscute. Dacă ți se pare că e o eroare, contactează un membru al echipei. + email_reject_invalid_post: + subject_template: "[%{site_name}] Problemă de email -- Eroare la trimiterea unui mesaj" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Dintre cauzele posibile: formatare complexă, mesaj prea lung, mesaj prea scurt. Te rugăm să încerci din nou sau să postezi prin intermediul site-ului, dacă eroarea continuă. + email_reject_invalid_post_specified: + subject_template: "[%{site_name}] Problemă de email -- Eroare de postare" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Cauza: + + %{post_error} + + Dacă poți corecta eroarea, te rugăm să încerci din nou. + email_reject_invalid_post_action: + subject_template: "[%{site_name}] Problemă de email -- Acțiune de postare invalidă" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Acțiunea de postare nu a fost recunoscută. Te rugăm să încerci din nou, sau să postezi pe website dacă eroarea persistă. + email_reject_reply_key: + subject_template: "[%{site_name}] Problemă de email -- Cheie de răspuns necunoscută" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Cheia de răspuns la acest email este invalidă sau necunoscută, așa că nu ne putem da seama la ce email vine acest răspuns. Contactați un membru al echipei. + email_reject_bad_destination_address: + subject_template: "[%{site_name}] Problemă de email -- Adresă destinatar necunoscută" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Nici una din adresele de email de destinație nu este recunoscută. Te rugăm să verifici că trimiți la adresa corecta de email furnizată de către echipă. + email_reject_topic_not_found: + subject_template: "[%{site_name}] Problemă de email -- Subiectul nu a fost găsit" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Subiectul la care vrei să răspunzi nu mai există -- poate că a fost șters? Dacă ți se pare că e o eroare, contactează un membru al echipei. + email_reject_topic_closed: + subject_template: "[%{site_name}] Problemă de email -- Subiect închis" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Subiectul la care vrei să răspunzi este în prezent închis și nu mai acceptă răspunsuri. Dacă ți se pare că e o eroare, contactează un membru al echipei. + email_reject_auto_generated: + subject_template: "[%{site_name}] Problemă de email - Răspuns autogenerat" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Emailul tău a fost marcat ca „autogenerat”, ceea ce înseamnă că a fost creat automat de un computer în loc să fie scris de un om; nu putem accepta aceste tipuri de emailuri. Dacă ți se pare că este o eroare, contactează un membru al echipei. + email_error_notification: + subject_template: "[%{site_name}] Problemă de email - Eroare de autentificare POP3" + text_body_template: | + Din păcate,s-a produs o eroare de autentificare la retragerea emailurilor de pe serverul POP + + Te rugăm să te asiguri că ai configurat corect setările POP [setările site-ului](%{base_url}/admin/site_settings/category/email). + + Dacă există intefață utilizator web pentru contul tău POP, ar trebui să te autentifici pe ea și să îți verifici acolo setările. + too_many_spam_flags: + subject_template: "Cont nou suspendat" + text_body_template: | + Salut, + + Acesta este un mesaj automat de pe %{site_name} pentru a te informa că postările tale au fost temporar ascunse pentru că au fost marcate cu marcaje de avertizare de către comunitate.. + + Ca măsura de precauție, noului tău cont i s-a blocat posibilitatea de a crea noi răspunsuri sau subiecte până ce un un membru al echipei nu îl va verifica. Ne cerem scuze pentru inconveniență. + + Pentru îndreptări suplimentare, te rugăm să citești [ghidul comunității](%{base_url}/guidelines). + too_many_tl3_flags: + subject_template: "Cont nou suspendat" + text_body_template: | + Salut, + + Acesta este un mesaj automat de pe %{site_name} pentru a te informa că ți-a fost suspendat contul din cauza unui număr mare de marcaje de avertizare primite de la comunitate. + + Ca măsura de precauție, noului tău cont i s-a blocat posibilitatea de a crea noi răspunsuri sau subiecte până ce un un membru al echipei nu îl va verifica. Ne cerem scuze pentru inconveniență. + + Pentru îndreptări suplimentare, te rugăm să citești [ghidul comunității](%{base_url}/guidelines). + blocked_by_staff: + subject_template: "Cont suspendat temporar" + text_body_template: |+ + Salut, + + Acesta este un mesaj automat de pe %{site_name} pentru a te informa că ți-a fost suspendat temporar contul, ca măsură de precauție. + + Poți să continui să răsfoiești, dar nu vei mai putea să răspunzi sau să creezi subiecte până când un [membru al echipei](%{base_url}/about) nu îți verifică postările recente. Ne cerem scuze pentru inconveniență. + + Pentru îndreptări suplimentare, te rugăm să citești [ghidul comunității](%{base_url}/guidelines). + + user_automatically_blocked: + subject_template: "Noul utilizator %{username} a fost blocat de marcajele de avertizare ale comunității." + text_body_template: | + Acesta este un mesaj automat. + + Noul utilizator [%{username}](%{user_url}) a fost blocat în mod automat din cauza că mai mulți utilizatori au marcat postarea(ările) lui %{username} cu cu marcaje de avertizare. + + Te rugăm [verifică marcajele de avertizare](%{base_url}/admin/flags). Dacă %{username} a fost blocat în mod incorect de la postare, dă click pe butonul deblocare din [pagina de administrare pentru acest utilizator](%{user_url}). + + Pragul poate fi schimbat prin `block_new_user` din setările site-ului. spam_post_blocked: subject_template: "Utilizatorul nou %{username} are postările blocate datorită adreselor repetate" + text_body_template: | + Acesta este un mesaj automat. + + Noul utilizator [%{username}](%{user_url}) a încercat să creeze postări multiple cu link-uri la %{domains}, dar aceste postări au fost blocate pentru a evita spam-ul. Utilizatorul poate încă să creeze noi subiecte dar care să nu link-uiască la %{domains}. + + Te rugăam [verifică acest utilizator](%{user_url}). + + Această setare poate fi schimbată prin `newuser_spam_host_threshold` și `white_listed_spam_host_domains` din setările site-ului. + unblocked: + subject_template: "Contul nu mai este în așteptare" + text_body_template: | + Salut, + + Acesta este un mesaj automat de pe %{site_name} pentru a te informa că - în urma verificărilor echipei - contul tău nu mai este suspendat. + + Acum poți să creezi din nou subiecte și postări. Îți mulțumim pentru răbdare. pending_users_reminder: + subject_template: + one: "un utilizator în așteptarea aprobării" + few: "%{count} (de) utilizatori în așteptarea aprobării" + other: "%{count} (de) utilizatori în așteptarea aprobării" text_body_template: | Exista înscrieri de noi utilizatori ce așteaptă să fie aprobate (sau respinse) înainte de a putea accesa forumul. - [Vă rugăm să le vizualizați în secțiunea de admin](%{base_url}/admin/users/list/în așteptare). + [Te rugăm să le vizualizezi în secțiunea de admin](%{base_url}/admin/users/list/în așteptare). download_remote_images_disabled: - subject_template: "Downloadul de imagini de legătura dezactivat" - text_body_template: "Funcția `download_remote_images_to_local` a fost dezactivată pentru că limita de spațiu din `download_remote_images_threshold` a fost atinsă." + subject_template: "Descărcarea de imagini la disanță este dezactivată" + text_body_template: "Setarea `download_remote_images_to_local` a fost dezactivată pentru că limita de spațiu din `download_remote_images_threshold` a fost atinsă." + dashboard_problems: + subject_template: "S-au găsit probleme" + text_body_template: | + Anumite probleme îți sunt raportate pe spațul de lucru al adminului. + + [Te rugăm să le verifici și să le rezolvi](%{base_url}/admin). + unsubscribe_link: | + Pentru dezabonare de la aceste emailuri, [click aici](%{unsubscribe_url}). + unsubscribe_link_and_mail: | + Pentru dezabonare de la aceste emailuri, [click aici](%{unsubscribe_url}). + unsubscribe_mailing_list: | + Primești acest mesaj pentru ca ai activat modul mailing list. + + Pentru dezabonare de la aceste emailuri, [click aici](%{unsubscribe_url}). subject_re: "Re: " subject_pm: "[PM] " user_notifications: previous_discussion: "Răspunsurile precedente" + reached_limit: + one: "ATENȚIE: ai atins limita de un email zilnic. Notificările pe email viitoare vor fi stopate." + few: "ATENȚIE: ai atins limita de %{count} (de) emailuri zilnice. Notificările pe email viitoare vor fi stopate." + other: "ATENȚIE: ai atins limita de %{count} (de) emailuri zilnice. Notificările pe email viitoare vor fi stopate." + in_reply_to: "Ca răspuns la" unsubscribe: title: "Dezabonare" - description: "Nu ești interesat în a primi aceste email-uri? Nicio problemă! Faceți click dedesubt pentru a vă dezabona imediat:" + description: "Nu ești interesat în a primi aceste email-uri? Nicio problemă! Fă click dedesubt pentru a te dezabona imediat:" + reply_by_email: "[Vizitează subiect](%{base_url}%{url}) sau dă reply la acest email pentru a răspunde." + reply_by_email_pm: "[Vizitează mesaj](%{base_url}%{url}) sau dă reply la acest email pentru a răspunde." + only_reply_by_email: "Dă reply la acest email pentru a răspunde." + visit_link_to_respond: "[Vizitează subiect](%{base_url}%{url}) pentru a răspunde." + visit_link_to_respond_pm: "[Vizitează subiect](%{base_url}%{url}) pentru a răspunde." posted_by: "Postat de %{username} pe data %{post_date}" + invited_to_private_message_body: | + %{username} te-a invitat la un mesaj + + > **%{topic_title}** + > + > %{topic_excerpt} + + pe + + > %{site_title} -- %{site_description} + invited_to_topic_body: | + %{username} te-a invitat la o discuție + + > **%{topic_title}** + > + > %{topic_excerpt} + + pe + + > %{site_title} -- %{site_description} + user_invited_to_private_message_pm: + subject_template: "[%{site_name}] %{username} te-a invitat la un mesaj '%{topic_title}'" + text_body_template: | + %{header_instructions} + + %{message} + + %{respond_instructions} + user_invited_to_private_message_pm_staged: + subject_template: "[%{site_name}] %{username} te-a invitat la un mesaj '%{topic_title}'" + text_body_template: | + %{header_instructions} + + %{message} + + %{respond_instructions} + user_invited_to_topic: + subject_template: "[%{site_name}] %{username} te-a invitat la subiectul '%{topic_title}'" + text_body_template: | + %{header_instructions} + + %{message} + + %{respond_instructions} user_replied: subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_replied_pm: + subject_template: "[%{site_name}] [PM] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_quoted: subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_linked: + subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_mentioned: subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_group_mentioned: + subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_posted: subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_watching_first_post: + subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_posted_pm: subject_template: "[%{site_name}] [MP] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_posted_pm_staged: + subject_template: "%{optional_re}%{topic_title}" + text_body_template: |2 + + %{message} digest: - why: "Un sumar scurt al %{site_link} de ultima oară când ați fost prezent %{last_seen_at}." - new_activity: "Activități noi în discuțiile și postările dvs:" - top_topics: "postări populare" - other_new_topics: "Discuții populare" + why: "Un rezumat scurt al %{site_link} de la ultima ta vizită din %{last_seen_at}." + subject_template: "[%{site_name}] Rezumat" + new_activity: "Activități noi în subiectele și postările tale:" + top_topics: "Postări populare" + other_new_topics: "Subiecte populare" + unsubscribe: "Acest rezumat este transmis de pe %{site_link} când a trecut ceva vreme de când nu te-am mai văzut. Pentru a te dezabona, dă clic pe %{unsubscribe_link}." click_here: "click aici" + from: "%{site_name} rezumat" read_more: "Citește mai mult" - more_topics: "Au fost %{new_topics_since_seen} alte discuții noi de la ultima dvs. vizită pe %{last_seen_at}." - more_topics_category: "Au fost %{new_topics_since_seen} alte discuții noi în aceste categorii de la utima dvs. vizită pe %{last_seen_at}:" + more_topics: "Existau %{new_topics_since_seen} alte subiecte noi " + more_topics_category: "Mai multe subiecte noi:" + mailing_list: + why: "Toată activitatea de pe %{site_link} pentru data de %{date}" + subject_template: "[%{site_name}] Rezumatul pentru data de %{date}" + unsubscribe: "Acest rezumat este trimis zilnic pentru că modul mailing list este activat. Pentru dezabonare dă click pe %{unsubscribe_link}" + from: "%{site_name} rezumat" + new_topics: "Subiecte noi" + topic_updates: "Actualizări la subiect" + view_this_topic: "Vizualizează acest subiect" + back_to_top: "Înapoi sus" forgot_password: subject_template: "[%{site_name}] Resetare parolă" text_body_template: | - Cineva a cerut resetarea parolei dvs. pe site-ul [%{site_name}](%{base_url}). + Cineva a cerut resetarea parolei tale pe site-ul [%{site_name}](%{base_url}). - Dacă nu ați fost dumneavoastră, puteți ignora fără griji aces email. + Dacă nu ai cerut-o tu, poți ignora fără griji acest email. Click pe următoarea adresă pentru a reseta parola: %{base_url}/users/password-reset/%{email_token} set_password: - subject_template: "[%{site_name}] Alege parola" + subject_template: "[%{site_name}] Setare parola" text_body_template: | - Cineva a cerut crearea unei parole pe siteul [%{site_name}](%{base_url}). Alternativ, vă puteți autentifica folosind orice serviciu online acceptat (Google, Facebook, etc), serviciu ce este asociat cu acesta adresa de email validată. + Cineva a cerut crearea unei parole pe site-ul [%{site_name}](%{base_url}). Alternativ, vă te poți autentifica folosind orice serviciu online acceptat (Google, Facebook, etc), serviciu ce este asociat cu acesta adresa de email validată. - Dacă nu ați cerut asta, puteți ignora fără griji acest email. + Dacă nu ai cerut asta, poți ignora fără griji acest email. Click pe adresa următoare pentru a alege o parolă: %{base_url}/users/password-reset/%{email_token} admin_login: subject_template: "[%{site_name}] Autentificare" - signup_after_approval: - subject_template: "Ați fost aprobat pe site-ul %{site_name}!" - signup: text_body_template: | - Bine ați venit la %{site_name}! + Cineva a încercat să se autentifice pe contul tău de pe [%{site_name}](%{base_url}). - Click pe următoarea adresă pentru a confirma și activă noul dvs. cont: + Dacă ai fost tu, poți să ignori fără griji acest email. + + Click pe următorul link pentru a te autentifica: + %{base_url}/users/admin-login/%{email_token} + account_created: + subject_template: "[%{site_name}] Noul tău cont" + text_body_template: | + Un cont nou a fost creat pentru tine pe %{site_name} + + Click pe următorul link pentru a-ți alege o parolă pentru noul tău cont + %{base_url}/users/password-reset/%{email_token} + confirm_new_email: + subject_template: "[%{site_name}] Confirmă noua ta adresă de email" + text_body_template: | + Confirmă-ți noua adresă de email pentru %{site_name} dând click pe următorul link: + + %{base_url}/users/authorize-email/%{email_token} + confirm_old_email: + subject_template: "[%{site_name}] Confirmă adresa ta de email curentă" + text_body_template: | + Înainte de a-ți putea schimba adresa de email, trebuie să ne confirmi că deții controlul asupra adresei de email curente. După ce completezi acest pas, va trebui să ne confirmi noua adresă de email. + + Confirmă-ți adresa de email curentă pentru %{site_name} dând click pe următorul link: + + %{base_url}/users/authorize-email/%{email_token} + notify_old_email: + subject_template: "[%{site_name}] Adresa ta de email a fost schimbată" + text_body_template: | + Acesta este un mesaj automat pentru a te informa că adresa ta de email pentru %{site_name} a fost schimbată. Dacă acest lucru s-a întâmplat dintr-o eroare, contractează un administrator al site-lui. + + Adresa ta de email s-a modificat în: + + %{new_email} + signup_after_approval: + subject_template: "Contul tă pe site-ul %{site_name} a fost aprobat!" + text_body_template: | + Bun venit pe %{site_name}! + + Un membru al echipei ți-a aprobat contul pe %{site_name}. + + Click link-ul urmator pentru a-ți confirma și activa noul cont: %{base_url}/users/activate-account/%{email_token} - Dacă adresa de mai sus nu e accesibilă, încercați să o copiați și să o lipiți în bară de adrese a propriului browser. + Dacă link-ul de mai sus nu este clickabil, încearcă să îl copiezi și să îl lipești în bara de adrese din browser. + + %{new_user_tips} + + Noi credem într-un [comportament civlizat 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.) + signup: + subject_template: "[%{site_name}] Confirmă-ți noul cont" + text_body_template: | + Bine ai venit pe %{site_name}! + + Click pe următoarea adresă pentru a confirma și activa noul tău cont: + %{base_url}/users/activate-account/%{email_token} + + Dacă adresa de mai sus nu e accesibilă, încearcă să o copiezi și să o lipești în bara de adrese a propriului browser. page_not_found: + title: "Oops! Această pagină nu există sau este privată." popular_topics: "Populare" recent_topics: "Recente" see_more: "Mai multe" @@ -1089,56 +2303,615 @@ ro: search_google: "Google" login_required: welcome_message: | - #[Bine ați venit la %{title}](#welcome) - Pe acest forum de discuții aveți nevoie de un cont pentru a vizualiza %{title}. Vă rugăm creați un cont sau autentificați-vă pentru a continua. + #[Bine ai venit pe %{title}](#welcome) + Ai nevoie de un cont. Te rugăm să îți creezi un cont sau autentifică-te pentru a continua. terms_of_service: - title: "Termeni și condiții" - signup_form_message: 'Am citit și accept Termenii și Condițiile.' - deleted: 'Șters' + title: "Condițiile generale de utilizare" + signup_form_message: 'Am citit și accept Condițiile generale de utilizare.' + deleted: 'șters' upload: - edit_reason: "descarcă copii locale ale imaginilor" - unauthorized: "Ne pare rău, fișierul pe care-l încercați să-l încărcați nu este autorizat (extensii autorizate: %{authorized_extensions})." - pasted_image_filename: "Lipire imagine" - store_failure: "Încercare de încărcare eșuată #%{upload_id} pentru utilizatorul #%{user_id}." + edit_reason: "copii locale ale imaginilor descărcate" + unauthorized: "Ne pare rău, fișierul pe care-l încerci să-l încarci nu este autorizat (extensii autorizate: %{authorized_extensions})." + pasted_image_filename: "Imagine lipită" + store_failure: "Încercare eșuată de stocare a încărcarii #%{upload_id} pentru utilizatorul #%{user_id}." + file_missing: "Ne pare rău, trebuie să furnizezi un fișier pentru încărcare." + attachments: + too_large: "Ne pare rău, dar fișierul pe care încerci să îl încarci este prea mare (mărimea maximă este de %{max_size_kb}KB)." images: + too_large: "Ne pare rău, dar imaginea pe care încerci să o încarci este prea mare (mărimea maximă este de %{max_size_kb}KB), te rugăm să o redimensionezi și apoi să încerci din nou." size_not_found: "Ne pare rău, nu am putut determina mărimea imaginii. Poate este coruptă?" + avatar: + missing: "Ne pare rău, dar nu putem găsi avatarul asociat cu această adresă de email. Ai putea să îl încarci din nou?" + flag_reason: + sockpuppet: "Un utilizator nou a creat un subiect, și un alt utilizator nou de la aceeași adresă de IP (%{ip_address}) a răspuns. Vezi `flag_sockpuppets` la setările site-ului." + spam_hosts: "Acest nou utilizator a încrecat să creeze postări multiple cu link-uri către acelasi domeniu (%{domain}). Vezi `newuser_spam_host_threshold` la setările site-ului." email_log: - no_user: "Nu pot găsii utilizatorul cu id-ul %{user_id}" + post_user_deleted: "Utilizatorul acestei postări a fost șters." + no_user: "Nu s-a găsit utilizatorul cu id-ul %{user_id}" anonymous_user: "Utilizatorul este anonim" suspended_not_pm: "Utilizatorul este suspendat, nici un mesaj" seen_recently: "Utilizatorul a fost văzut recent" - post_not_found: "Nu pot găsii postarea cu id-ul %{post_id}" - notification_already_read: "Notificarea despre care acest email conține informații a fost citită" + post_not_found: "Nu s-a găsit postarea cu id-ul %{post_id}" + notification_already_read: "Notificarea ce face obiectul acestui email a fost deja citită" topic_nil: "post.topic este nil" post_deleted: "postarea a fost ștearsă de către autor" user_suspended: "utilizatorul a fost suspendat" - already_read: "utilizatorul a citit deja aceasta postare" + already_read: "utilizatorul a citit deja această postare" + exceeded_emails_limit: "Depășit max_emails_per_day_per_user" + exceeded_bounces_limit: "Depășit bounce_score_threshold" message_blank: "mesajul este gol" - message_to_blank: "mesajul.către este gol" - text_part_body_blank: "text_part.body îs blank" + message_to_blank: "message.to este gol" + text_part_body_blank: "text_part.body e gol" body_blank: "conținutul este gol" color_schemes: base_theme_name: "Bază" about: "Despre" - guidelines: "Informații de ajutor" - privacy: "Privat" - edit_this_page: "Editează aceasta pagină" + guidelines: "Ghid" + privacy: "Confidențialitate" + edit_this_page: "Editează această pagină" csv_export: boolean_yes: "Da" boolean_no: "Nu" static_topic_first_reply: | - Editează prima postare în această discuție pentru a schimba conținutul paginii %{page_name}. + Editează prima postare în acest subiect pentru a schimba conținutul paginii %{page_name}. guidelines_topic: - title: "FAQ/Informații de ajutor" + title: "FAQ/Ghid" + body: | + + + ## [Acesta este un loc pentru discuții civilizate](#civilized) + + Te rugăm să trateți acesti forum de discuții cu același respect cu care ai trata un parc public. Și noi, la rândul nostru, suntem o resusrsă partajată a comunității — un loc în care ne punem la dispoziție aptitudinile, cunoștințele și priceperea prin intermediul conversației în desfășurare. + + Acestea nu sunt reguli absolute, ci doar îndreptări pentru judecata raționlă din spatele comunității.Folosește aceste îndreptări pentru a menține acest loc curat și bine iluminat pentru un discurs public civilizat. + + + + ## [Îmbunătățește calitatea discuției](#improve) + + Ajută-ne să facem din locul astă o zonă propice conversației, contribuind neîncetat la creșterea calității discuțiilor, în orice mod, orcât de mic. Dacă nu ești sigur că o postare adaugă ceva la conversație, gândește-te din nou la ce ai de spus și încearcă din nou mai târziu. + + Subiectele discutate aici contează pentru noi, și vrem să acționăm de așa manieră încât să conteze și pentru tine. Fi respectuos cu oamenii cu care discuți subiectele, chiar dacă nu ești de acord cu anumite lucruri care sunt spuse. + + O metodă de a crește calitatea discuției este să te uiți întăi la discuțiile deja existente. Te rugăm să petreci puțin timp răsfoind subiectele de pe aici, înainte de a te apuca să răspunzi sau să le creezi pe ale tale. Astfel, vei avea mai multe șanse să dai peste alții care au aceleasi interese ca și tine. + + + + ## [Fi agreabil, chiar și atunci când nu ești de acord](#agreeable) + + Poate că dorești să răspunzi la ceva cu care nu ești de acord. Asta-i bine. Dar, amintește-ți _să critici ideile și nu oamenii_. Te rugăm să eviți: + + * Insultele. + * Atacurile la persoană. + * Să răspunzi tonului unei postări în loc să răspunzi conținutului ei. + * Contrazicera de de dragul contrazicerii. + + În loc de asta, furnizează contra-argumente motivate care să îmbunătățească conversația. + + + + ## [Particparea ta contează](#participate) + + Conversațiile pe care le avem aici dau tonul pentru toată lumea. Ajută-ne să influențăm viitorul acestei comunități alegând să te angajezi în discuții care să facă din acest forum un loc interesant — și evitându-i pe cei care nu o fac. + + Discourse furnizează instrumentele care dau posibilitatea comnunității să identifice colectiv cele mai bune (și cele mai proaste) contribuții: favorite, semne de carte, aprecieri, marcaje de avertizare, răspunsuri, editări și așa mai departe. Folosește aceste instrumente ca să îți imbunătățești experiența și, de asemenea, pe cea a tuturor celorlați. + + Să încrecăm să lăsăm parcul mai frumos decât l-am găsit. + + + + ## [Dacă vezi o problemă, marcheaz-o](#flag-problems) + + Moderatorii au o autoriate specială; ei sunt responsabili de acest forum. Dar și tu, la rândul tău. Cu ajutorul tău, moderatorii pot fi facilitatori ai comunitătii și nu doar niste gunoieri sau polițiști. + + Atunci când sesizezi un comportament greșit, nu răspunde. Asta ar încuraja acel comportament greșit bagându-l în seamă, ți-ar consuma energia și ar irosi timpul tutuor. _Pur și simplu marcheaz-l cu marcaj de avertizare_. Dacă se adună suficiente marcaje de avertizare, se iau masuri, fie automat fie prin intermediul intrevenției unui moderator. + + Pentru a ne întreține comunitatea, moderatorii își rezervă dreptul să șteargă orice conținut și orice cont utilizator din orice motiv și în orice moment. Moderatorii nu pot previzualiza mesajele înainte de postare; ei și membrii echipei nu își pot asuma răspundera pentru nici un fel de conținut postat de comunitate. + + + + ## [Întodeauna fi civilizat](#be-civil) + + Nimic nu sabotează o conversație sănătoasă mai mult decât bădărănia: + + * Fi civilizat. Nu posta ceva ce o persoană rezonabilă ar putea considera ofensator, abuziv sau incitare la ură. + * Păstrează curățenia. Nu posta nimic obscen sau exlicit din punct de vedere sexual. + * Respectați-vă reciproc. Nu hărțui sau îndurera pe nimeni, nu maimuțări alți oameni și nu le expune informațiile lor private. + * Resptectă-ne forumul. Nu posta spam sau orice altă formă de vandalism. + + Aceștia nu sunt termeni concreți cu definiții precise — evită până și _aparența_ oricăror din aceste lucruri. Dacă nu ești sigur, întreabă-te cum te-ai simți dacă postarea ta ar apărea pe prima pagină din Dilema veche. + + Acesta este un forum public și motoarele de căutare indexează aceste discuții. Păstrează limbajul, link-urile și imaginile sigure pentru familie și prieteni. + + + + ## [Păstrează ordinea](#keep-tidy) + + Fă un efort să pui lucurile la locul potrivit, ca să petrecem mai mult timp discutând și mai puțin curâțând. Astfel: + + * Nu înceăe un subiect într-o categorie nepotrivită. + * Nu posta încrucișat același lucru în subiecte diferite. + * Nu posta răspunsuri fără conținut. + * Nu deturna un subiect schimbându-i cursul în mijlocul conversației. + * Nu îți semna postările — fiecare postare are atașate informațiile tale de profil. + + În loc să postezi “+1” sau “de acord”, folosește butonul Apreciere. În loc să duci un subiect într-o direcție radical diferită, folosește Răspunde ca subiect înrudit. + + + + ## [Postează numai ce-i al tău](#stealing) + + Nu posta nimic digital ce aparține altcuiva fără permisiunea lui prealabilă. Nu ai voie să postezi descrieri, link-uri sau metode de a fura conținutul proprietății intelectuale a altcuiva (software, video, audio, imagini), și nici să încalci orice altă lege. + + + + ## [Propulsat de tine](#power) + + Acest site este operat de [echipa noastră prietenoasă](/about) și de *tine*, the membrul comunității. Dacă ai orice altă întrebare desăre cum merg lucrurile pe-aici, deschide un nou subiect în [categoria de feedback la site](/c/site-feedback) și hai să discutăm! Dacă e vreo chestiune critică sau urgentă care nu poate fi gestionată printr-un meta-subiect sau marcaj de avertizare, contactează-ne prin [pagina echipei](/about). + + + + ## [Condițiile generale de utilizare a site-ului](#tos) + + Da, legaleza este plictisitoare, însă trebuie să ne protejăm – și prin extensie, și pe tine și datele tale – împotriva băieților răi. Avem niște [Condiții generale de utilizare a site-ului](/tos) ce descriu comporatmentul tău (și al nostru) și drepturile le gate de conținut, confidențialitate și legi. Pentru a utiliza acest serviciu trebuie să ne accepti [CGU](/tos). tos_topic: - title: "Acordul de servicii" + title: "Condițiile generale de utilizare" privacy_topic: title: "Politica de confidențialitate" + body: | + + + ## [Ce informații colectăm?](#collect) + + Noi colectăm informații de la tine atunci când te înregistrezi pe site-ul nostru și strângem date atunci când participi la forum citind, scriind sau evaluând conținutul distribuit aici. + + Când te înregistrezi pe site-ul nostru, ți se poate cere să îți introduci numele și adresa. Poți totuși să ne vizitezi site-ul fără să te înregistrezi. Adresa ta de email va fi verificată printr-un email ce conține un link unic. Dacă acel link este vizitat, noi știm că tu deții controlul adresei de email. + + Odată înregistrat și postând, noi înregistrăm adresa de IP de la care a provenit postarea. Putem de asemenea să păstrăm registre de server cu adresele IP ale fiecărei interogări către serverul nostru. + + + + ## [La ce folosim informațiile?](#use) + + Orice informație pe care o colectăm de la tine poate fi folosită într-unul din următoarele moduri: + + * Pentru a-ți personaliza experiența — informațiile tale ne ajută să răspundem mai bine nevoilor tale specifice. + * Să ne îmbunătățim site-ul — ne zbatem în permanență să ne îmbunătățim funcționalitățile site-ului pe baza informațiilor și al feedback-ului pe care îl primim de la tine. + * Să îmbunătățim serviciul clienți — informațiile tale ne ajută să răspundem mai eficient cererilor tale de serviciu clienți și nevoilor tale de suport. + * Să transmitem emailuri periodice — Adresa de email pe care ne-ai furnizat-o poate fi folosită să îți trimitem informații, notificări pe care le ceri cu privire la schimbări în subiecte sau în legătură cu numele tău utilizator, pentru a răspunde la solicitări și/sau alte cereri sau întrebări. + + + + ## [Cum îți protejăm informațiile?](#protect) + + Implementăm o gamă variată de măsuri pentru a menține securitatea informațiilor personale pe care le intruci, trimiți sau accesezi. + + + + ## [Care este politica voastră de păstrare a datelor?](#data-retention) + + Vom face eforturi cu bună-credință pentru a: + + * Nu reține mai mult de 90 de zile rapoartele server ce conțin adresele de IP ale tuturor interogărilor către serverul nostru. + * Nu reține mai mult de 5 ani adresele de IP asociate cu utilizatorii înregistrați și postările lor. + + + + ## [Folosiți cookies](#cookies) + + Da. Cookies sunt fișiere mici cpe care un site sau furnizorul său de servicii le transferă pe hard drive-ul computerului tău prin intermediul web browser-ului (dacă permiți) Aceste cookies dau posibiliatea site-ului să îți recunoască browserul și, dacă ai un cont înregistrat, să îl asocieze cu contul tău înregistrat. + + Folosim cookies pentru a-ți înțelege și salva preferințele în vederea vizitelor viitoare și să compilăm și agregăm date despre traficul pe site și interacțiunile site-ului astfel încât să putem oferi experiențe mai și instrumente mai bune pe site, în viitor. Putem contacta terți furnizori de servicii pentru a ne ajuta să ne întelegem mai bine vizitatorii. Acestor terți furnizori de servicii nu li se va permite să folosească informațiile colectate în numele nostru decât pentru a ne ajuta șă ne desfășurăm și îmbunătățim activitatea.. + + + + ## [Divulgați aceste informații terților?](#disclose) + + Nu vindem, comercializăm sau transferăm în vreun alt fel către terți informațiile tale personale identificabile. Asta nu include terții de încredere care ne ajută să ne exploatăm site-ul, să ne conducem activitatea, sau să vă servim, câtă vreme acești terți sunt de acord să păstreze aceste informații confidențiale. Putem de asemenea să divulgăm informațiile tale atunci când credem că e necesar pentru a ne supune legii, să aplicăm politica site-ului, sau să protejăm drepturile, proprietatea sau siguranța noastră sau a altora. Totuși, informațiile nepersonale ale vizitatorilor pot fi furnizate unor terți în scopuri de marketing, reclamă sau în alte scopuri. + + + + ## [Legături cu terți](#third-party) + + Uneori, la discreția noastră, putem include sau oferi produse sau servicii ale terților pe site-ul nostru. Aceste site-uri ale terților au propriile lor politici de confidențialitate separate și independente. De aceea noi nu avem nico responsabilitate pentru conținutul sau activitățile de pe aceste site-uri linkuite. Cu toate astea, vom încerca să protejăm integritatea site-ului nostru și suntem dispuși să luam în considerare orice feedback legat de aceste site-uri. + + + + ## [Protecția minorilor](#coppa) + + Site-ul nostru, produsele și serviciile sunt destinate direct persoanelor care au vârsta de peste 13 ani. Dacă acest server este în Statele Unite, și dacă ai mai puțin de 13 ani, în conformitate cu COPPA ([Children's Online Privacy Protection Act](https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act)), nu folosi acest site. + + + ## [Politica de confidențialitate online](#online) + + Această politică de confidențialitate se aplică numai informațiilor colectate online prin intermediul site-ului nostru nu și celor colectate offline. + + + + ## [Acordul tău](#consent) + + Prin utilizarea site-ului nostru, ești de acord cu Politica de confidențialitate a site-ului nostru web. + + + + ## [Schimbări în politica de confidențialitate](#changes) + + Dacă decidem să ne schimbăm politica de confidențialitate, vom afișa schimbările în această pagină. + + Acest document se supune licenței creative commons CC-BY-SA. A fost actualizat ultima dată pe 31 mai 2013. + static: + search_help: | +

Sfaturi

+

+

    +
  • Rezultatele în care titlul corespunde căutarii sunt prioritizate – în caz de dubiu, caută în titluri
  • +
  • Cele mai bune rezultate le dau cuvintele unice, altele decât cele obșnuite
  • +
  • Încearcă căutarea în cadrul unei categorii anume, a unui subiect sau utilizator
  • +
+

+

Opțiuni

+

+ + + + + + + +
ordine:vizualizăriordine:recenteordine:aprecieri@usernameutilizator:foo
stare:deschisestare:închisestare:arhivatestare:fărărăspunsstare:utilizator_unic
#categorie-slugcategorie:foogrup:fooecuson:foo
in:aprecieriîn:postateîn:urmărite_activîn:urmăriteîn:privat
în:semne de carteîn:primaîn:țintuiteîn:detașateîn:wiki
posts_count:numînainte:zile sau datădupă:zile sau datătags:one,two
+

+

Exemple

+

+

    +
  • curcubee #parcuri va căuta după postările care conțin cuvîntul "curcubee" în categoria "parcuri".
  • +
  • curcubee categorie:parcuri stare:deschise ordine:recente va căuta după subiecte care conțin cuvântul "curcubee" în categoria "parcuri" și care nu sunt închise or arhivate, ordonate după data ultimei postări.
  • +
  • curcubee categorie:"parcuri și grădini" în:semne de carte va căuta subiectele care conțin cuvântul "curcubee" în categoria "parcuri și grădini" și care sunt marcate de tine cu semn de carte.
  • +
+

+ badges: + editor: + name: Editor + description: Prima postare edită + long_description: | + Acest ecuson se acordă când, pentru prima dată, îți editezi una din postări. Deși nu poți să îți editezi postările la infinit, editarea este întotdeauna o idee buna: poți să îți îmbunătățești postările, să corectezi micile greșeli sau să adaugi chestii pe care le-ai uitat când ai postat prima dată. Editează ca să îți faci postările să strălucească. + basic_user: + name: Simplu utilizator + description: Ți-au fost acordate toate funcțiile esențiale ale comunității + long_description: | + Acest ecuson se acordăt când ai ajuns la nivelul de încredere 1. Îți mulțumim că stai nițel pe aici ca să citești câteva subiecte și să înveți despre ce anume e comunitatea noastră. Restricțiile de utilizator nou ți-au fost ridicate; ți-au fost acordate toate capacitățile esențiale, precum trimiterea de mesaje personale, marcarea cu marcaje de avertizare, editare wiki, și capacitatea de a posta imagini și link-uri multiple. + member: + name: Membru + description: Ți s-au acordat invitații, mesaje în grup, mai multe aprecieri + long_description: | + Acest ecuson se acordă când ajungi la nivelul de încredere 2. Îți mulțumim că încerci de câteva săptămâni să te alături cu adevărat comunității noastre. + regular: + name: Clientul casei + description: Ți s-au acordat recategorizare, redenumire, link-uri urmărite, wiki, mai multe aprecieri + long_description: | + Acest ecuson se acordă atunci când ai atins nivelul de încredere 3. Îți mulțumim că ești un „adevărat client al casei” în comunitatea noastră, deja de câteva luni de zile. Acum ești unul dintre cei mai activi cititori și un contributor de încredere care ne ridică întreaga comunitate. Acum vei avea posibilitatea să recategorisești și redenumești subiecte, să utilizezi marcaje de avertizare spam mai puternice, să ai acces la zona privată de sufragerie, și o să primești mult mai multe aprecieri în fiecare zi. + leader: + name: Lider + description: Ți s-au acordat editare globală, țintuire, închidere, arhivare, divizare și adăugare laolaltă, mai multe aprecieri + long_description: | + Acest ecuson se acordă când ajungi la nivelul de încredere 4. Ești un lider al acestei comunități, după cum te-a selectat echipa și, reprezinți un exemplu pozitiv prin acțiunile și cuvintele tale. Ai capacitatea să editezi toate postările, să aplici acțiuni de moderare obișnuite precum țintuire, închidere, delistare, arhivare, divizare și adunare laolaltă, și ai tone de aprecieri pe zi. + welcome: + name: Bun venit + description: Ai primit o apreciere + long_description: | + Acest ecuson se acordă atunci când primești prima apreciere la o postare. Felicitări, ai postat ceva ce colegii tăi membri ai comunității au găsit a fi interesant, mișto și folositor! + autobiographer: + name: Autobiograf + description: Ai completat informațiile de la profil + long_description: | + Acest ecuson se acordă pentru completarea profilului utilizator și selectare unei poze de profil. Faptul că oferi celorlați câteva informații despre cine ești și ce anume te interesează contribuie crearea unei comunităil mai bune și mai coezive. Alătură-te nouă! + anniversary: + name: Aniversare + description: Ești membru activ de un an, ai postat cel puțin odată + long_description: | + Acest ecuson se acordă când ai împlinit un an de când ești membru și ai avut cel puțin o postare în acest timp. Îți mulțumim că stai prin zonă și contribui la comunitatea noastră. Nu ne-am putea descurca fără tine. + nice_post: + name: Răspuns fain + description: Ai primit 10 aprecieri la un răspuns + long_description: | + Acest ecuson se acordă când un răspuns de-al tău primește 10 aprecieri. Răspunsul tău a făcut impresie în comunitate și a împins conversația înainte! + good_post: + name: Răspuns mișto + description: Ai primit 25 de aprecieri la un răspuns + long_description: | + Acest ecuson se acordă când un răspuns de-al tău primește 25 de aprecieri. Răspunsul tău a fost excepțional și a făcut conversația mult mai bună pentru toată lumea! + great_post: + name: Răspuns beton + description: Ai primit 50 de aprecieri la un răspuns + long_description: | + Acest ecuson se acordă când un răspuns de-al tău primește 50 de aprecieri. Wow! Răspunsul tău a fost inspirat, fascinant, amuzant sau expert și comunitatea l-a iubit. + nice_topic: + name: Subiect fain + description: Ai primit 10 de aprecieri la un subiect + long_description: | + Acest ecuson se acordă când unul din subiectele tale primește 10 aprecieri. Hei, ai început o conversație care i-a plăcut comunității! + good_topic: + name: Subiect mișto + description: Primit 25 de aprecieri la un subiect + long_description: | + Acest ecuson este acordat când un subiect de-al tău primește 25 de aprecieri. Ai lansat o conversație vibrantă și în jurul căreia s-a adunat comunitatea și pe care au iubit-o. + great_topic: + name: Subiect beton + description: Ai primit 50 de aprecieri la un subiect + long_description: | + Acest ecuson se acordă când un subiect de-al tău primește 50 de aprecieri. Ai inițiat o conversație fascinantă și comunitatea s-a bucurat de discuția dinamică ce a rezultat! + nice_share: + name: Distribuție faină + description: Ai distribuit o postare care a atras 25 de vizitatori unici + long_description: | + Acest ecuson se acordă pentru distribuirea unui link care a fost accesat de 25 de vizitatori externi. Îți mulțumim că popularizezi discuțiile noastre și informațiile despre această comunitate. + good_share: + name: Distribuție mișto + description: Ai distribuit o postare care a atras 300 de vizitatori unici + long_description: | + Acest ecuson se acordat pentru distribuirea unui link care a fost accesat de 300 de vizitatori externi. Bună treabă! Ai arătat o discuție fantastică unei mulțimi de oameni noi și ai ajutat această comunitate să crească. + great_share: + name: Distribuție beton + description: Ai distribuit o postare ce a atras 1000 de vizitatori unici + long_description: | + Acest ecuson este acordat pentru distribuirea unui link care a fost accesat de 1000 de vizitatori externi. Wow! A promovat o discuție interesantă în fața unei audiențe enorme și ai ajutat mult comunitatea noastră să crească! + first_like: + name: Prima apreciere + description: Ai apreciat o postare + long_description: | + Acest ecuson se acordă când, pentru prima dată, acorzi o apreciere unei postări folosind butonul :heart: . Acordarea de aprecieri pentru postări reprezintă o metodă minunată de a le arăta colegilor tăi din comunitate că ceea ce au postat ei este interesant, util, mișto sau amuzant. Împășește apreciere! + first_flag: + name: Primul marcaj de avertizare + description: Marcat postare cu marcaj de avertizare + long_description: | + Acest ecuson se acordă când, pentru prima dată, ai marcat o postare cu marcaj de avertizare. Marcarea cu marcaj de avertizare este metoda prin care cu toții ajutăm la menținerea acestui loc în condiții de curățenie și luminozitate pentru toată lumea. Dacă observi vreo postare care, indiferent de motiv, necesită atenția moderatorilor, te rugăm să nu eziți să îl marchezi. Poți de asemenea să marchezi cu marcaj de avertizare spre trimiterea de mesaj personal către un coleg utilizator, dacă vezi vreo problemă cu postarea lui. Dacă vezi vreo problemă, :flag_black: semnalează-o! + promoter: + name: Promotor + description: Ai invitat un utilizator + long_description: | + Acest ecuson se acordă când ai invitat pe cineva să se alăture comunității noastre prin intermediul butonului Invită din pagina ta de utilizator, sau de la sfârșitul unui subiect. Invitarea prietenilor care pot fi interesați în discuții specifice reprezintă o metodă minunată de a introduce oameni noi în comunitatea noastră, asa că mulțumim! + campaigner: + name: Șef de campanie + description: Ai invitat 3 utilizatori simpli + long_description: | + Acest ecuson se acordă după ce ai invitat 3 persoane care apoi au petrecut suficient timp pe site pentru a deveni utilizatori simpli. O comunitate vibrantă are nevoie de o infuzie regulată de noi-veniți care sa participe în mod obișnuit și care să adauge noi voci la conversații. + champion: + name: Campion + description: Ai invitat 5 membri + long_description: | + Acest ecuson se acordă când ai invitat 5 membri care ulterior au petrecut suficient timp pe site pentru a deveni membri deplini. Wow! Îți mulțumim că ne sporești diversitatea comunității cu noi membri. + first_share: + name: Prima distribuire + description: Ai distribuit o postare + long_description: | + Acest ecuson se acordă când, pentru prima oară, ai distribuit un link la un răspuns folosind butonul Distribuie. Distribuirea link-urilor reprezintă o metodă foarte bună pentru a arăta discuțiile interesante către restul lumii și de a spori comunitatea. + first_link: + name: Primul link + description: Ai aăugat un link la un alt subiect + long_description: | + Acest ecuson se acordă când, pentru prima oară, adaugi un link la alt subiect. Legarea subiectelor ajută colegii care citesc să găsească conversații conexe interesante, arătându-le legătura dintre subiecte în ambele direcții. Link-uiește la discreție! + first_quote: + name: Prima citare + description: Ai citat o postare + long_description: | + Acest ecuson se acordă când, pentru prima dată, citezi o postare precedentă în cadrul propriului tău răspuns și ajută la conexarea discuțiilor în cadrul unui subiect. Cel mai simplu mod să citezi este să selectezi o secțiune a unei postări și apoi să apeși orice buton de răspuns. Citează generos! + read_guidelines: + name: Ghid Citit + description: Ai citit ghidul comunității + long_description: | + Acest ecuson se acordă pentru că ai citit ghidul comunității. Urmând și distribuind aceste reguli simple putem construi o comunitate sustenabilă, amuzantă și sigură pentru toți. Întotdeauna adu-ți aminte că o altă ființă umană, una ce seamănă foarte mult cu tine, se află de partea cealaltă a ecranului. Fii drăguț! + reader: + name: Cititor + description: Ai citit toate răspunsurile dintr-un subiect cu mai mult de 100 de răspunsuri + long_description: | + Acest subiect se acordă când, pentru prima dată, ai citit un subiect lung cu mai mult de 100 de răspunsuri. Urmărind cu atenție o conversație te ajută să înțelegi diversele puncte de vedere și contribuie la dezvoltarea de conversații interesante. Cu cât citești mai mult, cu atât mai bună devine conversația. După cum ne place să spunem, A citi este fundamental! :slight_smile: + popular_link: + name: Link popular + description: Ai postat un link extern ce a atras 50 de click-uri + long_description: | + Acest ecuson se acordă când ai distribuit un link care a atras 50 de click-uri. Îți mulțumim că postezi link-uri utile și că adaugi un context interesant la conversații! + hot_link: + name: Link fierbinte + description: Ai postat un link extern ce a atras 300 de click-uri + long_description: | + Acest ecuson se acordă când ai partajat un link ce a atras 300 de click-uri. Îți mulțumim că ai postat un link fascinant care a împins conversația mai departe și a iluminat discuția! + famous_link: + name: Link celebru + description: Ai postat un link extern ce a atras 1000 de click-uri + long_description: | + Acest ecuson se acordă atunci când ai distribuit un link ce a atras 1000 de click-uri. Wow! Ai postat un link ce a îmbunătățit conversația în mod semnificativ adăugând detalii esențiale, context și informație. Bună treabă! + appreciated: + name: Apreciat + description: Ai primit câte 1 apreciere la 20 de postări + long_description: | + Acest ecuson se acordă când primești câte cel puțin o apreciere la 20 de postări diferite. Comunitatea se bucură de contribuțiile tale la conversații! + respected: + name: Respectat + description: Ai primit câte 2 aprecieri la 100 de postări + long_description: | + Acest ecuson se acordă când primești cel puțin câte 2 aprecieri la 100 de postări diferite. Comunitatea începe să îți respecte multe contribuții pe care le ai la conversații. + admired: + name: Admirat + description: Ai primit câte 5 aprecieri în 300 de postări + long_description: | + Acest ecuson se acordă când primești cel puțin câte 5 aprecieri în 300 de postări diferite. Wow! Comunitatea îți admiră contribuțiile frecvente și de înaltă calitate. + out_of_love: + name: Întreaga ta apreciere + description: Ai folosit 50 de aprecieri într-o zi + long_description: | + Acest ecuson se acordă atunci când îți folosești toate cele 50 de aprecieri zilnice. Faptul că îți amintești să îți rezervi un pic de timp pentru a aprecia postările de care te-ai bucurat și pe are le-ai prețuit încurajează colegii tăi de comunitate să creeze pe viitor discuții și mai interesante. + higher_love: + name: Înalta ta apreciere + description: Ai folosit de 5 ori 50 de aprecieri pe zi + long_description: | + Acest ecuson se acordă când îți folosești de 5 ori toate cele 50 de aprecieri zilnice. Îți mulțumim că îți aloci timp zilnic pentru a încuraja cele mai bune conversații. + crazy_in_love: + name: Maxima ta apreciere + description: Ai folosit de 20 de ori 50 de aprecieri pe zi + long_description: | + Acest ecuson se acordă atunci când folosești toate cele 50 de aprecieri la care ai zilnic dreptul, de-a lungul a 20 zile. Wow! Ești un model de încurajare pentru colegii din comunitate! + thank_you: + name: Mulțumesc + description: Ai 20 de postări apreciate și ai dat 10 apreiceri + long_description: | + Acest ecuson se acordă când ai 20 de postări apreciate și ai acordat 10 alte aprecieri la rândul tău. Atunci când cineva îți apreciază postările, găsești timp să apreciezi și tu ce postează alții. + gives_back: + name: Recunoscător + description: Ai 100 de postări apreciate și ai acordat 100 de aprecieri + long_description: | + Acest ecuson se acordă când ai 100 de postări apreciate și ai acordat 100 de alte aprecieri la rândul tău. Îți mulțumim că întorci favoarea și altora. + empathetic: + name: Emaptic + description: Ai 500 de postări apreciate și ai oferit 1000 de aprecieri + long_description: | + Acest ecuson se acordă când ți-au fost apreciate 500 de postări și ai acordat la rândul tău 1000 sau mai multe aprecieri. Wow! Ești un model de generozitate și apreciere reciprocă :two_hearts:. + first_emoji: + name: Primul emoji + description: Ai folosit un emoji într-o postare. + long_description: | + Acest ecuson se acordă prima data când adaugi un emoji la postarea ta :thumbsup:. Emoji permit transmiterea de emoții prin postări, de la fericire :smiley: la tristețe :anguished: la furie :angry: și întreaga plaetă :sunglasses: . Apasă un : (două puncte) sau apasă pe butonul Emoji toolbar din editor pentru a alege dintre sute de opțiuni :ok_hand: + first_mention: + name: Prima mențiune + description: Ai fost menționat în postarea unui utilizator + long_description: Acest ecuson se acordă când, pentru prima oară, ai menționat @numele de utilizator al cuiva într-o postare de-a ta. Fiecare menționare generează o notificare către acea persoană, astfel încât ea să știe despre postarea ta. Începi prin a apăsa tasta @ (simbolul at) ca să menționezi orice utilizator sau, dacă îți este permis, grup. E o metodă convenabilă să atragi atenția cuiva. + first_onebox: + name: Primul onebox + description: Ai postat un link care a devenit onebox + long_description: Acest ecuson se acordă când, pentru prima data, ai postat un link singur pe line, ceea ce a făcut ca automat să fie expandat într-un onebox cu un scurt rezumat al link-ului, un titlu și (dacă e disponibilă) cu o poză. + first_reply_by_email: + name: Forum prin email + description: Ai răspuns la o postare prin email + long_description: | + Acest ecuosn se acordă când ai răspuns pentru prima dată la o postare prin email :e-mail:. admin_login: - success: "Mesajul a fost trimis" + success: "Emailul a fost trimis" error: "Eroare!" email_input: "Email Admin" - submit_button: "Trimite Email" + submit_button: "Trimite email" + discourse_hub: + access_token_problem: "Spune-i unui admin: Te rog actualizează setările site-ului pentru a include discourse_org_access_key ." + performance_report: + initial_post_raw: Acest subiect include rapoarte zilnice de performanță referitoare la site-ul tău. + initial_topic_title: Rapoarte de performanță website + topic_invite: + user_exists: "Ne pare rău, acest utilizator a fost deja invitat. Nu poți să inviți un utilizator la un subiect decât o singură dată." + tags: + title: "Etichete" + staff_tag_disallowed: "Eticheta \"%{tag}\" poate fi pusă doar de un membru al echipei." + staff_tag_remove_disallowed: "Eticheta \"%{tag}\" poate fi ștearsă doar de un membru al echipei." + rss_by_tag: "Subiecte etichetate %{tag}" + wizard: + title: "Configurare Discourse" + step: + locale: + title: "Bun venit pe Discourse-ul tău!" + fields: + default_locale: + description: "Care e limba implicită pentru comunitatea ta?" + forum_title: + title: "Nume" + description: "Numele este un semn vizibil de la distanță, primul lucru pe care vizitatorii potențiali îl remarcă cu privire la comunitatea ta. Ce spune numele și titlul despre comunitatea ta?" + fields: + title: + label: "Numele comunității tale" + placeholder: "Bârlogul Mariei" + site_description: + label: "Descrie-ți comunitatea într-o singură frază scurtă" + placeholder: "Un loc în care Maria și prietenii stau la taifas despre chestii mișto" + introduction: + title: "Introducere" + 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 apartentență, 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: + open: + label: "Public" + description: "Oricine poate să acceseze această comunitate și să se înscrie pentru un cont" + restricted: + label: "Privat" + description: "Numai cei pe care i-am invitat sau aprobat pot să acceseze această comunitate." + contact: + title: "Contact" + fields: + contact_email: + label: "Mail" + placeholder: "nume@exemplu.comb" + description: "Adresa de email a persoanei sau grupului responsabil de aceasta comunitate. Folosită pentru notificări critice cum ar fi marcaje de avertizare negestionate, actualizări de securitate și afișată pe pagina Despre noi pentru contactarea de urgență a comunității." + contact_url: + label: "Pagină web" + placeholder: "http://www.exemplu.com/contact" + description: "Pagina web de contact pentru organizația ta sau pentru tine însuți. Va fi afișată Despre noi." + site_contact: + label: "Mesaje automate" + 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)" + placeholder: "Initech" + company_full_name: + label: "Numele firmei (lung)" + placeholder: "Initech, SRL." + company_domain: + label: "Numele domeniului firmei" + placeholder: "initech.com" + colors: + 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" + dark: + label: "Întunecat simplu" + logos: + title: "Logo-uri" + fields: + logo_url: + label: "Logo-ul principal" + description: "Imaginea logo din partea stângă-sus a site-ului tău. Folosește o formă de dreptunghi lat." + logo_small_url: + label: "Logo compact" + description: "O versiune compctă a logo-ului tău, care este afișată în partea din stânga-sus a site-ului. Folosește o formă pătrată." + icons: + title: "Iconițe" + fields: + favicon_url: + label: "Iconiță mică" + description: "Imagine iconiță folosită la reprezentarea site-ului tău în web browsere și care arată bine la mărimi mici, ca de ex 32px pe 32px." + apple_touch_icon_url: + 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: + choices: + latest: + label: "Subiecte recente" + categories: + 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." + finished: + title: "Discourse-ul tău e gata!" + description: | +

Dacă vei dori vreodată să schimbi aceste setări, vizitează secțiunea admin; care se găsește lângă iconița cu cheia franceză din meniul site-ului.

+

Distracție plăcută și mult succesla construcția noii comunități!

activemodel: errors: <<: *errors diff --git a/config/locales/server.ru.yml b/config/locales/server.ru.yml index 39f5eaf624..bd940be16e 100644 --- a/config/locales/server.ru.yml +++ b/config/locales/server.ru.yml @@ -1529,6 +1529,11 @@ ru: title: "Пользовательское соглашение" privacy_topic: title: "Политика конфиденциальности" + badges: + first_mention: + name: Первое обращение + description: Упомянул другого пользователя в сообщении + long_description: Эта награда выдается, когда вы впервые вставляете чей-то @псевдоним в свое сообщение. Каждое такое обращение отправит уведомление этому человеку, чтобы они были в курсе вашего сообщения. Чтобы вставить обращение к человеку по его псевдониму, или к целой группе по ее названию (если это разрешено), начните с символа @ - это удобный способ привлечь их внимание. admin_login: success: "письмо отправлено" error: "Ошибка!" diff --git a/config/locales/server.sq.yml b/config/locales/server.sq.yml index fd9e29f32f..255572bfe9 100644 --- a/config/locales/server.sq.yml +++ b/config/locales/server.sq.yml @@ -46,6 +46,7 @@ sq: errors: &errors format: '%{attribute} %{message}' messages: + too_long_validation: "ka limit maksimumi %{max} shkronja; ju vendosët %{length}." invalid_boolean: "Boolean jo i vlefshëm." taken: "është i marrë" accepted: duhet të pranohet @@ -53,6 +54,7 @@ sq: present: mund të lihet bosh confirmation: "nuk përputhet %{attribute}" empty: nuk mund të lihet bosh + equal_to: duhet të jetë baraz me %{count} exclusion: është i rezervuar invalid: është i pavlefshëm not_a_number: nuk është një numër @@ -219,6 +221,7 @@ sq: uncategorized_parent: "Uncategorized can't have a parent category" self_parent: "A subcategory's parent cannot be itself" depth: "You can't nest a subcategory under another" + invalid_email_in: "'%{email}' nuk është një adresë e vlefshme emaili." cannot_delete: uncategorized: "Nuk fshij dot kategorinë \"Uncategorized\"" has_subcategories: "Nuk e fshini dot këtë kategori sepse ajo ka nënkategori. " @@ -238,6 +241,15 @@ sq: leader: title: "udhëheqës" rate_limiter: + slow_down: "E keni bërë këtë veprim shumë shpesh, prisni pak e provoni më vonë. " + too_many_requests: "Sistemi ka një limit për sa herë ai veprim mund të kryhet në një ditë. Prisni %{time_left} para se të provoni përsëri. " + by_type: + first_day_replies_per_day: "Keni arritur maksimumin e përgjigjeve që një përdorues i ri mund të postojë në ditën e parë. Prisni %{time_left} dhe provoni përsëri." + first_day_topics_per_day: "Keni postuar maksimumin e temave që një anëtar i ri mund të krijojë në ditën e parë. Prisni %{time_left} para se të provoni përsëri. " + create_topic: "Po nxitoheni shumë për të krijuar tema të reja. Prisni %{time_left} dhe provoni përsëri." + create_post: "Po përgjigjeni shumë shpejt. Prisni %{time_left} dhe provoni përsëri." + delete_post: "Po fshini postimet shumë shpejt. Prisni %{time_left} dhe provoni përsëri." + topics_per_day: "Keni arritur maksimumin e temave të reja për sot. Prisni %{time_left} dhe provoni përsëri." hours: one: "1 orë" other: "%{count} orë" @@ -309,6 +321,15 @@ sq: x_months: one: "1 muaj më parë" other: "%{count} muaj më parë" + about_x_years: + one: "rreth 1 vit më parë" + other: "rreth %{count} vjet më parë" + over_x_years: + one: "mbi 1 vit më parë" + other: "mbi %{count} vite më parë" + almost_x_years: + one: "pothuajse 1 vit më parë" + other: "pothuajse %{count} vite më parë" password_reset: no_token: "Ndjesë, kjo lidhje për ndryshimin e fjalëkalimit është shumë e vjetër. Kliko butonin 'Identifikohu' dhe përdorni 'Kam harruar fjalëkalimin' për të marrë një lidhje të re." choose_new: "Zgjidhni një fjalëkalim të ri" @@ -323,6 +344,8 @@ sq: confirmed: "Adresa e postës u azhornua." please_continue: "Vazhdo tek %{site_name}" error: "Hasëm një gabim gjatë ndryshimit të adresës email. Mos vallë është në përdorim nga një llogari tjetër në faqe?" + authorizing_old: + title: "Ju falënderojmë për konfirmimin e adresës tuaj email" activation: action: "Klikoni këtu për të aktivizuar llogarinë tuaj" please_continue: "Llogaria juaj e re u konfirumua; ju po ridrejtoheni për tek faqja kryesore." @@ -390,6 +413,15 @@ sq: message: make: "Kjo temë është tani banderolë. Do të shfaqet në majë të gjithë faqes derisa përdoruesi t'a heqë vetë. " remove: "Kjo temë nuk është më banderolë. Nuk do të shfaqet më në majë të çdo faqeje të sitit. " + unsubscribed: + title: "U çregjistruat!" + description: "U çregjistruat. Për të ndryshuar rregullimet e email-it shkoni tek preferencat e përdoruesit." + topic_description: "Për t'u ri-abonuar tek %{link}, përdorni kontrollin e njoftimeve në fund apo në të djathtë të temës." + unsubscribe: + title: "Çregjistrohuni" + stop_watching_topic: "Ndaloni së ndjekuri këtë temë, %{link}" + unwatch_category: "Ndaloni së ndjekuri të gjitha temat në %{category}" + all: "Mos më dërgoni më email nga %{sitename}" reports: visits: title: "Vizitat e përdoruesit" @@ -599,6 +631,7 @@ sq: anon_polling_interval: "How often should anonymous clients poll in milliseconds" background_polling_interval: "How often should the clients poll in milliseconds (when the window is in the background)" cooldown_minutes_after_hiding_posts: "Number of minutes a user must wait before they can edit a post hidden via community flagging" + max_replies_in_first_day: "Numri maksimal i përgjigjeve që një përdorues ka të drejtë të krijojë në periudhën 24-orëshe pas postimit të tij të parë" tl2_additional_likes_per_day_multiplier: "Increase limit of likes per day for tl2 (member) by multiplying with this number" tl3_additional_likes_per_day_multiplier: "Increase limit of likes per day for tl3 (regular) by multiplying with this number" tl4_additional_likes_per_day_multiplier: "Increase limit of likes per day for tl4 (leader) by multiplying with this number" @@ -1168,12 +1201,12 @@ sq: previous_discussion: "Përgjigjet e mëparshme" in_reply_to: "Në Përgjigje Të" unsubscribe: - title: "Anullo abonimin" - description: "Nuk të interesojnë këto emaila? S'ka problem! Kliko më poshtë për të anulluar abonimin:" + title: "Çregjistrohuni" + description: "Nuk të interesojnë këto emaila? S'ka problem! Kliko më poshtë për të anuluar abonimin:" reply_by_email: "[Shiko Temën](%{base_url}%{url}) ose përgjigjju këtij email-i për të postuar." reply_by_email_pm: "[Shiko Mesazhin](%{base_url}%{url}) ose përgjigjju këtij email-i për të vazhduar bisedën." only_reply_by_email: "Përgjigjju këtij email-i për të vazhduar." - visit_link_to_respond: "[Shiko Temën](%{base_url}%/{url}) për tu përgjigjur." + visit_link_to_respond: "[Shiko Temën](%{base_url}%{url}) për tu përgjigjur." visit_link_to_respond_pm: "[Shiko Mesazhin](%{base_url}%/{url}) për tu përgjigjur." posted_by: "Postuar nga %{username} më %{post_date}" invited_to_topic_body: | @@ -1671,6 +1704,34 @@ sq: Originally adapted from the [WordPress Terms of Service](http://en.wordpress.com/tos/). privacy_topic: title: "Politika e Privatësisë" + static: + search_help: | +

Ca sugjerime

+

+

    +
  • Titujt kanë prioritet
  • +
  • Kur jeni brenda një kategorie, teme apo etikete, mund të kërkoni temat e atij konteksti
  • +
+

+

Opsionet

+

+ + + + + + + +
order:viewsorder:latestorder:likes@usernameuser:foo
status:openstatus:closedstatus:archivedstatus:norepliesstatus:single_user
#category-slugcategory:foogroup:foobadge:foo
in:likesin:postedin:watchingin:trackingin:private
in:bookmarksin:firstin:pinnedin:unpinnedin:wiki
posts_count:numbefore:days or dateafter:days or datetags:one,two
+

+

Ca shembuj

+

+

    +
  • rainbows #parks do kërkojë fjalën "rainbows" në kategorinë "parks".
  • +
  • rainbows category:parks status:open order:latest do kërkojë për tema me fjalën "rainbows" në kategorinë "parks" që nuk janë mbyllur apo arkivuar, renditur sipas datës së përgjigjes së fundit.
  • +
  • rainbows category:"parks and gardens" in:bookmarks do kërkojë për tema me fjalën "rainbows" në kategorinë "parks and gardens" që ju keni shtuar tek të preferuarat.
  • +
+

badges: editor: name: Redaktor @@ -1896,6 +1957,10 @@ sq: performance_report: initial_post_raw: This topic includes daily performance reports for your site. initial_topic_title: Raportet e performancës se faqes + wizard: + step: + emoji: + title: "Emoji" activemodel: errors: <<: *errors diff --git a/config/locales/server.tr_TR.yml b/config/locales/server.tr_TR.yml index acac9a205b..b5e59935ba 100644 --- a/config/locales/server.tr_TR.yml +++ b/config/locales/server.tr_TR.yml @@ -95,6 +95,7 @@ tr_TR: operation_already_running: "Devam eden bir işlem var. Yeni bir işlem başlatılamaz." backup_file_should_be_tar_gz: "Yedekleme dosyası .tar.gz uzantılı olmalı." not_enough_space_on_disk: "Yedeklemenin yüklenebilmesi için diskte yeterli alan bulunmuyor." + invalid_filename: "Yedekleme dosyasının adı geçersiz karakterler içeriyor. Geçerli olanlar: a-z 0-9 . -_." not_logged_in: "Bunun için giriş yapmanız gerekir." not_found: "İstenilen URL ya da kaynak bulunamadı." invalid_access: "İstenilen kaynağı görüntüleyebilmeniz için izniniz yok." @@ -173,7 +174,7 @@ tr_TR: email_already_used_in_category: "'%{email}' zaten '%{category_name}' kategorisi tarafından kullanılıyor." default_names: everyone: "herkes" - admins: "adminler" + admins: "yöneticiler" moderators: "moderatörler" staff: "görevli" trust_level_0: "güven_seviyesi_0" @@ -185,7 +186,7 @@ tr_TR: until_posts: other: "%{count} gönderi" new-topic: | - %{site_name} forumuna hoşgeldiniz — **yeni bir sohbet başlattığınız için teşekkür ederiz! ** + %{site_name} topluluğuna hoş geldiniz — **yeni bir sohbet başlattığınız için teşekkür ederiz! ** - Yüksek sesle okuduğunuzda başlık ilgi çekici geliyor mu? İyi bir özet mi? @@ -195,7 +196,7 @@ tr_TR: Daha fazlası için, [topluluk yönergelerimize bakın](/guidelines). Bu panel sadece ilk %{education_posts_text} için görünür. new-reply: | - %{site_name} forumuna hoşgeldiniz — **katılımınız için teşekkür ederiz!** + %{site_name} topluluğuna hoş geldiniz — **katılımınız için teşekkür ederiz!** - Cevabınız sohbeti bir şekilde geliştiriyor mu? @@ -282,10 +283,10 @@ tr_TR: meta_category_name: "Site geri bildirimi" meta_category_description: "Bu site, sitenin organizasyonu, nasıl çalıştığı ve nasıl geliştirilebileceği ile ilgili tartışma alanı." staff_category_name: "Görevliler" - staff_category_description: "Görevliler arası konuşmalar için özel kategori. Konular sadece admin ve moderatörlere gözükür." - assets_topic_body: "Bu kalıcı bir konudur, sadece görevlilere gözükür, site tasarımında kullanılan resim ve dosyaların depolanması için kullanılır. Sakın silmeyin!\n\n\nİşleyiş aşağıdaki gibidir:\n\n\n1. Bu konuyu cevaplayın.\n2. Logolar, favicon'lar vb. için kullanmak istediğiniz resimleri buraya yükleyin. (Gönderi düzenleyicisindeki yükleme düğmesini kullanabilir, veya resimleri sürükleyip bırakabilir veya kopyalayıp yapıştırabilirsiniz.)\n3. Cevabı gönderin.\n4. Yeni gönderinizdeki resimlere sağ tıklayarak ya da düzenleme ikonuna tıklayıp gönderinizi düzenleyerek resimlerin bağlantılarına ulaşabilirsiniz. Bağlantıları kopyalayın.\n5. Bağlantıları [basit ayarlar](/admin/site_settings/category/required) ilgili bölümlere yapıştırın.\n\n\nEğer farklı dosya tipleri yükleyebilmek istiyorsanız, [dosya ayarları](/admin/site_settings/category/files) sayfasındaki `authorized_extensions` ayarını düzenleyin." + staff_category_description: "Görevliler arası konuşmalar için özel kategori. Konular sadece yönetici ve moderatörlere gözükür." + assets_topic_body: "Bu kalıcı bir konudur, sadece görevlilere gözükür, site tasarımında kullanılan resim ve dosyaların depolanması için kullanılır. Sakın silmeyin!\n\n\nİşleyiş aşağıdaki gibidir:\n\n\n1. Bu konuyu cevaplayın.\n2. Logolar, simgecikler vb. kullanmak istediğiniz resimleri buraya yükleyin. (Gönderi düzenleyicisindeki yükleme düğmesini kullanabilir, veya resimleri sürükleyip bırakabilir veya kopyalayıp yapıştırabilirsiniz.)\n3. Cevabı gönderin.\n4. Yeni gönderinizdeki resimlere sağ tıklayarak ya da düzenleme ikonuna tıklayıp gönderinizi düzenleyerek resimlerin bağlantılarına ulaşabilirsiniz. Bağlantıları kopyalayın.\n5. Bağlantıları [basit ayarlar](/admin/site_settings/category/required) ilgili bölümlere yapıştırın.\n\n\nEğer farklı dosya tipleri yükleyebilmek istiyorsanız, [dosya ayarları](/admin/site_settings/category/files) sayfasındaki `authorized_extensions` ayarını düzenleyin." lounge_welcome: - title: "Lobiye hoşgeldiniz" + title: "Lobiye hoş geldiniz" body: |2 Tebrikler! :confetti_ball: @@ -322,7 +323,7 @@ tr_TR: uncategorized: "Kategorisiz silinemez" has_subcategories: "Alt kategorileri bulunduğu için bu kategori silinemez." topic_exists: - other: "Bu kategoriyi silemezsiniz çünkü %{count} konusu bulunuyor. En eski konu; %{topic_link}." + other: "Bu kategoriyi silemezsiniz çünkü %{count} konusu bulunuyor. En eski konu: %{topic_link}." topic_exists_no_oldest: "Bu kategoriyi silemezsiniz çünkü %{count} konusu bulunuyor." uncategorized_description: "Kategoriye ihtiyacı olmayan, ya da diğer kategorilere uymayan konular." trust_levels: @@ -386,7 +387,7 @@ tr_TR: distance_in_words_verbose: half_a_minute: "şu anda" less_than_x_seconds: - other: "şu anda" + other: "hemen şimdi" x_seconds: other: "%{count} saniye önce" less_than_x_minutes: @@ -413,7 +414,7 @@ tr_TR: choose: "Lütfen parola seçin" update: 'Parolayı Güncelle' save: 'Parola Belirle' - title: 'Parolayı Sıfırla' + title: 'Parola Sıfırla' success: "Parolanızı başarıyla değiştirdiniz ve giriş yaptınız." success_unapproved: "Parolanızı başarıyla değiştirdiniz." continue: "%{site_name} adresine devam edin" @@ -431,7 +432,7 @@ tr_TR: already_done: "Üzgünüz, hesap doğrulama linki artık geçerli değil. Hesabınız zaten etkin olabilir mi?" please_continue: "Hesabınız doğrulandı; şimdi ana sayfaya yönlendirileceksiniz." continue_button: "%{site_name} adresine devam edin" - welcome_to: "%{site_name} sitesine hoşgeldiniz!" + welcome_to: "%{site_name} topluluğuna hoş geldiniz!" approval_required: "Bu foruma erişebilmeniz için yeni hesabınızın bir moderatör tarafından manuel olarak onaylanması gerekir. Hesabınız onaylandığında e-posta ile bilgilendirileceksiniz!" missing_session: "Hesabınızı tespit edemiyoruz eğer önceden hesap oluşturduysanız, lütfen çerezlerin etkin olduğundan emin olun." post_action_types: @@ -458,8 +459,8 @@ tr_TR: notify_moderators: title: "Başka Bir Şey" description: 'Bu gönderinin, yukarıda belirtilmeyen bir nedenden ötürü görevliler tarafından kontrol edilmesi gerekiyor.' - long_form: 'bunu moderatörün ilgisi için bildirdi' - email_title: '"%{title}" konu başlığının moderatör tarafından kontrol edilmesi gerekiyor' + long_form: 'bunu görevlinin ilgisi için bildirdi' + email_title: '"%{title}" konusundaki bir gönderinin görevli tarafından kontrol edilmesi gerekiyor' email_body: "%{link}\n\n%{message}" bookmark: title: 'İmle' @@ -484,7 +485,7 @@ tr_TR: long_form: 'bunu uygunsuz olarak bildirdi' notify_moderators: title: "Başka Bir Şey" - description: 'Bu gönderi yönergeler, hizmet şartları veya başka herhangi bir nedenden dolayı moderatör incelemesi gerektirmektedir.' + description: 'Bu gönderi yönergeler, hizmet şartları veya başka herhangi bir nedenden dolayı görevli incelemesi gerektirmektedir.' long_form: 'bunu moderatörün ilgisi için bildirdi' email_title: '"%{title}" konu başlığının moderatör tarafından kontrol edilmesi gerekiyor' email_body: "%{link}\n\n%{message}" @@ -657,8 +658,8 @@ tr_TR: yaxis: "Ziyaret sayısı" dashboard: rails_env_warning: "Sunucunuz %{env} modunda çalışıyor." - host_names_warning: "config/database.yml dosyasınızda, bilgisayar adı olarak varsayılan değer olan \"localhost\" ayarlı. Değeri, sitenizin bilgisayar adını kullanacak biçimde güncelleyiniz." - gc_warning: 'Sunucunuz, Ruby''nin varsayılan çöp toplama ayarlarını kullanıyor ki bu size en iyi performansı vermeyecektir. Performansı ayarı için şu konuyu okuyun: Discourse için Ruby on Rails Ayarları.' + host_names_warning: "config/database.yml dosyasınızda, bilgisayar adı olarak öntanımlı değer olan \"localhost\" ayarlı. Değeri, sitenizin bilgisayar adını kullanacak biçimde güncelleyiniz." + gc_warning: 'Sunucunuz, Ruby''nin öntanımlı çöp toplama ayarlarını kullanıyor ki bu size en iyi performansı vermeyecektir. Performansı ayarı için şu konuyu okuyun: Discourse için Ruby on Rails Ayarları.' sidekiq_warning: 'Sidekiq çalışmıyor. E-posta yollamak gibi gibi birçok asenkron görev sidekiq''in işidir. En az bir tane sidekiq süreci çalıştırdığınızdan emin olun. Sidekiq ile ilgili bilgi burada.' queue_size_warning: 'Kuyruğa eklenmiş işlerin sayısı fazla: %{queue_size}. Bu Sidekiq işlem(ler)indeki bir sorunu işaret ediyor olabilir, ya da daha fazla Sidekiq işçisi eklemeniz gerekiyor olabilir.' memory_warning: 'Sunucunuz toplam 1GB''tan az bellek ile çalışıyor. En az 1GB bellek tavsiye edilmektedir.' @@ -676,14 +677,14 @@ tr_TR: title_nag: "Sitenizin ismini girin. Site ismini Site Ayarları sayfasından güncelleyin." site_description_missing: "Arama sonuçlarında gözükecek, sitenizi açıklayan tek bir cümle girin. Site Ayarları sayfasından site açıklamasını güncelleyin." consumer_email_warning: "Sitenizde e-posta gönderimleri için Gmail (ya da başka bir e-posta hizmeti) kurulumu yapılmış. Gmail ile gönderebileceğiniz e-posta sayısı limitlidir. Onun yerine, e-postalarınızın ulaştırılabildiğinden emin olmak için mandrill.com benzeri bir hizmet sağlayıcısını kullanın." - site_contact_username_warning: "Önemli otomatik mesajları gönderen kişi olarak gözükecek adminin kullanıcı adını girin. Site Ayarları&lt;/a> sayfasından site_contact_username parametresini güncelleyin." + site_contact_username_warning: "Önemli otomatik mesajları gönderen kişi olarak gözükecek yetkili kullanıcı adını girin. Site Ayarları&lt;/a> sayfasından site_contact_username parametresini güncelleyin." notification_email_warning: "Bildiri e-postaları alan adınıza bağlı geçerli bir e-posta adresinden yollanmıyor; e-postalar düzenli ve güvenilir bir şekilde ulaşmayabilir. Lütfen Site Ayarları sayfasından notification_email değeri için geçerli bir yerel e-posta adresi girin." subfolder_ends_in_slash: "Alt dizin kurulumunuz hatalı, DISCOURSE_RELATIVE_URL_ROOT sonunda yan çizgi bulunmalı." bad_favicon_url: "Minik simge yüklemesi başarısız oldu. Site Ayarlarından favicon_url alanını kontrol edin." site_settings: - censored_words: " ■■■■ yerine otomatik olarak kullanılacak kelimeler" + censored_words: "kelime yerine otomatik olarak ■■■■ kullanılacak kelimeler" delete_old_hidden_posts: "30 günden fazla süreyle gizli kalan gizlenmiş gönderileri otomatik olarak sil." - default_locale: "Bu Discourse yüklemesinin (ISO 639-1 Code) varsayılan dili" + default_locale: "Bu Discourse yüklemesinin (ISO 639-1 Code) öntanımlı dili" allow_user_locale: "Kullanıcıların arayüz için kendi istedikleri dili seçmesine izin ver" set_locale_from_accept_language_header: "anonim kullanıcıların arayüz dilini tarayıcılarının dil başlığından al. (DENEYSELDİR, anonim önbellek ile çalışmaz)" min_post_length: "Gönderide olması gereken en az karakter sayısı" @@ -701,9 +702,9 @@ tr_TR: educate_until_posts: "Kullanıcılar, ilk (n) gönderilerini yazmaya başladıklarında, pop-up yeni kullanıcı eğitim paneli metin düzenleyecisinin üstünde çıksın." title: "Sayfa başlığı etiketinde kullanılacak, bu sitenin ismi." site_description: "Meta açıklama etiketinde kullanılacak, bu sitenin bir cümlelik açıklaması." - contact_email: "Bu site için sorumlu kişinin e-posta adresi. Sadece acil durumlar için /about iletişim formu içerisinde ve beklenmeyen bildirmeler gibi kritik bildiriler için kullanılacak." + contact_email: "Bu site için sorumlu kişinin e-posta adresi. Sadece acil durumlar için /about iletişim formu içerisinde ve beklenmeyen bildirmeler gibi ciddi bildiriler için kullanılacak." contact_url: "Bu site için iletişim URL'si. Acil durumlar için /about iletişim formunda kullanılır." - queue_jobs: "SADECE YAZILIMCILAR İÇİN! UYARI! Aksi gerekmediği takdirde sidekiq işlerini hep otomatik sıraya koydurtun. Bu özellik devre dışı bırakılırsa, siteniz düzgün çalışmayacaktır." + queue_jobs: "SADECE GELİŞTİRİCİLER İÇİN! UYARI! Aksi gerekmediği takdirde işleri sidekiq ile sıraya koydurtun. Bu özellik devre dışı bırakılırsa, siteniz düzgün çalışmayacaktır." crawl_images: "Doğru genişlik ve yükseklik boyutlarını girmek için uzak URL'lerdeki resimlerin birer kopyasını alınsın." download_remote_images_to_local: "Uzaktaki resimler yerel resimlere çevirmek için indirilsin; bu ayar resim bağlantılarının kırılmasını önleyecektir" download_remote_images_threshold: "Uzaktaki resimlerin yerele indirilmesi için gereken en az disk alanı (yüzdesel)" @@ -717,10 +718,10 @@ tr_TR: max_image_height: "Bir gönderideki küçük resimlerin en fazla yüksekliği" category_featured_topics: "/categories sayfasında yer alan kategori başına düşen konu sayısı. Bu değeri değiştirirseniz, değişikliğin kategoriler sayfasına yansıması 15 dakika kadar sürebilir." show_subcategory_list: "Bir kategoriye girildiğinde konu listesi yerine alt kategori listesini göster." - fixed_category_positions: "Seçerseniz, kategoriler için sabit bir sıralama belirleyebileceksiniz. Seçmezseniz, kategoriler aktivite sırasına göre listelenir. " + fixed_category_positions: "Seçerseniz, kategoriler için sabit bir sıralama belirleyebileceksiniz. Seçmezseniz, kategoriler etkinlik sırasına göre listelenir. " fixed_category_positions_on_create: "Seçerseniz, konu oluşturma ekranında da kategori sıralaması korunur (fixed_category_positions gerektirir)." add_rel_nofollow_to_user_content: "İç bağlantılar (ana alan adları dahil) hariç, gönderilen tüm kullanıcı içeriklerine rel nofollow ekle. Bu ayarı değiştirirseniz, tüm gönderileri \"rake post:rebake\" ile yeniden işlemeniz gerekir." - exclude_rel_nofollow_domains: "nofollow eklenmeyecek sınırlandırılmış alan adları listesi. tld.com'a izin verirseniz otomatik olarak sub.tld.com'a da izin verilir." + exclude_rel_nofollow_domains: "nofollow eklenmeyecek sınırlandırılmış alan adları listesi. ust.com'a izin verirseniz otomatik olarak alt.ust.com'a da izin verilir." post_excerpt_maxlength: "Gönderi alıntısının / özetinin en fazla uzunluğu." show_pinned_excerpt_mobile: "Mobil görünümünde başa tutturulmuş konuların özetini göster." show_pinned_excerpt_desktop: "Masaüstü görünümünde başa tutturulmuş konuların özetini göster." @@ -740,8 +741,8 @@ tr_TR: summary_likes_required: "'Bu Konuyu Özetle'nin etkinleştirilmesi için konuda olması gereken en az beğeni sayısı" summary_percent_filter: "Kullanıcı 'Bu Konuyu Özetle'ye tıkladığında, gönderinin ilk % kısmını göster" summary_max_results: "'Bu Konuyu Özetle'den dönen en fazla gönderi sayısı" - enable_private_messages: "Güven düzeyi 1'e(özel mesaj göndermek için en az seviye ayarıyla belirlenebilir) sahip kullanıcıların mesaj oluşturup cevaplamasına izin ver. Görevliler her durumda mesaj gönderebilir." - enable_long_polling: "Bildiri için kullanılan message bus uzun sorgular yapabilir" + enable_private_messages: "Güven seviyesi 1'e(özel mesaj göndermek için en az seviye ayarıyla belirlenebilir) sahip kullanıcıların mesaj oluşturup cevaplamasına izin ver. Görevliler her durumda mesaj gönderebilir." + enable_long_polling: "Bildiri için kullanılan mesaj yolu uzun sorgular yapabilir" long_polling_base_url: "Uzun sorgular için kullanılan baz URL (CDN dinamik içerik sunuyorsa, bunu origin olarak ayarladığına emin ol) ör: http://origin.site.com" long_polling_interval: "Gönderilecek bilgi olmadığı zaman sunucunun kullanıcılara geri dönmeden önce beklemesi gereken zaman (sadece giriş yapmış kullanıcın için)" polling_interval: "Uzun sorgular yapılmadığı zaman, kaç mili saniyede bir giriş yapmış kullanıcılar poll yapmalı" @@ -770,21 +771,21 @@ tr_TR: allow_moderators_to_create_categories: "Moderatörlerin yeni kategoriler oluşturmasına izin ver" cors_origins: "Cross-origin isteklerin (CORS) izin verilen originler. Her origin http:// veya https:// içermeli. CORS'u etkinleştirebilmek için DISCOURSE_ENABLE_CORS env değişkeni doğru olarak ayarlanmalı." use_admin_ip_whitelist: "Yöneticiler, sadece Taranmış IP listesinde tanımlanmış bir IP adresinden erişim sağlıyorlarsa giriş yapabilirler. (Yönetici > Kayıtlar > Taranmış IP'ler)" - top_menu: "Anasayfa navigasyonunda nelerin, hangi sırada yer alacağını belirleyin. Örneğin en sonIyeniIokunmamışIkategorilerIen popülerIokunmuşlarIgönderilenlerIimlenenler" + top_menu: "Anasayfa gezingesinde nelerin, hangi sırada yer alacağını belirleyin. Örneğin en sonIyeniIokunmamışIkategorilerIgözdeIokunmuşlarIgönderilenlerIimlenenler" post_menu: "Gönderi menüsündeki öğelerin hangi sırada yer alacağını belirleyin. Örnek: beğen|düzenle|bildir|sil|paylaş|imle|cevapla" post_menu_hidden_items: "Gönderi menüsündeki maddeler, genişletme üç noktasına tıklanmadığı takdirde otomatik olarak gizlenir. " share_links: "Paylaşım penceresinde hangi maddelerin ne sırada gözükeceğini belirleyin." - track_external_right_clicks: "URL'leri tekrar yazdığı için, sağ tıklanan dış bağlantıların (ör: yeni bir sekmede aç) takibi varsayılan ayarlarda devre dışı bırakılmıştır." - site_contact_username: "Tüm otomatik mesajlar için gönderen kişi olarak gözükecek geçerli bir görevli kullanıcı adı. Boş bırakılırsa varsayılan Sistem hesabı kullanılacak." - send_welcome_message: "Tüm yeni kullanıcılara bir hoşgeldiniz mesajı ile beraber hızlı başlangıç kılavuzu gönderin." + track_external_right_clicks: "URL'leri tekrar yazdığı için, sağ tıklanan dış bağlantıların (ör: yeni bir sekmede aç) takibi öntanımlı ayarlarda devre dışı bırakılmıştır." + site_contact_username: "Tüm otomatik mesajlar için gönderen kişi olarak gözükecek geçerli bir görevli kullanıcı adı. Boş bırakılırsa öntanımlı Sistem hesabı kullanılacak." + send_welcome_message: "Tüm yeni kullanıcılara bir hoş geldiniz mesajı ile beraber hızlı başlangıç kılavuzu gönderin." suppress_reply_directly_below: "Bu gönderinin direk altında sadece tek bir cevap varsa, gönderideki açılabilir cevap sayısı bölümünü gösterme." suppress_reply_directly_above: "Bu gönderinin direk üstünde sadece tek bir cevap varsa, gönderideki açılabilir hangi-cevaba-istinaden-cevapla bölümünü gösterme." suppress_reply_when_quoting: "Gönderi cevabı alıntılarsa, gönderideki açılabilir hangi-cevaba-istinaden-cevapla bölümünü gösterme." max_reply_history: "Hangi-cevaba-istinaden-cevapla bölümü açılınca gösterilecek en fazla cevap sayısı" - topics_per_period_in_top_summary: "Popüler konular özetinde gösterilen popüler konu sayısı." - topics_per_period_in_top_page: "'Daha Fazla Göster' ile genişletilen popüler konular bölümünde gösterilecek popüler konu sayısı. " - redirect_users_to_top_page: "Yeni ve uzun süredir giriş yapmamış kullanıcıları otomatik olarak Popüler sayfasına yönlendir." - top_page_default_timeframe: "Üst sayfa görünümü için varsayılan zaman aralığı" + topics_per_period_in_top_summary: "Gözde konular özetinde gösterilen gözde konu sayısı." + topics_per_period_in_top_page: "'Daha Fazla Göster' ile genişletilen gözde konular bölümünde gösterilecek gözde konu sayısı. " + redirect_users_to_top_page: "Yeni ve uzun süredir giriş yapmamış kullanıcıları otomatik olarak Gözde sayfasına yönlendir." + top_page_default_timeframe: "Üst sayfa görünümü için öntanımlı zaman aralığı" show_email_on_profile: "Kullanıcının e-posta adresini profilinde göster (sadece kendilerine ve site görevlilerine gözükür)" prioritize_username_in_ux: "Kullanıcı sayfası, kullanıcı kartı ve gönderilerde kullanıcı adını ilk olarak göster(devre dışı ise gerçek isim önce gözükür)" email_token_valid_hours: "Parolamı unuttum / hesap etkinleştirme jetonları (n) saat geçerlidir." @@ -798,8 +799,8 @@ tr_TR: log_out_strict: "Çıkış yapılırken, kullanıcının tüm cihazlardaki TÜM seanslarını sonlandır" version_checks: "Discourse Hub'a sürüm güncellemeleri için ping yolla ve yeni versiyon mesajlarına /admin gösterge panelinde yer ver" new_version_emails: "Discourse'un yeni sürümü çıktığında contact_email adresine e-posta gönder." - port: "SADECE YAZILIMCILAR İÇİN! UYARI! Varsayılan 80 portu yerine bu HTTP portunu kullanın. Varsayılan 80'i kullanmak için boş bırakın. " - force_hostname: "SADECE YAZILIMCILAR İÇİN! DİKKAT! URL'de bir bilgisayar adı belirleyin. Varsayılan için boş bırakın." + port: "SADECE YAZILIMCILAR İÇİN! UYARI! Öntanımlı 80 portu yerine bu HTTP portunu kullanın. Öntanımlı 80'i kullanmak için boş bırakın. " + force_hostname: "SADECE YAZILIMCILAR İÇİN! DİKKAT! URL'de bir bilgisayar adı belirleyin. Öntanımlı için boş bırakın." invite_expiry_days: "Kullanıcı davet anahtarlarının geçerlilik süresi, gün olarak" invite_passthrough_hours: "Daha önce kabul edilmiş davetiye anahtarının kullanım süresi, saat olarak" invite_only: "Halka açık kayıt sistemi devre dışı bırakıldı, tüm yeni kullanıcıların bir üye ya da görevli tarafından davet edilmesi gerekir. " @@ -813,7 +814,7 @@ tr_TR: enable_sso: "Dış bir site aracılığı ile tek oturum açma sistemini etkinleştir. (UYARI: etkinleştirildiği takdirde, doğru yapılandırılmamışsa bazı kişilerin, SİZ DAHİL, oturum açmasını engelleyebilir! Ayrıca davetiye sistemini de devre dışı bırakır.)" enable_sso_provider: "/session/sso_provider son noktasında Discourse SSO sağlayıcı protokolünü uygula, sso_secret değerinin seçilmiş olmasını gerektirir" sso_secret: "SSO bilgisinin kritopgrafik şekilde doğrulanması için kullanılan gizli string, 10 karakter veya daha uzun olduğundan emin olun" - sso_overrides_email: "SSO yararlı yükündeki dış sitedeki e-postayı, her giriş yapıldığında, yerel değişiklikleri engellemek için yerel e-postanın üzerine yazar (DİKKAT: yerel e-postaların olağanaştırma sürecinde uyuşmazlıklar doğabilir)" + sso_overrides_email: "SSO yararlı yükündeki dış sitedeki e-postayı, her giriş yapıldığında, yerel değişiklikleri engellemek için yerel e-postanın üzerine yazar (DİKKAT: yerel e-postaların olağanlaştırma sürecinde uyuşmazlıklar doğabilir)" sso_overrides_username: "SSO yararlı yükündeki dış sitedeki kullanıcı adını, her giriş yapıldığında, yerel değişiklikleri engellemek için yerel kullanıcı adının üzerine yazar. (DİKKAT: kullanıcı adı uzunluklarıyla ilgili kurallardaki farklılıklardan ötürü uyuşmazlıklar doğabilir)" sso_overrides_name: "SSO yararlı yükündeki dış sitedeki tam adı, her giriş yapıldığında, yerel değişiklikleri engellemek için yerel tam adın üzerine yazar." sso_overrides_avatar: "SSO yararlı yükündeki dış site avatarını kullanıcı avatarının üzerine yazar Eğer etkinleştirildiyse, allow_uploaded_avatars ayarının devre dışı bırakılması şiddetle önerilir" @@ -843,7 +844,7 @@ tr_TR: enable_s3_backups: "Tamamlanınca yedeklemeleri S3'e yükle. ÖNEMLİ: Dosyalar ayarında doğru S3 girilmesini gerektirir" s3_backup_bucket: "Yedeklemelerin yüklenmesi için uzak biriktirme yeri. UYARI: Özel bir biriktirme yeri olduğundan emin olun" s3_disable_cleanup: "Yerel olarak silinen yedeklerin S3 sunucularından silinmesini kapat" - backup_time_of_day: "Yedeklemenin yapılacağı UTC zaman" + backup_time_of_day: "Yedeklemenin yapılacağı vaktin gün içindeki UTC zamanı." backup_with_uploads: "Planlanmış yedeklere yüklemeleri de dahil et. Etkisizleştirilirse sadece veritabanı yedeklenecek." active_user_rate_limit_secs: "'last_seen_at' alanını ne kadar sıklıkta güncelliyoruz, saniye olarak" verbose_localization: "Arayüzde ayrıntılı yerelleştirme ipuçlarını göster" @@ -878,13 +879,13 @@ tr_TR: s3_cdn_url: "Tüm s3 öğeleri için CDN URL adresi. (örneğin: https://cdn.somewhere.com). UYARI: bu ayarı değiştirdikten sonra tüm eski gönderileri rebake etmelisiniz." avatar_sizes: "Otomatik üretilen avatar ölçülerinin listesi." external_system_avatars_enabled: "Dışsal sistem avatarları hizmeti kullan." - default_opengraph_image_url: "Varsayılan opengraph imajının URL'si." + default_opengraph_image_url: "Öntanımlı opengraph imajının URL'si." allow_all_attachments_for_group_messages: "Grup mesajları için tüm e-posta eklentilerine izin ver." convert_pasted_images_to_hq_jpg: "Yapıştırılan resimleri yüksek kaliteli JPG dosyalarına dönüştür." convert_pasted_images_quality: "Dönüştürülen JPG dosyasının kalitesi (1 en düşük kalite, 100 en iyi kalite)" enable_flash_video_onebox: "Kutularda swf ve flv (Adobe Flash) yerleştirmelerine izin ver. UYARI: güvenlik açıkları doğurabilir" - default_invitee_trust_level: "Davet edilen kullanıcılar için varsayılan güven seviyesi (0-4)." - default_trust_level: "Tüm yeni kullanıcılar için varsayılan güven seviyesi (0-4). DİKKAT! Bu ayarı değiştirmeniz ciddi istenmeyen gönderi riski doğurabilir." + default_invitee_trust_level: "Davet edilen kullanıcılar için öntanımlı güven seviyesi (0-4)." + default_trust_level: "Tüm yeni kullanıcılar için öntanımlı güven seviyesi (0-4). DİKKAT! Bu ayarı değiştirmeniz ciddi seviyede istenmeyen gönderi riski doğurabilir." tl1_requires_topics_entered: "Yeni bir kullanıcının güven seviyesi 1'e yükseltilmeden önce oluşturması gereken konu sayısı." tl1_requires_read_posts: "Yeni bir kullanıcının güven seviyesi 1'e yükseltilmeden önce okuması gereken gönderi sayısı." tl1_requires_time_spent_mins: "Yeni bir kullanıcının güven seviyesi 1'e yükseltimeden önce gönderi okuyarak geçirmesi gereken dakika miktarı." @@ -899,6 +900,8 @@ tr_TR: tl3_requires_days_visited: "Kullanıcının güven seviyesi 3'e yükselmeye hak kazanması için son günlerde (gs3 için gereken zaman içerisinde) siteyi ziyaret etmiş olması gereken en az gün sayısı. gs3'e ulaşmayı engellemek için gs3 için gereken zamandan daha fazla bir değer girin. (0 veya daha fazla)" tl3_requires_topics_replied_to: "Kullanıcının güven seviyesi 3'e yükselmeye hak kazanması için son günlerde (gs3 için gereken zaman içerisinde) cevaplaması gereken en az konu sayısı (0 veya daha fazla)" tl3_requires_topics_viewed: "Kullanıcının güven seviyesi 3'e yükselmeye hak kazanması için son günlerde (gs3 için gereken zaman içerisinde) okumuş olması gereken konuların yüzdesi (0-100 arası)" + tl3_requires_topics_viewed_cap: "Son günlerde (gs3 için gereken zaman içerisinde) görüntülenmesi gereken en fazla konu sayısı." + tl3_requires_posts_read_cap: "Son günlerde (gs3 için gereken zaman içerisinde) okunması gereken en fazla konu sayısı." tl3_requires_topics_viewed_all_time: "Bir kullanıcının güven seviyesi 3'e yükselmeye hak kazanması için görüntülemesi gereken toplam en az konu sayısı." tl3_requires_posts_read_all_time: "Bir kullanıcının güven seviyesi 3'e yükselmeye hak kazanması için görüntülemesi gereken toplam en az gönderi sayısı." tl3_promotion_min_duration: "Bir kullanıcının güven seviyesi 2'ye düşürülebilmesi için güven seviyesi 3'te geçirmesi gereken en az gün sayısı." @@ -908,7 +911,7 @@ tr_TR: min_trust_to_create_topic: "Yeni bir konu oluşturmak için gereken en az güven seviyesi. " min_trust_to_edit_wiki_post: "Wiki olarak işaretlenmiş bir gönderiyi düzenleyebilmek için gereken en az güven seviyesi." min_trust_to_allow_self_wiki: "Kullanıcının kendi wiki gönderisini oluşturabilmesi için gereken güven seviyesi." - min_trust_to_send_messages: "Özel bir mesaj oluşturabilmek için gerekli olan güven düzeyi." + min_trust_to_send_messages: "Özel bir mesaj oluşturabilmek için gerekli olan güven seviyesi." newuser_max_links: "Yeni bir kullanıcının bir gönderiye ekleyebileceği bağlantı sayısı." newuser_max_images: "Yeni bir kullanıcının bir gönderiye ekleyebileceği resim sayısı." newuser_max_attachments: "Yeni bir kullanıcının bir gönderiye ekleyebileceği dosya sayısı." @@ -926,9 +929,9 @@ tr_TR: title_fancy_entities: "SmartyPants tarzında, konu başlıklarında ASCII karakterlerini süslü HTML öğelerine çevir: http://daringfireball.net/projects/smartypants/" min_title_similar_length: "Bir başlığın benzer konular için kontrolünün yapılmasından önce sahip olması gereken en az uzunluk." min_body_similar_length: "Bir gönderi metninin benzer konular için kontrolünün yapılmasından önce sahip olması gereken en az uzunluk." - desktop_category_page_style: "/categories sayfasının görsel stili." + desktop_category_page_style: "/categories sayfasının görsel biçimi." category_colors: "Kategoriler için izin verilen onaltılı renk değerlerinin listesi" - category_style: "Kategori rozetleri için görsel stil." + category_style: "Kategori rozetleri için görsel biçim." max_image_size_kb: "KB cinsinden yüklenebilecek en fazla resim büyüklüğü. Bu nginx (client_max_body_size) / apache veya proxyde de ayarlanmalı." max_attachment_size_kb: "KB cinsinden yüklenebilecek en fazla eklenti dosyası büyüklüğü. Bu nginx (client_max_body_size) / apache veya proxyde de ayarlanmalı." authorized_extensions: "Yüklenebilecek dosya uzantılarının listesi (tüm dosya türlerini etkinleştirmek için '*' kullanın)" @@ -937,9 +940,9 @@ tr_TR: topic_views_heat_low: "Bu kadar görüntülemeden sonra, görüntülemeler alanı hafifçe vurgulanacak." topic_views_heat_medium: "Bu kadar görüntülemeden sonra, görüntülemeler alanı kısmen vurgulanacak." topic_views_heat_high: "Bu kadar görüntülemeden sonra, görüntülemeler alanı belirgin şekilde vurgulanacak." - cold_age_days_low: "Sohbet başlangıcından bu kadar süre geçtiğinde, son aktivite tarihi hafifçe vurgulanır." - cold_age_days_medium: "Sohbet başlangıcından bu kadar süre geçtiğinde, son aktivite tarihi kısmen vurgulanır." - cold_age_days_high: "Sohbet başlangıcından bu kadar süre geçtiğinde, son aktivite tarihi belirgin şekilde vurgulanır." + cold_age_days_low: "Sohbet başlangıcından bu kadar süre geçtiğinde, son etkinlik tarihi hafifçe vurgulanır." + cold_age_days_medium: "Sohbet başlangıcından bu kadar süre geçtiğinde, son etkinlik tarihi kısmen vurgulanır." + cold_age_days_high: "Sohbet başlangıcından bu kadar süre geçtiğinde, son etkinlik tarihi belirgin şekilde vurgulanır." history_hours_low: "Bu kadar saat içerisinde düzenlenen bir gönderinin, düzenlendiğini belirten gösterge hafifçe vurgulanacak. " history_hours_medium: "Bu kadar saat içerisinde düzenlenen bir gönderinin, düzenlendiğini belirten gösterge kısmen vurgulanacak. " history_hours_high: "Bu kadar saat içerisinde düzenlenen bir gönderinin, düzenlendiğini belirten gösterge belirgin şekilde vurgulanacak. " @@ -967,9 +970,11 @@ tr_TR: auto_block_first_post_regex: "Eğer eşleşirse kullanıcının ilk gönderisinin engellenmesi ve onaylanma kuyruğuna gitmesine neden olan harf büyüklüğü duyarsız düzenli ifade. Örnek: reklam|a[bc]a düzenli ifadesi reklam, aba ya da aca içeren ilk gönderilerin engellenmesi ve onaylanma kuyruğuna gitmesine neden olacaktır. Sadece ilk gönderiler için geçerlidir." reply_by_email_enabled: "Konulara e-posta üzerinden cevap yazmayı etkinleştir." reply_by_email_address: "Email ile cevapla özelliği için gelen e-posta adresi şablonu, örnek: %{reply_key}@reply.example.com or replies+%{reply_key}@example.com" + incoming_email_prefer_html: "Gelen e-postalarda metin yerine HTML kullan. Bir ihtimal biçim hatalarına neden olabilir!" disable_emails: "Discourse'un herhangi bir e-posta göndermesine izin verme" strip_images_from_short_emails: "2800 Byte boyutundan küçük e-postalardan resimleri çıkar" short_email_length: "Kısa e-postanın uzunluğu, Byte olarak" + unsubscribe_via_email: "Kullanıcıların konu veya içerik alanında 'unsubscribe' olan bir e-posta göndererek e-postalara abonelikten çıkmasına izin ver" delete_email_logs_after_days: "(n) günden sonra e-posta kayıtlarını sil. sürekli tutmak için 0" max_emails_per_day_per_user: "Kullanıcılara bir günde gönderilebilecek en fazla e-posta sayısı. Limiti kaldırmak için 0" pop3_polling_enabled: "E-posta cevapları için POP3 üzerinden sorgula" @@ -983,10 +988,10 @@ tr_TR: email_in: "Kullanıcıların e-posta aracılığıyla yeni konu oluşturabilmesine izin ver (pop3 sorgulaması gerektirir). Adresleri her kategorinin \"Ayarlar\" sekmesinden düzenleyin." email_in_min_trust: "Bir kullanıcının e-posta aracılığı ile yeni konu oluşturabilmesi için sahip olması gereken en az güven seviyesi." email_prefix: "E-postaların konu bölümünü belirten [etiket]. Boş bırakılırsa 'title' yazacak." - email_site_title: "Bu siteden giden e-postalarda gönderici olarak kullanılacak sitenin başlığı. Herhangi bir şey girilmezse varsayılan olarak 'title' yazacak. Eğer 'başlık\" içeriğinizde, e-posta göndericisinin stringlerinde izin verilmeyen karakterler varsa, bu ayarı kullanın. " + email_site_title: "Bu siteden giden e-postalarda gönderici olarak kullanılacak sitenin başlığı. Herhangi bir şey girilmezse öntanımlı olarak 'title' yazacak. Eğer 'başlık\" içeriğinizde, e-posta göndericisinin stringlerinde izin verilmeyen karakterler varsa, bu ayarı kullanın. " minimum_topics_similar: "Yeni konu oluşturulurken, benzer konuların gösterilmesi için sitede olması gereken konu sayısı." relative_date_duration: "Gönderinin üstünden bu kadar gün geçtikten sonra, gönderi tarihi mutlak şekilde değil (20 Şubat) göreceli şekilde (7g) gösterilecek." - delete_user_max_post_age: "İlk gönderisini (x) günden eski olan kullanıcıların silinmesine izin verme." + delete_user_max_post_age: "İlk gönderisi (x) günden eski olan kullanıcıların silinmesine izin verme." delete_all_posts_max: "Tüm Gönderileri Sil düğmesine basıldığında tek seferde silinebilecek en fazla gönderi sayısı. Eğer bir kullanıcının gönderi sayısı bu sayıdan fazlaysa, gönderilerin hepsi tek seferde silinemez ve bu kullanıcı silinemez." username_change_period: "Kayıt sonrası, kullanıcı adınının değiştirilebileceği gün sayısı. (Kullanıcı adının değiştirilebilmesini devre dışı bırakmak için 0 girin)" email_editable: "Kullanıcıların kayıt olduktan sonra e-posta adreslerini değiştirmesine izin ver." @@ -994,10 +999,11 @@ tr_TR: allow_uploaded_avatars: "Kullanıcıların özel profil resimleri yüklemelerine izin ver." allow_animated_avatars: "Kullanıcıların hareketli gif profil resimleri kullanmalarına izin ver. UYARI: Bu ayarı değiştirdikten sonra avatars:refresh rake görevini çalıştırın." allow_animated_thumbnails: "Animasyonlu giflerin, animasyonlu küçük resmini oluşturur." - default_avatars: "Yeni kullanıcılar için, onlar değiştirene kadar, varsayılan olarak kullanılacak avatarların URL'leri." + default_avatars: "Yeni kullanıcılar için, onlar değiştirene kadar, öntanımlı olarak kullanılacak avatarların URL'leri." automatically_download_gravatars: "Hesap oluşturma veya e-posta değişikliği esnasında kullanıcılar için Gravatarları indir" digest_topics: "E-posta özetinde en fazla gösterilebilecek olan konu sayısı." digest_min_excerpt_length: "E-posta özetindeki konular için gösterilecek özet boyutu, karakter olarak." + digest_suppress_categories: "Bu kategorileri özet e-postalarından gizle." disable_digest_emails: "Tüm kullanıcılar için özet e-postaları devre dışı bırak." detect_custom_avatars: "Kullanıcıların özel profil resimleri yükleyip yüklemediklerini kontrol et ya da etme." max_daily_gravatar_crawls: "Discourse'un gün içinde özel avatarlar için Gravatar'ı en fazla kaç kere kontrol edeceği." @@ -1009,7 +1015,7 @@ tr_TR: anonymous_account_duration_minutes: "Anonimliği koruyabilmek için, her kulanıcı için her N dakikada bir yeni bir anonim hesap oluştur. Örnek: 600'e ayarlanırsa, son gönderi üzerinden 600 dakika geçer geçmez VE kullanıcı anonim moddaysa, yeni bir anonim hesap oluşturulur." hide_user_profiles_from_public: "Anonim kullanıcılar için kullanıcı kartlarını, kullanıcı profillerini ve kullanıcı dizinini devre dışı bırak" allow_profile_backgrounds: "Kullanıcıların profillerine arkaplan eklemesine izin ver." - enable_mobile_theme: "Mobil cihazlar mobil uyumlu temayı kullanır, dilerse masaüstü görünüme geçebilirler. Eğer özel, duyarlı bir stil kullanıyorsanız bunu devredışı bırakın." + enable_mobile_theme: "Mobil cihazlar mobil uyumlu temayı kullanır, dilerse masaüstü görünüme geçebilirler. Eğer özel, duyarlı bir biçim kullanıyorsanız bunu devre dışı bırakın." dominating_topic_minimum_percent: "Konuyu domine ettiğine dair uyarı almadan önce konudaki gönderilerin yüzde kaçının kullanıcıya ait olması gerekir." disable_avatar_education_message: "Avatar değiştirme için eğitici mesajları kapat." suppress_uncategorized_badge: "Kategorisiz konular için olan rozeti konu listesinde gösterme." @@ -1021,9 +1027,9 @@ tr_TR: enable_names: "Kullanıcıların tam adlarını profillerde, kullanıcı kartlarında ve e-postalarda göster. Tam adların hiç bir yerde görünmemesi için devre dışı bırak." display_name_on_posts: "Gönderilerde @kullanıcıadı'na ek olarak kullanıcının tam adını da göster." show_time_gap_days: "İki gönderinin tarihleri arasında bu kadar gün farkı varsa, konuda zaman aralığına yer ver." - invites_per_page: "Varsayılan olarak kullanıcı sayfasında gösterilen davetler." + invites_per_page: "Öntanımlı olarak kullanıcı sayfasında gösterilen davetler." short_progress_text_threshold: "Bir konudaki gönderi sayısı bu sayının üzerine çıktığında, ilerleme çubuğunda sadece şu anki gönderi sayısını göster. İlerleme çubuğunun kalınlığını değiştirirseniz, bu değeri de değiştirmeniz gerekebilir." - default_code_lang: "GitHub kod bloklarına (lang-auto, ruby, python vs.) uygulanacak, varsayılan programlama dili sözdizimi vurgulaması." + default_code_lang: "GitHub kod bloklarına (lang-auto, ruby, python vs.) uygulanacak, öntanımlı programlama dili söz dizimi vurgulaması." warn_reviving_old_topic_age: "Herhangi bir kullanıcı, son cevabın burada belirtilen gün sayısından daha önce yazıldığı bir konuya cevap yazmaya başladığında, bir uyarı mesajı çıkacak. Bu özelliği devre dışı bırakmak için 0 girin. " autohighlight_all_code: "Tüm önceden biçimlendirilen kod bloklarına, açıkça dil seçimi yapılmamış olsa da, zorla kod vurgulaması uygula." highlighted_languages: "Dahil edilen kod renklendirme kuralları. (Uyarı: çok fazla dil eklemek performansı etkileyebilir) demo için bakınız: https://highlightjs.org/static/demo/" @@ -1054,8 +1060,8 @@ tr_TR: default_email_mailing_list_mode: "Öntanımlı olarak her yeni gönderi için bir e-posta gönder." disable_mailing_list_mode: "Kullanıcıların duyuru listesi modunu etkinleştirmesini engelle." default_email_always: "Öntanımlı olarak kullanıcı etkin olsa bile e-posta bildirimi gönder." - default_other_new_topic_duration_minutes: "Konunun yeni olarak düşünülmesi için genel varsayılan koşul." - default_other_auto_track_topics_after_msecs: "Bir konunun otomatik olarak takip edilmesi için geçmesi gereken genel varsayılan zaman." + default_other_new_topic_duration_minutes: "Konunun yeni olarak düşünülmesi için genel öntanımlı koşul." + default_other_auto_track_topics_after_msecs: "Bir konunun otomatik olarak takip edilmesi için geçmesi gereken genel öntanımlı zaman." default_other_external_links_in_new_tab: "Harici linkleri, öntanımlı olarak, yeni bir sekmede aç." default_other_enable_quoting: "Vurgulanmış yazılar için alıntı ile cevaplamayı, öntanımlı olarak, etkinleştir." default_other_dynamic_favicon: "Tarayıcı simgesinde, öntanımlı olarak, yeni/güncellenmiş konu sayısını göster." @@ -1065,13 +1071,21 @@ tr_TR: default_categories_watching: "Öntanımlı olarak gözlenen kategorilerin listesi." default_categories_tracking: "Öntanımlı olarak, takip edilen kategorilerin listesi." default_categories_muted: "Öntanımlı olarak, sesi kısılan kategorilerin listesi." + max_api_keys_per_user: "Kullanıcı başına kullanılabilecek kullanıcı API anahtarı sayısı" + min_trust_level_for_user_api_key: "Kullanıcı API'si oluşturmak için gereken güven seviyesi" tagging_enabled: "Konularda etiketleri etkinleştirin?" min_trust_to_create_tag: "Yeni bir etiket oluşturmak için gereken en az güven seviyesi." max_tags_per_topic: "Bir konuya eklenebilecek en fazla etiket." max_tag_length: "Bir etiket isminde kullanılabilecek en fazla karakter sayısı." max_tag_search_results: "Etiketler için arama yapılırken gösterilecek en fazla sonuç." - tag_style: "Etiket rozetleri için görsel stil." + tags_sort_alphabetically: "Etiketleri harf sırasına göre sırala. Öntanımlı olarak gözdelik seviyesine göre gösterilir." + tag_style: "Etiket rozetleri için görsel biçim." + staff_tags: "Yalnızca görevli kişiler tarafından kullanılabilecek etiket listesi" min_trust_level_to_tag_topics: "Konulara etiket eklemek için gereken en az güven seviyesi." + suppress_overlapping_tags_in_list: "Eğer etiketler konu ismi içerisinde tam kelime olarak bulunuyorsa, etiketi gösterme" + company_short_name: "Şirket İsmi (kısa)" + company_full_name: "Şirket İsmi (tamamı)" + company_domain: "Şirket Alan Adı" errors: invalid_email: "Geçersiz e-posta adresi." invalid_username: "Bu kullanıcı adı ile bir kullanıcı bulunmuyor." @@ -1086,6 +1100,7 @@ tr_TR: invalid_string_min: "En az %{min} karakter olmalı." invalid_string_max: "En fazla %{max} karakter olabilir." invalid_reply_by_email_address: "Değer '%{reply_key}' içermeli ve bildiri e-postasından farklı olmalı." + pop3_polling_authentication_failed: "POP3 kimlik doğrulaması başarısız. Lütfen pop3 bilgilerinizi kontrol edin." search: within_post: "%{username} tarafından #%{post_number}" types: @@ -1102,8 +1117,8 @@ tr_TR: most_recent_poster: "En Son Gönderen" frequent_poster: "En Sık Gönderen" redirected_to_top_reasons: - new_user: "Hoşgeldiniz! Bunlar en popüler yeni gönderiler." - not_seen_in_a_month: "Hoşgeldiniz! Bir süredir yoktunuz. Bunlar sizin yokluğunuzda en popüler olan konular." + new_user: "Hoş geldiniz! Bunlar en yeni gözde konular." + not_seen_in_a_month: "Hoş geldiniz! Bir süredir yoktunuz. Bunlar sizin yokluğunuzda en gözde olan konular." merge_posts: edit_reason: other: "%{count} gönderi %{username} tarafından birleştirildi" @@ -1160,7 +1175,7 @@ tr_TR: suspended_with_reason: "Hesap %{date} tarihine kadar askıya alınmıştır. Sebep: %{reason}" errors: "%{errors}" not_available: "Uygun değil. Bunu denemeye ne dersiniz? %{suggestion}" - something_already_taken: "Bir şeyler ters gitti. Kullanıcı adı veya e-posta zaten kayıtlı olabilir. Parolamı Unuttum bağlantısını deneyin." + something_already_taken: "Bir şeyler ters gitti. Kullanıcı adı veya e-posta zaten kayıtlı olabilir. Parolamı unuttum bağlantısını deneyin." omniauth_error: "Üzgünüz, hesabınız doğrulanırken bir hata oluştu. Doğrulama işlemini onaylamamış olabilir misiniz?" omniauth_error_unknown: "Girişiniz yapılırken bir şeyler ters gitti, lütfen tekrar deneyin." new_registrations_disabled: "Şu an yeni hesap oluşturulamıyor. " @@ -1280,7 +1295,7 @@ tr_TR: invite_password_instructions: subject_template: "%{site_name} hesabınız için parola oluşturun" text_body_template: | - %{site_name}'e olan davetiyeni kabul ettiğin için teşekkür ederiz -- hoşgeldin! + %{site_name} topluluğuna olan davetiyeni kabul ettiğin için teşekkür ederiz -- hoş geldin! Şimdi bir parola seçmek için şu bağlantıya tıklayın: %{base_url}/users/password-reset/%{email_token} @@ -1336,22 +1351,115 @@ tr_TR: system_messages: post_hidden: subject_template: "Gönderi topluluk bildirimleri tarafından gizlendi" - welcome_user: - subject_template: "%{site_name} sitesine hoşgeldiniz!" + usage_tips: text_body_template: | - %{site_name} sitesine katıldığınız için teşekkür ederiz, hoşgeldiniz! + İşte başlangıç için birkaç ipucu: + + ## Okuma + + Daha fazla okumak için, **yalnızca aşağı kaydırmaya devam edin!** + + As new replies or new topics arrive, they will appear automatically – no need to refresh the page. + + ## Gezinti + + - For search, your user page, or the menu, use the **icon buttons at upper right**. + + - Selecting a topic title will always take you to your **next unread reply** in the topic. To enter at the top or bottom instead, select the reply count or last reply date. + + + + - While reading a topic, use the timeline on the right to jump to the top, bottom, or your last read position. On smaller screens, select the progress bar at bottom right to expand it: + + + + Ayrıca süper hızlı klavye kısayollarının listesini görmek için ? tuşuna basabilirsiniz. + + ## Cevaplama + + To insert a quote, select the text you wish to quote, then press any Reply button to open the editor. Repeat for multiple quotes. + + + + You can always continue reading while you compose your reply, and we automatically save drafts as you write. + + Birine cevabınız hakkında bildirim yollamak için ismini kullanın. `@` yazarak kullanıcı ismi aramaya başlayabilirsiniz. + + + + To use [standard Emoji](http://www.emoji.codes/), just type `:` to match by name, or use the traditional smileys `;)` + + + + To generate a summary for a link, paste it on a line by itself: + + + + Cevabınız basit HTML, BBCode, veya [Markdown](http://commonmark.org/help/) kullanılarak biçimlendirilebilir: + + Bu kalın. + Bu [b]kalın[/b]. + Bu **kalın**. + + Daha fazla biçimlendirme ipucu için [10 dakikalık öğreticiyi](http://commonmark.org/help/tutorial/) deneyebilirsiniz! + + ## Eylemler + + Tüm gönderilerin altında eylem düğmeleri bulunur: + + + + - To let someone know that you enjoyed and appreciated their post, use the **like** button. Share the love! + + - Grab a copy-pasteable link to any reply or topic via the **link** button. + + - Use the show more button to reveal more actions. **Flag** to privately let the author, or [our staff](%{base_url}/about), know about a problem. **Bookmark** to find this post later on your profile page. + + ## Bildirimler + + When someone replies to you, quotes your post, mentions your `@username`, or even links to your post, a number will immediately appear at the top right of the page. Select it to access your **notifications**. + + + + Don't worry about missing a reply – you'll be emailed any notifications that arrive when you are away. + + ## Tercihler + + - All topics less than **two days old** are considered new. + + - Any topic you've **actively participated in** (by creating it, replying to it, or reading it for an extended period) will be automatically tracked on your behalf. + + You will see the new and unread number indicators next to these topics: + + + + You can change your notifications for any topic via the notification control at the bottom, and right hand side, of each topic. + + + + You can also set notification state per category, if you want to watch or mute every new topic in a specific category. + + Bu ayarların herhangi birini değiştirmek için [kullanıcı tercihleri](%{base_url}/my/preferences) sayfasını ziyaret edin. + + ## Community Trust + + It's great to meet you! As you participate here, over time we'll get to know you, and your temporary new user limitations will be lifted. Keep participating, and over time you'll gain new [trust levels](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) that include special abilities to help us manage our community together. + welcome_user: + subject_template: "%{site_name} topluluğuna hoş geldiniz!" + text_body_template: | + %{site_name} topluluğuna katıldığınız için teşekkür ederiz, hoş geldiniz! %{new_user_tips} - Biz her zaman [medeni topluluk davranışına](%{base_url}/guidelines) inanıyoruz. + 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 mesajı cevaplamanız yeterli.) welcome_invite: - subject_template: "%{site_name} sitesine hoşgeldiniz!" + subject_template: "%{site_name} topluluğuna hoş geldiniz!" text_body_template: | - %{site_name} davetiyenizi onayladığınız için teşekkürler -- hoşgeldiniz! + %{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. @@ -1363,7 +1471,7 @@ tr_TR: %{new_user_tips} - Biz her zaman [medeni topluluk davranışına](%{base_url}/guidelines) inanıyoruz. + Biz her zaman [topluluk yönergelerimize](%{base_url}/guidelines) inanıyoruz. Ziyaretinizin keyfini çıkarın! @@ -1441,7 +1549,7 @@ tr_TR: subject_template: "Dışarı veri aktarımı başarısız oldu" text_body_template: "Üzgünüz, dışarı veri aktarımı başarısız oldu. Lütfen kayıtları inceleyin veya bir görevli ile iletişime geçin." email_reject_insufficient_trust_level: - subject_template: "[%{site_name}] E-posta sorunu -- Yetersiz Güven Düzeyi" + subject_template: "[%{site_name}] E-posta sorunu -- Yetersiz Güven Seviyesi" email_reject_user_not_found: subject_template: "[%{site_name}] E-posta sorunu -- Kullanıcı Bulunamadı" email_reject_screened_email: @@ -1466,16 +1574,19 @@ tr_TR: email_reject_parsing: + subject_template: "[%{site_name}] E-posta sorunu -- İçerik Tanınamadı" text_body_template: | Üzgünüz, ama %{destination} (titled %{former_title}) adresine göndermeye çalıştığınız e-posta başırısız oldu. E-postada herhangi bir cevap bulamadık. **Cevabınızın e-posta'nın en üstünde yer aldığından emin olun** -- aralardaki cevapları işleyemiyoruz. email_reject_invalid_access: subject_template: "[%{site_name}] E-posta sorunu -- Geçersiz giriş" email_reject_strangers_not_allowed: subject_template: "[%{site_name}] E-posta sorunu -- Geçersiz İzin" + email_reject_invalid_post: + subject_template: "[%{site_name}] E-posta sorunu -- Gönderme hatası" email_reject_reply_key: subject_template: "[%{site_name}] E-posta sorunu -- Bilinmeyen Cevap Anahtarı" email_reject_bad_destination_address: - subject_template: "[%{site_name}] Eposta sorunu -- Bilinmeyen: Adres" + subject_template: "[%{site_name}] E-posta sorunu -- Bilinmeyen: Adres" email_reject_topic_not_found: subject_template: "[%{site_name}] E-posta sorunu -- Konu Bulunamadı" email_reject_topic_closed: @@ -1486,6 +1597,14 @@ tr_TR: subject_template: "[%{site_name}] E-posta sorunu -- POP doğrulama hatası" too_many_spam_flags: subject_template: "Yeni hesap askıda" + text_body_template: | + Merhaba, + + Bu, %{site_name} adresinden gönderilen, topluluk tarafından bildirildiği için kontrol edilmek için gizlenen gönderinizi size bildiren otomatik bir mesajdır. + + As a precautionary measure, your new account has been blocked from creating new replies or topics until a staff member can review your account. We apologize for the inconvenience. + + Ek bilgi için, [topluluk yönergelerine](%{base_url}/guidelines) başvurun. too_many_tl3_flags: subject_template: "Yeni hesap askıda" blocked_by_staff: @@ -1514,6 +1633,14 @@ tr_TR: text_body_template: "`download_remote_images_to_local` ayarı harddisk alanı limiti `download_remote_images_threshold` aşıldığı için devre dışı bırakıldı." dashboard_problems: subject_template: "Sorunlar bulundu" + unsubscribe_link: | + Bu e-postaları almayı durdurmak için [buraya tıklayın](%{unsubscribe_url}). + unsubscribe_link_and_mail: | + Bu e-postaları almayı durdurmak için [buraya tıklayın](%{unsubscribe_url}). + unsubscribe_mailing_list: | + Duyuru listesi ayarını açtığınız için bunu alıyorsunuz. + + Bu e-postaları almayı durdurmak için [buraya tıklayın](%{unsubscribe_url}). subject_re: "Cvp:" subject_pm: "[ÖM]" user_notifications: @@ -1670,9 +1797,9 @@ tr_TR: digest: why: "%{last_seen_at} tarihindeki son girişinizden beri %{site_link} sitesine olanların kısa bir özeti" subject_template: "[%{site_name}] Özeti" - new_activity: "Konu ve gönderilerinizdeki yeni aktiviteler:" - top_topics: "Popüler gönderiler" - other_new_topics: "Popüler konular" + new_activity: "Konu ve gönderilerinizdeki yeni etkinlikler:" + top_topics: "Gözde gönderiler" + other_new_topics: "Gözde konular" click_here: "buraya tıklayın" from: "%{site_name} özeti" read_more: "Devamını Oku" @@ -1745,7 +1872,7 @@ tr_TR: signup_after_approval: subject_template: "%{site_name} sitesinde hesabınız onaylandı!" text_body_template: | - %{site_name} sitesine hoşgeldiniz! + %{site_name} topluluğuna hoş geldiniz! %{site_name} sitesindeki hesabınız bir görevli tarafından onaylandı. @@ -1755,7 +1882,7 @@ tr_TR: %{new_user_tips} - Biz her zaman [medeni topluluk davranışına](%{base_url}/guidelines) inanıyoruz. + Biz her zaman [topluluk yönergelerimize](%{base_url}/guidelines) inanıyoruz. Ziyaretinizin keyfini çıkarın! @@ -1763,7 +1890,7 @@ tr_TR: signup: subject_template: "[%{site_name}] Yeni hesabınızı onaylayın" text_body_template: | - %{site_name} sitesine hoşgeldiniz! + %{site_name} topluluğuna hoş geldiniz! Hesabınızı onaylamak ve etkinleştirmek için aşağıdaki bağlantıya tıklayın: %{base_url}/users/activate-account/%{email_token} @@ -1771,14 +1898,14 @@ tr_TR: Eğer yukarıdaki bağlantı tıklanabilir değilse, bağlantıyı kopyalayıp tarayıcınızın adres çubuğuna yapıştırmayı deneyin. page_not_found: title: "Hay aksi! Bu sayfa yok ya da gizli." - popular_topics: "Popüler" + popular_topics: "Gözde" recent_topics: "Yeni" see_more: "Daha fazla" search_title: "Bu sitede ara" search_google: "Google" login_required: welcome_message: | - #[Hoşgeldiniz %{title}](#welcome) + #[%{title} topluluğuna hoş geldiniz](#welcome) Hesap oluşturmanız gerekiyor. Devam etmek için lütfen bir hesap oluşturun ya da giriş yapın. terms_of_service: title: "Üyelik Sözleşmesi" @@ -1871,12 +1998,12 @@ tr_TR: name: Acemi description: Bütün esas forum uygulamalarını kullanabilmeye hak kazanılmıştır long_description: | - Bu rozet 1. güven seviyesi ulaştığın için verildi. Forumda neler olduğunu takip ettiğin için ve konuları okuduğun için teşekkürler. Artık yeni özelliklere sahipsin; kişisel mesajlaşma, bildirme, düzenleme, ve çoklu resim ve bağlantı paylaşabilme gibi. + Bu rozet 1. güven seviyesine ulaştığın için verildi. Forumda neler olduğunu takip ettiğin için ve konuları okuduğun için teşekkürler. Artık yeni özelliklere sahipsin; kişisel mesajlaşma, bildirme, düzenleme, ve çoklu resim ve bağlantı paylaşabilme gibi. member: name: Üye description: Davetler, grup mesajlaşmaları, ve daha fazla beğeni hakkı kazanılmıştır long_description: | - Bu rozet 2. güven seviyesine için verildi. Birkaç haftadır aramızda zaman geçirdiğin için teşekkürler. Artık kullanıcı sayfandan ya da konu sayfandan davetler gönderebilirsin, kişisel grup mesajları oluşturabilirsin ve günlük daha fazla beğeni yapabilirsin. + Bu rozet 2. güven seviyesine ulaştığın için verildi. Birkaç haftadır aramızda zaman geçirdiğin için teşekkürler. Artık kullanıcı sayfandan ya da konu sayfandan davetler gönderebilirsin, kişisel grup mesajları oluşturabilirsin ve günlük daha fazla beğeni yapabilirsin. regular: name: Müdavim description: Yeniden kategorize etme, yeniden isimlendirme, takip edilen bağlantılar, ve daha fazla beğeni hakkı kazanılmıştır @@ -1989,16 +2116,16 @@ tr_TR: Bu rozet cevabınızda başkasından alıntı yaptığınız için verilmiştir. Başka konulardan ve mesajlardan alıntı yapmak mesajlar arasındaki bağlantıyı kuvvetlendirir. En kolay alıntı yapma yolu alıntı yapacağınız bölümü seçip cevap düğmesine basmaktır. read_guidelines: name: Yönergeleri Okuma - description: Site yönergelerini okuma + description: Topluluk yönergelerini okuma long_description: | - Bu rozeti site yönergelerini okuduğunuz için kazandınız. Site kurallarını bilmek ve bu kurallara uygun davranmak daha huzurlu bir ortam içiersinde paylaşım yapmanızı sağlar. + Bu rozeti topluluk yönergelerini okuduğunuz için kazandınız. Site kurallarını bilmek ve bu kurallara uygun davranmak daha huzurlu bir ortam içerisinde paylaşım yapmanızı sağlar. reader: name: Okuyucu description: 100 cevaptan fazla cevabı olan bir konunun her cevabını okuma long_description: | Bu rozet 100 den fazla cevaba sahip olan bir konuyu okuduğunuz için verilmiştir. Bir tartışmayı takip etmek o konu hakkında ayrıntılı bilgi sahibi olmanızı ve görüş açınızı genişletmenizi sağlar. popular_link: - name: Popüler Bağlantı + name: Gözde Bağlantı description: 50 kere tıklanmış bir bağlantı paylaşma long_description: | Bu rozet 50 tıklama elde etmiş bir bağlantı paylaştığınız için verilmiştir. Yararlı bir link paylaşımı yaptığınız için teşekkür ederiz. @@ -2014,17 +2141,17 @@ tr_TR: name: Takdire Layık description: 20 gönderine 1 beğeni aldın long_description: | - Bu rozet 20 farklı mesajda en az bir beğeni kazandığınız için verilmiştir. Forum olarak tartışmalara olan katkınızı takdir ediyoruz! + Bu rozet 20 farklı mesajda en az bir beğeni kazandığınız için verilmiştir. Topluluk olarak tartışmalara olan katkınızı takdir ediyoruz! respected: name: Saygıdeğer description: 100 gönderine 2 beğeni aldın long_description: | - Bu rozet 100 farklı mesajda en az 2 beğeni kazandığınız için verilmiştir.Katkılarınız forum için çok değerli. + Bu rozet 100 farklı mesajda en az 2 beğeni kazandığınız için verilmiştir. Katkılarınız forum için çok değerli. admired: name: Çok Beğenilen description: 300 gönderine 5 beğeni aldın long_description: | - Bu rozet farklı 300 mesajda en az 5 beğeni kazandığınız için verilmiştir.Süper! Tartışmalara olan katkınız muazzam. + Bu rozet farklı 300 mesajda en az 5 beğeni kazandığınız için verilmiştir. Süper! Tartışmalara olan katkınız muazzam. out_of_love: name: Sevgiden Öte description: Bir günde 50 beğeni kullanıldı @@ -2086,6 +2213,98 @@ tr_TR: staff_tag_disallowed: " \"%{tag}\" etiketi yalnızca görevliler tarafından eklenebilir gözüküyor." staff_tag_remove_disallowed: " \"%{tag}\" etiketi yalnızca görevliler tarafından silinebilir gözüküyor." rss_by_tag: "%{tag} etiketli konular" + wizard: + title: "Discourse Kurulumu" + step: + locale: + title: "Discourse topluluğunuza hoş geldiniz!" + fields: + default_locale: + description: "Topluluğunuz için öntanımlı dil nedir?" + forum_title: + title: "İsim" + fields: + title: + label: "Topluluğunuzun ismi" + introduction: + title: "Tanıtım" + fields: + welcome: + label: "Hoş geldiniz Konusu" + privacy: + title: "Erişim" + fields: + privacy: + choices: + open: + label: "Herkese Açık" + description: "Herkes topluluğa erişebilir ve bir hesap için kayıt olabilir." + restricted: + label: "Özel" + description: "Yalnızca davet ettiğim veya onaylanmış kişiler foruma erişebilir." + contact: + title: "İletişim" + fields: + contact_email: + label: "Posta" + placeholder: "isim@ornek.com" + contact_url: + label: "Ağ Sayfası" + placeholder: "http://www.ornek.com/iletisim" + site_contact: + label: "Otomatik Mesajlar" + description: "Discourse tarafından gönderilen tüm otomatik kişisel mesajlar 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: "Şirket İsmi (kısa)" + placeholder: "Falanteknikbilim" + company_full_name: + label: "Şirket İsmi (tamamı)" + placeholder: "Falanteknikbilim A.Ş" + company_domain: + label: "Şirket Alan Adı" + placeholder: "falanteknikbilim.com" + colors: + 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" + dark: + label: "Basit Karanlık" + logos: + title: "Logolar" + fields: + logo_url: + label: "Birincil Logo" + logo_small_url: + label: "Sadeleştirilmiş Logo" + icons: + title: "Simgeler" + fields: + favicon_url: + label: "Simgecik" + apple_touch_icon_url: + label: "Büyük Simge" + homepage: + title: "Ana Sayfa" + fields: + homepage_style: + choices: + latest: + label: "Son Konular" + categories: + label: "Kategoriler" + emoji: + title: "Emoji" + invites: + title: "Görevli Davet Et" + finished: + title: "Discourse'unuz hazır! " activemodel: errors: <<: *errors diff --git a/plugins/poll/config/locales/client.fa_IR.yml b/plugins/poll/config/locales/client.fa_IR.yml index a5fffa79c4..064c381502 100644 --- a/plugins/poll/config/locales/client.fa_IR.yml +++ b/plugins/poll/config/locales/client.fa_IR.yml @@ -13,6 +13,8 @@ fa_IR: total_votes: other: "مجموع آرا" average_rating: "میانگین امتیاز: %{average}." + public: + title: "آرا عمومی هستند" cast-votes: title: "انداختن رأی شما" label: "رای بدهید!" @@ -30,3 +32,15 @@ fa_IR: title: "نظرسنجی را ببند" label: "بسته " confirm: "آیا از بستن این نظرسنجی اطمینان دارید ؟ " + ui_builder: + title: ساخت نظرسنجی + poll_type: + label: نوع + regular: یک انتخاب + multiple: انتخاب چندگانه + poll_config: + max: بیشترین + min: کمترین + step: مرحله + poll_public: + label: نشان دادن رای دهندگان diff --git a/plugins/poll/config/locales/client.ro.yml b/plugins/poll/config/locales/client.ro.yml index b7866bda0c..e5b2cde587 100644 --- a/plugins/poll/config/locales/client.ro.yml +++ b/plugins/poll/config/locales/client.ro.yml @@ -11,7 +11,7 @@ ro: voters: one: "participant" few: "participanți" - other: "participanți" + other: "de participanți" total_votes: one: "un vot" few: "total voturi" @@ -22,18 +22,18 @@ ro: multiple: help: at_least_min_options: - one: "Puteţi alege cel puţin o{count} opţiune." - few: "Trebuie să alegeți cel puțin %{count} opțiuni." - other: "Trebuie să alegeți cel puțin %{count} opțiuni." + one: "Trebuie să alegi minim o opţiune." + few: "Trebuie să alegi cel puțin %{count} opțiuni." + other: "Trebuie să alegi cel puțin %{count} opțiuni." up_to_max_options: - one: "Trebuie să alegeți maxim o opțiune." - few: "Trebuie să alegeți maxim %{count} opțiuni." - other: "Trebuie să alegeți maxim %{count} opțiuni." + one: "Trebuie să alegi maxim o opțiune." + few: "Trebuie să alegi maxim %{count} opțiuni." + other: "Trebuie să alegi maxim %{count} opțiuni." x_options: - one: "Trebuie să alegeți o opțiune." - few: "Trebuie să alegeți %{count} opțiuni." - other: "Trebuie să alegeți %{count} opțiuni." - between_min_and_max_options: "Trebuie să alegeți între minim %{min} și maxim %{max} opțiuni" + one: "Trebuie să alegi o opțiune." + few: "Trebuie să alegi %{count} opțiuni." + other: "Trebuie să alegi %{count} opțiuni." + between_min_and_max_options: "Trebuie să alegi între minim %{min} și maxim %{max} opțiuni" cast-votes: title: "Exprimă-ți votul" label: "Votează acum!" @@ -50,20 +50,20 @@ ro: close: title: "Închide sondajul" label: "Închide sondajul" - confirm: "Sunteţi sigur că vreţi să închideţi acest sondaj?" + confirm: "Ești sigur că vrei să închizi acest sondaj?" error_while_toggling_status: "Ne pare rău, a apărut o eroare la schimbarea stării acestui sondaj." - error_while_casting_votes: "Ne pare rău, a apărut o eroare la exercitarea voturilor dvs." + error_while_casting_votes: "Ne pare rău, a apărut o eroare la exercitarea voturilor tale." error_while_fetching_voters: "Ne pare rău, a apărut o eroare la afișarea votanților." ui_builder: - title: Creați Sondaj - insert: Introduceți Sondaj + title: Creează sondaj + insert: Introdu sondaj help: - options_count: Trebuie să introduceți cel puțin 2 opțiuni + options_count: Trebuie să introduci cel puțin 2 opțiuni poll_type: label: Tip - regular: Alegere Unică - multiple: Alegere Multiplă - number: Ordonarea Numerelor + regular: Opțiune unică + multiple: Opțiune multiplă + number: Ordonare numerică poll_config: max: Maxim min: Minim diff --git a/plugins/poll/config/locales/server.he.yml b/plugins/poll/config/locales/server.he.yml index cc5f7f9897..ef3498220f 100644 --- a/plugins/poll/config/locales/server.he.yml +++ b/plugins/poll/config/locales/server.he.yml @@ -8,24 +8,24 @@ he: site_settings: poll_enabled: "אפשר למשתמשים ליצור סקרים?" - poll_maximum_options: "מספר אפשרויות מירבי המותר בסקר" + poll_maximum_options: "מספר האפשרויות המירבי המותר בסקר" poll_edit_window_mins: "מספר דקות אחרי יצירת פוסט במהלכן ניתן לערוך סקרים." poll: - multiple_polls_without_name: "יש מספר סקרים ללא שם. השתמש במאפיין 'name' לזהות באופן יחודי את הסקרים שלך. " - multiple_polls_with_same_name: "יש מספר סקרים עם אותו שם %{name}. השתמש במאפיין 'name' לזהות באופן יחודי את הסקרים שלך. " + multiple_polls_without_name: "יש מספר סקרים ללא שם. השתמשו במאפיין 'name' לזהות באופן יחודי את הסקרים שלכם." + multiple_polls_with_same_name: "יש מספר סקרים עם אותו שם %{name}. השתמשו במאפיין 'name' לזהות באופן יחודי את הסקרים שלכם." default_poll_must_have_at_least_2_options: "לסקר צריכות להיות לפחות שתי אפשרויות." - named_poll_must_have_at_least_2_options: "לסקר בשם %{name} צריך שיהיה לפחות שתי אפשרויות." + named_poll_must_have_at_least_2_options: "לסקר בשם %{name} צריך שיהיו לפחות שתי אפשרויות." default_poll_must_have_less_options: - one: "לסקר חייב להיות פחות מאפשרות אחת." - other: "לסקר חייב להיות פחות מ-%{count} אפשרויות." + one: "לסקר חייבת להיות פחות מאפשרות אחת." + other: "לסקר חייבות להיות פחות מ-%{count} אפשרויות." named_poll_must_have_less_options: one: "לסקר בשם %{name} צריכה להיות פחות מאפשרות אחת." other: "לסקר בשם %{name} צריכות להיות פחות מ-%{count} אפשרויות." - default_poll_must_have_different_options: "לסקר צריך שיהיה אפשרויות שונות. " - named_poll_must_have_different_options: "לסקר בשם %{name} צריך שיהיו אפשרויות שונות. " - default_poll_with_multiple_choices_has_invalid_parameters: "לסקר עם בחירה מרובה יש פרמטרים לא תקינים. " - named_poll_with_multiple_choices_has_invalid_parameters: "לסקר בשם %{name} עם בחירה מרובה יש פרמטרים לא תקינים. " - requires_at_least_1_valid_option: "עליך לבחור לפחות אפשרות אחת תקינה. " + default_poll_must_have_different_options: "לסקר צריך שתהיינה אפשרויות שונות. " + named_poll_must_have_different_options: "לסקר בשם %{name} צריך שתהינה אפשרויות שונות." + default_poll_with_multiple_choices_has_invalid_parameters: "לסקר עם בחירה מרובה יש פרמטרים לא תקינים." + named_poll_with_multiple_choices_has_invalid_parameters: "לסקר בשם %{name} עם בחירה מרובה יש פרמטרים לא תקינים." + requires_at_least_1_valid_option: "עליך לבחור לפחות אפשרות אחת תקינה." default_cannot_be_made_public: "לא ניתן להפוך סקרים עם הצבעות קיימות לפומביים." named_cannot_be_made_public: "הסקר %{name} מכיל הצבעות ולא יכול להפוך לפומבי." edit_window_expired: @@ -35,9 +35,9 @@ he: no_polls_associated_with_this_post: "אין סקרים שמקושרים לפוסט הזה." no_poll_with_this_name: "אין סקר בשם %{name} שמקושר לפוסט הזה. " post_is_deleted: "לא ניתן לפעול על פוסט שנמחק." - topic_must_be_open_to_vote: "הנושא צריך להיות פתוח להצבעות." + topic_must_be_open_to_vote: "הנושא חייב להיות פתוח להצבעות." poll_must_be_open_to_vote: "הסקר חייב להיות פתוח להצבעות." topic_must_be_open_to_toggle_status: "הנושא חייב להיות פתוח לשינויים בסטטוס." - only_staff_or_op_can_toggle_status: "רק חבר צוות או המפרסם המקורי יכול לשנות סטטוס של סקר. " + only_staff_or_op_can_toggle_status: "רק חבר צוות או המפרסם המקורי יכולים לשנות סטטוס של סקר." email: link_to_poll: "לחצו כדי לצפות בסקר." diff --git a/plugins/poll/config/locales/server.ro.yml b/plugins/poll/config/locales/server.ro.yml index dfd522aba9..c12a3ab980 100644 --- a/plugins/poll/config/locales/server.ro.yml +++ b/plugins/poll/config/locales/server.ro.yml @@ -7,7 +7,7 @@ ro: site_settings: - poll_enabled: "Permiți utilizatorilor să creeze sondaje?" + poll_enabled: "Permite utilizatorilor să creeze sondaje?" poll_maximum_options: "Numărul maxim admis de opțiuni într-un sondaj" poll_edit_window_mins: "Număr de minute după crearea postării pe parcursul cărora sondajele pot fi editate." poll: @@ -28,18 +28,18 @@ ro: default_poll_with_multiple_choices_has_invalid_parameters: "Sondajul cu opțiuni multiple are parametri invalizi." named_poll_with_multiple_choices_has_invalid_parameters: "Sondajul numit %{name} cu opțiuni multiple are parametri invalizi." requires_at_least_1_valid_option: "Trebuie să selectezi cel puțin o opțiune validă." - default_cannot_be_made_public: "Sondaj cu voturi nu poate fi făcut public." + default_cannot_be_made_public: "Sondaj cu voturi - nu poate fi făcut public." named_cannot_be_made_public: "Sondajul numit %{name} are voturi și nu poate fi făcut public." edit_window_expired: - cannot_change_polls: "Nu poți adăuga, șterge sau redenumi sondaje după primele %{minutes} minute." + cannot_change_polls: "Nu poți adăuga, șterge sau redenumi sondaje după primele %{minutes} (de) minute." op_cannot_edit_options: "Nu poți adăuga sau elimina opțiuni ale unui sondaj după primele %{minutes} minute. Te rugăm contactează un moderator pentru a edita o opțiune din sondaj." staff_cannot_add_or_remove_options: "Nu poți adăuga sau elimina opțiuni ale unui sondaj după primele %{minutes} minute. Ar trebui să închizi discuția și să creezi alta în loc." no_polls_associated_with_this_post: "Nu există sondaje asociate acestei postări." no_poll_with_this_name: "Nu există nici un sondaj cu numele %{name} asociat acestei postări." post_is_deleted: "Postările șterse nu se pot modifica." - topic_must_be_open_to_vote: "Discuția trebuie să fie activă pentru a se putea vota." - poll_must_be_open_to_vote: "Sondajul trebuie să fie deschis pentru a se putea vota." - topic_must_be_open_to_toggle_status: "Discuția trebuie să fie activă pentru a se schimba statutul." - only_staff_or_op_can_toggle_status: "Doar un administrator sau autorul postării inițiale pot schimba statusul unui sondaj." + topic_must_be_open_to_vote: "Subiectul trebuie să fie deschis pentru votare." + poll_must_be_open_to_vote: "Sondajul trebuie să fie deschis pentru votare." + topic_must_be_open_to_toggle_status: "Subiectul trebuie să fie activ pentru a se schimba statutul." + only_staff_or_op_can_toggle_status: "Doar un administrator sau autorul postării inițiale poate schimba starea unui sondaj." email: link_to_poll: "Click pentru afișarea sondajului." diff --git a/public/403.ro.html b/public/403.ro.html index 540c6bc610..0ad295eb83 100644 --- a/public/403.ro.html +++ b/public/403.ro.html @@ -18,7 +18,7 @@

403

-

Nu poți vedea acea resursă!

+

Nu poți vizualiza această resursă!

Această pagină va fi înlocuită cu o pagină Discourse 403 personalizată.

diff --git a/public/422.he.html b/public/422.he.html index 0bce83eb82..e8b1f51729 100644 --- a/public/422.he.html +++ b/public/422.he.html @@ -19,7 +19,7 @@

השינוי שביקשתם נדחה.

-

אולי ניסית לשנות ערך שאין לך הרשאה אליו.

+

אולי ניסית לשנות משהו שאין לך גישה אליו.

diff --git a/public/500.ro.html b/public/500.ro.html index 62a68407cd..b3a42c8d41 100644 --- a/public/500.ro.html +++ b/public/500.ro.html @@ -1,13 +1,13 @@ -Hop - Cod de eroare 500 +Oops - Cod de eroare 500 -

Hop

+

Oops

Platforma software pe care rulează acest forum a întâlnit o problemă neprevăzută. Ne cerem scuze pentru inconveniență.

Informațiile detaliate despre această eroare au fost -înregistrate și o notificare a fost generată automat. A să aruncăm o privire.

-

Nu este necesară nici o altă acțiune. Dacă însă eroarea persistă, puteți posta detalii suplimentare, incluzând pașii ce trebuie urmați pentru a reproduce eroarea într-un subiect din categoria site feedback.

+înregistrate și o notificare a fost generată automat. O să aruncăm o privire.

+

Nu este necesară nici o altă acțiune. Dacă însă eroarea persistă, poți posta detalii suplimentare, incluzând pașii ce trebuie urmați pentru a reproduce eroarea, într-un subiect din categoria feedback la site.

diff --git a/public/503.ro.html b/public/503.ro.html index 2752fc234e..834b98ba9a 100644 --- a/public/503.ro.html +++ b/public/503.ro.html @@ -1,10 +1,10 @@ -Site-ul este În Mentenanţă - Discourse.org +Site-ul este în revizie - Discourse.org -

Momentan suntem indisponibili pentru o mentenanţă planificată a site-ului

+

Momentan suntem indisponibili din cauza unei revizii planificate a site-ului

Te rog verifică din nou în câteva minute.

Ne cerem scuze pentru inconvenienţă!

diff --git a/vendor/gems/discourse_imgur/lib/discourse_imgur/locale/server.ro.yml b/vendor/gems/discourse_imgur/lib/discourse_imgur/locale/server.ro.yml index c17b73f9f3..31204c8dae 100644 --- a/vendor/gems/discourse_imgur/lib/discourse_imgur/locale/server.ro.yml +++ b/vendor/gems/discourse_imgur/lib/discourse_imgur/locale/server.ro.yml @@ -8,5 +8,5 @@ ro: site_settings: enable_imgur: "Activează API-ul imgur pentru încărcare, nu găzdui fişiere local" - imgur_client_id: "ID-ul de client imgur.com este necesar pentru ca încarcarea de imagini să funcţioneze" - imgur_client_secret: "Secretul de client imgur.com. Nu este necesar în mod curent pentru ca încarcarea de imagini să funcţioneze, dar ar putea fi la un moment dat." + imgur_client_id: "ID-ul de client imgur.com este necesar pentru ca încărcarea de imagini să funcționeze" + imgur_client_secret: "Cheia secretă de client imgur.com. Nu este necesar în mod curent pentru ca încărcarea de imagini să funcționeze, dar ar putea fi la un moment dat." From 4206eded50fa0444e522f527778db3a9a7411320 Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Thu, 6 Oct 2016 15:46:12 -0400 Subject: [PATCH 0531/1447] remove i18n strings for removed dashboard warnings --- config/locales/server.en.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 78788de32a..0959ed5b53 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -810,14 +810,7 @@ en: s3_backup_config_warning: 'The server is configured to upload backups to s3, but at least one the following setting is not set: s3_access_key_id, s3_secret_access_key or s3_backup_bucket. Go to the Site Settings and update the settings. See "How to set up image uploads to S3?" to learn more.' image_magick_warning: 'The server is configured to create thumbnails of large images, but ImageMagick is not installed. Install ImageMagick using your favorite package manager or download the latest release.' failing_emails_warning: 'There are %{num_failed_jobs} email jobs that failed. Check your app.yml and ensure that the mail server settings are correct. See the failed jobs in Sidekiq.' - default_logo_warning: "Set the graphic logos for your site. Update logo_url, logo_small_url, and favicon_url in Site Settings." - contact_email_missing: "Enter a site contact email address so you can be reached for urgent matters regarding your site. Update it in Site Settings." - contact_email_invalid: "The site contact email is invalid. Update it in Site Settings." - title_nag: "Enter the name of your site. Update title in Site Settings." - site_description_missing: "Enter a one sentence description of your site that will appear in search results. Update site_description in Site Settings." consumer_email_warning: "Your site is configured to use Gmail (or another consumer email service) to send email. Gmail limits how many emails you can send. Consider using an email service provider like mandrill.com to ensure email deliverability." - site_contact_username_warning: "Enter the name of a friendly staff user account to send important automated messages from. Update site_contact_username in Site Settings." - notification_email_warning: "Notification emails are not being sent from a valid email address on your domain; email delivery will be erratic and unreliable. Please set notification_email to a valid local email address in Site Settings." subfolder_ends_in_slash: "Your subfolder setup is incorrect; the DISCOURSE_RELATIVE_URL_ROOT ends in a slash." email_polling_errored_recently: one: "Email polling has generated an error in the past 24 hours. Look at the logs for more details." From 647ee46edff789634a34dc0a406d19d8a50f21cd Mon Sep 17 00:00:00 2001 From: Sam Saffron Date: Fri, 7 Oct 2016 12:40:57 +1100 Subject: [PATCH 0532/1447] FIX: don't stem the search term Search for "canned" not working correctly and "butted", "ands" and many more :) --- lib/search.rb | 2 +- spec/components/search_spec.rb | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/search.rb b/lib/search.rb index be4beb5a5e..e9f3cddc16 100644 --- a/lib/search.rb +++ b/lib/search.rb @@ -663,7 +663,7 @@ class Search def self.ts_query(term, locale = nil, joiner = "&") data = Post.exec_sql("SELECT to_tsvector(:locale, :term)", - locale: locale || long_locale, + locale: 'simple', term: term ).values[0][0] diff --git a/spec/components/search_spec.rb b/spec/components/search_spec.rb index 23d29ea53e..20c2046e0b 100644 --- a/spec/components/search_spec.rb +++ b/spec/components/search_spec.rb @@ -323,6 +323,11 @@ describe Search do end end + it 'does not tokenize search term' do + Fabricate(:post, raw: 'thing is canned should still be found!') + expect(Search.execute('canned').posts).to be_present + end + context 'categories' do let!(:category) { Fabricate(:category) } From ae8088ab990143f75719e3a84543ec2925abb903 Mon Sep 17 00:00:00 2001 From: Vinoth Kannan Date: Fri, 7 Oct 2016 10:29:56 +0530 Subject: [PATCH 0533/1447] fluxbb.rb: optional table prefix env variable added --- script/import_scripts/fluxbb.rb | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/script/import_scripts/fluxbb.rb b/script/import_scripts/fluxbb.rb index 79dc081d49..7238370eb6 100644 --- a/script/import_scripts/fluxbb.rb +++ b/script/import_scripts/fluxbb.rb @@ -5,25 +5,29 @@ require File.expand_path(File.dirname(__FILE__) + "/base.rb") # Before running this script, paste these lines into your shell, # then use arrow keys to edit the values =begin -export FLUXBB_USER="root" +export FLUXBB_HOST="localhost" export FLUXBB_DB="fluxbb" +export FLUXBB_USER="root" export FLUXBB_PW="" +export FLUXBB_PREFIX="" =end # Call it like this: # RAILS_ENV=production bundle exec ruby script/import_scripts/fluxbb.rb class ImportScripts::FluxBB < ImportScripts::Base + FLUXBB_HOST ||= ENV['FLUXBB_HOST'] || "localhost" FLUXBB_DB ||= ENV['FLUXBB_DB'] || "fluxbb" BATCH_SIZE ||= 1000 - FLUXBB_PW ||= ENV['FLUXBB_PW'] || "" FLUXBB_USER ||= ENV['FLUXBB_USER'] || "root" + FLUXBB_PW ||= ENV['FLUXBB_PW'] || "" + FLUXBB_PREFIX ||= ENV['FLUXBB_PREFIX'] || "" def initialize super @client = Mysql2::Client.new( - host: "localhost", + host: FLUXBB_HOST, username: FLUXBB_USER, password: FLUXBB_PW, database: FLUXBB_DB @@ -43,7 +47,7 @@ class ImportScripts::FluxBB < ImportScripts::Base results = mysql_query( "SELECT g_id id, g_title name, g_user_title title - FROM groups") + FROM #{FLUXBB_PREFIX}groups") create_groups(results) do |group| { id: group['id'], @@ -62,7 +66,7 @@ class ImportScripts::FluxBB < ImportScripts::Base "SELECT id, username, realname name, url website, email email, registered created_at, registration_ip registration_ip_address, last_visit last_visit_time, last_email_sent last_emailed_at, location, group_id - FROM users + FROM #{FLUXBB_PREFIX}users LIMIT #{BATCH_SIZE} OFFSET #{offset};") @@ -103,7 +107,7 @@ class ImportScripts::FluxBB < ImportScripts::Base categories = mysql_query(" SELECT id, cat_name name, disp_position position - FROM categories + FROM #{FLUXBB_PREFIX}categories ORDER BY id ASC ").to_a @@ -118,7 +122,7 @@ class ImportScripts::FluxBB < ImportScripts::Base children_categories = mysql_query(" SELECT id, forum_name name, forum_desc description, disp_position position, cat_id parent_category_id - FROM forums + FROM #{FLUXBB_PREFIX}forums ORDER BY id ").to_a @@ -135,7 +139,7 @@ class ImportScripts::FluxBB < ImportScripts::Base def import_posts puts "", "creating topics and posts" - total_count = mysql_query("SELECT count(*) count from posts").first["count"] + total_count = mysql_query("SELECT count(*) count from #{FLUXBB_PREFIX}posts").first["count"] batches(BATCH_SIZE) do |offset| results = mysql_query(" @@ -147,8 +151,8 @@ class ImportScripts::FluxBB < ImportScripts::Base p.poster_id user_id, p.message raw, p.posted created_at - FROM posts p, - topics t + FROM #{FLUXBB_PREFIX}posts p, + #{FLUXBB_PREFIX}topics t WHERE p.topic_id = t.id ORDER BY p.posted LIMIT #{BATCH_SIZE} @@ -190,11 +194,11 @@ class ImportScripts::FluxBB < ImportScripts::Base banned = 0 failed = 0 - total = mysql_query("SELECT count(*) count FROM bans").first['count'] + total = mysql_query("SELECT count(*) count FROM #{FLUXBB_PREFIX}bans").first['count'] system_user = Discourse.system_user - mysql_query("SELECT username, email FROM bans").each do |b| + mysql_query("SELECT username, email FROM #{FLUXBB_PREFIX}bans").each do |b| user = User.find_by_email(b['email']) if user user.suspended_at = Time.now From 3d02dc28be235c519496c2341f79e5ea4ea8f653 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Fri, 7 Oct 2016 12:54:11 +0530 Subject: [PATCH 0534/1447] FIX: genrating invite link should not send email --- app/models/invite.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/invite.rb b/app/models/invite.rb index 0937ddf4f0..c765908101 100644 --- a/app/models/invite.rb +++ b/app/models/invite.rb @@ -99,7 +99,7 @@ class Invite < ActiveRecord::Base topic = opts[:topic] group_ids = opts[:group_ids] - send_email = opts[:send_email] || true + send_email = opts[:send_email].nil? ? true : opts[:send_email] custom_message = opts[:custom_message] lower_email = Email.downcase(email) From 743ddf50a90da128360d4a1538cc0b9deaeea19d Mon Sep 17 00:00:00 2001 From: Vinoth Kannan Date: Fri, 7 Oct 2016 13:56:10 +0530 Subject: [PATCH 0535/1447] fluxbb.rb: skip admin & mod groups --- script/import_scripts/fluxbb.rb | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/script/import_scripts/fluxbb.rb b/script/import_scripts/fluxbb.rb index 7238370eb6..d754c5db0c 100644 --- a/script/import_scripts/fluxbb.rb +++ b/script/import_scripts/fluxbb.rb @@ -49,7 +49,9 @@ class ImportScripts::FluxBB < ImportScripts::Base "SELECT g_id id, g_title name, g_user_title title FROM #{FLUXBB_PREFIX}groups") - create_groups(results) do |group| + customgroups = results.select { |group| group['id'] > 2 } + + create_groups(customgroups) do |group| { id: group['id'], name: group['name'], title: group['title'] } @@ -89,10 +91,12 @@ class ImportScripts::FluxBB < ImportScripts::Base admin: user['group_id'] == 1 } end - create_group_members(results) do |user| - if user.group_id - user_id = user_id_from_imported_user_id(user.id) - group_id = group_id_from_imported_group_id(user.group_id) + groupusers = results.select{ |user| user['group_id'] > 2 } + + groupusers.each do |user| + if user['group_id'] + user_id = user_id_from_imported_user_id(user['id']) + group_id = group_id_from_imported_group_id(user['group_id']) if user_id && group_id GroupUser.find_or_create_by(user_id: user_id, group_id: group_id) From 1886f021e252cab5ce3516f746901b5f44708fb8 Mon Sep 17 00:00:00 2001 From: Jay Pfaffman Date: Fri, 7 Oct 2016 09:38:54 -0700 Subject: [PATCH 0536/1447] mbox: Improve error checking and reporting --- script/import_scripts/mbox.rb | 61 ++++++++++++++++++++++++++--------- 1 file changed, 46 insertions(+), 15 deletions(-) diff --git a/script/import_scripts/mbox.rb b/script/import_scripts/mbox.rb index 212974c6a7..324f7f318b 100755 --- a/script/import_scripts/mbox.rb +++ b/script/import_scripts/mbox.rb @@ -1,9 +1,6 @@ require 'sqlite3' require File.expand_path(File.dirname(__FILE__) + "/base.rb") -# TODO: ignore ~ emacs backup files -# DONE: sort filenames before processing - # Paste these lines into your shell before running this: =begin @@ -41,6 +38,13 @@ class ImportScripts::Mbox < ImportScripts::Base # ex: "jobs-folder" => "jobs" } + unless File.directory?(MBOX_DIR) + puts "Cannot find import directory #{MBOX_DIR}. Giving up." + exit + end + + validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :on => :create + def execute import_categories create_email_indices @@ -49,6 +53,7 @@ class ImportScripts::Mbox < ImportScripts::Base import_users create_forum_topics import_replies + # replace_email_addresses # uncomment to replace all email address with @username end def import_categories @@ -91,16 +96,21 @@ class ImportScripts::Mbox < ImportScripts::Base files.sort! files.each_with_index do |f, idx| + print_warning "\nProcessing: #{f}" + start_time = Time.now + if SPLIT_AT.present? msg = "" + message_count = 0 each_line(f) do |line| line = line.scrub if line =~ SPLIT_AT +p message_count += 1 if !msg.empty? mail = Mail.read_from_string(msg) yield mail, f - print_status(idx, files.size) + print_status(idx, files.size, start_time) msg = "" end end @@ -110,14 +120,14 @@ class ImportScripts::Mbox < ImportScripts::Base if !msg.empty? mail = Mail.read_from_string(msg) yield mail, f - print_status(idx, files.size) + print_status(idx, files.size, start_time) msg = "" end else raw = File.read(f) mail = Mail.read_from_string(raw) yield mail, f - print_status(idx, files.size) + print_status(idx, files.size, start_time) end end @@ -133,7 +143,9 @@ class ImportScripts::Mbox < ImportScripts::Base titles = {} rows.each do |row| msg_ids[row[0]] = true - titles[row[1]] = row[0] + if titles[row[1]].nil? + titles[row[1]] = row[0] + end end # First, any replies where the parent doesn't exist should have that field cleared @@ -171,12 +183,18 @@ class ImportScripts::Mbox < ImportScripts::Base if mail.from.present? from_email = mail.from.dup if from_email.kind_of?(Array) - from_email = from_email.first.dup + if from_email[0].nil? + print_warning "Cannot find email address (ignoring)!\n#{mail}" + else + from_email = from_email.first.dup + from_email.gsub!(/ at /, '@') + from_email.gsub!(/ [at] /, '@') + # strip real names in ()s. Todo: read into name + from_email.gsub!(/ \(.*$/, '') + from_email.gsub!(/ /, '') + end end - - from_email.gsub!(/ at /, '@') - from_email.gsub!(/ \(.*$/, '') - end +p end display_names = from.try(:display_names) if display_names.present? @@ -191,6 +209,10 @@ class ImportScripts::Mbox < ImportScripts::Base [from_email, from_name] end + def print_warning(message) + $stderr.puts "#{message}" + end + def create_email_indices db = open_db db.execute "DROP TABLE IF EXISTS emails" @@ -228,7 +250,11 @@ class ImportScripts::Mbox < ImportScripts::Base email_date = mail['date'].to_s email_date = DateTime.parse(email_date).to_s unless email_date.blank? - db.execute "INSERT OR IGNORE INTO emails (msg_id, + if from_email.kind_of?(String) + unless from_email.match(/\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i) + print_warning "Ignoring bad email address #{from_email} in #{msg_id}" + else + db.execute "INSERT OR IGNORE INTO emails (msg_id, from_email, from_name, title, @@ -237,7 +263,9 @@ class ImportScripts::Mbox < ImportScripts::Base message, category) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", - [msg_id, from_email, from_name, title, reply_to, email_date, mail.to_s, category] + [msg_id, from_email, from_name, title, reply_to, email_date, mail.to_s, category] + end + end end ensure db.close @@ -285,8 +313,8 @@ class ImportScripts::Mbox < ImportScripts::Base end def clean_raw(input) - raw = input.dup + raw.scrub! raw.gsub!(/-- \nYou received this message because you are subscribed to the Google Groups "[^"]*" group.\nTo unsubscribe from this group and stop receiving emails from it, send an email to [^+@]+\+unsubscribe@googlegroups.com\.\nFor more options, visit https:\/\/groups\.google\.com\/groups\/opt_out\./, '') raw @@ -411,9 +439,12 @@ class ImportScripts::Mbox < ImportScripts::Base post_count = replies.size + puts "Replies: #{post_count}" + batches(BATCH_SIZE) do |offset| posts = replies[offset..offset+BATCH_SIZE-1] break if posts.nil? + break if posts.count < 1 next if all_records_exist? :posts, posts.map {|p| p[0]} From 40814aa66d36f1e6589cd5ec850a51c1d34e9069 Mon Sep 17 00:00:00 2001 From: Jay Pfaffman Date: Fri, 7 Oct 2016 09:41:30 -0700 Subject: [PATCH 0537/1447] no replace_email_addresses in this branch --- script/import_scripts/mbox.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/script/import_scripts/mbox.rb b/script/import_scripts/mbox.rb index 324f7f318b..47c5c5613d 100755 --- a/script/import_scripts/mbox.rb +++ b/script/import_scripts/mbox.rb @@ -53,7 +53,6 @@ class ImportScripts::Mbox < ImportScripts::Base import_users create_forum_topics import_replies - # replace_email_addresses # uncomment to replace all email address with @username end def import_categories From c1da9e780e13e78a9761b7a8478710e02483adae Mon Sep 17 00:00:00 2001 From: Leo McArdle Date: Fri, 7 Oct 2016 21:40:41 +0100 Subject: [PATCH 0538/1447] FEATURE: Added user profile and card outlets Added user-location-and-website outlet Added user-card-location-and-website outlet --- app/assets/javascripts/discourse/templates/user-card.hbs | 2 ++ app/assets/javascripts/discourse/templates/user.hbs | 1 + 2 files changed, 3 insertions(+) diff --git a/app/assets/javascripts/discourse/templates/user-card.hbs b/app/assets/javascripts/discourse/templates/user-card.hbs index f7dafdf3c2..48f3c5faa5 100644 --- a/app/assets/javascripts/discourse/templates/user-card.hbs +++ b/app/assets/javascripts/discourse/templates/user-card.hbs @@ -80,6 +80,8 @@ {{/if}} {{/if}} + + {{plugin-outlet "user-card-location-and-website"}}
{{/if}} diff --git a/app/assets/javascripts/discourse/templates/user.hbs b/app/assets/javascripts/discourse/templates/user.hbs index 23560b1a2e..fc6fee572b 100644 --- a/app/assets/javascripts/discourse/templates/user.hbs +++ b/app/assets/javascripts/discourse/templates/user.hbs @@ -74,6 +74,7 @@ {{model.website_name}} {{/if}} {{/if}} + {{plugin-outlet "user-location-and-website"}}
From a7507dad63953488c6f2acbf2ecc853454cc06b1 Mon Sep 17 00:00:00 2001 From: cpradio Date: Thu, 6 Oct 2016 15:18:05 -0400 Subject: [PATCH 0539/1447] Add Acceptance Tests (which found an error) Tests for populating category and tags Added acceptance tests for populating the Username and Category through the Advanced Search UI (will work on the other fields later) Give the combo-box elements ids Add acceptance tests for the rest of the advanced search UI (except for Tags, tags are evil) --- .../components/search-advanced-options.js.es6 | 5 +- .../components/search-advanced-options.hbs | 6 +- .../acceptance/search-full-test.js.es6 | 231 +++++++++++++++++- test/javascripts/helpers/qunit-helpers.js.es6 | 12 +- 4 files changed, 245 insertions(+), 9 deletions(-) diff --git a/app/assets/javascripts/discourse/components/search-advanced-options.js.es6 b/app/assets/javascripts/discourse/components/search-advanced-options.js.es6 index 72c37455a4..6fabacccc8 100644 --- a/app/assets/javascripts/discourse/components/search-advanced-options.js.es6 +++ b/app/assets/javascripts/discourse/components/search-advanced-options.js.es6 @@ -1,6 +1,6 @@ import { on, observes, default as computed } from 'ember-addons/ember-computed-decorators'; -const REGEXP_FILTER_PREFIXES = /(user:|@|category:|#|group:|badge:|tags?:|in:|status:|posts_count:|(before|after):)/ig; +const REGEXP_FILTER_PREFIXES = /\s?(user:|@|category:|#|group:|badge:|tags?:|in:|status:|posts_count:|(before|after):)/ig; const REGEXP_USERNAME_PREFIX = /\s?(user:|@)/ig; const REGEXP_CATEGORY_PREFIX = /\s?(category:|#)/ig; @@ -65,6 +65,9 @@ export default Em.Component.extend({ }, findSearchTerm(EXPRESSION, searchTerm) { + if (!searchTerm) + return ""; + const expression_location = searchTerm.search(EXPRESSION); if (expression_location === -1) return ""; diff --git a/app/assets/javascripts/discourse/templates/components/search-advanced-options.hbs b/app/assets/javascripts/discourse/templates/components/search-advanced-options.hbs index f71b0f08d2..fb6997ee62 100644 --- a/app/assets/javascripts/discourse/templates/components/search-advanced-options.hbs +++ b/app/assets/javascripts/discourse/templates/components/search-advanced-options.hbs @@ -48,13 +48,13 @@
- {{combo-box valueAttribute="value" content=inOptions value=searchedTerms.in none="user.locale.any"}} + {{combo-box id="in" valueAttribute="value" content=inOptions value=searchedTerms.in none="user.locale.any"}}
- {{combo-box valueAttribute="value" content=statusOptions value=searchedTerms.status none="user.locale.any"}} + {{combo-box id="status" valueAttribute="value" content=statusOptions value=searchedTerms.status none="user.locale.any"}}
@@ -63,7 +63,7 @@
- {{combo-box valueAttribute="value" content=postTimeOptions value=searchedTerms.time.when}} + {{combo-box id="post-time" valueAttribute="value" content=postTimeOptions value=searchedTerms.time.when}} {{input type="text" value=searchedTerms.time.days class="input-small" id='search-post-date'}}
diff --git a/test/javascripts/acceptance/search-full-test.js.es6 b/test/javascripts/acceptance/search-full-test.js.es6 index 889b066ee6..248efe4745 100644 --- a/test/javascripts/acceptance/search-full-test.js.es6 +++ b/test/javascripts/acceptance/search-full-test.js.es6 @@ -1,5 +1,43 @@ -import { acceptance } from "helpers/qunit-helpers"; -acceptance("Search - Full Page"); +import { acceptance, waitFor } from "helpers/qunit-helpers"; +acceptance("Search - Full Page", { + settings: {tagging_enabled: true}, + setup() { + const response = (object) => { + return [ + 200, + {"Content-Type": "application/json"}, + object + ]; + }; + + server.get('/tags/filter/search', () => { //eslint-disable-line + return response({results: [{text: 'monkey', count: 1}]}); + }); + + server.get('/users/search/users', () => { //eslint-disable-line + return response({users: [{username: "admin", name: "admin", + avatar_template: "/letter_avatar_proxy/v2/letter/a/3ec8ea/{size}.png"}]}); + }); + + server.get('/admin/groups.json', () => { //eslint-disable-line + return response([{id: 2, automatic: true, name: "moderators", user_count: 4, alias_level: 0, + visible: true, automatic_membership_email_domains: null, automatic_membership_retroactive: false, + primary_group: false, title: null, grant_trust_level: null, incoming_email: null, + notification_level: null, has_messages: true, is_member: true, mentionable: false, + flair_url: null, flair_bg_color: null, flair_color: null}]); + }); + + server.get('/badges.json', () => { //eslint-disable-line + return response({badge_types: [{id: 3, name: "Bronze", sort_order: 7}], + badge_groupings: [{id: 1, name: "Getting Started", description: null, position: 10, system: true}], + badges: [{id: 17, name: "Reader", description: "Read every reply in a topic with more than 100 replies", + grant_count: 0, allow_title: false, multiple_grant: false, icon: "fa-certificate", image: null, + listable: true, enabled: true, badge_grouping_id: 1, system: true, + long_description: "This badge is granted the first time you read a long topic with more than 100 replies. Reading a conversation closely helps you follow the discussion, understand different viewpoints, and leads to more interesting conversations. The more you read, the better the conversation gets. As we like to say, Reading is Fundamental! :slight_smile:\n", + slug: "reader", has_badge: false, badge_type_id: 3}]}); + }); + } +}); test("perform various searches", assert => { visit("/search"); @@ -9,13 +47,198 @@ test("perform various searches", assert => { assert.ok(find('.fps-topic').length === 0); }); - fillIn('.search input', 'none'); + fillIn('.search input.full-page-search', 'none'); click('.search .btn-primary'); andThen(() => assert.ok(find('.fps-topic').length === 0), 'has no results'); - fillIn('.search input', 'posts'); + fillIn('.search input.full-page-search', 'posts'); click('.search .btn-primary'); andThen(() => assert.ok(find('.fps-topic').length === 1, 'has one post')); }); + +test("open advanced search", assert => { + visit("/search"); + + andThen(() => assert.ok(exists('.search .search-advanced'), 'shows advanced search panel')); + + fillIn('.search input.full-page-search', 'none'); + click('.search-advanced h3.panel-title'); + + andThen(() => assert.ok(visible('.search-advanced .search-options'), '"search-options" is visible')); +}); + +test("validate population of advanced search", assert => { + visit("/search"); + fillIn('.search input.full-page-search', 'test user:admin #bug group:moderators badge:Reader tags:monkey in:likes status:open after:5 posts_count:10'); + click('.search-advanced h3.panel-title'); + + andThen(() => { + assert.ok(exists('.search-options span:contains("admin")'), 'has "admin" pre-populated'); + assert.ok(exists('.search-options .category-combobox .select2-choice .select2-chosen:contains("bug")'), 'has "bug" pre-populated'); + assert.ok(exists('.search-options span:contains("moderators")'), 'has "moderators" pre-populated'); + assert.ok(exists('.search-options span:contains("Reader")'), 'has "Reader" pre-populated'); + assert.ok(exists('.search-options .tag-chooser .tag-monkey'), 'has "monkey" pre-populated'); + assert.ok(exists('.search-options .combobox .select2-choice .select2-chosen:contains("I liked")'), 'has "I liked" pre-populated'); + assert.ok(exists('.search-options .combobox .select2-choice .select2-chosen:contains("are open")'), 'has "are open" pre-populated'); + assert.ok(exists('.search-options .combobox .select2-choice .select2-chosen:contains("after")'), 'has "after" pre-populated'); + assert.equal(find('.search-options #search-post-date').val(), "5", 'has "5" pre-populated'); + assert.equal(find('.search-options #search-posts-count').val(), "10", 'has "10" pre-populated'); + }); +}); + +test("update username through advanced search ui", assert => { + visit("/search"); + fillIn('.search input.full-page-search', 'none'); + click('.search-advanced h3.panel-title'); + fillIn('.search-options .user-selector', 'admin'); + click('.search-options .user-selector'); + keyEvent('.search-options .user-selector', 'keydown', 8); + + andThen(() => { + waitFor(() => { + assert.ok(visible('.search-options .autocomplete'), '"autocomplete" popup is visible'); + assert.ok(exists('.search-options .autocomplete ul li a span.username:contains("admin")'), '"autocomplete" popup has an entry for "admin"'); + + click('.search-options .autocomplete ul li a:first'); + + andThen(() => { + assert.ok(exists('.search-options span:contains("admin")'), 'has "admin" pre-populated'); + assert.equal(find('.search input.full-page-search').val(), "none user:admin", 'has updated search term to "none user:admin"'); + }); + }); + }); +}); + +test("update category through advanced search ui", assert => { + visit("/search"); + fillIn('.search input.full-page-search', 'none'); + click('.search-advanced h3.panel-title'); + selectDropdown('.search-options .category-combobox', 4); + click('.search-options'); // need to click off the combobox for the search-term to get updated + + andThen(() => { + assert.ok(exists('.search-options .category-combobox .select2-choice .select2-chosen:contains("faq")'), 'has "faq" populated'); + assert.equal(find('.search input.full-page-search').val(), "none #faq", 'has updated search term to "none #faq"'); + }); +}); + +test("update group through advanced search ui", assert => { + visit("/search"); + fillIn('.search input.full-page-search', 'none'); + click('.search-advanced h3.panel-title'); + fillIn('.search-options .group-selector', 'moderators'); + click('.search-options .group-selector'); + keyEvent('.search-options .group-selector', 'keydown', 8); + + andThen(() => { + waitFor(() => { + assert.ok(visible('.search-options .autocomplete'), '"autocomplete" popup is visible'); + assert.ok(exists('.search-options .autocomplete ul li a:contains("moderators")'), '"autocomplete" popup has an entry for "moderators"'); + + click('.search-options .autocomplete ul li a:first'); + + andThen(() => { + assert.ok(exists('.search-options span:contains("moderators")'), 'has "moderators" pre-populated'); + assert.equal(find('.search input.full-page-search').val(), "none group:moderators", 'has updated search term to "none group:moderators"'); + }); + }); + }); +}); + +test("update badges through advanced search ui", assert => { + visit("/search"); + fillIn('.search input.full-page-search', 'none'); + click('.search-advanced h3.panel-title'); + fillIn('.search-options .badge-names', 'Reader'); + click('.search-options .badge-names'); + keyEvent('.search-options .badge-names', 'keydown', 8); + + andThen(() => { + waitFor(() => { + assert.ok(visible('.search-options .autocomplete'), '"autocomplete" popup is visible'); + assert.ok(exists('.search-options .autocomplete ul li a:contains("Reader")'), '"autocomplete" popup has an entry for "Reader"'); + + click('.search-options .autocomplete ul li a:first'); + + andThen(() => { + assert.ok(exists('.search-options span:contains("Reader")'), 'has "Reader" pre-populated'); + assert.equal(find('.search input.full-page-search').val(), "none badge:Reader", 'has updated search term to "none badge:Reader"'); + }); + }); + }); +}); + +// test("update tags through advanced search ui", assert => { +// visit("/search"); +// fillIn('.search input.full-page-search', 'none'); +// click('.search-advanced h3.panel-title'); +// +// keyEvent('.search-options .tag-chooser input.select2-input', 'keydown', 110); +// fillIn('.search-options .tag-chooser input.select2-input', 'monkey'); +// keyEvent('.search-options .tag-chooser input.select2-input', 'keyup', 110); +// +// andThen(() => { +// waitFor(() => { +// click('li.select2-result-selectable:first'); +// andThen(() => { +// assert.ok(exists('.search-options .tag-chooser .tag-monkey'), 'has "monkey" pre-populated'); +// assert.equal(find('.search input.full-page-search').val(), "none tags:monkey", 'has updated search term to "none tags:monkey"'); +// }); +// }); +// }); +// }); + +test("update in filter through advanced search ui", assert => { + visit("/search"); + fillIn('.search input.full-page-search', 'none'); + click('.search-advanced h3.panel-title'); + selectDropdown('.search-options #s2id_in', 'likes'); + fillIn('.search-options #in', 'likes'); + + andThen(() => { + assert.ok(exists('.search-options #s2id_in .select2-choice .select2-chosen:contains("I liked")'), 'has "I liked" populated'); + assert.equal(find('.search input.full-page-search').val(), "none in:likes", 'has updated search term to "none in:likes"'); + }); +}); + +test("update status through advanced search ui", assert => { + visit("/search"); + fillIn('.search input.full-page-search', 'none'); + click('.search-advanced h3.panel-title'); + selectDropdown('.search-options #s2id_status', 'closed'); + fillIn('.search-options #status', 'closed'); + + andThen(() => { + assert.ok(exists('.search-options #s2id_status .select2-choice .select2-chosen:contains("are closed")'), 'has "are closed" populated'); + assert.equal(find('.search input.full-page-search').val(), "none status:closed", 'has updated search term to "none status:closed"'); + }); +}); + +test("update post time through advanced search ui", assert => { + visit("/search"); + fillIn('.search input.full-page-search', 'none'); + click('.search-advanced h3.panel-title'); + fillIn('#search-post-date', '5'); + selectDropdown('.search-options #s2id_postTime', 'after'); + fillIn('.search-options #postTime', 'after'); + + andThen(() => { + assert.ok(exists('.search-options #s2id_postTime .select2-choice .select2-chosen:contains("after")'), 'has "after" populated'); + assert.equal(find('.search-options #search-post-date').val(), "5", 'has "5" populated'); + assert.equal(find('.search input.full-page-search').val(), "none after:5", 'has updated search term to "none after:5"'); + }); +}); + +test("update posts count through advanced search ui", assert => { + visit("/search"); + fillIn('.search input.full-page-search', 'none'); + click('.search-advanced h3.panel-title'); + fillIn('#search-posts-count', '5'); + + andThen(() => { + assert.equal(find('.search-options #search-posts-count').val(), "5", 'has "5" populated'); + assert.equal(find('.search input.full-page-search').val(), "none posts_count:5", 'has updated search term to "none posts_count:5"'); + }); +}); diff --git a/test/javascripts/helpers/qunit-helpers.js.es6 b/test/javascripts/helpers/qunit-helpers.js.es6 index ed5a51e1e3..1fe326b36b 100644 --- a/test/javascripts/helpers/qunit-helpers.js.es6 +++ b/test/javascripts/helpers/qunit-helpers.js.es6 @@ -109,6 +109,15 @@ function blank(obj, text) { ok(Ember.isEmpty(obj), text); } +function waitFor(callback, timeout) { + timeout = timeout || 500; + stop(); + Ember.run.later(() => { + callback(); + start(); + }, timeout); +} + export { acceptance, controllerFor, asyncTestDiscourse, @@ -116,4 +125,5 @@ export { acceptance, logIn, currentUser, blank, - present }; + present, + waitFor }; From dc87b6943ad84f3fcc8e6c631d1bb1475fa9b7bd Mon Sep 17 00:00:00 2001 From: cpradio Date: Sat, 8 Oct 2016 09:29:05 -0400 Subject: [PATCH 0540/1447] Fix the ID for postTime --- .../discourse/templates/components/search-advanced-options.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/templates/components/search-advanced-options.hbs b/app/assets/javascripts/discourse/templates/components/search-advanced-options.hbs index fb6997ee62..0e2e54c500 100644 --- a/app/assets/javascripts/discourse/templates/components/search-advanced-options.hbs +++ b/app/assets/javascripts/discourse/templates/components/search-advanced-options.hbs @@ -63,7 +63,7 @@
- {{combo-box id="post-time" valueAttribute="value" content=postTimeOptions value=searchedTerms.time.when}} + {{combo-box id="postTime" valueAttribute="value" content=postTimeOptions value=searchedTerms.time.when}} {{input type="text" value=searchedTerms.time.days class="input-small" id='search-post-date'}}
From bd03061028ed9defa3bd364d4eea7fc9f2c81cf5 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Mon, 10 Oct 2016 00:37:56 +0530 Subject: [PATCH 0541/1447] update onebox gem version --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index c4897db3c4..19f381f607 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -216,7 +216,7 @@ GEM omniauth-twitter (1.2.1) json (~> 1.3) omniauth-oauth (~> 1.1) - onebox (1.5.49) + onebox (1.5.50) htmlentities (~> 4.3.4) moneta (~> 0.8) multi_json (~> 1.11) From 8f68a95e56c7c6b42d4508e8fd08a44de2b41ba0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Mon, 10 Oct 2016 16:18:57 +0200 Subject: [PATCH 0542/1447] FIX: trim leading & trailing whitespaces in admin user search --- lib/admin_user_index_query.rb | 3 ++- spec/components/admin_user_index_query_spec.rb | 10 +++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/admin_user_index_query.rb b/lib/admin_user_index_query.rb index 0cf304d422..3c2eeec9d3 100644 --- a/lib/admin_user_index_query.rb +++ b/lib/admin_user_index_query.rb @@ -79,6 +79,7 @@ class AdminUserIndexQuery def filter_by_search if params[:filter].present? + params[:filter].strip! if ip = IPAddr.new(params[:filter]) rescue nil @query.where('ip_address <<= :ip OR registration_ip_address <<= :ip', ip: ip.to_cidr_s) else @@ -89,7 +90,7 @@ class AdminUserIndexQuery def filter_by_ip if params[:ip].present? - @query.where('ip_address = :ip OR registration_ip_address = :ip', ip: params[:ip]) + @query.where('ip_address = :ip OR registration_ip_address = :ip', ip: params[:ip].strip) end end diff --git a/spec/components/admin_user_index_query_spec.rb b/spec/components/admin_user_index_query_spec.rb index 7d03cf1e31..a4a7e48abf 100644 --- a/spec/components/admin_user_index_query_spec.rb +++ b/spec/components/admin_user_index_query_spec.rb @@ -110,12 +110,12 @@ describe AdminUserIndexQuery do before(:each) { Fabricate(:user, email: "test1@example.com") } it "matches the email" do - query = ::AdminUserIndexQuery.new({ filter: "est1" }) + query = ::AdminUserIndexQuery.new({ filter: " est1" }) expect(query.find_users.count()).to eq(1) end it "matches the email using any case" do - query = ::AdminUserIndexQuery.new({ filter: "Test1" }) + query = ::AdminUserIndexQuery.new({ filter: "Test1\t" }) expect(query.find_users.count()).to eq(1) end @@ -126,12 +126,12 @@ describe AdminUserIndexQuery do before(:each) { Fabricate(:user, username: "test_user_1") } it "matches the username" do - query = ::AdminUserIndexQuery.new({ filter: "user" }) + query = ::AdminUserIndexQuery.new({ filter: "user\n" }) expect(query.find_users.count).to eq(1) end it "matches the username using any case" do - query = ::AdminUserIndexQuery.new({ filter: "User" }) + query = ::AdminUserIndexQuery.new({ filter: "\r\nUser" }) expect(query.find_users.count).to eq(1) end end @@ -141,7 +141,7 @@ describe AdminUserIndexQuery do let!(:user) { Fabricate(:user, ip_address: "117.207.94.9") } it "matches the ip address" do - query = ::AdminUserIndexQuery.new({ filter: "117.207.94.9" }) + query = ::AdminUserIndexQuery.new({ filter: " 117.207.94.9 " }) expect(query.find_users.count()).to eq(1) end From 586ce69b1b9b9db765c0e9d961eae430697d02f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Mon, 10 Oct 2016 16:36:36 +0200 Subject: [PATCH 0543/1447] UX: properly hide 'Activity Summary' preference when Summaries are disabled --- .../discourse/controllers/preferences.js.es6 | 5 ----- .../discourse/templates/user/preferences.hbs | 10 +++++----- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/app/assets/javascripts/discourse/controllers/preferences.js.es6 b/app/assets/javascripts/discourse/controllers/preferences.js.es6 index 98e0b05f7c..068825d4cf 100644 --- a/app/assets/javascripts/discourse/controllers/preferences.js.es6 +++ b/app/assets/javascripts/discourse/controllers/preferences.js.es6 @@ -59,11 +59,6 @@ export default Ember.Controller.extend(CanCheckEmails, { return !this.siteSettings.enable_sso && this.siteSettings.enable_local_logins; }, - @computed() - canReceiveDigest() { - return !this.siteSettings.disable_digest_emails; - }, - @computed() availableLocales() { return this.siteSettings.available_locales.split('|').map(s => ({ name: s, value: s })); diff --git a/app/assets/javascripts/discourse/templates/user/preferences.hbs b/app/assets/javascripts/discourse/templates/user/preferences.hbs index 96c061cfb3..7d82418518 100644 --- a/app/assets/javascripts/discourse/templates/user/preferences.hbs +++ b/app/assets/javascripts/discourse/templates/user/preferences.hbs @@ -189,9 +189,9 @@ {{/unless}}
-
- - {{#if canReceiveDigest}} + {{#unless siteSettings.disable_digest_emails}} +
+ {{preference-checkbox labelKey="user.email_digests.title" disabled=model.user_option.mailing_list_mode checked=model.user_option.email_digests}} {{#if model.user_option.email_digests}}
@@ -199,8 +199,8 @@
{{preference-checkbox labelKey="user.include_tl0_in_digests" disabled=model.user_option.mailing_list_mode checked=model.user_option.include_tl0_in_digests}} {{/if}} - {{/if}} -
+
+ {{/unless}} {{#unless siteSettings.disable_mailing_list_mode}}
From d06c82e5559715eb569c52cffff1d235c6d30e84 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Mon, 10 Oct 2016 20:47:57 +0530 Subject: [PATCH 0544/1447] FEATURE: add unique class to topic navigation pages --- .../javascripts/discourse/views/navigation-default.js.es6 | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 app/assets/javascripts/discourse/views/navigation-default.js.es6 diff --git a/app/assets/javascripts/discourse/views/navigation-default.js.es6 b/app/assets/javascripts/discourse/views/navigation-default.js.es6 new file mode 100644 index 0000000000..031456f324 --- /dev/null +++ b/app/assets/javascripts/discourse/views/navigation-default.js.es6 @@ -0,0 +1,3 @@ +import { createViewWithBodyClass } from 'discourse/lib/create-view'; + +export default createViewWithBodyClass('navigation-topics'); From eacfdf92cd4686ab591a71405db01a60148b2af3 Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 11 Oct 2016 10:12:11 +1100 Subject: [PATCH 0545/1447] FIX: increase external_avatar_url to 1000 limit --- ...1010230853_single_sign_on_increase_external_avatar_url.rb | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 db/migrate/20161010230853_single_sign_on_increase_external_avatar_url.rb diff --git a/db/migrate/20161010230853_single_sign_on_increase_external_avatar_url.rb b/db/migrate/20161010230853_single_sign_on_increase_external_avatar_url.rb new file mode 100644 index 0000000000..dc14e29497 --- /dev/null +++ b/db/migrate/20161010230853_single_sign_on_increase_external_avatar_url.rb @@ -0,0 +1,5 @@ +class SingleSignOnIncreaseExternalAvatarUrl < ActiveRecord::Migration + def change + change_column :single_sign_on_records, :external_avatar_url, :string, limit: 1000 + end +end From 543bf5e1e1f50b88eb0f5df66723f623f7c9305b Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 11 Oct 2016 10:12:23 +1100 Subject: [PATCH 0546/1447] ignore bin, it is full of stuff --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 896584c6da..131364d5b5 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,8 @@ ._.DS_Store dump.rdb +bin/* + .sass-cache/* public/csv/* public/plugins/* From b6d0d4d94d5e321f7855c985b12e649e179e220f Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 11 Oct 2016 10:36:08 +1100 Subject: [PATCH 0547/1447] tweaks to full page search --- .../discourse/controllers/full-page-search.js.es6 | 4 ++-- .../discourse/templates/full-page-search.hbs | 10 +++++++--- app/assets/stylesheets/common/base/search.scss | 5 +++-- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 b/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 index b33f338f6f..8487a63a3c 100644 --- a/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 +++ b/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 @@ -138,9 +138,9 @@ export default Ember.Controller.extend({ return this.currentUser && this.currentUser.staff && hasResults; }, - @computed + @computed('isExpanded') canCreateTopic() { - return this.currentUser && !this.site.mobileView; + return this.currentUser && !this.site.mobileView && !this.get('isExpanded'); }, _search() { diff --git a/app/assets/javascripts/discourse/templates/full-page-search.hbs b/app/assets/javascripts/discourse/templates/full-page-search.hbs index 31df545ec7..08154200f2 100644 --- a/app/assets/javascripts/discourse/templates/full-page-search.hbs +++ b/app/assets/javascripts/discourse/templates/full-page-search.hbs @@ -2,7 +2,7 @@ {{search-text-field value=searchTerm class="full-page-search input-xxlarge search no-blur" action="search" hasAutofocus=hasAutofocus}} {{d-button action="search" icon="search" class="btn-primary" disabled=searching}} - {{search-advanced-options searchTerm=searchTerm}} + {{search-advanced-options searchTerm=searchTerm isExpanded=isExpanded}} {{#if canCreateTopic}} {{d-button id="create-topic" class="btn-default" action="createTopic" actionParam=searchTerm icon="plus" label="topic.create"}} @@ -42,7 +42,9 @@ {{#if searchActive}} {{i18n "search.no_results"}} {{/if}} - {{i18n "search.search_help"}} + {{#unless isExpanded}} + {{i18n "search.search_help"}} + {{/unless}} {{/unless}} @@ -118,7 +120,9 @@ {{#if hasResults}} {{/if}} diff --git a/app/assets/stylesheets/common/base/search.scss b/app/assets/stylesheets/common/base/search.scss index 2fe1a4d8fb..c307b9d691 100644 --- a/app/assets/stylesheets/common/base/search.scss +++ b/app/assets/stylesheets/common/base/search.scss @@ -101,8 +101,9 @@ margin-bottom: 15px; .panel-title { - background-color: dark-light-diff($primary, $secondary, 90%, -75%); - padding: 5px 10px 5px 10px; + background-color: dark-light-diff($primary, $secondary, 94%, -80%); + padding: 8px 10px; + cursor: pointer; } .search-options { From aaec05e36a713ce5ffcf6158400adfe9d6dbea04 Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 11 Oct 2016 10:56:07 +1100 Subject: [PATCH 0548/1447] FIX: stop asking for bio from facebook, it is deprecated --- lib/auth/facebook_authenticator.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/auth/facebook_authenticator.rb b/lib/auth/facebook_authenticator.rb index 70f3c3bfd7..e117450b9f 100644 --- a/lib/auth/facebook_authenticator.rb +++ b/lib/auth/facebook_authenticator.rb @@ -39,7 +39,7 @@ class Auth::FacebookAuthenticator < Auth::Authenticator end - bio = facebook_hash[:about_me] + bio = facebook_hash[:about_me] || facebook_hash[:about] location = facebook_hash[:location] website = facebook_hash[:website] @@ -94,7 +94,7 @@ class Auth::FacebookAuthenticator < Auth::Authenticator strategy = env["omniauth.strategy"] strategy.options[:client_id] = SiteSetting.facebook_app_id strategy.options[:client_secret] = SiteSetting.facebook_app_secret - strategy.options[:info_fields] = 'gender,email,name,bio,first_name,link,last_name,website,location' + strategy.options[:info_fields] = 'gender,email,name,about,first_name,link,last_name,website,location' if SiteSetting.facebook_request_extra_profile_details strategy.options[:scope] = 'email,user_about_me,user_location,user_website' end From 89daa43754821e71954505375faacdf2c3e6cfc6 Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 11 Oct 2016 13:03:21 +1100 Subject: [PATCH 0549/1447] FEATURE: remap emojis back for push notifications and desktop alerts --- app/models/emoji.rb | 13 +++++++++++++ app/services/post_alerter.rb | 2 +- lib/excerpt_parser.rb | 7 ++++++- spec/components/pretty_text_spec.rb | 5 +++++ spec/services/post_alerter_spec.rb | 8 +++----- 5 files changed, 28 insertions(+), 7 deletions(-) diff --git a/app/models/emoji.rb b/app/models/emoji.rb index 51eae0c706..6eb570fce4 100644 --- a/app/models/emoji.rb +++ b/app/models/emoji.rb @@ -173,6 +173,19 @@ class Emoji @unicode_replacements end + def self.lookup_unicode(name) + @reverse_map ||= begin + map = {} + db['emojis'].each do |e| + next if e['name'] == 'tm' + code = replacement_code(e['code']) + map[e['name']] = code if code + end + map + end + @reverse_map[name] + end + def self.unicode_replacements_json @unicode_replacements_json ||= unicode_replacements.to_json end diff --git a/app/services/post_alerter.rb b/app/services/post_alerter.rb index 5fc0c8aaf9..83a06aeaa1 100644 --- a/app/services/post_alerter.rb +++ b/app/services/post_alerter.rb @@ -382,7 +382,7 @@ class PostAlerter post_number: original_post.post_number, topic_title: original_post.topic.title, topic_id: original_post.topic.id, - excerpt: original_post.excerpt(400, text_entities: true, strip_links: true), + excerpt: original_post.excerpt(400, text_entities: true, strip_links: true, remap_emoji: true), username: original_username, post_url: post_url } diff --git a/lib/excerpt_parser.rb b/lib/excerpt_parser.rb index 4a19c337a8..2c62b93719 100644 --- a/lib/excerpt_parser.rb +++ b/lib/excerpt_parser.rb @@ -14,6 +14,7 @@ class ExcerptParser < Nokogiri::XML::SAX::Document @markdown_images = options[:markdown_images] == true @keep_newlines = options[:keep_newlines] == true @keep_emoji_images = options[:keep_emoji_images] == true + @remap_emoji = options[:remap_emoji] == true @start_excerpt = false end @@ -51,7 +52,11 @@ class ExcerptParser < Nokogiri::XML::SAX::Document attributes = Hash[*attributes.flatten] if attributes["class"] == 'emoji' - if @keep_emoji_images + if @remap_emoji + title = (attributes["alt"] || "").gsub(":", "") + title = Emoji.lookup_unicode(title) || attributes["alt"] + return characters(title) + elsif @keep_emoji_images return include_tag(name, attributes) else return characters(attributes["alt"]) diff --git a/spec/components/pretty_text_spec.rb b/spec/components/pretty_text_spec.rb index eb840cbcd8..109181333f 100644 --- a/spec/components/pretty_text_spec.rb +++ b/spec/components/pretty_text_spec.rb @@ -265,6 +265,11 @@ HTML expect(PrettyText.excerpt(emoji_image, 100, { keep_emoji_images: true })).to match_html(emoji_image) end + it "should have an option to remap emoji to code points" do + emoji_image = "I :heart: you :unknown: " + expect(PrettyText.excerpt(emoji_image, 100, { remap_emoji: true })).to match_html("I ❤ you :unknown:") + end + it "should have an option to preserve emoji codes" do emoji_code = ":heart:" expect(PrettyText.excerpt(emoji_code, 100)).to eq(":heart:") diff --git a/spec/services/post_alerter_spec.rb b/spec/services/post_alerter_spec.rb index 9338060543..8c2915b64c 100644 --- a/spec/services/post_alerter_spec.rb +++ b/spec/services/post_alerter_spec.rb @@ -327,7 +327,7 @@ describe PostAlerter do end describe "push_notification" do - let(:mention_post) { create_post_with_alerts(user: user, raw: 'Hello @eviltrout')} + let(:mention_post) { create_post_with_alerts(user: user, raw: 'Hello @eviltrout :heart:')} let(:topic) { mention_post.topic } it "correctly pushes notifications if configured correctly" do @@ -344,8 +344,6 @@ describe PostAlerter do push_url: "https://site2.com/push") end - - body = nil headers = nil @@ -368,7 +366,7 @@ describe PostAlerter do 'post_number' => 1, 'topic_title' => topic.title, 'topic_id' => topic.id, - 'excerpt' => 'Hello @eviltrout', + 'excerpt' => 'Hello @eviltrout ❤', 'username' => user.username, 'url' => UrlHelper.absolute(mention_post.url), 'client_id' => 'xxx0' @@ -378,7 +376,7 @@ describe PostAlerter do 'post_number' => 1, 'topic_title' => topic.title, 'topic_id' => topic.id, - 'excerpt' => 'Hello @eviltrout', + 'excerpt' => 'Hello @eviltrout ❤', 'username' => user.username, 'url' => UrlHelper.absolute(mention_post.url), 'client_id' => 'xxx1' From 2de50a616d4120a9718eda7ba9bc08d35b293a0e Mon Sep 17 00:00:00 2001 From: cpradio Date: Tue, 11 Oct 2016 09:55:15 -0400 Subject: [PATCH 0550/1447] FEATURE: Use the top period default for users who have been inactive or are new --- app/controllers/list_controller.rb | 8 ++-- app/models/site_setting.rb | 9 +--- app/models/user_option.rb | 2 +- spec/controllers/list_controller_spec.rb | 57 ++++++++++++++++++++++++ 4 files changed, 64 insertions(+), 12 deletions(-) diff --git a/app/controllers/list_controller.rb b/app/controllers/list_controller.rb index e680ce8d68..e4e037170c 100644 --- a/app/controllers/list_controller.rb +++ b/app/controllers/list_controller.rb @@ -171,7 +171,7 @@ class ListController < ApplicationController def top(options=nil) options ||= {} - period = ListController.best_period_for(current_user.try(:previous_visit_at), options[:category]) + period = ListController.best_period_for(current_user.try(:previous_visit_at), options[:category], SiteSetting.top_page_default_timeframe.to_sym) send("top_#{period}", options) end @@ -327,14 +327,14 @@ class ListController < ApplicationController exclude_category_ids.pluck(:id) end - def self.best_period_for(previous_visit_at, category_id=nil) + def self.best_period_for(previous_visit_at, category_id=nil, default_period=nil) best_periods_for(previous_visit_at).each do |period| top_topics = TopTopic.where("#{period}_score > 0") top_topics = top_topics.joins(:topic).where("topics.category_id = ?", category_id) if category_id return period if top_topics.count >= SiteSetting.topics_per_period_in_top_page end - # default period is yearly - SiteSetting.top_page_default_timeframe.to_sym + + default_period end def self.best_periods_for(date) diff --git a/app/models/site_setting.rb b/app/models/site_setting.rb index dcc74ecfc3..2a2c04ac46 100644 --- a/app/models/site_setting.rb +++ b/app/models/site_setting.rb @@ -97,13 +97,8 @@ class SiteSetting < ActiveRecord::Base ].flatten.to_set end - def self.min_redirected_to_top_period - TopTopic.sorted_periods.each do |p| - period = p[0] - return period if TopTopic.topics_per_period(period) >= SiteSetting.topics_per_period_in_top_page - end - # not enough topics - nil + def self.min_redirected_to_top_period(duration=nil) + return ListController.best_period_for(duration) end def self.email_polling_enabled? diff --git a/app/models/user_option.rb b/app/models/user_option.rb index 1071026c18..99be107d21 100644 --- a/app/models/user_option.rb +++ b/app/models/user_option.rb @@ -90,7 +90,7 @@ class UserOption < ActiveRecord::Base # top must be in the top_menu return unless SiteSetting.top_menu =~ /(^|\|)top(\||$)/i # not enough topics - return unless period = SiteSetting.min_redirected_to_top_period + return unless period = SiteSetting.min_redirected_to_top_period(1.days.ago) if !user.seen_before? || (user.trust_level == 0 && !redirected_to_top_yet?) update_last_redirected_to_top! diff --git a/spec/controllers/list_controller_spec.rb b/spec/controllers/list_controller_spec.rb index c07c6ad2f7..03768b0853 100644 --- a/spec/controllers/list_controller_spec.rb +++ b/spec/controllers/list_controller_spec.rb @@ -226,6 +226,63 @@ describe ListController do end end + describe "best_period_for" do + + context "has_top_topics_and_not_seen_recently" do + + SiteSetting.topics_per_period_in_top_page = 2 + SiteSetting.top_page_default_timeframe = 'daily' + + let!(:t1) { Fabricate(:topic) } + let!(:t2) { Fabricate(:topic) } + let!(:t3) { Fabricate(:topic) } + + before do + TopTopic.refresh! + end + + it "should_return_a_time_period" do + expect(ListController.best_period_for(nil, nil, SiteSetting.top_page_default_timeframe.to_sym)).not_to eq(nil) + end + + end + + context "has_top_topics_and_seen_recently" do + + SiteSetting.topics_per_period_in_top_page = 2 + SiteSetting.top_page_default_timeframe = 'daily' + + let!(:t1) { Fabricate(:topic) } + let!(:t2) { Fabricate(:topic) } + let!(:t3) { Fabricate(:topic) } + + before do + TopTopic.refresh! + end + + it "should_return_a_time_period" do + expect(ListController.best_period_for(1.month.ago, nil, SiteSetting.top_page_default_timeframe.to_sym)).not_to eq(nil) + end + + end + + context "does_not_have_top_topics" do + + SiteSetting.topics_per_period_in_top_page = 2 + SiteSetting.top_page_default_timeframe = 'daily' + + before do + TopTopic.refresh! + end + + it "should_not_return_a_time_period" do + expect(ListController.best_period_for(1.month.ago, nil, nil)).to eq(nil) + end + + end + + end + describe "best_periods_for" do it "returns yearly for more than 180 days" do From ddcc084d22244599dca0e591ec7f417f7ffff159 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Tue, 11 Oct 2016 17:56:46 +0200 Subject: [PATCH 0551/1447] Revert "FEATURE: Use the top period default for users who have been inactive or are new" --- app/controllers/list_controller.rb | 8 ++-- app/models/site_setting.rb | 9 +++- app/models/user_option.rb | 2 +- spec/controllers/list_controller_spec.rb | 57 ------------------------ 4 files changed, 12 insertions(+), 64 deletions(-) diff --git a/app/controllers/list_controller.rb b/app/controllers/list_controller.rb index e4e037170c..e680ce8d68 100644 --- a/app/controllers/list_controller.rb +++ b/app/controllers/list_controller.rb @@ -171,7 +171,7 @@ class ListController < ApplicationController def top(options=nil) options ||= {} - period = ListController.best_period_for(current_user.try(:previous_visit_at), options[:category], SiteSetting.top_page_default_timeframe.to_sym) + period = ListController.best_period_for(current_user.try(:previous_visit_at), options[:category]) send("top_#{period}", options) end @@ -327,14 +327,14 @@ class ListController < ApplicationController exclude_category_ids.pluck(:id) end - def self.best_period_for(previous_visit_at, category_id=nil, default_period=nil) + def self.best_period_for(previous_visit_at, category_id=nil) best_periods_for(previous_visit_at).each do |period| top_topics = TopTopic.where("#{period}_score > 0") top_topics = top_topics.joins(:topic).where("topics.category_id = ?", category_id) if category_id return period if top_topics.count >= SiteSetting.topics_per_period_in_top_page end - - default_period + # default period is yearly + SiteSetting.top_page_default_timeframe.to_sym end def self.best_periods_for(date) diff --git a/app/models/site_setting.rb b/app/models/site_setting.rb index 2a2c04ac46..dcc74ecfc3 100644 --- a/app/models/site_setting.rb +++ b/app/models/site_setting.rb @@ -97,8 +97,13 @@ class SiteSetting < ActiveRecord::Base ].flatten.to_set end - def self.min_redirected_to_top_period(duration=nil) - return ListController.best_period_for(duration) + def self.min_redirected_to_top_period + TopTopic.sorted_periods.each do |p| + period = p[0] + return period if TopTopic.topics_per_period(period) >= SiteSetting.topics_per_period_in_top_page + end + # not enough topics + nil end def self.email_polling_enabled? diff --git a/app/models/user_option.rb b/app/models/user_option.rb index 99be107d21..1071026c18 100644 --- a/app/models/user_option.rb +++ b/app/models/user_option.rb @@ -90,7 +90,7 @@ class UserOption < ActiveRecord::Base # top must be in the top_menu return unless SiteSetting.top_menu =~ /(^|\|)top(\||$)/i # not enough topics - return unless period = SiteSetting.min_redirected_to_top_period(1.days.ago) + return unless period = SiteSetting.min_redirected_to_top_period if !user.seen_before? || (user.trust_level == 0 && !redirected_to_top_yet?) update_last_redirected_to_top! diff --git a/spec/controllers/list_controller_spec.rb b/spec/controllers/list_controller_spec.rb index 03768b0853..c07c6ad2f7 100644 --- a/spec/controllers/list_controller_spec.rb +++ b/spec/controllers/list_controller_spec.rb @@ -226,63 +226,6 @@ describe ListController do end end - describe "best_period_for" do - - context "has_top_topics_and_not_seen_recently" do - - SiteSetting.topics_per_period_in_top_page = 2 - SiteSetting.top_page_default_timeframe = 'daily' - - let!(:t1) { Fabricate(:topic) } - let!(:t2) { Fabricate(:topic) } - let!(:t3) { Fabricate(:topic) } - - before do - TopTopic.refresh! - end - - it "should_return_a_time_period" do - expect(ListController.best_period_for(nil, nil, SiteSetting.top_page_default_timeframe.to_sym)).not_to eq(nil) - end - - end - - context "has_top_topics_and_seen_recently" do - - SiteSetting.topics_per_period_in_top_page = 2 - SiteSetting.top_page_default_timeframe = 'daily' - - let!(:t1) { Fabricate(:topic) } - let!(:t2) { Fabricate(:topic) } - let!(:t3) { Fabricate(:topic) } - - before do - TopTopic.refresh! - end - - it "should_return_a_time_period" do - expect(ListController.best_period_for(1.month.ago, nil, SiteSetting.top_page_default_timeframe.to_sym)).not_to eq(nil) - end - - end - - context "does_not_have_top_topics" do - - SiteSetting.topics_per_period_in_top_page = 2 - SiteSetting.top_page_default_timeframe = 'daily' - - before do - TopTopic.refresh! - end - - it "should_not_return_a_time_period" do - expect(ListController.best_period_for(1.month.ago, nil, nil)).to eq(nil) - end - - end - - end - describe "best_periods_for" do it "returns yearly for more than 180 days" do From 9cbf7d036ac3374fdc49b46c202cdbc7117d0f7f Mon Sep 17 00:00:00 2001 From: cpradio Date: Tue, 11 Oct 2016 13:22:43 -0400 Subject: [PATCH 0552/1447] FEATURE: Use the top period default for users who have been inactive or are new --- app/models/site_setting.rb | 9 ++++----- app/models/user_option.rb | 2 +- spec/models/site_setting_spec.rb | 34 ++++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/app/models/site_setting.rb b/app/models/site_setting.rb index dcc74ecfc3..fbe1b782d5 100644 --- a/app/models/site_setting.rb +++ b/app/models/site_setting.rb @@ -97,11 +97,10 @@ class SiteSetting < ActiveRecord::Base ].flatten.to_set end - def self.min_redirected_to_top_period - TopTopic.sorted_periods.each do |p| - period = p[0] - return period if TopTopic.topics_per_period(period) >= SiteSetting.topics_per_period_in_top_page - end + def self.min_redirected_to_top_period(duration) + period = ListController.best_period_for(duration) + return period if TopTopic.topics_per_period(period) >= SiteSetting.topics_per_period_in_top_page + # not enough topics nil end diff --git a/app/models/user_option.rb b/app/models/user_option.rb index 1071026c18..99be107d21 100644 --- a/app/models/user_option.rb +++ b/app/models/user_option.rb @@ -90,7 +90,7 @@ class UserOption < ActiveRecord::Base # top must be in the top_menu return unless SiteSetting.top_menu =~ /(^|\|)top(\||$)/i # not enough topics - return unless period = SiteSetting.min_redirected_to_top_period + return unless period = SiteSetting.min_redirected_to_top_period(1.days.ago) if !user.seen_before? || (user.trust_level == 0 && !redirected_to_top_yet?) update_last_redirected_to_top! diff --git a/spec/models/site_setting_spec.rb b/spec/models/site_setting_spec.rb index c2f358c2c9..bf4c1c4161 100644 --- a/spec/models/site_setting_spec.rb +++ b/spec/models/site_setting_spec.rb @@ -69,6 +69,40 @@ describe SiteSetting do end end + describe "min_redirected_to_top_period" do + + context "has_enough_top_topics" do + + SiteSetting.topics_per_period_in_top_page = 2 + SiteSetting.top_page_default_timeframe = 'daily' + + before do + SiteSetting.expects(:min_redirected_to_top_period).returns(:daily) + end + + it "should_return_a_time_period" do + expect(SiteSetting.min_redirected_to_top_period(1.days.ago)).not_to eq(nil) + end + + end + + context "does_not_have_enough_top_topics" do + + SiteSetting.topics_per_period_in_top_page = 20 + SiteSetting.top_page_default_timeframe = 'daily' + + before do + SiteSetting.expects(:min_redirected_to_top_period).returns(nil) + end + + it "should_return_nil" do + expect(SiteSetting.min_redirected_to_top_period(1.days.ago)).to eq(nil) + end + + end + + end + describe "scheme" do before do SiteSetting.force_https = true From 1e1959a89d88d3368a44545ded5291c371158143 Mon Sep 17 00:00:00 2001 From: cpradio Date: Tue, 11 Oct 2016 16:28:31 -0400 Subject: [PATCH 0553/1447] FIX: Improve Mobile UI for Advanced Search --- app/assets/stylesheets/mobile/search.scss | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/app/assets/stylesheets/mobile/search.scss b/app/assets/stylesheets/mobile/search.scss index b55afefc4d..8852e81f64 100644 --- a/app/assets/stylesheets/mobile/search.scss +++ b/app/assets/stylesheets/mobile/search.scss @@ -2,6 +2,29 @@ float: none; } +.search-advanced { + h3.panel-title { + margin: 0; + } + + .search-options { + .control-group { + padding-bottom: 10px; + + &.pull-left { + float: none; + width: auto; + } + + .controls { + input,select { + width: 75%; + } + } + } + } +} + .search.row { margin-top: 5px; } From c51992cf5e0bc9a636ae4c7a9f8c3bd11186e936 Mon Sep 17 00:00:00 2001 From: Jeff Atwood Date: Tue, 11 Oct 2016 14:01:16 -0700 Subject: [PATCH 0554/1447] remove old search help in favor of advanced search --- .../controllers/full-page-search.js.es6 | 5 ---- .../discourse/routes/application.js.es6 | 6 ---- .../discourse/templates/full-page-search.hbs | 6 ---- .../discourse/views/search-help.js.es6 | 7 ----- config/locales/client.en.yml | 4 --- config/locales/server.en.yml | 30 ------------------- 6 files changed, 58 deletions(-) delete mode 100644 app/assets/javascripts/discourse/views/search-help.js.es6 diff --git a/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 b/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 index 8487a63a3c..7719ce0850 100644 --- a/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 +++ b/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 @@ -206,11 +206,6 @@ export default Ember.Controller.extend({ this.get('selected').clear(); }, - showSearchHelp() { - // TODO: dupe code should be centralized - ajax("/static/search_help.html", { dataType: 'html' }).then(model => showModal('searchHelp', { model })); - }, - search() { this._search(); } diff --git a/app/assets/javascripts/discourse/routes/application.js.es6 b/app/assets/javascripts/discourse/routes/application.js.es6 index f34b5ffcde..df074f01d3 100644 --- a/app/assets/javascripts/discourse/routes/application.js.es6 +++ b/app/assets/javascripts/discourse/routes/application.js.es6 @@ -28,12 +28,6 @@ const ApplicationRoute = Discourse.Route.extend(OpenComposer, { actions: { - showSearchHelp() { - ajax("/static/search_help.html", { dataType: 'html' }).then(model => { - showModal('searchHelp', { model }); - }); - }, - toggleAnonymous() { ajax("/users/toggle-anon", {method: 'POST'}).then(() => { window.location.reload(); diff --git a/app/assets/javascripts/discourse/templates/full-page-search.hbs b/app/assets/javascripts/discourse/templates/full-page-search.hbs index 08154200f2..443579e814 100644 --- a/app/assets/javascripts/discourse/templates/full-page-search.hbs +++ b/app/assets/javascripts/discourse/templates/full-page-search.hbs @@ -42,9 +42,6 @@ {{#if searchActive}} {{i18n "search.no_results"}} {{/if}} - {{#unless isExpanded}} - {{i18n "search.search_help"}} - {{/unless}} {{/unless}} @@ -120,9 +117,6 @@ {{#if hasResults}} {{/if}} diff --git a/app/assets/javascripts/discourse/views/search-help.js.es6 b/app/assets/javascripts/discourse/views/search-help.js.es6 deleted file mode 100644 index d16b2fc79f..0000000000 --- a/app/assets/javascripts/discourse/views/search-help.js.es6 +++ /dev/null @@ -1,7 +0,0 @@ -import ModalBodyView from "discourse/views/modal-body"; - -export default ModalBodyView.extend({ - templateName: 'modal/search_help', - title: I18n.t('search_help.title'), - focusInput: false -}); diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 49547abec9..3f5c4ee299 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -1210,7 +1210,6 @@ en: title: "search topics, posts, users, or categories" no_results: "No results found." no_more_results: "No more results found." - search_help: Search help searching: "Searching ..." post_format: "#{{post_number}} by {{username}}" @@ -2111,9 +2110,6 @@ en: lightbox: download: "download" - search_help: - title: 'Search Help' - keyboard_shortcuts_help: title: 'Keyboard Shortcuts' jump_to: diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index e6acba16bc..16cde36684 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -2950,36 +2950,6 @@ en: This document is CC-BY-SA. It was last updated May 31, 2013. - static: - search_help: | -

Tips

-

-

    -
  • Title matches are prioritized – when in doubt, search for titles
  • -
  • Unique, uncommon words will produce the best results
  • -
  • Try searching within a particular category, topic, or user
  • -
-

-

Options

-

- - - - - - - -
order:viewsorder:latestorder:likes@usernameuser:foo
status:openstatus:closedstatus:archivedstatus:norepliesstatus:single_user
#category-slugcategory:foogroup:foobadge:foo
in:likesin:postedin:watchingin:trackingin:private
in:bookmarksin:firstin:pinnedin:unpinnedin:wiki
posts_count:numbefore:days or dateafter:days or datetags:one,two
-

-

Examples

-

-

    -
  • rainbows #parks will search for topics containing the word "rainbows" in the category "parks".
  • -
  • rainbows category:parks status:open order:latest will search for topics containing the word "rainbows" in the category "parks" that are not closed or archived, ordered by date of last post.
  • -
  • rainbows category:"parks and gardens" in:bookmarks will search for topics containing the word "rainbows" in the category "parks and gardens" that are bookmarked by you.
  • -
-

- badges: editor: name: Editor From 70f46d81a9827f7ffac259da67b3f7c701667388 Mon Sep 17 00:00:00 2001 From: Jeff Atwood Date: Tue, 11 Oct 2016 14:25:48 -0700 Subject: [PATCH 0555/1447] disable the group and badge searches for now --- .../discourse/templates/components/search-advanced-options.hbs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/assets/javascripts/discourse/templates/components/search-advanced-options.hbs b/app/assets/javascripts/discourse/templates/components/search-advanced-options.hbs index 0e2e54c500..624a60f0e0 100644 --- a/app/assets/javascripts/discourse/templates/components/search-advanced-options.hbs +++ b/app/assets/javascripts/discourse/templates/components/search-advanced-options.hbs @@ -18,6 +18,7 @@
+ {{#if siteSettings.tagging_enabled}}
From ca4130f30d49e5460bb38a2e0c14b0c35026a464 Mon Sep 17 00:00:00 2001 From: cpradio Date: Tue, 11 Oct 2016 17:41:04 -0400 Subject: [PATCH 0556/1447] FIX: Use @username instead of user:username --- .../discourse/components/search-advanced-options.js.es6 | 4 ++-- test/javascripts/acceptance/search-full-test.js.es6 | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/discourse/components/search-advanced-options.js.es6 b/app/assets/javascripts/discourse/components/search-advanced-options.js.es6 index 6fabacccc8..6f988b310f 100644 --- a/app/assets/javascripts/discourse/components/search-advanced-options.js.es6 +++ b/app/assets/javascripts/discourse/components/search-advanced-options.js.es6 @@ -99,9 +99,9 @@ export default Em.Component.extend({ const userFilter = this.get('searchedTerms.username'); if (userFilter && userFilter.length !== 0) if (match.length !== 0) - searchTerm = searchTerm.replace(match, ` user:${userFilter}`); + searchTerm = searchTerm.replace(match, ` @${userFilter}`); else - searchTerm += ` user:${userFilter}`; + searchTerm += ` @${userFilter}`; else if (match.length !== 0) searchTerm = searchTerm.replace(match, ''); diff --git a/test/javascripts/acceptance/search-full-test.js.es6 b/test/javascripts/acceptance/search-full-test.js.es6 index 248efe4745..931d2c69cd 100644 --- a/test/javascripts/acceptance/search-full-test.js.es6 +++ b/test/javascripts/acceptance/search-full-test.js.es6 @@ -105,7 +105,7 @@ test("update username through advanced search ui", assert => { andThen(() => { assert.ok(exists('.search-options span:contains("admin")'), 'has "admin" pre-populated'); - assert.equal(find('.search input.full-page-search').val(), "none user:admin", 'has updated search term to "none user:admin"'); + assert.equal(find('.search input.full-page-search').val(), "none @admin", 'has updated search term to "none user:admin"'); }); }); }); From ff74bd7e28a13014dd09228445bf0a9938066518 Mon Sep 17 00:00:00 2001 From: cpradio Date: Tue, 11 Oct 2016 17:50:16 -0400 Subject: [PATCH 0557/1447] FIX: comment out tests for UI elements removed from HTML markup --- .../acceptance/search-full-test.js.es6 | 92 +++++++++---------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/test/javascripts/acceptance/search-full-test.js.es6 b/test/javascripts/acceptance/search-full-test.js.es6 index 931d2c69cd..b337b51a87 100644 --- a/test/javascripts/acceptance/search-full-test.js.es6 +++ b/test/javascripts/acceptance/search-full-test.js.es6 @@ -77,8 +77,8 @@ test("validate population of advanced search", assert => { andThen(() => { assert.ok(exists('.search-options span:contains("admin")'), 'has "admin" pre-populated'); assert.ok(exists('.search-options .category-combobox .select2-choice .select2-chosen:contains("bug")'), 'has "bug" pre-populated'); - assert.ok(exists('.search-options span:contains("moderators")'), 'has "moderators" pre-populated'); - assert.ok(exists('.search-options span:contains("Reader")'), 'has "Reader" pre-populated'); + //assert.ok(exists('.search-options span:contains("moderators")'), 'has "moderators" pre-populated'); + //assert.ok(exists('.search-options span:contains("Reader")'), 'has "Reader" pre-populated'); assert.ok(exists('.search-options .tag-chooser .tag-monkey'), 'has "monkey" pre-populated'); assert.ok(exists('.search-options .combobox .select2-choice .select2-chosen:contains("I liked")'), 'has "I liked" pre-populated'); assert.ok(exists('.search-options .combobox .select2-choice .select2-chosen:contains("are open")'), 'has "are open" pre-populated'); @@ -124,51 +124,51 @@ test("update category through advanced search ui", assert => { }); }); -test("update group through advanced search ui", assert => { - visit("/search"); - fillIn('.search input.full-page-search', 'none'); - click('.search-advanced h3.panel-title'); - fillIn('.search-options .group-selector', 'moderators'); - click('.search-options .group-selector'); - keyEvent('.search-options .group-selector', 'keydown', 8); +// test("update group through advanced search ui", assert => { +// visit("/search"); +// fillIn('.search input.full-page-search', 'none'); +// click('.search-advanced h3.panel-title'); +// fillIn('.search-options .group-selector', 'moderators'); +// click('.search-options .group-selector'); +// keyEvent('.search-options .group-selector', 'keydown', 8); +// +// andThen(() => { +// waitFor(() => { +// assert.ok(visible('.search-options .autocomplete'), '"autocomplete" popup is visible'); +// assert.ok(exists('.search-options .autocomplete ul li a:contains("moderators")'), '"autocomplete" popup has an entry for "moderators"'); +// +// click('.search-options .autocomplete ul li a:first'); +// +// andThen(() => { +// assert.ok(exists('.search-options span:contains("moderators")'), 'has "moderators" pre-populated'); +// assert.equal(find('.search input.full-page-search').val(), "none group:moderators", 'has updated search term to "none group:moderators"'); +// }); +// }); +// }); +// }); - andThen(() => { - waitFor(() => { - assert.ok(visible('.search-options .autocomplete'), '"autocomplete" popup is visible'); - assert.ok(exists('.search-options .autocomplete ul li a:contains("moderators")'), '"autocomplete" popup has an entry for "moderators"'); - - click('.search-options .autocomplete ul li a:first'); - - andThen(() => { - assert.ok(exists('.search-options span:contains("moderators")'), 'has "moderators" pre-populated'); - assert.equal(find('.search input.full-page-search').val(), "none group:moderators", 'has updated search term to "none group:moderators"'); - }); - }); - }); -}); - -test("update badges through advanced search ui", assert => { - visit("/search"); - fillIn('.search input.full-page-search', 'none'); - click('.search-advanced h3.panel-title'); - fillIn('.search-options .badge-names', 'Reader'); - click('.search-options .badge-names'); - keyEvent('.search-options .badge-names', 'keydown', 8); - - andThen(() => { - waitFor(() => { - assert.ok(visible('.search-options .autocomplete'), '"autocomplete" popup is visible'); - assert.ok(exists('.search-options .autocomplete ul li a:contains("Reader")'), '"autocomplete" popup has an entry for "Reader"'); - - click('.search-options .autocomplete ul li a:first'); - - andThen(() => { - assert.ok(exists('.search-options span:contains("Reader")'), 'has "Reader" pre-populated'); - assert.equal(find('.search input.full-page-search').val(), "none badge:Reader", 'has updated search term to "none badge:Reader"'); - }); - }); - }); -}); +// test("update badges through advanced search ui", assert => { +// visit("/search"); +// fillIn('.search input.full-page-search', 'none'); +// click('.search-advanced h3.panel-title'); +// fillIn('.search-options .badge-names', 'Reader'); +// click('.search-options .badge-names'); +// keyEvent('.search-options .badge-names', 'keydown', 8); +// +// andThen(() => { +// waitFor(() => { +// assert.ok(visible('.search-options .autocomplete'), '"autocomplete" popup is visible'); +// assert.ok(exists('.search-options .autocomplete ul li a:contains("Reader")'), '"autocomplete" popup has an entry for "Reader"'); +// +// click('.search-options .autocomplete ul li a:first'); +// +// andThen(() => { +// assert.ok(exists('.search-options span:contains("Reader")'), 'has "Reader" pre-populated'); +// assert.equal(find('.search input.full-page-search').val(), "none badge:Reader", 'has updated search term to "none badge:Reader"'); +// }); +// }); +// }); +// }); // test("update tags through advanced search ui", assert => { // visit("/search"); From c5b94878ac75f7dc69cdd3addc81db2b6d8f4360 Mon Sep 17 00:00:00 2001 From: Rafael dos Santos Silva Date: Tue, 11 Oct 2016 19:14:32 -0300 Subject: [PATCH 0558/1447] We need this variable later --- app/services/badge_granter.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/services/badge_granter.rb b/app/services/badge_granter.rb index b5206b61b9..ece099e4f1 100644 --- a/app/services/badge_granter.rb +++ b/app/services/badge_granter.rb @@ -312,6 +312,9 @@ class BadgeGranter SiteSetting.default_locale end + # Make this variable in this scope + notification = nil + I18n.with_locale(notification_locale) do notification = Notification.create!( user_id: row.user_id, From 48fa1f141fdb5469f6ba0f6e2c5c7a9d4aaf9920 Mon Sep 17 00:00:00 2001 From: Rafael dos Santos Silva Date: Tue, 11 Oct 2016 19:15:36 -0300 Subject: [PATCH 0559/1447] Add specs for localized notifications on backfilled badges --- spec/services/badge_granter_spec.rb | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/spec/services/badge_granter_spec.rb b/spec/services/badge_granter_spec.rb index a7ce5e40df..cb906c282d 100644 --- a/spec/services/badge_granter_spec.rb +++ b/spec/services/badge_granter_spec.rb @@ -94,6 +94,23 @@ describe BadgeGranter do expect(Badge.find(Badge::NiceTopic).grant_count).to eq(1) expect(Badge.find(Badge::GoodTopic).grant_count).to eq(1) end + + it 'should grant badges in the user locale' do + + SiteSetting.allow_user_locale = true + + nice_topic = Badge.find(Badge::NiceTopic) + name_english = nice_topic.name + + user = Fabricate(:user, locale: 'fr') + post = Fabricate(:post, like_count: 10, user: user) + + BadgeGranter.backfill(nice_topic) + + notification_badge_name = JSON.parse(post.user.notifications.first.data)['badge_name'] + + expect(notification_badge_name).not_to eq(name_english) + end end describe 'grant' do From 6bf0bc3408541eba3321159f7f06fb06df85a6aa Mon Sep 17 00:00:00 2001 From: cpradio Date: Tue, 11 Oct 2016 18:52:31 -0400 Subject: [PATCH 0560/1447] FEATURE: search menu options opens full page search --- .../javascripts/discourse/widgets/search-menu-controls.js.es6 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/widgets/search-menu-controls.js.es6 b/app/assets/javascripts/discourse/widgets/search-menu-controls.js.es6 index 61e0626f8d..141fd4ee32 100644 --- a/app/assets/javascripts/discourse/widgets/search-menu-controls.js.es6 +++ b/app/assets/javascripts/discourse/widgets/search-menu-controls.js.es6 @@ -44,7 +44,7 @@ createWidget('search-context', { ])); } - result.push(this.attach('link', { action: 'showSearchHelp', + result.push(this.attach('link', { href: '/search', label: 'show_help', className: 'show-help' })); result.push(h('div.clearfix')); From 1d27610ffcc0d5218257512d45648a78103c3b55 Mon Sep 17 00:00:00 2001 From: cpradio Date: Tue, 11 Oct 2016 19:59:37 -0400 Subject: [PATCH 0561/1447] FEATURE: search menu options opens full page search --- .../javascripts/discourse/controllers/full-page-search.js.es6 | 3 ++- .../javascripts/discourse/routes/full-page-search.js.es6 | 2 +- .../javascripts/discourse/widgets/search-menu-controls.js.es6 | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 b/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 index 7719ce0850..442ecba7d7 100644 --- a/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 +++ b/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 @@ -18,9 +18,10 @@ export default Ember.Controller.extend({ bulkSelectEnabled: null, loading: Em.computed.not("model"), - queryParams: ["q", "context_id", "context", "skip_context"], + queryParams: ["q", "isExpanded", "context_id", "context", "skip_context"], q: null, selected: [], + isExpanded: false, context_id: null, context: null, searching: false, diff --git a/app/assets/javascripts/discourse/routes/full-page-search.js.es6 b/app/assets/javascripts/discourse/routes/full-page-search.js.es6 index 10cd876555..86b191266e 100644 --- a/app/assets/javascripts/discourse/routes/full-page-search.js.es6 +++ b/app/assets/javascripts/discourse/routes/full-page-search.js.es6 @@ -5,7 +5,7 @@ import PreloadStore from 'preload-store'; import { getTransient, setTransient } from 'discourse/lib/page-tracker'; export default Discourse.Route.extend({ - queryParams: { q: {}, context_id: {}, context: {}, skip_context: {} }, + queryParams: { q: {}, isExpanded: false, context_id: {}, context: {}, skip_context: {} }, model(params) { const cached = getTransient('lastSearch'); diff --git a/app/assets/javascripts/discourse/widgets/search-menu-controls.js.es6 b/app/assets/javascripts/discourse/widgets/search-menu-controls.js.es6 index 141fd4ee32..f4ebe9bc34 100644 --- a/app/assets/javascripts/discourse/widgets/search-menu-controls.js.es6 +++ b/app/assets/javascripts/discourse/widgets/search-menu-controls.js.es6 @@ -44,7 +44,7 @@ createWidget('search-context', { ])); } - result.push(this.attach('link', { href: '/search', + result.push(this.attach('link', { href: '/search?isExpanded=true', label: 'show_help', className: 'show-help' })); result.push(h('div.clearfix')); From 5091124eed1c40c40d147f7dcdf033d749b4715c Mon Sep 17 00:00:00 2001 From: cpradio Date: Tue, 11 Oct 2016 20:35:25 -0400 Subject: [PATCH 0562/1447] FIX: fix eslint error due to removing the search_help Related commit that made eslint unhappy https://github.com/discourse/discourse/commit/c51992cf5e0bc9a636ae4c7a9f8c3bd11186e936 --- .../javascripts/discourse/controllers/full-page-search.js.es6 | 1 - 1 file changed, 1 deletion(-) diff --git a/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 b/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 index 442ecba7d7..5885ed35fb 100644 --- a/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 +++ b/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 @@ -1,6 +1,5 @@ import { ajax } from 'discourse/lib/ajax'; import { translateResults, searchContextDescription, getSearchKey, isValidSearchTerm } from "discourse/lib/search"; -import showModal from 'discourse/lib/show-modal'; import { default as computed, observes } from 'ember-addons/ember-computed-decorators'; import Category from 'discourse/models/category'; import { escapeExpression } from 'discourse/lib/utilities'; From 41d2620d065d1a1a7ed9199126ab200622810025 Mon Sep 17 00:00:00 2001 From: Rafael dos Santos Silva Date: Wed, 12 Oct 2016 14:00:05 -0300 Subject: [PATCH 0563/1447] Add some styling to print redux version --- app/views/layouts/crawler.html.erb | 40 ------------------------------ app/views/topics/show.html.erb | 11 ++++++++ lib/sass/discourse_stylesheets.rb | 4 +-- 3 files changed, 13 insertions(+), 42 deletions(-) diff --git a/app/views/layouts/crawler.html.erb b/app/views/layouts/crawler.html.erb index 0446c81f0b..a04edf944a 100644 --- a/app/views/layouts/crawler.html.erb +++ b/app/views/layouts/crawler.html.erb @@ -10,46 +10,6 @@ <%- end %> <%= render_google_universal_analytics_code %> <%= yield :head %> - <%- unless customization_disabled? %> diff --git a/app/views/topics/show.html.erb b/app/views/topics/show.html.erb index 620b1b54f0..4f20a507f0 100644 --- a/app/views/topics/show.html.erb +++ b/app/views/topics/show.html.erb @@ -69,6 +69,17 @@ <% if @topic_view.print %> <% content_for :after_body do %> + <%- if rtl? %> + <%= DiscourseStylesheets.stylesheet_link_tag(mobile_view? ? :mobile_rtl : :desktop_rtl, 'print') %> + <%- else %> + <%= DiscourseStylesheets.stylesheet_link_tag(mobile_view? ? :mobile : :desktop, 'print') %> + <%- end %> + diff --git a/app/views/layouts/finish_installation.html.erb b/app/views/layouts/finish_installation.html.erb new file mode 100644 index 0000000000..2b709a56c9 --- /dev/null +++ b/app/views/layouts/finish_installation.html.erb @@ -0,0 +1,23 @@ + + + <%= stylesheet_link_tag 'wizard' %> + <%= render partial: "common/special_font_face" %> + <%= script 'jquery_include' %> + <%= script 'wizard-vendor' %> + <%= render partial: "layouts/head" %> + <%= t 'wizard.title' %> + + + +
+
+
+ <%= yield %> +
+ +
+
+ + diff --git a/config/initializers/006-ensure_login_hint.rb b/config/initializers/006-ensure_login_hint.rb index b497eb93e3..fb0a526c7e 100644 --- a/config/initializers/006-ensure_login_hint.rb +++ b/config/initializers/006-ensure_login_hint.rb @@ -6,7 +6,7 @@ if User.limit(20).count < 20 && User.where(admin: true).count == 1 else emails = GlobalSetting.developer_emails.split(",") if emails.length > 1 - emails = emails[0..-2].join(' , ') << " or #{emails[-1]} " + emails = emails[0..-2].join(', ') << " or #{emails[-1]} " else emails = emails[0] end diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index f3bd464db3..fd7ebcc9b6 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -3193,6 +3193,17 @@ en: staff_tag_remove_disallowed: "The tag \"%{tag}\" may only be removed by staff." rss_by_tag: "Topics tagged %{tag}" + first_installation: + congratulations: "Congratulations, you installed Discourse!" + register: + button: "Register" + title: "Register Admin Account" + help: "register a new account to get started" + no_emails: "Unfortunately, no administrator emails were defined during setup, so finalizing the configuration may be difficult." + confirm_email: + title: "Confirm your Email" + message: "

We sent an activation mail to %{email}. Please follow the instructions in the email to activate your account.

If it doesn't arrive, ensure you have set up email correctly for your Discourse and check your spam folder.

" + wizard: title: "Discourse Setup" step: diff --git a/config/routes.rb b/config/routes.rb index fe1b788598..5c51163ef5 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -37,6 +37,11 @@ Discourse::Application.routes.draw do end end + get "finish-installation" => "finish_installation#index" + get "finish-installation/register" => "finish_installation#register" + post "finish-installation/register" => "finish_installation#register" + get "finish-installation/confirm-email" => "finish_installation#confirm_email" + resources :directory_items get "site" => "site#site" @@ -687,6 +692,8 @@ Discourse::Application.routes.draw do # special case for top root to: "list#top", constraints: HomePageConstraint.new("top"), :as => "top_lists" + root to: 'finish_installation#index', constraints: HomePageConstraint.new("finish_installation"), as: 'installation_redirect' + get "/user-api-key/new" => "user_api_keys#new" post "/user-api-key" => "user_api_keys#create" post "/user-api-key/revoke" => "user_api_keys#revoke" diff --git a/lib/homepage_constraint.rb b/lib/homepage_constraint.rb index 247da1c904..0783fd51f0 100644 --- a/lib/homepage_constraint.rb +++ b/lib/homepage_constraint.rb @@ -4,6 +4,8 @@ class HomePageConstraint end def matches?(request) + return @filter == 'finish_installation' if SiteSetting.has_login_hint? + provider = Discourse.current_user_provider.new(request.env) homepage = provider.current_user ? SiteSetting.homepage : SiteSetting.anonymous_homepage homepage == @filter diff --git a/lib/wizard.rb b/lib/wizard.rb index 0ae5e6ac59..2e1689c5b6 100644 --- a/lib/wizard.rb +++ b/lib/wizard.rb @@ -76,13 +76,17 @@ class Wizard def requires_completion? return false unless SiteSetting.wizard_enabled? + first_admin = User.where(admin: true) .where.not(id: Discourse.system_user.id) .where.not(auth_token_updated_at: nil) .order(:auth_token_updated_at) - .first - @user.present? && first_admin == @user && !completed? && (Topic.count < 15) + @user.present? && first_admin.first == @user && !completed? && (Topic.count < 15) + end + + def self.user_requires_completion?(user) + Wizard::Builder.new(user).build.requires_completion? end end diff --git a/public/images/wizard/tada.svg b/public/images/wizard/tada.svg new file mode 100644 index 0000000000..c6c7728999 --- /dev/null +++ b/public/images/wizard/tada.svg @@ -0,0 +1 @@ +image/svg+xml diff --git a/spec/controllers/finish_installation_controller_spec.rb b/spec/controllers/finish_installation_controller_spec.rb new file mode 100644 index 0000000000..2ada049fbf --- /dev/null +++ b/spec/controllers/finish_installation_controller_spec.rb @@ -0,0 +1,85 @@ +require 'rails_helper' + +describe FinishInstallationController do + + describe '.index' do + context "has_login_hint is false" do + before do + SiteSetting.has_login_hint = false + end + + it "doesn't allow access" do + get :index + expect(response).not_to be_success + end + end + + context "has_login_hint is true" do + before do + SiteSetting.has_login_hint = true + end + + it "allows access" do + get :index + expect(response).to be_success + end + end + end + + describe '.register' do + context "has_login_hint is false" do + before do + SiteSetting.has_login_hint = false + end + + it "doesn't allow access" do + get :register + expect(response).not_to be_success + end + end + + context "has_login_hint is true" do + before do + SiteSetting.has_login_hint = true + GlobalSetting.stubs(:developer_emails).returns("robin@example.com") + end + + it "allows access" do + get :register + expect(response).to be_success + end + + it "raises an error when the email is not in the allowed list" do + expect { + post :register, email: 'notrobin@example.com', username: 'eviltrout', password: 'disismypasswordokay' + }.to raise_error(Discourse::InvalidParameters) + end + + it "doesn't redirect when fields are wrong" do + post :register, email: 'robin@example.com', username: '', password: 'disismypasswordokay' + expect(response).not_to be_redirect + end + + it "registers the admin when the email is in the list" do + Jobs.expects(:enqueue).with(:critical_user_email, has_entries(type: :signup)) + post :register, email: 'robin@example.com', username: 'eviltrout', password: 'disismypasswordokay' + expect(response).to be_redirect + expect(User.where(username: 'eviltrout').exists?).to eq(true) + end + + end + end + + describe '.confirm_email' do + context "has_login_hint is false" do + before do + SiteSetting.has_login_hint = false + end + + it "shows the page" do + get :confirm_email + expect(response).to be_success + end + end + end +end diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb index d5f259cdaf..3f6331f0bc 100644 --- a/spec/controllers/users_controller_spec.rb +++ b/spec/controllers/users_controller_spec.rb @@ -254,6 +254,14 @@ describe UsersController do expect(session["password-#{token}"]).to be_blank end + it "redirects to the wizard if you're the first admin" do + user = Fabricate(:admin, auth_token: SecureRandom.hex(16), auth_token_updated_at: Time.now) + token = user.email_tokens.create(email: user.email).token + get :password_reset, token: token + put :password_reset, token: token, password: 'hg9ow8yhg98oadminlonger' + expect(response).to be_redirect + end + it "doesn't invalidate the token when loading the page" do user = Fabricate(:user, auth_token: SecureRandom.hex(16)) email_token = user.email_tokens.create(email: user.email) From c6ef1301f32c84f49a73c18ffb2a3dcb7c1948f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Wed, 19 Oct 2016 17:41:17 +0200 Subject: [PATCH 0629/1447] optimize tada.svg --- public/images/wizard/tada.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/images/wizard/tada.svg b/public/images/wizard/tada.svg index c6c7728999..b43b39827b 100644 --- a/public/images/wizard/tada.svg +++ b/public/images/wizard/tada.svg @@ -1 +1 @@ -image/svg+xml + From 9f7b529495f90d44714a77463112df48ce1f24d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Wed, 19 Oct 2016 18:42:24 +0200 Subject: [PATCH 0630/1447] FIX: properly detect when attachments are allowed --- app/assets/javascripts/discourse/lib/utilities.js.es6 | 4 ++-- test/javascripts/lib/utilities-test.js.es6 | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/assets/javascripts/discourse/lib/utilities.js.es6 b/app/assets/javascripts/discourse/lib/utilities.js.es6 index b1b124518b..a46fdb0c8c 100644 --- a/app/assets/javascripts/discourse/lib/utilities.js.es6 +++ b/app/assets/javascripts/discourse/lib/utilities.js.es6 @@ -267,12 +267,12 @@ export function isAnImage(path) { export function allowsImages() { return authorizesAllExtensions() || - (/(png|jpe?g|gif|bmp|tiff?|svg|webp|ico)/i).test(authorizedExtensions()); + (/\.(png|jpe?g|gif|bmp|tiff?|svg|webp|ico)/i).test(authorizedExtensions()); } export function allowsAttachments() { return authorizesAllExtensions() || - !(/((png|jpe?g|gif|bmp|tiff?|svg|web|ico)(,\s)?)+$/i).test(authorizedExtensions()); + !/^(\.(png|jpe?g|gif|bmp|tiff?|svg|webp|ico)(,\s)?)+$/i.test(authorizedExtensions()); } export function displayErrorForUpload(data) { diff --git a/test/javascripts/lib/utilities-test.js.es6 b/test/javascripts/lib/utilities-test.js.es6 index 59281334fc..fd3583de8c 100644 --- a/test/javascripts/lib/utilities-test.js.es6 +++ b/test/javascripts/lib/utilities-test.js.es6 @@ -164,13 +164,13 @@ test("avatarImg", function() { }); test("allowsAttachments", function() { - Discourse.SiteSettings.authorized_extensions = "jpg|jpeg|gif"; + Discourse.SiteSettings.authorized_extensions = ".jpg, .jpeg, .gif"; not(allowsAttachments(), "no attachments allowed by default"); - Discourse.SiteSettings.authorized_extensions = "jpg|jpeg|gif|*"; + Discourse.SiteSettings.authorized_extensions = ".jpg, .jpeg, .gif, *"; ok(allowsAttachments(), "attachments are allowed when all extensions are allowed"); - Discourse.SiteSettings.authorized_extensions = "jpg|jpeg|gif|pdf"; + Discourse.SiteSettings.authorized_extensions = ".jpg, .jpeg, .gif, .pdf"; ok(allowsAttachments(), "attachments are allowed when at least one extension is not an image extension"); }); From aee943486aa002250d1fdae3769f8fa3f87392f8 Mon Sep 17 00:00:00 2001 From: Kiril Staikov Date: Wed, 5 Oct 2016 19:28:58 -0400 Subject: [PATCH 0631/1447] FEATURE:'No Echo' option for mailing list mode. Mailing list mode now includes the 'no echo' option: to only receive emails of posts not created by you. If you reply to an email thread in mailing list mode, your reply will not then be echoed back to you in a duplicate email by the system. --- .../discourse/controllers/preferences.js.es6 | 3 +- .../notify_mailing_list_subscribers.rb | 7 ++++- app/jobs/regular/user_email.rb | 2 +- app/models/mailing_list_mode_site_setting.rb | 3 +- config/locales/client.en.yml | 1 + config/locales/server.en.yml | 1 + spec/jobs/enqueue_mailing_list_emails_spec.rb | 5 ++++ .../notify_mailing_list_subscribers_spec.rb | 30 ++++++++++++++++++- spec/jobs/user_email_spec.rb | 15 ++++++++++ 9 files changed, 62 insertions(+), 5 deletions(-) diff --git a/app/assets/javascripts/discourse/controllers/preferences.js.es6 b/app/assets/javascripts/discourse/controllers/preferences.js.es6 index b94d993ed1..f9077e6e43 100644 --- a/app/assets/javascripts/discourse/controllers/preferences.js.es6 +++ b/app/assets/javascripts/discourse/controllers/preferences.js.es6 @@ -79,7 +79,8 @@ export default Ember.Controller.extend(CanCheckEmails, { mailingListModeOptions() { return [ {name: I18n.t('user.mailing_list_mode.daily'), value: 0}, - {name: this.get('frequencyEstimate'), value: 1} + {name: this.get('frequencyEstimate'), value: 1}, + {name: I18n.t('user.mailing_list_mode.individual_no_echo'), value: 2} ]; }, diff --git a/app/jobs/regular/notify_mailing_list_subscribers.rb b/app/jobs/regular/notify_mailing_list_subscribers.rb index 6eed13a420..ae5e333e7e 100644 --- a/app/jobs/regular/notify_mailing_list_subscribers.rb +++ b/app/jobs/regular/notify_mailing_list_subscribers.rb @@ -16,7 +16,7 @@ module Jobs users = User.activated.not_blocked.not_suspended.real .joins(:user_option) - .where(user_options: {mailing_list_mode: true, mailing_list_mode_frequency: 1}) + .where('user_options.mailing_list_mode AND user_options.mailing_list_mode_frequency > 0') .where('NOT EXISTS( SELECT 1 FROM topic_users tu @@ -46,6 +46,11 @@ module Jobs next end + if (user.id == post.user_id) && (user.user_option.mailing_list_mode_frequency == 2) + skip(user.email, user.id, post.id, I18n.t('email_log.no_echo_mailing_list_mode')) + next + end + begin if message = UserNotifications.mailing_list_notify(user, post) EmailLog.unique_email_per_post(post, user) do diff --git a/app/jobs/regular/user_email.rb b/app/jobs/regular/user_email.rb index 50109e2a68..de1d318f4f 100644 --- a/app/jobs/regular/user_email.rb +++ b/app/jobs/regular/user_email.rb @@ -103,7 +103,7 @@ module Jobs end if user.user_option.mailing_list_mode? && - user.user_option.mailing_list_mode_frequency == 1 && # don't catch notifications for users on daily mailing list mode + user.user_option.mailing_list_mode_frequency > 0 && # don't catch notifications for users on daily mailing list mode (!post.try(:topic).try(:private_message?)) && NOTIFICATIONS_SENT_BY_MAILING_LIST.include?(email_args[:notification_type]) # no need to log a reason when the mail was already sent via the mailing list job diff --git a/app/models/mailing_list_mode_site_setting.rb b/app/models/mailing_list_mode_site_setting.rb index b2a8291d00..9a8241c1f0 100644 --- a/app/models/mailing_list_mode_site_setting.rb +++ b/app/models/mailing_list_mode_site_setting.rb @@ -9,7 +9,8 @@ class MailingListModeSiteSetting < EnumSiteSetting def self.values @values ||= [ { name: 'user.mailing_list_mode.daily', value: 0 }, - { name: 'user.mailing_list_mode.individual', value: 1 } + { name: 'user.mailing_list_mode.individual', value: 1 }, + { name: 'user.mailing_list_mode.individual_no_echo', value: 2 } ] end diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index fe210e4bb3..df618cac2b 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -535,6 +535,7 @@ en: Muted topics and categories are not included in these emails. daily: "Send daily updates" individual: "Send an email for every new post" + individual_no_echo: "Send an email for every new post except my own" many_per_day: "Send me an email for every new post (about {{dailyEmailEstimate}} per day)" few_per_day: "Send me an email for every new post (about 2 per day)" tag_settings: "Tags" diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index fd7ebcc9b6..3ae8f8fb67 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -2614,6 +2614,7 @@ en: message_to_blank: "message.to is blank" text_part_body_blank: "text_part.body is blank" body_blank: "body is blank" + no_echo_mailing_list_mode: "Mailing list notifications disabled for user's own posts" color_schemes: base_theme_name: "Base" diff --git a/spec/jobs/enqueue_mailing_list_emails_spec.rb b/spec/jobs/enqueue_mailing_list_emails_spec.rb index 820ed1e812..3ee9ebe941 100644 --- a/spec/jobs/enqueue_mailing_list_emails_spec.rb +++ b/spec/jobs/enqueue_mailing_list_emails_spec.rb @@ -82,6 +82,11 @@ describe Jobs::EnqueueMailingListEmails do expect(subject).to_not include user.id end + it "doesn't return users with mailing list mode set to 'individual_excluding_own'" do + user_option.update(mailing_list_mode_frequency: 2) + expect(subject).to_not include user.id + end + it "doesn't return a user who has received the mailing list summary earlier" do user.update(first_seen_at: 5.hours.ago) expect(subject).to_not include user.id diff --git a/spec/jobs/notify_mailing_list_subscribers_spec.rb b/spec/jobs/notify_mailing_list_subscribers_spec.rb index 899d4aedd9..92a97409b9 100644 --- a/spec/jobs/notify_mailing_list_subscribers_spec.rb +++ b/spec/jobs/notify_mailing_list_subscribers_spec.rb @@ -47,9 +47,15 @@ describe Jobs::NotifyMailingListSubscribers do end end - context "with a valid post" do + context "with a valid post authored by same user" do let!(:post) { Fabricate(:post, user: user) } + it "doesn't send the email to the user if the frequency is set to 'always with no echo'" do + user.user_option.update(mailing_list_mode: true, mailing_list_mode_frequency: 2) + UserNotifications.expects(:mailing_list_notify).never + Jobs::NotifyMailingListSubscribers.new.execute(post_id: post.id) + end + it "sends the email to the user if the frequency is set to 'always'" do user.user_option.update(mailing_list_mode: true, mailing_list_mode_frequency: 1) UserNotifications.expects(:mailing_list_notify).with(user, post).once @@ -63,6 +69,28 @@ describe Jobs::NotifyMailingListSubscribers do end end + context "with a valid post created by someone other than the user" do + let!(:post) { Fabricate(:post, user: user, user_id: 'different') } + + it "sends the email to the user if the frequency is set to 'always with no echo'" do + user.user_option.update(mailing_list_mode: true, mailing_list_mode_frequency: 2) + UserNotifications.expects(:mailing_list_notify).once + Jobs::NotifyMailingListSubscribers.new.execute(post_id: post.id) + end + + it "sends the email to the user if the frequency is set to 'always'" do + user.user_option.update(mailing_list_mode: true, mailing_list_mode_frequency: 1) + UserNotifications.expects(:mailing_list_notify).once + Jobs::NotifyMailingListSubscribers.new.execute(post_id: post.id) + end + + it "does not send the email to the user if the frequency is set to 'daily'" do + user.user_option.update(mailing_list_mode: true, mailing_list_mode_frequency: 0) + UserNotifications.expects(:mailing_list_notify).never + Jobs::NotifyMailingListSubscribers.new.execute(post_id: post.id) + end + end + context "with a deleted post" do let!(:post) { Fabricate(:post, user: user, deleted_at: Time.now) } diff --git a/spec/jobs/user_email_spec.rb b/spec/jobs/user_email_spec.rb index f99a403b4e..a1af812c12 100644 --- a/spec/jobs/user_email_spec.rb +++ b/spec/jobs/user_email_spec.rb @@ -240,6 +240,21 @@ describe Jobs::UserEmail do Jobs::UserEmail.new.execute(type: :user_mentioned, user_id: user.id, notification_type: "posted", post_id: post.id) end + it "doesn't send the mail if the user is using individual mailing list mode with no echo" do + Email::Sender.any_instance.expects(:send).never + user.user_option.update(mailing_list_mode: true, mailing_list_mode_frequency: 2) + # sometimes, we pass the notification_id + Jobs::UserEmail.new.execute(type: :user_mentioned, user_id: user.id, notification_id: notification.id, post_id: post.id) + # other times, we only pass the type of notification + Jobs::UserEmail.new.execute(type: :user_mentioned, user_id: user.id, notification_type: "posted", post_id: post.id) + # When post is nil + Jobs::UserEmail.new.execute(type: :user_mentioned, user_id: user.id, notification_type: "posted") + # When post does not have a topic + post = Fabricate(:post) + post.topic.destroy + Jobs::UserEmail.new.execute(type: :user_mentioned, user_id: user.id, notification_type: "posted", post_id: post.id) + end + it "doesn't send the email if the post has been user deleted" do Email::Sender.any_instance.expects(:send).never post.update_column(:user_deleted, true) From 91da1247695ffedc2476e8749ae87b45f5d38a06 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Wed, 19 Oct 2016 22:12:25 +0100 Subject: [PATCH 0632/1447] Added resolveService function to custom resolver --- app/assets/javascripts/discourse-common/resolver.js.es6 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/assets/javascripts/discourse-common/resolver.js.es6 b/app/assets/javascripts/discourse-common/resolver.js.es6 index fdf1a1abea..34222872df 100644 --- a/app/assets/javascripts/discourse-common/resolver.js.es6 +++ b/app/assets/javascripts/discourse-common/resolver.js.es6 @@ -120,6 +120,10 @@ export function buildResolver(baseName) { return this.customResolve(parsedName) || this._super(parsedName); }, + resolveService(parsedName) { + return this.customResolve(parsedName) || this._super(parsedName); + }, + resolveRoute(parsedName) { return this.findLoadingRoute(parsedName) || this.customResolve(parsedName) || this._super(parsedName); }, From 9457b03da1b3251cae04bb638772ac51c9672e04 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 20 Oct 2016 10:14:53 +1100 Subject: [PATCH 0633/1447] UX: make it easier to collapse the timeline from fullscreen --- .../javascripts/discourse/components/topic-navigation.js.es6 | 3 ++- app/assets/stylesheets/common/topic-timeline.scss | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/components/topic-navigation.js.es6 b/app/assets/javascripts/discourse/components/topic-navigation.js.es6 index 72313abb53..c7b28ca17c 100644 --- a/app/assets/javascripts/discourse/components/topic-navigation.js.es6 +++ b/app/assets/javascripts/discourse/components/topic-navigation.js.es6 @@ -46,7 +46,8 @@ export default Ember.Component.extend({ _expanded() { if (this.get('info.topicProgressExpanded')) { $(window).on('click.hide-fullscreen', (e) => { - if (!$(e.target).parents().is('.timeline-container, #topic-progress-wrapper')) { + if ( $(e.target).is('.topic-timeline') || + !$(e.target).parents().is('.timeline-container, #topic-progress-wrapper')) { this._collapseFullscreen(); } }); diff --git a/app/assets/stylesheets/common/topic-timeline.scss b/app/assets/stylesheets/common/topic-timeline.scss index 8e606dbb90..3aa43fd055 100644 --- a/app/assets/stylesheets/common/topic-timeline.scss +++ b/app/assets/stylesheets/common/topic-timeline.scss @@ -46,6 +46,9 @@ border-top: 1px solid dark-light-choose(scale-color($primary, $lightness: 90%), scale-color($secondary, $lightness: 90%)); padding-top: 15px; z-index: 100000; + .timeline-scrollarea { + max-width: 200px; + } .topic-timeline { width: auto; margin-left: 1.5em; From 8d48779b5ce20c01663b116afdfb70787a2313a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Thu, 20 Oct 2016 12:34:42 +0200 Subject: [PATCH 0634/1447] FIX: don't :boom: with an invalid URI --- app/models/upload.rb | 5 ++--- spec/models/upload_spec.rb | 4 ++++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/models/upload.rb b/app/models/upload.rb index 80e30c80cb..cf95ec5aa2 100644 --- a/app/models/upload.rb +++ b/app/models/upload.rb @@ -232,9 +232,8 @@ class Upload < ActiveRecord::Base url = url.sub(SiteSetting.s3_cdn_url, Discourse.store.absolute_base_url) if SiteSetting.s3_cdn_url.present? # always try to get the path - if (uri = URI(url)).scheme - url = uri.path - end + uri = URI(url) rescue nil + url = uri.path if uri.try(:scheme) Upload.find_by(url: url) end diff --git a/spec/models/upload_spec.rb b/spec/models/upload_spec.rb index 5dd981e6a0..6412be8942 100644 --- a/spec/models/upload_spec.rb +++ b/spec/models/upload_spec.rb @@ -149,6 +149,10 @@ describe Upload do )).to eq(upload) end + it "doesn't blow up with an invalid URI" do + expect { Upload.get_from_url("http://ip:port/index.html") }.not_to raise_error + end + describe "s3 store" do let(:path) { "/original/3X/1/0/10f73034616a796dfd70177dc54b6def44c4ba6f.png" } let(:url) { "//#{SiteSetting.s3_upload_bucket}.s3.amazonaws.com#{path}" } From 6eccf9da0361a7969088fe81d511986bd43b4602 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Thu, 20 Oct 2016 18:49:09 +0530 Subject: [PATCH 0635/1447] Update Translations --- config/locales/client.ar.yml | 185 +++++---- config/locales/client.bs_BA.yml | 47 ++- config/locales/client.cs.yml | 1 - config/locales/client.da.yml | 5 +- config/locales/client.de.yml | 19 +- config/locales/client.es.yml | 47 ++- config/locales/client.et.yml | 3 - config/locales/client.fa_IR.yml | 1 - config/locales/client.fi.yml | 45 ++- config/locales/client.fr.yml | 59 ++- config/locales/client.gl.yml | 1 - config/locales/client.he.yml | 49 ++- config/locales/client.it.yml | 3 - config/locales/client.ja.yml | 3 - config/locales/client.ko.yml | 6 +- config/locales/client.nb_NO.yml | 1 - config/locales/client.nl.yml | 3 - config/locales/client.pl_PL.yml | 3 - config/locales/client.pt.yml | 391 ++++++++++++------- config/locales/client.pt_BR.yml | 3 - config/locales/client.ro.yml | 49 ++- config/locales/client.ru.yml | 1 - config/locales/client.sk.yml | 3 - config/locales/client.sq.yml | 5 +- config/locales/client.sv.yml | 3 - config/locales/client.tr_TR.yml | 184 +++++---- config/locales/client.vi.yml | 1 - config/locales/client.zh_CN.yml | 3 - config/locales/client.zh_TW.yml | 1 - config/locales/server.bs_BA.yml | 29 ++ config/locales/server.de.yml | 33 +- config/locales/server.es.yml | 29 -- config/locales/server.fi.yml | 34 +- config/locales/server.fr.yml | 32 +- config/locales/server.he.yml | 34 +- config/locales/server.ja.yml | 29 -- config/locales/server.ro.yml | 34 +- config/locales/server.sq.yml | 90 +++-- config/locales/server.sv.yml | 29 -- config/locales/server.tr_TR.yml | 239 ++++++------ config/locales/server.zh_CN.yml | 29 -- plugins/poll/config/locales/client.bs_BA.yml | 26 ++ plugins/poll/config/locales/client.pt.yml | 9 + plugins/poll/config/locales/server.bs_BA.yml | 24 ++ public/500.bs_BA.html | 2 +- 45 files changed, 1013 insertions(+), 814 deletions(-) diff --git a/config/locales/client.ar.yml b/config/locales/client.ar.yml index 9e141ff9f2..3d22546502 100644 --- a/config/locales/client.ar.yml +++ b/config/locales/client.ar.yml @@ -726,17 +726,17 @@ ar: first_time: "أول إعجاب بالمشاركة" never: "أبدا" email_previous_replies: - title: "تضمين مشاركات سابقة في أسفل البريد المرسل" - unless_emailed: "الا اذا تم ارساله موخراً" - always: "دائماً" - never: "ابداً" + title: "ضمّن الردود السابقة أسفل البُرد الإلكترونية" + unless_emailed: "في حال لم تُرسل" + always: "دائما" + never: "أبدا" email_digests: - title: "إرسال رسالة إلكترونية تحتوي على جديد الموقع عندما لا أزور الموقع" - every_30_minutes: "بعد 30 دقيقه" - every_hour: "كل ساعه " - daily: "يومي" + title: "إن لم أزر الموقع، أرسل إلي بريدا إلكترونيا يلخص المواضيع والردود الشعبية" + every_30_minutes: "كل 30 دقيقة" + every_hour: "كل ساعة" + daily: "يوميا" every_three_days: "كل ثلاثة أيام" - weekly: "اسبوعي" + weekly: "أسبوعيا" every_two_weeks: "كل أسبوعين" include_tl0_in_digests: "ارفق المشاركات للاعضاء الجدد في ملخص المراسلات" email_in_reply_to: "ارفق مقتبسات الرد على المنشور في رسائل البريد" @@ -1022,7 +1022,7 @@ ar: post_missing: "لا يمكن للمشاركة أن تكون خالية" post_length: "التعليق يجب أن يكون أكثر {{min}} حرف" try_like: 'هل جربت زر ؟' - category_missing: "يجب عليك اختيارتصنيف" + category_missing: "عليك اختيار فئة" save_edit: "حفظ التحرير" reply_original: "التعليق على الموضوع الاصلي" reply_here: "الرد هنا" @@ -1161,7 +1161,6 @@ ar: title: "ابحث في المواضيع أو المشاركات أو المستخدمين أو الفئات" no_results: "لا نتائج." no_more_results: "لا نتائج أخرى." - search_help: بحث عن المساعدة searching: "يبحث..." post_format: "#{{post_number}} بواسطة {{username}}" context: @@ -1266,7 +1265,7 @@ ar: title: "فشل تحميل الموضوع" description: "آسفون، تعذر علينا تحميل هذا الموضوع، قد يرجع ذلك إلى مشكلة بالاتصال. من فضلك حاول مجددا. أخبرنا بالمشكلة إن استمر حدوثها." not_found: - title: "لم يتم العثور على الموضوع" + title: "لم يوجد الموضوع" description: "آسفون، لم نجد هذا الموضوع. ربما أزاله أحد المشرفين؟" total_unread_posts: zero: "لا مشاركات غير مقروءة في هذا الموضوع" @@ -1296,18 +1295,18 @@ ar: few: "هناك {{count}} إعجابات في هذا الموضوع" many: "هناك {{count}} إعجابا في هذا الموضوع" other: "هناك {{count}} إعجاب في هذا الموضوع" - back_to_list: "العودة لقائمة المواضيع" + back_to_list: "عُد إلى قائمة المواضيع" options: "خيارات الموضوع" - show_links: "إظهار الروابط في هذا الموضوع" - toggle_information: "إظهار/إخفاء تفاصيل الموضوع" + show_links: "أظهر الوصلات في الموضوع" + toggle_information: "أظهر/أخف تفاصيل الموضوع" read_more_in_category: "أتريد قراءة المزيد؟ تصفح المواضيع الأخرى في {{catLink}} أو {{latestLink}}." read_more: "أتريد قراءة المزيد؟ {{catLink}} أو {{latestLink}}." read_more_MF: "{UNREAD, plural, zero {} one {تبقى {BOTH, select, true {موضوع واحد غير مقروء و} false {موضوع واحد غير مقروء} other {}}} two {تبقى {BOTH, select, true {موضوعان غير مقروءان و} false {موضوعان غير مقروءان} other {}}} few {تبقت {BOTH, select, true {# مواضيع غير مقروءة و} false {# مواضيع غير مقروءة} other {}}} many {تبقى {BOTH, select, true {# موضوعا غير مقروء و} false {# موضوعا غير مقروء} other {}}} other {تبقى {BOTH, select, true {# موضوع غير مقروء و} false {# موضوع غير مقروء} other {}}}}{NEW, plural, zero {} one {{UNREAD, plural, zero {تبقى } one {} two {} few {} many {} other {}}موضوع واحد جديد} two {{UNREAD, plural, zero {تبقى } one {} two {} few {} many {} other {}}موضوعان جديدان} few {{UNREAD, plural, zero {تبقت } one {} two {} few {} many {} other {}}# مواضيع جديدة} many {{UNREAD, plural, zero {تبقى } one {} two {} few {} many {} other {}}# موضوعا جديدا} other {{UNREAD, plural, zero {تبقى } one {} two {} few {} many {} other {}}# موضوع جديد}}، أو {CATEGORY, select, true {تصفّح المواضيع الأخرى في {catLink}} false {{latestLink}} other {}}" browse_all_categories: تصفّح كل الفئات view_latest_topics: اعرض أحدث المواضيع suggest_create_topic: لمَ لا تكتب موضوعًا؟ - jump_reply_up: الذهاب إلى أول رد - jump_reply_down: الذهاب إلى آخر رد + jump_reply_up: انتقل إلى أول رد + jump_reply_down: انتقل إلى آخر رد deleted: "الموضوع محذوف" auto_close_notice: "سيُغلق الموضوع آليا %{timeLeft}." auto_close_notice_based_on_last_post: "سيُغلق الموضوع بعد %{duration} من آخر رد." @@ -1409,7 +1408,7 @@ ar: success_message: 'تم الإبلاغ عن الموضوع' feature_topic: title: "ترشيح هذا الموضوع" - pin: "جعل هذا الموضوع يظهر في أعلى فئة {{categoryLink}} حتى " + pin: "اجعل هذا الموضوع يظهر أعلى فئة {{categoryLink}} حتى" confirm_pin: "لديك مسبقاً {{count}} مواضيع معلقة. قد تكون كثرة المواضيع المعلقة عبئاً على لمستخدمين الجدد والزوار. هل أنت متأكد أنك تريد تعليق موضوع آخر في هذه الفئة؟" unpin: "أزل هذا الموضوع من أعلى فئة \"{{categoryLink}}\"." unpin_until: "أزل هذا الموضوع من أعلى فئة \"{{categoryLink}}\" أو انتظر حتى %{until}." @@ -1617,7 +1616,7 @@ ar: via_auto_generated_email: "هذه المشاركة وصلت عبر بريد الكتروني منشىء تلقائياً" whisper: "هذه المشاركة همسة خاصة للمشرفين" wiki: - about: "هذه المشاركة تعتبر ويكي." + about: "هذه مشاركة ويكي" archetypes: save: 'حفظ الخيارات' few_likes_left: "نشكرك على مشاركة حبّك! تبقّت لديك بضعة إعجابات لليوم فقط." @@ -1644,8 +1643,8 @@ ar: yes_value: "نعم، احذف الردود أيضا" no_value: "لا، المشاركة فحسب" admin: "عمليات المدير" - wiki: "تحويلها إلى ويكي" - unwiki: "إيقاف وضعية الويكي" + wiki: "اجعلها ويكي" + unwiki: "أزلها من الويكي" convert_to_moderator: "إضافة لون للموظف" revert_to_regular: "حذف اللون الوظيفي" rebake: "إعادة بناء HTML" @@ -1960,7 +1959,7 @@ ar: bookmarked: help: "قمت بتفضيل هذا الموضوع" locked: - help: "هذا الموضوع مغلق, لن يتم قبول اي رد " + help: "هذا الموضوع مغلق ولم يعد يستقبل ردودا" archived: help: "هذا الموضوع مؤرشف، لذا فهو مجمّد ولا يمكن تعديله" locked_and_archived: @@ -2126,8 +2125,6 @@ ar: readonly: "مشاهدة" lightbox: download: "تحميل" - search_help: - title: 'مساعدة البحث' keyboard_shortcuts_help: title: 'اختصارات لوحة المفاتيح' jump_to: @@ -2216,25 +2213,25 @@ ar:

tagging: all_tags: "كل الوسوم" - selector_all_tags: "كل العلامات الوصفية" + selector_all_tags: "كل الوسوم" selector_no_tags: "لا وسوم" - changed: "العلامات الوصفية تم تغييرها:" + changed: "الوسوم المعدلة:" tags: "الوسوم" - choose_for_topic: "اختر علامات وصفية جديدة لهذه الموضوع" - delete_tag: "حذف العلامة الوصفية" + choose_for_topic: "اختر (إن أردت) وسوما لهذا الموضوع" + delete_tag: "احذف الوسم" delete_confirm: "أمتأكد من حذف هذا الوسم؟" - rename_tag: "اعادة تسمية العلامة الوصفية" - rename_instructions: "اختر اسم جديد للعلامة الوصفية:" + rename_tag: "أعد تسمية الوسم" + rename_instructions: "اختر اسما جديدا للوسم:" sort_by: "افرز ب‍:" sort_by_count: "العدد" sort_by_name: "الاسم" - manage_groups: "تنظيم مجموعات العلامة الوصفية" - manage_groups_description: "حدد المجموعات لتنظيم العلامات الوصفية" + manage_groups: "أدر مجموعات الوسوم" + manage_groups_description: "اصنع مجموعات لتنظيم الوسوم" filters: - without_category: "%{filter} %{category} مواضيع" - with_category: "%{filter} %{category} مواضيع في" - untagged_without_category: "مواضيع غير موسومة %{filter} " - untagged_with_category: "%{filter} مواضيع بدون بطاقة فى %{category}" + without_category: "مواضيع %{tag} %{filter}" + with_category: "مواضيع %{tag} %{filter} في %{category}" + untagged_without_category: "مواضيع %{filter} غير الموسومة" + untagged_with_category: "مواضيع %{filter} غير الموسومة في %{category}" notifications: watching: title: "مُراقب" @@ -2263,7 +2260,7 @@ ar: new_name: "مجموعة وسوم جديدة" save: "حفظ" delete: "حذف" - confirm_delete: "أمتأكد من حذف هذا الوسم؟" + confirm_delete: "أمتأكد من حذف مجموعة الوسوم هذه؟" topics: none: unread: "ليست هناك مواضيع غير مقروءة." @@ -2289,8 +2286,8 @@ ar: custom_message: "اجعل دعوتك اكثر خصوصية بكتابة" custom_message_link: "رسالة مخصصة" custom_message_placeholder: "ادخل رسالتك المخصصة" - custom_message_template_forum: "اهلا, يمكنك المشاركة في هذا المنتدى!" - custom_message_template_topic: "اهلا, اظن انك ستستمتع يهذا الموضوع!" + custom_message_template_forum: "مرحبا. عليك الانضمام إلى هذا المنتدى!" + custom_message_template_topic: "مرحبا. أظن أن هذا الموضوع سيسعدك!" admin_js: type_to_filter: "اكتب للتّرشيح..." admin: @@ -2306,7 +2303,7 @@ ar: please_upgrade: "من فضلك رقّ البرمجية!" no_check_performed: "لم يتم التحقق من التحديثات. اضمن أن sidekiq يعمل." stale_data: "لم يتم التحقق من التحديثات مؤخراً. اضمن أن sidekiq يعمل." - version_check_pending: "يبدو أنك رُقيت مؤخرا. رائع!" + version_check_pending: "يبدو أنك رقّيت الموقع مؤخرا. مذهل!" installed_version: "المثبتة" latest_version: "الأخيرة" problems_found: "يوجد بعض المشاكل عند تثبيت Discourse :" @@ -2527,10 +2524,10 @@ ar: backup: label: "أجرِ نسخ احتياطي" title: "أنشئ نسخة احتياطية" - confirm: "هل تريد انشاء نسخة احتياطية جديدة ؟" + confirm: "أتريد إجراء نسخة احتياطية جديدة؟" without_uploads: "نعم (لا تضمن الملفات)" download: - label: "تحميل" + label: "نزّل" title: "نزل النسخة الاحتياطية" destroy: title: "أزل النسخة الاحتياطية" @@ -2597,65 +2594,65 @@ ar: revert: "اعاده التغيرات " revert_confirm: "هل انت متاكد من انك تريد اعاده التغيرات؟ " colors: - title: "اللون" - long_title: "نمط الألوان" - new_name: "نمط ألوان جديد" + title: "الألوان" + long_title: "مخططات الألوان" + new_name: "مخطط ألوان جديد" copy_name_prefix: "نسخة من" - delete_confirm: "حذف جميع الالوان؟" + delete_confirm: "أأحذف مخطط الألوان هذا؟" undo: "تراجع" undo_title: "التراجع عن تغيير اللن الى اللون السابق" revert: "تراجع" revert_title: "اعادة ضبط اللون الى اللون الافتراضي للموقع" primary: - name: 'اساسي' + name: 'الأساسي' secondary: - name: 'ثانوي' - description: 'اللون الاساسي للخلفية, والنص للايقونة' + name: 'الثانوي' + description: 'لون الخلفية الأساسي، ولون نصوص بعض الأزرار.' tertiary: - name: 'ثلاثي' - description: 'الروابط، الأزرار، الإشعارات و أشياء أخرى.' + name: 'الثلاثي' + description: 'الوصلات، وبعض الأزرار، والإشعارات ولون الإبراز.' quaternary: - name: "رباعي" - description: "الروابط" + name: "الرباعي" + description: "وصلات التنقل." header_background: - name: "خلفية رأس الصفحة" - description: "لون الخلفية لرأس الصفحة الخاصة بالموقع" + name: "خلفية الترويسة" + description: "لون خلفية ترويسة الموقع." header_primary: name: "رأس الصفحة الأساسي" - description: "لون و أيقونات رأس الصفحة الخاصة بالموقع." + description: "النص والأيقونات في ترويسة الموقع." highlight: - name: 'تحديد' - description: 'لون خلفية النصوص و العناصر المحددة في جسم الصفحة مثل المشاركات و المواضيع.' + name: 'الإبراز' + description: 'لون خلفية العناصر المُبرزة في الصفحة، كالمشاركات والمواضيع.' danger: - name: 'خطر' - description: 'لون بعض الأوامر مثل حذف المشاركات و المواضيع' + name: 'الخطر' + description: 'لون إبراز إجراءات حذف المشاركات والمواضيع (مثلا).' success: - name: 'نجاح' + name: 'النجاح' description: 'يستخدم لإظهار نجاح عملية ما.' love: name: 'إعجاب' description: "لون زر الإعجاب." email: - title: "رسائل البريد الالكتروني" - settings: "اعدادات" - templates: "نماذج" + title: "البُرد الإلكترونية" + settings: "إعدادات" + templates: "القوالب" preview_digest: "ملخص المعاينة." - sending_test: "إرسال بريد إلكتروني للتجربة..." + sending_test: "يرسل بريدا إلكترونيا اختباريا..." error: "خطأ - %{server_error}" test_error: "حدث خطأ أثناء إرسال رسالة تجريبية. الرجاء فحص إعدادات البريد الإلكتروني و التأكد من أن الاستضافة لا تمنع مرور البريد الإلكتروني والمحاولة مرة أخرى." - sent: "تم الإرسال" - skipped: "تم التجاوز" + sent: "المُرسلة" + skipped: "المتخطّاة" bounced: "مروج" - received: "وارد" + received: "المُستلمة" rejected: "مرفوض" - sent_at: "أرسلت في" + sent_at: "أُرسلت في" time: "الوقت" user: "المستخدم" email_type: "نوع البريد الكتروني" - to_address: "الى العناوين" - test_email_address: "عنوان البريد الكتروني للتجربة" - send_test: "ارسل رسالة تجربة" - sent_test: "اٌرسلت!" + to_address: "إلى العنوان" + test_email_address: "عنوان البريد الإلكتروني للاختبار" + send_test: "أرسل رسالة اختبار" + sent_test: "أُرسلت!" delivery_method: "طريقة التسليم" preview_digest_desc: "معاينة محتوى رسائل البريد الإلكتروني الملخص المرسلة للأعضاء الغير متاحين." refresh: "تحديث" @@ -2686,24 +2683,24 @@ ar: subject_placeholder: "موضوع..." error_placeholder: "خطأ" logs: - none: "لا يوجد سجلات." + none: "لا سجلات." filters: - title: "المنقي" + title: "رشّح" user_placeholder: "اسم المستخدم" address_placeholder: "name@example.com" type_placeholder: "الخلاصة، إنشاء حساب..." reply_key_placeholder: "مفتاح الرد" skipped_reason_placeholder: "السبب" logs: - title: "سجلات" - action: "عملية" + title: "السجلات" + action: "الإجراء" created_at: "مكتوبة" last_match_at: "اخر تطابق" match_count: "تطابقات" ip_address: "IP" - topic_id: "رقم معرّف الموضوع" - post_id: "رقم المشاركة" - category_id: "معرف الفئة" + topic_id: "معرّف الموضوع" + post_id: "معرّف المشاركة" + category_id: "معرّف الفئة" delete: 'حذف' edit: 'تعديل' save: 'حفظ' @@ -2795,7 +2792,7 @@ ar: not_found: "تعذر إيجاد المستخدم." invalid: "عذراً , لايمكنك تمثل شخصية ذلك العضو." users: - title: 'مستخدمين' + title: 'المستخدمون' create: 'اضافة مدير' last_emailed: "آخر بريد الكتروني" not_found: "آسفون، اسم هذا المستخدم غير موجود في النظام." @@ -2803,13 +2800,13 @@ ar: active: "نشط" show_emails: "عرض الرسائل" nav: - new: "جديد" - active: "نشط" + new: "الجدد" + active: "النشطون" pending: "قيد الانتظار" - staff: 'الإدارة' + staff: 'الطاقم' suspended: 'موقوف' blocked: 'محظور' - suspect: 'مريب' + suspect: 'المريبون' approved: "موافقة؟" approved_selected: zero: "وافق المستخدم" @@ -2826,20 +2823,20 @@ ar: many: "رفض المستخدمين ({{count}})" other: "رفض المستخدمين ({{count}})" titles: - active: 'مستخدمين نشطين' - new: 'مستخدمين جدد ' + active: 'المستخدمون النشطون' + new: 'المستخدمون الجدد' pending: 'أعضاء بانتظار المراجعة' newuser: 'أعضاء في مستوى الثقة 0 (عضو جديد)' basic: 'أعضاء في مستوى الثقة 1 (عضو أساسي)' member: 'الاعضاء في مستوى الثقة رقم 2 (أعضاء)' regular: 'الاعضاء في مستوى الثقة رقم 3 (عاديين)' leader: 'الاعضاء في مستوى الثقة رقم 4 (قادة)' - staff: "طاقم" - admins: 'مستخدمين مدراء' + staff: "الطاقم" + admins: 'المستخدمون المدراء' moderators: 'المشرفون' blocked: 'مستخدمين محظورين:' suspended: 'أعضاء موقوفين' - suspect: 'أعضاء مريبين' + suspect: 'المستخدمون المريبون' reject_successful: zero: "رفض بنجاح 1 مستخدم" one: "رفض بنجاح 1 مستخدم" @@ -2856,7 +2853,7 @@ ar: other: "فشل لرفض %{count} مستخدمين." not_verified: "لم يتم التحقق" check_email: - title: "اظهار عوان البريد الالكتروني لهذا العضو." + title: "اكشف عنوان البريد الإلكتروني لهذا العضو" text: "إظهار" user: suspend_failed: "حدث خطأ ما أوقف هذا المستخدم {{error}}." @@ -2866,7 +2863,7 @@ ar: suspend_reason_label: "لماذا هل أنت عالق؟ هذا النص سيكون ظاهراً للكل على صفحة تعريف هذا العضو, وسيكون ظاهراً للعضو عندما يحاول تسجل الدخول. احفظها قصيرة." suspend_reason: "سبب" suspended_by: "محظور من قبل" - delete_all_posts: "حذف جميع المشاركات" + delete_all_posts: "احذف كل مشاركاته" delete_all_posts_confirm_MF: "أنت على وشك {POSTS, plural, zero {عدم حذف شيء} one {حذف مشاركة واحدة} two {حذف مشاركتين} few {حذف # مشاركات} many {حذف # مشاركة} other {حذف # مشاركة}}{TOPICS, plural, zero {} one { وموضوع واحد} two { وموضوعين} few { و# مواضيع} many {و# موضوعا} other {و# موضوع}}. أمتأكد؟" suspend: "علّق" unsuspend: "إلقاء التعليق" @@ -3052,7 +3049,7 @@ ar: title: 'إعدادات' reset: 'إعادة تعيين' none: 'لا شيء' - no_results: "لا توجد نتائج." + no_results: "لا نتائج." clear_filter: "مسح" add_url: "أضافة رابط" add_host: "أضافة نطاق" @@ -3081,7 +3078,7 @@ ar: tags: "الوسوم" search: "البحث" badges: - title: 'شعارات ' + title: الشارات new_badge: شعار جديد new: 'جديد ' name: 'إسم ' diff --git a/config/locales/client.bs_BA.yml b/config/locales/client.bs_BA.yml index ad29dabdb5..946863582f 100644 --- a/config/locales/client.bs_BA.yml +++ b/config/locales/client.bs_BA.yml @@ -28,6 +28,7 @@ bs_BA: millions: "{{number}} miliona" dates: time: "h:mm a" + timeline_date: "MMM YYYY" long_no_year: "MMM D h:mm a" long_no_year_no_time: "MMM D" full_no_year_no_time: "MMMM Do" @@ -862,7 +863,6 @@ bs_BA: title: "traži teme, postove, članove ili kategorije" no_results: "Nema rezultata." no_more_results: "Nema rezultata pretrage." - search_help: Pomoć pri pretrazi searching: "Potražujem..." post_format: "#{{post_number}} od {{username}}" context: @@ -1523,12 +1523,18 @@ bs_BA: name: 'love' description: "The like button's color." email: + title: "Emailovi" settings: "Settings" + templates: "Predlošci" preview_digest: "Pregled Sajta" sending_test: "Sending test Email..." + error: "Greška - %{server_error}" test_error: "There was a problem sending the test email. Please double-check your mail settings, verify that your host is not blocking mail connections, and try again." sent: "Sent" skipped: "Skipped" + bounced: "Vraćeni" + received: "Primljeno" + rejected: "Odbijeni" sent_at: "Sent At" time: "Time" user: "User" @@ -1538,6 +1544,7 @@ bs_BA: send_test: "Send Test Email" sent_test: "sent!" delivery_method: "Delivery Method" + preview_digest_desc: "Prikaži sadržaj sažetih poruka pošte poslanih neaktivnim korisnicima." refresh: "Refresh" format: "Format" html: "html" @@ -1545,6 +1552,26 @@ bs_BA: last_seen_user: "Last Seen User:" reply_key: "Reply Key" skipped_reason: "Skip Reason" + incoming_emails: + from_address: "Od" + to_addresses: "Za" + cc_addresses: "Cc" + subject: "Naslov" + error: "Greška" + none: "Nema dolaznih poruka pošte." + modal: + title: "Detalji dolaznih poruka pošte" + error: "Greška" + headers: "Zaglavlja" + subject: "Naslov" + body: "Tijelo" + rejection_message: "Poruka odbijenica" + filters: + from_placeholder: "from@example.com" + to_placeholder: "to@example.com" + cc_placeholder: "cc@example.com" + subject_placeholder: "Naslov..." + error_placeholder: "Greška" logs: none: "No logs found." filters: @@ -1872,3 +1899,21 @@ bs_BA: with_post: %{username} for post in %{link} with_post_time: %{username} for post in %{link} at %{time} with_time: %{username} at %{time} + wizard_js: + wizard: + back: "Prethodno" + next: "Iduće" + step: "%{current} od %{total}" + upload: "Učitaj" + uploading: "Učitavanje..." + quit: "Možda kasnije" + staff_count: + one: "Vaša zajednica ima 1 člana osoblja." + few: "Vaša zajednica ima 2 člana osoblja." + other: "Vaša zajednica ima %{count} članova osoblja." + invites: + add_user: "Dodaj" + roles: + admin: "Admin" + moderator: "Moderator" + regular: "Regularan korisnik" diff --git a/config/locales/client.cs.yml b/config/locales/client.cs.yml index 67ae08d3e5..a9620f8414 100644 --- a/config/locales/client.cs.yml +++ b/config/locales/client.cs.yml @@ -1059,7 +1059,6 @@ cs: title: "vyhledávat témata, příspěvky, uživatele nebo kategorie" no_results: "Nenalezeny žádné výsledky." no_more_results: "Nenalezeny žádné další výsledky." - search_help: Pomoc s hledáním searching: "Hledám ..." post_format: "#{{post_number}} od {{username}}" context: diff --git a/config/locales/client.da.yml b/config/locales/client.da.yml index 6cc1a555ff..4450858a4a 100644 --- a/config/locales/client.da.yml +++ b/config/locales/client.da.yml @@ -1071,7 +1071,6 @@ da: title: "søg efter emner, indlæg, brugere eller kategorier" no_results: "Ingen resultater fundet." no_more_results: "Ikke flere resultater." - search_help: Hjælp til søgning searching: "Søger…" post_format: "#{{post_number}} af {{username}}" context: @@ -1184,7 +1183,7 @@ da: toggle_information: "vis detaljer om emnet" read_more_in_category: "Mere læsestof? Se andre emner i {{catLink}} eller {{latestLink}}." read_more: "Mere læsestof? {{catLink}} eller {{latestLink}}." - read_more_MF: "There { UNREAD, plural, =0 {} one { is 1 unread } other { are # unread } } { NEW, plural, =0 {} one { {BOTH, select, true{and } false {is } other{}} 1 new topic} other { {BOTH, select, true{and } false {are } other{}} # new topics} } remaining, or {CATEGORY, select, true {browse other topics in {catLink}} false {{latestLink}} other {}}" + read_more_MF: "Der { UNREAD, plural, =0 {} one { er 1 ulæst } other { er # ulæste } } { NEW, plural, =0 {} one { {BOTH, select, true{and } false {is } other{}} 1 new topic} other { {BOTH, select, true{and } false {are } other{}} # new topics} } tilbage, eller {CATEGORY, select, true {kig på andre emner i {catLink}} false {{latestLink}} other {}}" browse_all_categories: Vis alle kategorier view_latest_topics: vis seneste emner suggest_create_topic: Hvorfor ikke oprette et emne? @@ -1834,8 +1833,6 @@ da: readonly: "Se" lightbox: download: "download" - search_help: - title: 'Søg i hjælp' keyboard_shortcuts_help: title: 'Tastaturgenveje' jump_to: diff --git a/config/locales/client.de.yml b/config/locales/client.de.yml index 605509d13d..14eda7803a 100644 --- a/config/locales/client.de.yml +++ b/config/locales/client.de.yml @@ -657,6 +657,7 @@ de: after_4_minutes: "nach 4 Minuten" after_5_minutes: "nach 5 Minuten" after_10_minutes: "nach 10 Minuten" + notification_level_when_replying: "Wenn ich in einem Thema antworte, setze das Thema auf" invited: search: "zum Suchen nach Einladungen hier eingeben…" title: "Einladungen" @@ -1088,7 +1089,6 @@ de: title: "suche nach Themen, Beiträgen, Benutzern oder Kategorien" no_results: "Keine Ergebnisse gefunden." no_more_results: "Es wurde keine weiteren Ergebnisse gefunden." - search_help: Hilfe zur Suche searching: "Suche …" post_format: "#{{post_number}} von {{username}}" context: @@ -1096,6 +1096,21 @@ de: category: "Kategorie #{{category}} durchsuchen" topic: "Dieses Thema durchsuchen" private_messages: "Nachrichten durchsuchen" + advanced: + title: Erweiterte Suche + posted_by: + label: Verfasst von + in_category: + label: In der Kategorie + in_group: + label: In der Gruppe + with_badge: + label: Mit dem Abzeichen + with_tags: + label: Mit den Schlagwörtern + filters: + label: Zeige nur Beiträge an, die... + likes: Mir gefallen hamburger_menu: "zu einer anderen Themenliste oder Kategorie wechseln" new_item: "neu" go_back: 'zurückgehen' @@ -1863,8 +1878,6 @@ de: readonly: "Ansehen" lightbox: download: "herunterladen" - search_help: - title: 'Suche' keyboard_shortcuts_help: title: 'Tastenkombinationen' jump_to: diff --git a/config/locales/client.es.yml b/config/locales/client.es.yml index 5b13f4f886..ccafd91206 100644 --- a/config/locales/client.es.yml +++ b/config/locales/client.es.yml @@ -600,6 +600,7 @@ es: title: "Idioma de la interfaz" instructions: "El idioma de la interfaz. Cambiará cuando recargues la página." default: "(por defecto)" + any: "cualquiera" password_confirmation: title: "Introduce de nuevo la contraseña" last_posted: "Último post" @@ -657,6 +658,7 @@ es: after_4_minutes: "después de 4 minutos" after_5_minutes: "después de 5 minutos" after_10_minutes: "después de 10 minutos" + notification_level_when_replying: "Cuando publique en un tema, cambia el nivel de seguimiento a" invited: search: "escribe para buscar invitaciones..." title: "Invitaciones" @@ -1088,7 +1090,6 @@ es: title: "buscar temas, posts, usuarios o categorías" no_results: "No se ha encontrado ningún resultado." no_more_results: "No se encontraron más resultados." - search_help: Ayuda para buscar searching: "Buscando ..." post_format: "#{{post_number}} por {{username}}" context: @@ -1096,6 +1097,44 @@ es: category: "Buscar la categoría #{{category}}" topic: "Buscar en este tema" private_messages: "Buscar en mensajes" + advanced: + title: Búsqueda avanzada + posted_by: + label: Publicado por + in_category: + label: En la categoría + in_group: + label: En el Grupo + with_badge: + label: Con el Distintivo + with_tags: + label: Con las Etiquetas + filters: + label: Muéstrame sólo temas/posts que... + likes: Me han gustado + posted: He publicado en ellos + watching: Estoy vigilando + tracking: Estoy siguiendo + private: están en mis mensajes directos + bookmarks: he guardado en marcadores + first: son el primer post del tema + pinned: están destacados con pin + unpinned: no están destacados con pin + wiki: son tipo wiki + statuses: + label: Donde los temas + open: están abiertos + closed: están cerrados + archived: están archivados + noreplies: no tienen respuestas + single_user: contienen un solo usuario + post: + count: + label: Número Mínimo de Posts + time: + label: Publicado + before: antes del + after: después del hamburger_menu: "ir a otra lista de temas o categoría" new_item: "nuevo" go_back: 'volver' @@ -1309,6 +1348,9 @@ es: share: title: 'Compartir' help: 'comparte el enlace a este tema' + print: + title: 'Imprimir' + help: 'Abrir una versión imprimible de este tema' flag_topic: title: 'Reportar' help: 'reportar de forma privada para atención de los moderadores o enviar una notificación privada sobre él' @@ -1868,8 +1910,6 @@ es: readonly: "Ver" lightbox: download: "descargar" - search_help: - title: 'Ayuda para búsquedas' keyboard_shortcuts_help: title: 'Atajos de teclado' jump_to: @@ -1921,6 +1961,7 @@ es: mark_regular: 'm, r Seguimiento normal del tema (por defecto)' mark_tracking: 'm, t Seguir tema' mark_watching: 'm, w Vigilar Tema' + print: 'ctrl+p Imprimir tema' badges: earned_n_times: one: "Ganó este distintivo 1 vez" diff --git a/config/locales/client.et.yml b/config/locales/client.et.yml index e809059cce..7f1f68ba39 100644 --- a/config/locales/client.et.yml +++ b/config/locales/client.et.yml @@ -1087,7 +1087,6 @@ et: title: "otsi teemasid, postitusi, kasutajaid, või foorumeid" no_results: "Ei leidnud midagi." no_more_results: "Rohkem vasteid pole." - search_help: Otsingu spikker searching: "Otsin..." post_format: "postituse nr{{post_number}} tegi {{username}}" context: @@ -1860,8 +1859,6 @@ et: readonly: "Vaata" lightbox: download: "lae alla" - search_help: - title: 'Otsi spikrist' keyboard_shortcuts_help: title: 'Klaviatuuri kiirvalikud' jump_to: diff --git a/config/locales/client.fa_IR.yml b/config/locales/client.fa_IR.yml index f8e3512004..85745dd27d 100644 --- a/config/locales/client.fa_IR.yml +++ b/config/locales/client.fa_IR.yml @@ -864,7 +864,6 @@ fa_IR: title: "جستجوی موضوعات، نوشته ها، کاربران یا دسته‌ بندی ها" no_results: "چیزی یافت نشد." no_more_results: "نتایجی بیشتری یافت نشد." - search_help: راهنمای جستجو searching: "جستجو کردن..." post_format: "#{{post_number}} توسط {{username}}" context: diff --git a/config/locales/client.fi.yml b/config/locales/client.fi.yml index 74492491c4..1bddb0de69 100644 --- a/config/locales/client.fi.yml +++ b/config/locales/client.fi.yml @@ -1080,7 +1080,6 @@ fi: title: "etsi ketjuja, viestejä, käyttäjiä tai alueita" no_results: "Ei tuloksia." no_more_results: "Enempää tuloksia ei löytynyt." - search_help: Haun ohje searching: "Etsitään ..." post_format: "#{{post_number}} käyttäjältä {{username}}" context: @@ -1088,6 +1087,44 @@ fi: category: "Etsi alueelta #{{category}}" topic: "Etsi tästä ketjusta" private_messages: "Etsi viesteistä" + advanced: + title: Tarkennettu haku + posted_by: + label: Kirjoittaja + in_category: + label: Alue + in_group: + label: Kirjoittajan ryhmä + with_badge: + label: Kirjoittajalla ansiomerkki + with_tags: + label: Tunniste + filters: + label: Tuloksiin vain ketjuja/viestejä, ... + likes: joista olen tykännyt + posted: joihin olen kirjoittanut + watching: joita tarkkailen + tracking: joita seuraan + private: jotka ovat yksityisviesteistäni + bookmarks: jotka olen lisännyt kirjanmerkkeihini + first: jotka ovat ketjun avausviestejä + pinned: jotka on kiinnitettyjä + unpinned: jotka eivät ole kiinnitettyjä + wiki: ovat wiki-viestejä + statuses: + label: Ketju/Ketjuun + open: on avoin + closed: on suljettu + archived: on arkistoitu + noreplies: ei ole vastattu + single_user: on kirjoittanut vain yksi käyttäjä + post: + count: + label: Viestejä vähintään + time: + label: Kirjoitettu + before: ennen + after: jälkeen hamburger_menu: "vaihda ketjulistausta tai siirry toiselle alueelle" new_item: "uusi" go_back: 'mene takaisin' @@ -1300,6 +1337,9 @@ fi: share: title: 'Jaa' help: 'jaa linkki tähän ketjuun' + print: + title: 'Tulosta' + help: 'Avaa tulostettava versio tästä ketjusta' flag_topic: title: 'Liputa' help: 'liputa tämä ketju tai lähetä siitä yksityinen ilmoitus valvojalle' @@ -1859,8 +1899,6 @@ fi: readonly: "Nähdä" lightbox: download: "lataa" - search_help: - title: 'Haun ohjeet' keyboard_shortcuts_help: title: 'Näppäinoikotiet' jump_to: @@ -1912,6 +1950,7 @@ fi: mark_regular: 'm, r Tavallinen (oletus) ketju' mark_tracking: 'm, t Seuraa ketjua' mark_watching: 'm, w Tarkkaile ketjua' + print: 'ctrl+p Tulosta ketju' badges: earned_n_times: one: "Ansaitsi tämän ansiomerkin yhden kerran" diff --git a/config/locales/client.fr.yml b/config/locales/client.fr.yml index 5df45ece87..8adee78dc3 100644 --- a/config/locales/client.fr.yml +++ b/config/locales/client.fr.yml @@ -81,14 +81,14 @@ fr: date_year: "D MMM 'YY" medium_with_ago: x_minutes: - one: "Il y a 1 min" - other: "Il y a %{count} mins" + one: "il y a 1 min" + other: "il y a %{count} mins" x_hours: - one: "Il y a 1 heure" - other: "Il y a %{count} heures" + one: "il y a 1 heure" + other: "il y a %{count} heures" x_days: - one: "Il y a 1 jour" - other: "Il y a %{count} jours" + one: "il y a 1 jour" + other: "il y a %{count} jours" later: x_days: one: "1 jour plus tard" @@ -600,6 +600,7 @@ fr: title: "Langue de l'interface" instructions: "Langue de l'interface utilisateur. Le changement sera pris en compte lorsque vous actualiserez la page." default: "(par défaut)" + any: "tous" password_confirmation: title: "Confirmation du mot de passe" last_posted: "Dernier message" @@ -657,6 +658,7 @@ fr: after_4_minutes: "après 4 minutes" after_5_minutes: "après 5 minutes" after_10_minutes: "après 10 minutes" + notification_level_when_replying: "Quand j'ai répondu dans un sujet, le régler sur" invited: search: "commencer à saisir pour rechercher vos invitations…" title: "Invitations" @@ -1088,7 +1090,6 @@ fr: title: "rechercher des sujets, messages, utilisateurs ou catégories" no_results: "Aucun résultat." no_more_results: "Aucun résultat supplémentaire." - search_help: Aide à la recherche searching: "Recherche en cours…" post_format: "#{{post_number}} par {{username}}" context: @@ -1096,6 +1097,44 @@ fr: category: "Rechercher dans la catégorie #{{category}}" topic: "Rechercher dans ce sujet" private_messages: "Rechercher des messages privés" + advanced: + title: Recherche avancée + posted_by: + label: Rédigé par + in_category: + label: Dans la catégorie + in_group: + label: Dans le groupe + with_badge: + label: Avec le badge + with_tags: + label: Avec les tags + filters: + label: Seulement retourner les sujets/messages... + likes: que j'ai aimé + posted: auxquels j'ai participé + watching: que je surveille + tracking: que je suis + private: qui sont dans mes messages privés + bookmarks: auxquels j'ai mis un signet + first: qui sont les premiers messages + pinned: qui sont épinglés + unpinned: qui ne sont pas épinglés + wiki: qui sont des wikis + statuses: + label: Dont les sujets + open: sont ouverts + closed: sont fermés + archived: sont archivés + noreplies: n'ont aucune réponse + single_user: contiennent un unique utilisateur + post: + count: + label: Nombre minimum de messages + time: + label: Quand + before: avant + after: après hamburger_menu: "aller à une autre catégorie ou liste de sujets" new_item: "nouveau" go_back: 'retour' @@ -1309,6 +1348,9 @@ fr: share: title: 'Partager' help: 'partager ce sujet' + print: + title: 'Imprimer' + help: 'Ouvrir une version de ce sujet adaptée à l''impression' flag_topic: title: 'Signaler' help: 'signaler secrètement ce sujet pour attirer l''attention ou envoyer une notification privée à son propos.' @@ -1868,8 +1910,6 @@ fr: readonly: "Voir" lightbox: download: "télécharger" - search_help: - title: 'Aide à la recherche' keyboard_shortcuts_help: title: 'Raccourcis clavier' jump_to: @@ -1921,6 +1961,7 @@ fr: mark_regular: 'm, r Notifications par défaut pour le sujet' mark_tracking: 'm, t Suivre le sujet' mark_watching: 'm, w Surveiller le sujet' + print: 'Ctrl+p Imprimer le sujet' badges: earned_n_times: one: "A reçu ce badge 1 fois" diff --git a/config/locales/client.gl.yml b/config/locales/client.gl.yml index 1d589073f0..e70c20b55c 100644 --- a/config/locales/client.gl.yml +++ b/config/locales/client.gl.yml @@ -959,7 +959,6 @@ gl: title: "buscar temas, publicacións, usuarios ou categorías" no_results: "Non se atoparon resultados." no_more_results: "Non se atoparon máis resultados." - search_help: Buscar axuda searching: "Buscando..." post_format: "#{{post_number}} de {{username}}" context: diff --git a/config/locales/client.he.yml b/config/locales/client.he.yml index 988a5c0cdf..7ff6cd4eb6 100644 --- a/config/locales/client.he.yml +++ b/config/locales/client.he.yml @@ -600,6 +600,7 @@ he: title: "שפת ממשק" instructions: "שפת ממשק המשתמש. היא תתחלף כשתרעננו את העמוד." default: "(ברירת מחדל)" + any: "כלשהו" password_confirmation: title: "סיסמה שוב" last_posted: "פוסט אחרון" @@ -657,6 +658,7 @@ he: after_4_minutes: "אחרי 4 דקות" after_5_minutes: "אחרי 5 דקות" after_10_minutes: "אחרי 10 דקות" + notification_level_when_replying: "כאשר אני מפרסם נושא, קבע נושא זה ל" invited: search: "הקלידו כדי לחפש הזמנות..." title: "הזמנות" @@ -1088,7 +1090,6 @@ he: title: "חיפוש נושאים, פוסטים, משתמשים או קטגוריות" no_results: "אין תוצאות." no_more_results: "לא נמצאו עוד תוצאות." - search_help: עזרה בחיפוש searching: "מחפש ..." post_format: "#{{post_number}} מאת {{username}}" context: @@ -1096,6 +1097,44 @@ he: category: "חפשו את הקטגוריה #{{category}}" topic: "חפשו בנושא זה" private_messages: "חיפוש הודעות" + advanced: + title: חיפוש מתקדם + posted_by: + label: פורסם על ידי + in_category: + label: בקטגוריה + in_group: + label: בקבוצה + with_badge: + label: עם עיטור + with_tags: + label: עם תגיות + filters: + label: החזירו רק נושאים/פוסטים ש... + likes: אהבתי + posted: פרסמתי בהם + watching: אני צופה בהם + tracking: אני עוקב אחריהם + private: בהודעות שלי + bookmarks: סימנתי עם סימנייה + first: הפוסטים הראשונים + pinned: נעוצים + unpinned: לא נעוצים + wiki: הם ויקי + statuses: + label: כאשר נושאים + open: פתוחים + closed: סגורים + archived: מאורכבים + noreplies: אין להם תגובות + single_user: מכילים משתמש/ת יחידים + post: + count: + label: מספר פוסטים מינימלי + time: + label: פורסמו + before: לפני + after: אחרי hamburger_menu: "עיברו לרשימת נושאים אחרת או קטגוריה" new_item: "חדש" go_back: 'חזור אחורה' @@ -1311,6 +1350,9 @@ he: share: title: 'שיתוף' help: 'שתפו קישור לנושא זה' + print: + title: 'הדפסה' + help: 'פתיחת גרסה ידידותית להדפסה של נושא זה' flag_topic: title: 'דגל' help: 'דגלו נושא זה באופן פרטי לתשומת לב או שלחו התראה פרטית בנוגע אליו' @@ -1689,7 +1731,7 @@ he: flagging: title: 'תודה על עזרתך לשמירה על תרבות הקהילה שלנו!' action: 'דגלו פוסט' - take_action: "בצע פעולה" + take_action: "ניקטו פעולה" notify_action: 'הודעה' official_warning: 'אזהרה רשמית' delete_spammer: "מחק ספאמר" @@ -1870,8 +1912,6 @@ he: readonly: "צפה" lightbox: download: "הורדה" - search_help: - title: 'עזרה בחיפוש' keyboard_shortcuts_help: title: 'קיצורי מקלדת' jump_to: @@ -1923,6 +1963,7 @@ he: mark_regular: 'm, r נושא רגיל' mark_tracking: 'm, t עקבו אחר נושא' mark_watching: 'm, w צפו בנושא' + print: 'ctrl+p הדפסת נושא' badges: earned_n_times: one: "הרוויחו עיטור זה פעם אחת" diff --git a/config/locales/client.it.yml b/config/locales/client.it.yml index 96ade6b290..01f34a4ec3 100644 --- a/config/locales/client.it.yml +++ b/config/locales/client.it.yml @@ -1029,7 +1029,6 @@ it: title: "cerca argomenti, messaggi, utenti o categorie" no_results: "Nessun risultato trovato." no_more_results: "Nessun altro risultato trovato." - search_help: Cerca aiuto searching: "Ricerca in corso..." post_format: "#{{post_number}} da {{username}}" context: @@ -1766,8 +1765,6 @@ it: readonly: "Visualizza" lightbox: download: "scarica" - search_help: - title: 'Aiuto Ricerca' keyboard_shortcuts_help: title: 'Scorciatorie Tastiera' jump_to: diff --git a/config/locales/client.ja.yml b/config/locales/client.ja.yml index 75ffbff850..425b0b7b73 100644 --- a/config/locales/client.ja.yml +++ b/config/locales/client.ja.yml @@ -925,7 +925,6 @@ ja: title: "トピック、投稿、ユーザ、カテゴリを探す" no_results: "何も見つかりませんでした。" no_more_results: "検索結果は以上です。" - search_help: 検索のヘルプ searching: "検索中..." post_format: "#{{post_number}} {{username}}から" context: @@ -1561,8 +1560,6 @@ ja: full: "作成 / 返信 / 閲覧" create_post: "返信 / 閲覧" readonly: "閲覧できる" - search_help: - title: '検索のヘルプ' keyboard_shortcuts_help: title: 'ショートカットキー' jump_to: diff --git a/config/locales/client.ko.yml b/config/locales/client.ko.yml index c9fcfe112c..5af99c7348 100644 --- a/config/locales/client.ko.yml +++ b/config/locales/client.ko.yml @@ -97,6 +97,7 @@ ko: invited_user: "%{who}이(가) %{when}에 초대됨" invited_group: "%{who} 이(가) %{when} 에 초대됨" removed_user: "%{who}이(가) %{when}에 삭제됨" + removed_group: "%{who}이(가) %{when}에 삭제됨" autoclosed: enabled: '%{when}에 닫힘' disabled: '%{when}에 열림' @@ -432,6 +433,8 @@ ko: github_profile: "Github" email_activity_summary: "활동 요약" mailing_list_mode: + label: "메일링 리스트 모드" + enabled: "메일링 리스트 모드 활성화" individual: "모든 새로운 게시글에 대해 메일을 보내주세요." few_per_day: "모든 새로운 게시글에 대해 메일을 보내주세요 (하루에 약 2개)." tag_settings: "태그" @@ -652,8 +655,10 @@ ko: likes_received: other: "받음" top_replies: "인기 댓글" + no_replies: "아직 답글이 없습니다." more_replies: "답글 더 보기" top_topics: "인기 주제" + no_topics: "아직 주제가 없습니다." more_topics: "주제 더 보기" top_badges: "인기 배지" no_badges: "아직 배지가 없습니다." @@ -955,7 +960,6 @@ ko: title: "주제, 글, 사용자, 카테고리 검색" no_results: "검색 결과가 없습니다" no_more_results: "더 이상 결과가 없습니다." - search_help: 검색 도움말 searching: "검색중..." post_format: "#{{post_number}} by {{username}}" context: diff --git a/config/locales/client.nb_NO.yml b/config/locales/client.nb_NO.yml index fd95d1a370..f67fe9ebb8 100644 --- a/config/locales/client.nb_NO.yml +++ b/config/locales/client.nb_NO.yml @@ -861,7 +861,6 @@ nb_NO: title: "søk etter emner, innlegg, brukere eller kategorier" no_results: "Ingen resultater funnet." no_more_results: "Ingen flere resultater funnet." - search_help: Søkehjelp searching: "Søker ..." post_format: "#{{post_number}} av {{username}}" context: diff --git a/config/locales/client.nl.yml b/config/locales/client.nl.yml index 1d9eebe170..2a0773b84a 100644 --- a/config/locales/client.nl.yml +++ b/config/locales/client.nl.yml @@ -1087,7 +1087,6 @@ nl: title: "zoek naar topics, berichten, gebruikers of categorieën" no_results: "Geen resultaten gevonden." no_more_results: "Geen resultaten meer gevonden." - search_help: Zoek in help searching: "Zoeken..." post_format: "#{{post_number}} door {{username}}" context: @@ -1866,8 +1865,6 @@ nl: readonly: "Bekijk" lightbox: download: "download" - search_help: - title: 'Zoek in help' keyboard_shortcuts_help: title: 'Sneltoetsen' jump_to: diff --git a/config/locales/client.pl_PL.yml b/config/locales/client.pl_PL.yml index 9101686c7d..ee9ef25f16 100644 --- a/config/locales/client.pl_PL.yml +++ b/config/locales/client.pl_PL.yml @@ -1085,7 +1085,6 @@ pl_PL: title: "szukaj tematów, wpisów, użytkowników lub kategorii" no_results: "Brak wyników wyszukiwania" no_more_results: "Nie znaleziono więcej wyników." - search_help: Wyszukaj w pomocy searching: "Szukam…" post_format: "#{{post_number}} za {{username}}" context: @@ -1869,8 +1868,6 @@ pl_PL: readonly: "przeglądać" lightbox: download: "pobierz" - search_help: - title: 'Wyszukiwanie pomocy' keyboard_shortcuts_help: title: 'Skróty klawiszowe' jump_to: diff --git a/config/locales/client.pt.yml b/config/locales/client.pt.yml index de3fae1aa1..23fcff8137 100644 --- a/config/locales/client.pt.yml +++ b/config/locales/client.pt.yml @@ -103,7 +103,7 @@ pt: next_month: 'Mês Seguinte' share: topic: 'partilhar uma hiperligação para este tópico' - post: 'Mensagem #%{postNumber}' + post: 'publicação #%{postNumber}' close: 'fechar' twitter: 'partilhar esta hiperligação no Twitter' facebook: 'partilhar esta hiperligação no Facebook' @@ -113,9 +113,9 @@ pt: public_topic: "tornei este tópico publico %{when}" private_topic: "tornei este tópico privado %{when}" split_topic: "dividir este tópico %{when}" - invited_user: "Convidou %{who} %{when}" + invited_user: "convidou %{who} %{when}" invited_group: "convidou %{who} %{when}" - removed_user: "Removeu %{who} %{when}" + removed_user: "removeu %{who} %{when}" removed_group: "removeu %{who} %{when}" autoclosed: enabled: 'fechado %{when}' @@ -136,6 +136,7 @@ pt: enabled: 'listado %{when}' disabled: 'removido da lista %{when}' topic_admin_menu: "Ações administrativas dos Tópicos" + wizard_required: "É altura de configurar o seu fórum! Iniciar o ajudante de configuração!" emails_are_disabled: "Todos os envios de e-mail foram globalmente desativados por um administrador. Nenhum e-mail de notificação será enviado." bootstrap_mode_enabled: "Para facilitar o lançamento do seu novo sítio mais fácil, encontra-se agora em modo de inicialização. Qualquer utilizador novo terá nível de confiança 1 e resumos de email diários ligados. Este modo será automaticamente desligado quando o número total de utilizadores ultrapassar %{min_users}." bootstrap_mode_disabled: "Modo de inicialização será desligado dentro das próximas 24 horas." @@ -212,7 +213,7 @@ pt: last_30_days: "Últimos 30 Dias" like_count: "Gostos" topic_count: "Tópicos" - post_count: "Mensagens" + post_count: "Publicações" user_count: "Novos Utilizadores" active_user_count: "Utilizadores Activos" contact: "Contacte-nos" @@ -221,13 +222,13 @@ pt: title: "Adicionar Marcador" clear_bookmarks: "Remover Marcadores" help: - bookmark: "Clique para adicionar um marcador à primeira mensagem deste tópico" + bookmark: "Clique para adicionar um marcador à primeira publicação neste tópico" unbookmark: "Clique para remover todos os marcadores deste tópico" bookmarks: - not_logged_in: "Pedimos desculpa, é necessário ter sessão iniciada para marcar mensagens" - created: "adicionou esta mensagem aos marcadores" - not_bookmarked: "leu esta mensagem; clique para adicioná-la aos marcadores" - last_read: "esta foi a última mensagem que leu; clique para adicioná-la aos marcadores" + not_logged_in: "Pedimos desculpa, é necessário ter sessão iniciada para marcar publicações." + created: "adicionou esta publicação aos marcadores" + not_bookmarked: "leu esta publicação; clique para adicioná-la aos marcadores" + last_read: "esta foi a última publicação que leu; clique para adicioná-la aos marcadores" remove: "Remover Marcador" confirm_clear: "Tem a certeza que pretende eliminar todos os marcadores deste tópico?" topic_count_latest: @@ -257,7 +258,7 @@ pt: switch_to_anon: "Entrar em modo Anónimo" switch_from_anon: "Sair de modo Anónimo" banner: - close: "Destituir esta faixa." + close: "Marcar esta faixa como vista." edit: "Editar esta faixa >>" choose_topic: none_found: "Nenhum tópico encontrado." @@ -270,27 +271,27 @@ pt: reject: 'Rejeitar' delete_user: 'Eliminar Utilizador' title: "Necessita de Aprovação" - none: "Não há mensagens para rever." + none: "Não há publicações para rever." edit: "Editar" cancel: "Cancelar" - view_pending: "ver mensagens pendentes" + view_pending: "ver publicações pendentes" has_pending_posts: - one: "Este tópico tem 1 mensagem à espera de aprovação" - other: "Este tópico tem {{count}} mensagens à espera de aprovação" + one: "Este tópico tem 1 publicação à espera de aprovação" + other: "Este tópico tem {{count}} publicações à espera de aprovação" confirm: "Guardar Alterações" - delete_prompt: "Tem a certeza que deseja eliminar %{username}? Isto irá remover todas as suas mensagens e bloquear os seus emails e endereços ip." + delete_prompt: "Tem a certeza que deseja eliminar %{username}? Isto irá remover todas as suas publicações e bloquear os seus emails e endereços IP." approval: - title: "A Mensagem Necessita de Aprovação" - description: "Recebemos a sua nova mensagem mas necessita de ser aprovada pelo moderador antes de aparecer. Por favor seja paciente." + title: "A Publicação Necessita de Aprovação" + description: "Recebemos a sua nova publicação mas necessita de ser aprovada pelo moderador antes de aparecer. Por favor seja paciente." pending_posts: - one: "Tem 1 mensagem pendente." - other: "Tem {{count}} mensagens pendentes." + one: "Tem 1 publicação pendente." + other: "Tem {{count}} publicações pendentes." ok: "OK" user_action: user_posted_topic: "{{user}} publicou o tópico" - you_posted_topic: " publicouo tópico" + you_posted_topic: " publicou o tópico" user_replied_to_post: "{{user}} respondeu a {{post_number}}" - you_replied_to_post: " respondeu a {{post_number}}" + you_replied_to_post: "Você respondeu a {{post_number}}" user_replied_to_topic: "{{user}} respondeu ao tópico" you_replied_to_topic: " respondeu ao tópico" user_mentioned_user: "{{user}} mencionou {{another_user}}" @@ -316,7 +317,7 @@ pt: days_visited: "Visitas" days_visited_long: "Dias Visitados" posts_read: "Ler" - posts_read_long: "Mensagens Lidas" + posts_read_long: "Publicações Lidas" total_rows: one: "1 utilizador" other: "%{count} utilizadores" @@ -337,7 +338,7 @@ pt: other: "grupos" members: "Membros" topics: "Tópicos" - posts: "Mensagens" + posts: "Publicações" mentions: "Menções" messages: "Mensagens" alias_levels: @@ -355,8 +356,8 @@ pt: title: "A vigiar" description: "Será notificado de cada nova publicação em todas as mensagens, e uma contagem de novas respostas será exibida." watching_first_post: - title: "A vigiar a primeira entrada" - description: "Será apenas notificado acerca da primeira entrada em cada tópico deste grupo." + title: "A Vigiar a Primeira Publicação" + description: "Será apenas notificado acerca da primeira publicação em cada tópico deste grupo." tracking: title: "A Acompanhar" description: "Será notificado se alguém mencionar o seu @nome ou lhe responder, e uma contagem de novas respostas será exibida." @@ -393,12 +394,15 @@ pt: save: "Guardar Ordem" apply_all: "Aplicar" position: "Posição" - posts: "Mensagens" + posts: "Publicações" topics: "Tópicos" latest: "Recentes" latest_by: "recentes por" toggle_ordering: "alternar o controlo de ordenação" subcategories: "Subcategorias" + topic_sentence: + one: "1 tópico" + other: "%{count} tópicos" topic_stat_sentence: one: "%{count} novo tópico no passado %{unit}." other: "%{count} novos tópicos no passado %{unit}." @@ -415,7 +419,7 @@ pt: trust_level: "TL" read_time: "tempo de leitura" topics_entered: "tópicos inseridos" - post_count: "# mensagens" + post_count: "# publicações" confirm_delete_other_accounts: "Tem a certeza que quer apagar estas contas?" user_fields: none: "(selecione uma opção)" @@ -424,7 +428,7 @@ pt: profile: "Perfil" mute: "Silenciar" edit: "Editar Preferências" - download_archive: "Descarregar As Minhas Mensagens" + download_archive: "Descarregar As Minhas Publicações" new_private_message: "Nova Mensagem" private_message: "Mensagem" private_messages: "Mensagens" @@ -446,9 +450,9 @@ pt: disable: "Desativar Notificações" enable: "Ativar Notificações" each_browser_note: "Nota: Tem que alterar esta configuração em todos os navegadores de internet que utiliza." - dismiss_notifications: "Dispensar tudo" + dismiss_notifications: "Marcar Visto Tudo" dismiss_notifications_tooltip: "Marcar como lidas todas as notificações por ler" - disable_jump_reply: "Não voltar para a minha mensagem após ter respondido" + disable_jump_reply: "Não voltar para a minha publicação após eu ter respondido" dynamic_favicon: "Mostrar contagem de tópicos novos / atualizados no ícone do browser." external_links_in_new_tab: "Abrir todas as hiperligações externas num novo separador" enable_quoting: "Ativar resposta usando citação de texto destacado" @@ -469,14 +473,24 @@ pt: Esta configuração sobrepõe o sumário de actividade.
Tópicos e categorias mudos não são incluídos nestes correios electrónicos. daily: "Enviar actualizações diárias" - individual: "Enviar um correio electrónico por cada nova mensage" + individual: "Enviar um email por cada nova publicação" + many_per_day: "Mandar-me um email por cada nova publicação (cerca de {{dailyEmailEstimate}} por dia)" + few_per_day: "Mandar-me um email por cada nova publicação (cerca de 2 por dia)" tag_settings: "Etiquetas" watched_tags: "Visto" + watched_tags_instructions: "Irá vigiar automaticamente todos os novos tópicos nestas categorias. Será notificado de todas as novas respostas e tópicos, e uma contagem de novas respostas irá aparecer junto ao tópico." tracked_tags: "Vigiado" + tracked_tags_instructions: "Irá acompanhar automaticamente todos os novos tópicos nestas categorias. Uma contagem de novas respostas irá aparecer junto ao tópico." muted_tags: "Silenciado" + muted_tags_instructions: "Não será notificado de nada acerca de novos tópicos nestas categorias, e estes não irão aparecer nos recentes." watched_categories: "Vigiado" + watched_categories_instructions: "Irá vigiar automaticamente todos os novos tópicos nestas categorias. Será notificado de todas as novas respostas e tópicos, e uma contagem de novas respostas irá aparecer junto ao tópico." tracked_categories: "Acompanhado" - watched_first_post_categories: "A ver a primeira mensage" + tracked_categories_instructions: "Irá acompanhar automaticamente todos os novos tópicos nestas categorias. Uma contagem de novas respostas irá aparecer junto ao tópico." + watched_first_post_categories: "A Vigiar a Primeira Resposta" + watched_first_post_categories_instructions: "Será notificado acerca da primeira resposta em cada novo tópico nestas categorias." + watched_first_post_tags: "A Vigiar a Primeira Resposta" + watched_first_post_tags_instructions: "Será notificado acerca da primeira resposta em cada novo tópico nestas categorias." muted_categories: "Silenciado" muted_categories_instructions: "Não será notificado de nada acerca de novos tópicos nestas categorias, e estes não irão aparecer nos recentes." delete_account: "Eliminar A Minha Conta" @@ -489,11 +503,19 @@ pt: muted_users: "Mudo" muted_users_instructions: "Suprimir todas as notificações destes utilizadores." muted_topics_link: "Mostrar tópicos mudos" + watched_topics_link: "Mostrar tópicos vigiados" automatically_unpin_topics: "Desafixar tópicos automaticamente quando eu chegar ao final." + apps: "Aplicações" + revoke_access: "Rescindir Acesso" + undo_revoke_access: "Cancelar Rescissão de Acesso" + api_permissions: "Permissões:" + api_approved: "Aprovado:" + api_read: "ler" + api_read_write: "ler e escrever" staff_counters: flags_given: "sinalizações úteis" - flagged_posts: "mensagens sinalizadas" - deleted_posts: "mensagens eliminadas" + flagged_posts: "publicações denunciadas" + deleted_posts: "publicações eliminadas" suspensions: "suspensões" warnings_received: "avisos" messages: @@ -518,6 +540,7 @@ pt: error: "Ocorreu um erro ao modificar este valor." change_username: title: "Alterar Nome de Utilizador" + confirm: "Se mudar o seu nome de utilizador, todas as citações das suas publicações e menções @nome serão quebradas. Tem a certeza absoluta de que o quer fazer?" taken: "Pedimos desculpa, esse nome de utilizador já está a ser utilizado." error: "Ocorreu um erro ao alterar o seu nome de utilizador." invalid: "Esse nome de utilizador é inválido. Deve conter apenas números e letras." @@ -577,6 +600,7 @@ pt: title: "Idioma da Interface" instructions: "Idioma da interface de utilizador. Será alterado quando atualizar a página." default: "(pré-definido)" + any: "qualquer" password_confirmation: title: "Palavra-passe Novamente" last_posted: "Última Publicação" @@ -592,8 +616,8 @@ pt: like_notification_frequency: title: "Notificar quando alguém gostar" always: "Sempre" - first_time_and_daily: "Na primeira vez que mensagem é gostada e diariamente" - first_time: "A primeira vez que uma mensagem é gostada." + first_time_and_daily: "Na primeira vez que a publicação é gostada e diariamente" + first_time: "A primeira vez que uma publicação é gostada." never: "Nunca" email_previous_replies: title: "Incluir respostas prévias no fundo do email." @@ -601,14 +625,16 @@ pt: always: "sempre" never: "nunca" email_digests: + title: "Quando eu não vier aqui, mandar-me um email de resumo de tópicos e respostas populares." every_30_minutes: "a cada 30 minutos" every_hour: "A cada hora" daily: "diariamente" every_three_days: "a cada três dias" weekly: "semanalmente" every_two_weeks: "a cada duas semanas" - email_in_reply_to: "Incluir um excerto do mensagem respondida nos emails" - email_direct: "Enviar-me um email quando alguém me citar, responder às minhas mensagens, mencionar o meu @nomedeutilizador, ou convidar-me para um tópico" + include_tl0_in_digests: "Incluir conteúdo de novos utilizadores nos emails de resumo" + email_in_reply_to: "Incluir um excerto da publicação respondida nos emails" + email_direct: "Enviar-me um email quando alguém me citar, responder às minhas publicações, mencionar o meu @nome-de-utilizador, ou convidar-me para um tópico" email_private_messages: "Enviar-me um email quando alguém me envia uma mensagem" email_always: "Enviar-me notificações de email mesmo quando estou ativo no sítio" other_settings: "Outros" @@ -632,6 +658,7 @@ pt: after_4_minutes: "após 4 minutos" after_5_minutes: "após 5 minutos" after_10_minutes: "após 10 minutos" + notification_level_when_replying: "Quando eu respondo num tópico, por esse tópico como" invited: search: "digite para procurar convites..." title: "Convites" @@ -649,12 +676,14 @@ pt: pending_tab: "Pendente" pending_tab_with_count: "Pendentes ({{count}})" topics_entered: "Tópicos Visualizados" - posts_read_count: "Mensagens Lidas" + posts_read_count: "Publicações Lidas" expired: "Este convite expirou." rescind: "Remover" rescinded: "Convite Removido" reinvite: "Reenviar convite" + reinvite_all: "Reenviar todos os Convites" reinvited: "Convite reenviado" + reinvited_all: "Todos os Convites reenviados!" time_read: "Tempo de Leitura" days_visited: "Dias Visitados" account_age_days: "Idade da conta, em dias" @@ -683,8 +712,8 @@ pt: one: "Tópico criado" other: "Tópicos criados" post_count: - one: "mensagem criada" - other: "mensagens criadas" + one: "publicação criada" + other: "publicações criadas" likes_given: one: " dado" other: " dados" @@ -695,8 +724,8 @@ pt: one: "dia visitado" other: "dias visitados" posts_read: - one: "mensagem lida" - other: "mensagens lidas" + one: "publicação lida" + other: "publicações lidas" bookmark_count: one: "marcador" other: "marcadores" @@ -712,6 +741,8 @@ pt: top_links: "Melhores hiperligações" no_links: "Não há nenhuma hiperligação ainda." most_liked_by: "Por mais apreciados" + most_liked_users: "Mais Gostados" + most_replied_to_users: "Mais Respondidos" no_likes: "Nenhum gostos ainda." associated_accounts: "Contas associadas" ip_address: @@ -758,14 +789,18 @@ pt: enabled: "Este sítio encontra-se no modo só de leitura. Por favor continue a navegar mas responder, dar gostos e outras acções estão de momento desativadas." login_disabled: "A função de início de sessão está desativada enquanto o sítio se encontrar no modo só de leitura." logout_disabled: "A função de término de sessão está desativada enquanto o sítio se encontrar no modo só de leitura." - too_few_topics_and_posts_notice: "Vamos começar esta discussão! Atualmente existem %{currentTopics} / %{requiredTopics} tópicos e %{currentPosts} / %{requiredPosts} mensagens. Novos visitantes precisam de conversações para ler e responder a." + too_few_topics_and_posts_notice: "Vamos começar esta discussão! Atualmente existem %{currentTopics} / %{requiredTopics} tópicos e %{currentPosts} / %{requiredPosts} respostas. Novos visitantes precisam de conversações para ler e a que responder." too_few_topics_notice: "Vamos começar esta discussão! Atualmente existem %{currentTopics} / %{requiredTopics} tópios. Novos visitantes precisam de algumas conversações para ler e responder a." - too_few_posts_notice: "Vamos começar esta discussão! Atualmente existem %{currentPosts} / %{requiredPosts} mensagens. Novos visitantes precisam de algumas conversações para ler e responder a." + too_few_posts_notice: "Vamos começar esta discussão! Atualmente existem %{currentPosts} / %{requiredPosts} respostas. Novos visitantes precisam de algumas conversações para ler e a que responder." logs_error_rate_notice: + reached: "%{relativeAge}%{rate} atingiu o limite definido nas configurações do site de %{siteSettingRate}." + exceeded: "%{relativeAge}%{rate} excede o limite definido nas configurações do site de %{siteSettingRate}." rate: one: "1 erro/%{duration}" other: "%{count} erros/%{duration}" learn_more: "saber mais..." + all_time: 'total' + all_time_desc: 'total de tópicos criados' year: 'ano' year_desc: 'tópicos criados nos últimos 365 dias' month: 'mês' @@ -773,10 +808,10 @@ pt: week: 'semana' week_desc: 'tópicos criados nos últimos 7 dias' day: 'dia' - first_post: Primeira mensagem + first_post: Primeira publicação mute: Silenciar unmute: Reativar - last_post: Última mensagem + last_post: Última publicação last_reply_lowercase: última resposta replies_lowercase: one: resposta @@ -787,22 +822,23 @@ pt: hide_forever: "não obrigado" hidden_for_session: "OK, Irei perguntar-lhe amanhã. Pode sempre usar 'Iniciar Sessão' para criar uma conta, também." intro: "Olá! :heart_eyes: Parece que está a gostar da discussão, mas não está inscrito para uma conta." - value_prop: "Quando cria uma conta, nós lembramo-nos exatamente do que leu, por isso volta sempre ao sítio onde ficou. Também recebe notificações, aqui ou por email, sempre que novas mensagens são feitas. E pode gostar de mensagens para partilhar o amor. :heartbeat:" + value_prop: "Quando cria uma conta, nós lembramo-nos exatamente do que leu, por isso volta sempre ao sítio onde ficou. Também recebe notificações, aqui ou por email, sempre que novas mensagens são feitas. E pode gostar de publicações para partilhar o amor. :heartbeat:" summary: - enabled_description: "Está a ver um resumo deste tópico: as mensagens mais interessantes são determinados pela comunidade." + enabled_description: "Está a ver um resumo deste tópico: as respostas mais interessantes são determinadas pela comunidade." description: "Existem {{replyCount}} respostas." description_time: "Existem {{replyCount}} respostas com um tempo de leitura estimado de {{readingTime}} minutos." enable: 'Resumir Este Tópico' - disable: 'Mostrar Todas As Mensagens' + disable: 'Mostrar Todas As Respostas' deleted_filter: - enabled_description: "Este tópico contém mensagens eliminadas, as quais foram ocultas." - disabled_description: "Mensagens eliminadas no tópico são exibidas." - enable: "Ocultar mensagens eliminadas" - disable: "Exibir mensagens eliminadas" + enabled_description: "Este tópico contém respostas eliminadas, que foram ocultadas." + disabled_description: "Respostas eliminadas no tópico são exibidas." + enable: "Ocultar Respostas Eliminadas" + disable: "Exibir Respostas Eliminadas" private_message_info: title: "Mensagem" invite: "Convidar Outros..." remove_allowed_user: "Deseja mesmo remover {{name}} desta mensagem?" + remove_allowed_group: "Deseja mesmo remover {{name}} desta mensagem?" email: 'Email' username: 'Nome de utilizador' last_seen: 'Visto' @@ -869,6 +905,16 @@ pt: github: title: "com GitHub" message: "A autenticar com GitHub (certifique-se de que os bloqueadores de popup estão desativados)" + emoji_set: + apple_international: "Apple/International" + google: "Google" + twitter: "Twitter" + emoji_one: "Emoji One" + win10: "Win10" + category_page_style: + categories_only: "Apenas Categorias" + categories_with_featured_topics: "Categorias com Tópicos Destacados" + categories_and_latest_topics: "Categorias e Tópicos Recentes" shortcut_modifier_key: shift: 'Shift' ctrl: 'Ctrl' @@ -878,20 +924,26 @@ pt: more_emoji: "mais..." options: "Opções" whisper: "susurro" + unlist: "não listado" add_warning: "Este é um aviso oficial." toggle_whisper: "Alternar Sussuro" + toggle_unlisted: "Alternar Não Listado" posting_not_on_topic: "A que tópico quer responder?" saving_draft_tip: "a guardar..." saved_draft_tip: "guardado" saved_local_draft_tip: "guardado localmente" similar_topics: "O seu tópico é similar a..." drafts_offline: "rascunhos offline" + group_mentioned: + one: "Ao usar {{group}}, estará a notificar 1 pessoa – tem a certeza?" + other: "Ao usar {{group}}, estará a notificar {{count}} pessoas – tem a certeza?" + duplicate_link: "Parce que a tua ligação a {{domain}} já foi publicada neste tópico por @{{username}} nesta resposta {{ago}} – tens a certeza de que a queres publicar outra vez?" error: title_missing: "O título é obrigatório" title_too_short: "O título tem que ter pelo menos {{min}} caracteres." title_too_long: "O tíítulo não pode conter mais do que {{max}} caracteres." - post_missing: "A mensagem não pode estar vazia" - post_length: "A mensagem tem que ter pelo menos {{min}} caracteres." + post_missing: "A publicação não pode estar vazia" + post_length: "A publicação tem que ter pelo menos {{min}} caracteres" try_like: 'Já tentou o botão ?' category_missing: "Tem que escolher uma categoria" save_edit: "Guardar alterações" @@ -907,14 +959,14 @@ pt: edit_reason_placeholder: "Porque está a editar?" show_edit_reason: "(adicione a razão para a edição)" reply_placeholder: "Digite aqui. Utilize Markdown, BBCode, ou HTML para formatar. Arraste ou cole imagens." - view_new_post: "Ver a sua nova mensagem." + view_new_post: "Ver a sua nova publicação" saving: "A Guardar" saved: "Guardado!" - saved_draft: "Rascunho da mensagem em progresso. Selecione para continuar." + saved_draft: "Rascunho da publicação em progresso. Selecione para continuar." uploading: "A carregar…" show_preview: 'mostrar pré-visualização »' hide_preview: '« esconder pré-visualização' - quote_post_title: "Citar mensagem inteira" + quote_post_title: "Citar publicação inteira" bold_title: "Negrito" bold_text: "texto em negrito" italic_title: "Itálico" @@ -945,7 +997,7 @@ pt: auto_close: label: "Tempo de fecho automático do tópico:" error: "Por favor introduza um valor válido." - based_on_last_post: "Não feche até que a última mensagem do tópico tenha pelo menos este tempo." + based_on_last_post: "Não fechar até que a última resposta no tópico tenha pelo menos esta idade." all: examples: 'Insira o número de horas (24), tempo absoluto (17:30) ou um selo temporal (2013-11-22 14:00).' limited: @@ -955,12 +1007,12 @@ pt: title: "notificações de menções de @nome, respostas às suas publicações e tópicos, mensagens, etc" none: "Impossível de carregar as notificações neste momento." more: "ver notificações antigas" - total_flagged: "total de mensagens sinalizadas" + total_flagged: "total de publicações denunciadas" mentioned: "

{{username}} {{description}}

" group_mentioned: "

{{username}} {{description}}

" quoted: "

{{username}} {{description}}

" replied: "

{{username}} {{description}}

" - posted: "

{{username}} {{description}}

" + posted: "

{{username}} {{description}}

" edited: "

{{username}} {{description}}

" liked: "

{{username}} {{description}}

" liked_2: "

{{username}}, {{username2}} {{description}}

" @@ -971,7 +1023,8 @@ pt: invited_to_private_message: "

{{username}} {{description}}

" invited_to_topic: "

{{username}} {{description}}

" invitee_accepted: "

{{username}} aceitou o seu convite

" - moved_post: "

{{username}} moveu {{description}}

" + moved_post: "

{{username}} moveu {{description}}

" + linked: "

{{username}} {{description}}

" granted_badge: "

Ganhou '{{description}}'

" group_message_summary: one: "

{{count}} mensagem na caixa de entrada do seu grupo {{group_name}}

" @@ -981,14 +1034,14 @@ pt: quoted: "Citado por" replied: "Respondido" posted: "Publicado por" - edited: "Edição da sua mensagem por" - liked: "Gostou da sua mensagem" + edited: "Edição da sua publicação por" + liked: "Gostou da sua publicação" private_message: "Mensagem privada de" invited_to_private_message: "Convidado para uma mensagem privada de" invited_to_topic: "Convidado para um tópico de" invitee_accepted: "Convite aceite por" - moved_post: "A sua mensagem foi movida por" - linked: "Hiperligação para a sua mensagem" + moved_post: "A sua publicação foi movida por" + linked: "Ligação para a sua publicação" granted_badge: "Distintivo concedido" group_message_summary: "Mensagens na caixa de entrada do seu grupo" popup: @@ -998,7 +1051,7 @@ pt: replied: '{{username}} respondeu-lhe em "{{topic}}" - {{site_title}}' posted: '{{username}} publicou em "{{topic}}" - {{site_title}}' private_message: '{{username}} enviou-lhe uma mensagem privada em "{{topic}}" - {{site_title}}' - linked: '{{username}} ligou-se à sua mensagem a partir de "{{topic}}" - {{site_title}}' + linked: '{{username}} ligou à sua publicação de "{{topic}}" - {{site_title}}' upload_selector: title: "Adicionar uma imagem" title_with_attachments: "Adicionar uma imagem ou um ficheiro" @@ -1016,7 +1069,7 @@ pt: search: sort_by: "Ordenar por" relevance: "Relevância" - latest_post: "Última Mensagem" + latest_post: "Última Publicação" most_viewed: "Mais Visto" most_liked: "Mais Gostos" select_all: "Selecionar Tudo" @@ -1024,16 +1077,27 @@ pt: result_count: one: "1 resultado para \"{{term}}\"" other: "{{count}} resultados para \"{{term}}\"" - title: "pesquisar tópicos, mensagens, utilizadores, ou categorias" + title: "pesquisar tópicos, publicações, utilizadores, ou categorias" no_results: "Não foi encontrado nenhum resultado." no_more_results: "Mais nenhum resultado encontrado." - search_help: Procurar ajuda searching: "A procurar..." - post_format: "#{{post_number}} de {{username}}" + post_format: "#{{post_number}} por {{username}}" context: - user: "Procurar mensagens de @{{username}}" + user: "Procurar publicações por @{{username}}" topic: "Pesquisar este tópico" private_messages: "Pesquisar mensagens" + advanced: + posted_by: + label: Publicado por + filters: + label: Apenas devolver tópicos/respostas que... + posted: Eu publiquei em + first: são a primeira publicação + post: + count: + label: Número Mínimo de Publicações + time: + label: Publicado hamburger_menu: "ir para outra lista de tópicos ou categorias" new_item: "novo" go_back: 'voltar atrás' @@ -1044,12 +1108,12 @@ pt: unlist_topics: "Remover Tópicos da Lista" reset_read: "Repor Leitura" delete: "Eliminar Tópicos" - dismiss: "Destituir" - dismiss_read: "Destituir todos os não lidos" - dismiss_button: "Destituir..." - dismiss_tooltip: "Destituir apenas novas mensagens ou parar o acompanhamento de tópicos" + dismiss: "Marcar Visto" + dismiss_read: "Marcar todos os não lidos como vistos" + dismiss_button: "Marcar visto..." + dismiss_tooltip: "Marcar como vistas apenas novas mensagens ou parar o acompanhamento de tópicos" also_dismiss_topics: "Parar de acompanhar estes tópicos para que estes nunca me apareçam como não lidos novamente" - dismiss_new: "Destituir Novo" + dismiss_new: "Marcar Visto Novos" toggle: "ativar seleção em massa de tópicos" actions: "Ações em Massa" change_category: "Mudar Categoria" @@ -1067,7 +1131,7 @@ pt: unread: "Tem tópicos não lidos." new: "Não tem novos tópicos." read: "Ainda não leu nenhum tópico." - posted: "Ainda não publicou nenhum tópico." + posted: "Ainda não publicou em nenhum tópico." latest: "Não há tópicos recentes." hot: "Não há tópicos quentes." bookmarks: "Ainda não marcou nenhum tópico." @@ -1076,7 +1140,7 @@ pt: search: "Não há resultados na pesquisa." educate: new: '

Os seus novos tópicos aparecem aqui.

Por defeito, os tópicos são considerados novos e mostrarão o indicador novo caso tenham sido criados nos últimos 2 dias.

Pode alterar isto nas suas preferências.

' - unread: '

Os seus tópicos não lidos aparecem aqui.

Por defeito, os tópicos são considerados não lidos e aparecem nas contagens de não lidos 1 Se:</p>

  • Criou o tópico
  • Respondeu ao tópico
  • Leu o tópico por mais de 4 minutos

Ou, se definiu explicitamente o tópico para acompanhar ou vigiar através do controlo de notificações que se encontra na parte inferior de cada tópico.

Visite as preferências para alterar isto.

' + unread: '

As suas publicações não lidas aparecem aqui.

Por defeito, tópicos são considerados não lidos e mostrarão contadores de não lidos 1 se você:

  • Criou o tópico
  • Respondeu ao tópico
  • Leu o tópico durante mais de 4 minutos

Ou marcou explicitamente o tópico como Acompanhado ou Vigiado via o controle de notificações no fundo de cada tópico.

Visite as suas preferências para mudar isto.

' bottom: latest: "Não existem mais tópicos recentes." hot: "Não existem mais tópicos quentes." @@ -1092,6 +1156,9 @@ pt: unsubscribe: stop_notifications: "Irá passar a receber menos notificações para {{title}}" change_notification_state: "O seu estado de notificação atual é" + filter_to: + one: "1 publicação no tópico" + other: "{{count}} publicações no tópico" create: 'Novo Tópico' create_long: 'Criar um novo Tópico' private_message: 'Iniciar uma mensagem' @@ -1122,14 +1189,14 @@ pt: title: "Tópico não encontrado" description: "Pedimos desculpa, não foi possível encontrar esse tópico. Talvez tenha sido removido por um moderador?" total_unread_posts: - one: "tem 1 mensagem não lido neste tópico" - other: "tem {{count}} mensagens não lidas neste tópico" + one: "tem 1 publicação não lida neste tópico" + other: "tem {{count}} publicações não lidas neste tópico" unread_posts: - one: "tem 1 mensagem antiga não lida neste tópico" - other: "tem {{count}} mensagens antigas não lidas neste tópico" + one: "tem 1 publicação antiga não lida neste tópico" + other: "tem {{count}} publicações antigas não lidas neste tópico" new_posts: - one: "existe 1 nova mensagem neste tópico desde a sua última leitura" - other: "existem {{count}} novas mensagens neste tópico desde a sua última leitura" + one: "existe 1 nova publicação neste tópico desde a sua última leitura" + other: "existem {{count}} novas publicações neste tópico desde a sua última leitura" likes: one: "existe 1 gosto neste tópico" other: "existem {{count}} gostos neste tópico" @@ -1151,15 +1218,22 @@ pt: auto_close_title: 'Configurações para Fechar Automaticamente' auto_close_save: "Guardar" auto_close_remove: "Não Fechar Este Tópico Automaticamente" + auto_close_immediate: + one: "A última publicação neste tópico já tem 1 hora, por isso o tópico será fechado imediatamente." + other: "A última publicação neste tópico já tem %{count} horas, por isso o tópico será fechado imediatamente." + timeline: + back_description: "Voltar à última publicação não lida" progress: title: progresso do tópico go_top: "topo" go_bottom: "fim" go: "ir" - jump_bottom: "saltar para a última mensagem" - jump_bottom_with_number: "avançar para a mensagem %{post_number}" - total: total de mensagens - current: mensagem atual + jump_bottom: "ir para a última publicação" + jump_prompt: "ir para publicação" + jump_prompt_long: "Para que publicação gostaria de ir?" + jump_bottom_with_number: "ir para a publicação %{post_number}" + total: total de publicações + current: publicação atual notifications: reasons: '3_6': 'Receberá notificações porque está a vigiar esta categoria.' @@ -1205,7 +1279,7 @@ pt: delete: "Eliminar Tópico" open: "Abrir Tópico" close: "Fechar Tópico" - multi_select: "Selecionar Mensagens..." + multi_select: "Selecionar Publicações..." auto_close: "Fechar Automaticamente..." pin: "Fixar Tópico..." unpin: "Desafixar Tópico..." @@ -1258,7 +1332,7 @@ pt: other: "Tópicos atualmente fixados globalmente: {{count}}" make_banner: "Tornar este tópico numa faixa que apareça no topo de todas as páginas." remove_banner: "Remover a faixa que aparece no topo de todas as páginas." - banner_note: "Os utilizadores podem destituir a faixa ao fecharem-na. Apenas um tópico pode ser considerado uma faixa em qualquer momento." + banner_note: "Os utilizadores podem marcar vista a faixa por fecharem-na. Apenas um tópico pode ser posto como faixa em qualquer momento." no_banner_exists: "Não existe tópico de faixa." banner_exists: "Existe atualmente um tópico de faixa." inviting: "A Convidar..." @@ -1289,34 +1363,38 @@ pt: login_reply: 'Iniciar sessão para Responder' filters: n_posts: - one: "1 mensagem" - other: "{{count}} mensagens" + one: "1 publicação" + other: "{{count}} publicações" cancel: "Remover filtro" split_topic: title: "Mover para um Novo Tópico" action: "mover para um novo tópico" topic_name: "Nome do Novo Tópico" - error: "Ocorreu um erro ao mover as mensagens para um novo tópico." + error: "Ocorreu um erro ao mover as publicações para um novo tópico." instructions: - one: "Está prestes a criar um novo tópico e populá-lo com a mensagem que selecionou." - other: "Está prestes a criar um novo tópico e populá-lo com as {{count}} mensagens que selecionou." + one: "Está prestes a criar um novo tópico e populá-lo com a publicação que selecionou." + other: "Está prestes a criar um novo tópico e populá-lo com as {{count}} publicações que selecionou." merge_topic: title: "Mover para Tópico Existente" action: "mover para tópico existente" - error: "Ocorreu um erro ao mover as mensagens para esse tópico." + error: "Ocorreu um erro ao mover as publicações para esse tópico." instructions: - one: "Por favor selecione o tópico para o qual gostaria de mover esta mensagem." - other: "Por favor selecione o tópico para o qual gostaria de mover estas {{count}} mensagens." + one: "Por favor selecione o tópico para o qual gostaria de mover esta publicação." + other: "Por favor selecione o tópico para o qual gostaria de mover estas {{count}} publicações." + merge_posts: + title: "Juntar Publicações Selecionadas" + action: "juntar publicações selecionadas" + error: "Ocorreu um erro ao juntar os tópicos selecionados." change_owner: - title: "Mudar Proprietário das Mensagens" + title: "Mudar Dono das Publicações" action: "mudar titularidade" - error: "Ocorreu um erro na mudança de titularidade das mensagens." - label: "Novo Proprietário das Mensagens" + error: "Ocorreu um erro na mudança de dono das publicações." + label: "Novo Dono das Publicações" placeholder: "nome de utilizador do novo proprietário" instructions: - one: "Por favor seleccione o novo titular da mensagem de {{old_user}}." - other: "Por favor selecione o novo titular das {{count}} mensagens de {{old_user}}." - instructions_warn: "Note que quaisquer notificações relacionadas com esta mensagem serão transferidas retroativamente para o novo utilizador.
Aviso: Atualmente nenhum dado dependente da mensagem é transferido para o novo utilizador. Usar com cautela." + one: "Por favor seleccione o novo dono da publicação de {{old_user}}." + other: "Por favor selecione o novo dono das {{count}} publicações de {{old_user}}." + instructions_warn: "Note que quaisquer notificações relacionadas com esta publicação serão transferidas retroativamente para o novo utilizador.
Aviso: Atualmente nenhum dado dependente da publicação é transferido para o novo utilizador. Usar com cautela." change_timestamp: title: "Alterar Selo Temporal" action: "alterar selo temporal" @@ -1332,29 +1410,29 @@ pt: select_all: 'selecionar tudo ' deselect_all: desmarcar tudo description: - one: Selecionou 1 mensagem. - other: Selecionou {{count}} mensagens. + one: Selecionou 1 publicação. + other: Selecionou {{count}} publicações. post: reply: " {{replyAvatar}} {{usernameLink}}" reply_topic: " {{link}}" quote_reply: "citar resposta" edit: "Editar {{link}} {{replyAvatar}} {{username}}" edit_reason: "Motivo:" - post_number: "mensagem {{number}}" - last_edited_on: "mensagem editada pela última vez em" + post_number: "publicação {{number}}" + last_edited_on: "publicação editada pela última vez em" reply_as_new_topic: "Responder com novo Tópico" - continue_discussion: "Continuar a discussão desde {{postLink}}:" - follow_quote: "avançar para a mensagem citada" - show_full: "Mostrar Mensagem Completa" + continue_discussion: "Continuar a discussão de {{postLink}}:" + follow_quote: "ir para a publicação citada" + show_full: "Mostrar Publicação Completa" show_hidden: 'Ver conteúdo ocultado.' deleted_by_author: - one: "(mensagens abandonadas pelo autor serão removidas automaticamente em %{count} hora a não ser que estejam sinalizadas)" - other: "(mensagens abandonadas pelo autor serão eliminadas automaticamente em %{count} horas a não ser que estejam sinalizadas)" + one: "(publicação retraída pelo autor, será removida automaticamente em %{count} hora a não ser que esteja denunciada)" + other: "(publicação retraída pelo autor, será eliminada automaticamente em %{count} horas a não ser que esteja denunciada)" expand_collapse: "expandir/colapsar" gap: one: "ver 1 resposta oculta" other: "ver {{count}} respostas ocultas" - unread: "Mensagem não lida" + unread: "Publicação não lida" has_replies: one: "{{count}} Resposta" other: "{{count}} Respostas" @@ -1362,15 +1440,15 @@ pt: one: "{{count}} Gosto" other: "{{count}} Gostos" has_likes_title: - one: "1 pessoa gostou desta mensagem" - other: "{{count}} pessoas gostaram desta mensagem" - has_likes_title_only_you: "você gostou desta mensagem" + one: "1 pessoa gostou desta publicação" + other: "{{count}} pessoas gostaram desta publicação" + has_likes_title_only_you: "você gostou desta publicação" has_likes_title_you: - one: "você e 1 outra pessoa gostaram desta mensagem" - other: "você e {{count}} outras pessoas gostaram desta mensagem" + one: "você e 1 outra pessoa gostaram desta publicação" + other: "você e {{count}} outras pessoas gostaram desta publicação" errors: - create: "Pedimos desculpa, ocorreu um erro ao criar a sua mensagem. Por favor, tente novamente." - edit: "Pedimos desculpa, ocorreu um erro ao editar a sua mensagem. Por favor, tente novamente." + create: "Pedimos desculpa, ocorreu um erro ao criar a sua publicação. Por favor, tente novamente." + edit: "Pedimos desculpa, ocorreu um erro ao editar a sua publicação. Por favor, tente novamente." upload: "Pedimos desculpa, ocorreu um erro ao carregar esse ficheiro. Por favor, tente novamente." file_too_large: "Lamentamos mas esse ficheiro é demasiado grande (o tamanho máximo é de {{max_size_kb}}kb). Porque não carregar o seu ficheiro grande para um serviço de partilha na nuvem e depois partilhar o link?" too_many_uploads: "Pedimos desculpa, só pode carregar um ficheiro de cada vez." @@ -1380,36 +1458,36 @@ pt: attachment_upload_not_allowed_for_new_user: "Pedimos desculpa, os novos utilizadores não podem carregar anexos." attachment_download_requires_login: "Pedimos desculpa, os novos utilizadores não podem carregar anexos." abandon: - confirm: "Tem a certeza que deseja abandonar a sua mensagem?" + confirm: "Tem a certeza que deseja abandonar a sua publicação?" no_value: "Não, manter" yes_value: "Sim, abandonar" - via_email: "esta mensagem chegou por email" - via_auto_generated_email: "esta mensagem chegou via um email gerado automaticamente" - whisper: "esta mensagem é um susurro privado para os moderadores" + via_email: "esta publicação chegou por email" + via_auto_generated_email: "esta publicação chegou via um email gerado automaticamente" + whisper: "esta publicação é um susurro privado para os moderadores" wiki: - about: "esta mensagem é uma wiki" + about: "esta publicação é uma wiki" archetypes: save: 'Guardar as Opções' few_likes_left: "Obrigado por partilhar o amor! Restam-lhe apenas um gostos para hoje." controls: reply: "começar a compor uma resposta a este tópico" like: "gostar deste tópico" - has_liked: "gostou desta mensagem" + has_liked: "gostou desta publicação" undo_like: "desfazer gosto" - edit: "editar este tópico" - edit_anonymous: "Pedimos desculpa, mas necessita de ter sessão iniciada para editar esta mensagem." - flag: "sinalizar privadamente este tópico para consideração ou enviar uma notificação privada sobre o mesmo" - delete: "eliminar esta mensagem" - undelete: "repor esta mensagem" - share: "partilhar uma hiperligação para esta mensagem" + edit: "editar esta publicação" + edit_anonymous: "Pedimos desculpa, mas necessita de ter sessão iniciada para editar esta publicação." + flag: "denunciar privadamente este tópico para moderação ou enviar uma notificação privada sobre o mesmo" + delete: "eliminar esta publicação" + undelete: "repor esta publicação" + share: "partilhar uma ligação a esta publicação" more: "Mais" delete_replies: confirm: - one: "Também quer eliminar a {{count}} resposta direta a esta mensagem?" - other: "Também quer eliminar as {{count}} respostas diretas a esta mensagem?" + one: "Também quer eliminar a {{count}} resposta direta a esta publicação?" + other: "Também quer eliminar as {{count}} respostas diretas a esta publicação?" yes_value: "Sim, eliminar as respostas também" - no_value: "Não, somente esta mensagem" - admin: "ações administrativas de mensagens" + no_value: "Não, somente esta publicação" + admin: "ações administrativas de publicação" wiki: "Fazer Wiki" unwiki: "Remover Wiki" convert_to_moderator: "Adicionar Cor do Pessoal" @@ -1444,9 +1522,9 @@ pt: inappropriate: "Sinalizou isto como inapropriado" notify_moderators: "Sinalizou isto para moderação" notify_user: "Enviou uma mensagem a este utilizador" - bookmark: "Adicionou um marcador a esta mensagem" + bookmark: "Adicionou um marcador a esta publicação" like: "Gostou disto" - vote: "Votou nesta mensagem" + vote: "Votou nesta publicação" by_you_and_others: off_topic: one: "Para além de si, 1 pessoa sinalizou isto como fora de contexto" @@ -1464,14 +1542,14 @@ pt: one: "Para além de si, 1 outro utilizador enviaram uma mensagem a este utilizador" other: "Para além de si, {{count}} outros utilizadores enviaram uma mensagem a este utilizador" bookmark: - one: "Para além de si, 1 pessoa adicionou um marcador a esta mensagem" - other: "Para além de si, {{count}} adicionaram um marcador a esta mensagem" + one: "Para além de si, 1 pessoa adicionou um marcador a esta publicação" + other: "Para além de si, {{count}} adicionaram um marcador a esta publicação" like: one: "Para além de si, 1 pessoa gostou disto" other: "Para além de si, {{count}} pessoas gostaram disto" vote: - one: "Para além de si, 1 pessoa votou nesta mensagem" - other: "Para além de si, {{count}} pessoas votaram nesta mensagem" + one: "Para além de si, 1 pessoa votou nesta publicação" + other: "Para além de si, {{count}} pessoas votaram nesta publicação" by_others: off_topic: one: "1 pessoa sinalizou isto como fora de contexto" @@ -1489,18 +1567,22 @@ pt: one: "1 pessoa enviou uma mensagem a este utilizador" other: "{{count}} enviaram uma mensagem a este utilizador" bookmark: - one: "1 pessoa adicionou um marcador a esta mensagem" - other: "{{count}} pessoas adicionaram um marcador a esta mensagem" + one: "1 pessoa adicionou um marcador a esta publicação" + other: "{{count}} pessoas adicionaram um marcador a esta publicação" like: one: "1 pessoa gostou disto" other: "{{count}} pessoas gostaram disto" vote: - one: "1 pessoa votou nesta mensagem" - other: "{{count}} pessoas votaram nesta mensagem" + one: "1 pessoa votou nesta publicação" + other: "{{count}} pessoas votaram nesta publicação" delete: confirm: - one: "Tem a certeza que quer eliminar essa mensagem?" - other: "Tem a certeza que quer eliminar todas essas mensagens?" + one: "Tem a certeza que quer eliminar essa publicação?" + other: "Tem a certeza que quer eliminar todas essas publicações?" + merge: + confirm: + one: "Tem a certeza que quer juntar estas publicações?" + other: "Tem a certeza que quer juntar estas {{count}} publicações?" revisions: controls: first: "Primeira revisão" @@ -1578,6 +1660,9 @@ pt: notifications: watching: title: "A vigiar" + description: "Irá vigiar automaticamente todos os novos tópicos nestas categorias. Será notificado de todas as novas respostas em cada tópico, e uma contagem de novas respostas será mostrada." + watching_first_post: + title: "A Vigiar a Primeira Publicação" tracking: title: "Acompanhar" regular: @@ -1751,6 +1836,10 @@ pt: full: "Criar / Responder / Ver" create_post: "Responder / Ver" readonly: "Ver" + keyboard_shortcuts_help: + application: + dismiss_new_posts: 'x, r Marcar Visto Novos/Publicações' + dismiss_topics: 'x, t Marcar Visto Tópicos' admin_js: type_to_filter: "digite para filtrar..." admin: diff --git a/config/locales/client.pt_BR.yml b/config/locales/client.pt_BR.yml index eadb0ce518..5d5af5f1ca 100644 --- a/config/locales/client.pt_BR.yml +++ b/config/locales/client.pt_BR.yml @@ -1075,7 +1075,6 @@ pt_BR: title: "procurar em tópicos, respostas, usuários ou categorias" no_results: "Nenhum resultado encontrado." no_more_results: "Sem mais resultados encontrados." - search_help: Ajuda na busca searching: "Procurando..." post_format: "#{{post_number}} por {{username}}" context: @@ -1837,8 +1836,6 @@ pt_BR: readonly: "Ver" lightbox: download: "download" - search_help: - title: 'Ajuda na pesquisa' keyboard_shortcuts_help: title: 'Atalhos de teclado' jump_to: diff --git a/config/locales/client.ro.yml b/config/locales/client.ro.yml index 738b7c4ad8..698a5f827c 100644 --- a/config/locales/client.ro.yml +++ b/config/locales/client.ro.yml @@ -630,6 +630,7 @@ ro: title: "Limba interfeței" instructions: "Limba pentru interfața forumului. Schimbarea se va produce odată ce reîmprospătați pagina." default: "(implicit)" + any: "oricare" password_confirmation: title: "Confirmă parola" last_posted: "Ultima postare" @@ -687,6 +688,7 @@ ro: after_4_minutes: "după 4 minute" after_5_minutes: "după 5 minute" after_10_minutes: "după 10 minute" + notification_level_when_replying: "Când postez într-un subiect, setează subiectul ca" invited: search: "Scrie pentru a căuta invitații..." title: "Invitații" @@ -1132,7 +1134,6 @@ ro: title: "Caută subiecte, postări, utilizatori sau categorii" no_results: "Nici un rezultat." no_more_results: "Nu s-au mai găsit alte rezultate." - search_help: Ajutor căutare searching: "Se caută..." post_format: "#{{post_number}} de {{username}}" context: @@ -1140,6 +1141,44 @@ ro: category: "Caută în categoria #{{category}} " topic: "Caută în acest subiect" private_messages: "Caută mesaje" + advanced: + title: Căutare avansată + posted_by: + label: Postat de + in_category: + label: În categoria + in_group: + label: În grupul + with_badge: + label: Cu ecusonul + with_tags: + label: Cu etichetele + filters: + label: Afișează doar postările/subiectele ... + likes: pe care le-am apreciat + posted: în care am postat + watching: pe care le urmăresc activ + tracking: le urmăresc + private: sunt în mesajele mele + bookmarks: le-am adăugat la semne de carte + first: sunt chiar pe primul loc în listă + pinned: sunt fixate + unpinned: nu sunt fixate + wiki: sunt wiki + statuses: + label: Unde subiectele + open: sunt deschise + closed: sunt închise + archived: sunt arhivate + noreplies: nu au nici un răspuns + single_user: au un singur utilizator + post: + count: + label: Număr minim de postări + time: + label: Postat(e) + before: înainte + after: după hamburger_menu: "Du-te la o altă categorie saulistă de subiecte" new_item: "nou" go_back: 'înapoi' @@ -1362,6 +1401,9 @@ ro: share: title: 'Distribuie' help: 'distribuie un link cu acest subiect' + print: + title: 'Tipărire' + help: 'Deschide o versiune pentru imprimare a acestui subiect' flag_topic: title: 'Marcaje' help: 'marchează acest subiect pentru a atrage atenția adminilor sau a le trimite o notificare privată despre el' @@ -1968,8 +2010,6 @@ ro: readonly: "Doar citire" lightbox: download: "descărcare" - search_help: - title: 'Ajutor căutare' keyboard_shortcuts_help: title: 'Scurtături de tastatură' jump_to: @@ -2021,12 +2061,13 @@ ro: mark_regular: 'm, r Subiect obișnuit (implicit)' mark_tracking: 'm, t Urmărește subiect' mark_watching: 'm, w Urmărește activ subiect' + print: 'ctrl+p Tipărire subiect' badges: earned_n_times: one: "A primit acest ecuson o dată" few: "A primit acest ecuson de %{count} ori" other: "A primit acest ecuson de %{count} de ori" - granted_on: "Acordat pe %{date}" + granted_on: "Acordat acum %{date}" others_count: "Numărul celorlalți care au acest ecuson (%{count})" title: Ecusoane allow_title: "titlu disponibil" diff --git a/config/locales/client.ru.yml b/config/locales/client.ru.yml index c9c02d02bc..4f186a3a65 100644 --- a/config/locales/client.ru.yml +++ b/config/locales/client.ru.yml @@ -1087,7 +1087,6 @@ ru: title: "Поиск по темам, сообщениям, псевдонимам и разделам" no_results: "Ничего не найдено." no_more_results: "Больше ничего не найдено." - search_help: Справка по поиску searching: "Поиск ..." post_format: "#{{post_number}} от {{username}}" context: diff --git a/config/locales/client.sk.yml b/config/locales/client.sk.yml index c609ec0a93..fc0ae6eebc 100644 --- a/config/locales/client.sk.yml +++ b/config/locales/client.sk.yml @@ -1089,7 +1089,6 @@ sk: title: "hľadaj témy, príspevky, používateľov, alebo kategórie" no_results: "Žiadne výsledky" no_more_results: "Nenašlo sa viac výsledkov" - search_help: Pomoc pri vyhľadávaní searching: "Vyhľadávam....." post_format: "#{{post_number}} podľa {{username}}" context: @@ -1894,8 +1893,6 @@ sk: readonly: "Zobraz" lightbox: download: "stiahnuť" - search_help: - title: 'Pomoc pri vyhľadávaní' keyboard_shortcuts_help: title: 'Klávesové skratky' jump_to: diff --git a/config/locales/client.sq.yml b/config/locales/client.sq.yml index de792227ad..0ecac4345b 100644 --- a/config/locales/client.sq.yml +++ b/config/locales/client.sq.yml @@ -753,7 +753,7 @@ sq: the_topic: "tema" loading: "Duke ngarkuar..." errors: - prev_page: "duku u munduar të ngarkohet" + prev_page: "duke u munduar të ngarkohet" reasons: network: "Gabim në rrjet" server: "Gabim në server" @@ -1078,7 +1078,6 @@ sq: title: "kërko në faqe" no_results: "Nuk u gjet asnjë rezultat." no_more_results: "Nuk gjetëm rezultate të tjera. " - search_help: Ndihmë për kërkimin searching: "Duke kërkuar..." post_format: "#{{post_number}} nga {{username}}" context: @@ -1825,8 +1824,6 @@ sq: readonly: "Shiko" lightbox: download: "shkarko" - search_help: - title: 'Opsionet e kërkimit' keyboard_shortcuts_help: title: 'Shkurtimet e tastierës ' jump_to: diff --git a/config/locales/client.sv.yml b/config/locales/client.sv.yml index 1f7a852edd..512f57d39d 100644 --- a/config/locales/client.sv.yml +++ b/config/locales/client.sv.yml @@ -1088,7 +1088,6 @@ sv: title: "sök efter ämnen, inlägg, användare, eller kategorier" no_results: "Inga resultat hittades." no_more_results: "Inga fler resultat hittades." - search_help: Sökhjälp searching: "Söker ..." post_format: "#{{post_number}} av {{username}}" context: @@ -1868,8 +1867,6 @@ sv: readonly: "se" lightbox: download: "ladda ned" - search_help: - title: 'Sökhjälp' keyboard_shortcuts_help: title: 'Tangentbordsgenvägar' jump_to: diff --git a/config/locales/client.tr_TR.yml b/config/locales/client.tr_TR.yml index da4a140c59..38c11ffce5 100644 --- a/config/locales/client.tr_TR.yml +++ b/config/locales/client.tr_TR.yml @@ -94,7 +94,7 @@ tr_TR: action_codes: public_topic: "bu konuyu %{when} herkese açık yaptı" private_topic: "bu konuyu %{when} özel yaptı" - split_topic: "bu konuyu şu zamanda ayır: %{when}" + split_topic: "bu konuyu %{when} ayırdı" invited_user: "%{when} %{who} davet edildi" invited_group: "%{who} %{when} davet edildi" removed_user: "%{when} %{who} silindi" @@ -180,7 +180,7 @@ tr_TR: other: "{{count}} karakter" suggested_topics: title: "Önerilen Konular" - pm_title: "Önerilen Mesajlar" + pm_title: "Önerilen İletiler" about: simple_title: "Hakkında" title: "%{title} Hakkında" @@ -300,7 +300,7 @@ tr_TR: posts: "Bu grubun üyelerinden gönderi yok." members: "Bu grupta üye yok." mentions: "Bu gruptan söz edilmemiş." - messages: "Bu grup için bir mesaj yok." + messages: "Bu grup için bir ileti yok." topics: "Bu grubun üyelerinden konu yok." add: "Ekle" selector_placeholder: "Üye ekle" @@ -313,9 +313,9 @@ tr_TR: topics: "Konular" posts: "Gönderiler" mentions: "Bahsetmeler" - messages: "Mesajlar" + messages: "İletiler" alias_levels: - title: "Kimler bu gruba mesaj gönderebilir ve gruptan @bahsedebilir?" + title: "Kimler bu gruba ileti gönderebilir ve gruptan @bahsedebilir?" nobody: " Hiç Kimse" only_admins: "Sadece Yöneticiler" mods_and_admins: "Sadece Moderatörler ve Yöneticiler" @@ -327,7 +327,7 @@ tr_TR: notifications: watching: title: "Gözleniyor" - description: "Tüm gönderilerdeki her mesaj hakkında bilgilendirileceksiniz ve yeni cevap sayısı gösterilecek." + description: "Tüm gönderilerdeki her ileti hakkında bilgilendirileceksiniz ve yeni cevap sayısı gösterilecek." watching_first_post: title: "İlk Gönderi Gözlemeniz" description: "Bu grupta bulunan tüm konuların sadece ilk gönderilerinde bildirim alacaksınız." @@ -400,9 +400,9 @@ tr_TR: mute: "Sustur" edit: "Tercihleri Düzenle" download_archive: "Gönderilerimi İndir" - new_private_message: "Yeni Mesaj" - private_message: "Mesaj" - private_messages: "Mesajlar" + new_private_message: "Yeni İleti" + private_message: "İleti" + private_messages: "İletiler" activity_stream: "Etkinlik" preferences: "Tercihler" expand_profile: "Genişlet" @@ -468,7 +468,7 @@ tr_TR: delete_account_confirm: "Hesabınızı kalıcı olarak silmek istediğinize emin misiniz? Bu eylemi geri alamazsınız!" deleted_yourself: "Hesabınız başarıyla silindi." delete_yourself_not_allowed: "Hesabınızı şu an silemezsiniz. Hesabınızı silmesi için bir yönetici ile iletişime geçin." - unread_message_count: "Mesajlar" + unread_message_count: "İletiler" admin_delete: "Sil" users: "Kullanıcılar" muted_users: "Susturuldu" @@ -484,7 +484,7 @@ tr_TR: api_read: "okuma" api_read_write: "okuma ve yazma" staff_counters: - flags_given: "yardımcı bayraklar" + flags_given: "yardımcı bildirimler" flagged_posts: "bildirilen gönderiler" deleted_posts: "silinen gönderiler" suspensions: "uzaklaştırmalar" @@ -495,10 +495,10 @@ tr_TR: sent: "Gönderildi" archive: " Arşiv" groups: "Gruplarım" - bulk_select: "Mesajları seçin" + bulk_select: "İletileri seçin" move_to_inbox: "Gelen kutusuna taşı" move_to_archive: " Arşiv" - failed_to_move: "Seçilen mesajları taşımak başarısız oldu (muhtemelen ağınız çöktü)" + failed_to_move: "Seçilen iletileri taşımak başarısız oldu (muhtemelen ağınız çöktü)" select_all: "Tümünü seç" change_password: success: "(e-posta gönderildi)" @@ -570,6 +570,7 @@ tr_TR: title: "Arayüz dili" instructions: "Kullanıcı arayüzünün dili. Sayfayı yenilediğiniz zaman değişecektir." default: "(öntanımlı)" + any: "herhangi biri" password_confirmation: title: "Tekrar Parola" last_posted: "Son Gönderi" @@ -586,7 +587,7 @@ tr_TR: title: "Beğenildiğinde bildir" always: "Her zaman" first_time_and_daily: "İlk kez bir gönderi günlük beğenildiğinde" - first_time: "İlk ileti beğenisinde" + first_time: "İlk gönderi beğenisinde" never: "Asla" email_previous_replies: title: "Önceki cevapları e-postaların altına ekle" @@ -604,7 +605,7 @@ tr_TR: include_tl0_in_digests: "Yeni kullanıcılardan gelen içeriği özet e-postalarına ekle" email_in_reply_to: "Gönderilere gelen cevapların bir örneğini e-postaya ekle" email_direct: "Birisi gönderime cevap verdiğinde, benden alıntı yaptığında, @kullaniciadi şeklinde bahsettiğinde ya da beni bir konuya davet ettiğinde bana bir e-posta at" - email_private_messages: "Biri bana mesaj yazdığında bana bir e-posta gönder" + email_private_messages: "Biri bana ileti yazdığında bana bir e-posta gönder" email_always: "Sitede etkin olduğum sıralarda bile bana e-posta bildirimleri gönder" other_settings: "Diğer" categories_settings: "Kategoriler" @@ -627,6 +628,7 @@ tr_TR: after_4_minutes: "4 dakika sonra" after_5_minutes: "5 dakika sonra" after_10_minutes: "10 dakika sonra" + notification_level_when_replying: "Bir konuya yazdığımda, o konuyu şuna ayarla" invited: search: "davetiye aramak için yazın..." title: "Davetler" @@ -661,7 +663,7 @@ tr_TR: none: "Henüz kimseyi buraya davet etmediniz. Tek tek davetiye gönderebilirsiniz, ya da toplu bir davetiye dosyası yükleyerek birçok kişiyi aynı anda davet edebilirsiniz. " text: "Dosyadan Toplu Davet Gönder" uploading: "Yükleniyor..." - success: "Dosya başarıyla yüklendi, işlem tamamlandığında mesajla bilgilendirileceksiniz." + success: "Dosya başarıyla yüklendi, işlem tamamlandığında iletiyle bilgilendirileceksiniz." error: "'{{filename}}' yüklenirken bir hata oluştu: {{message}}" password: title: "Parola" @@ -711,7 +713,7 @@ tr_TR: title: "Kayıt Anındaki IP Adresi" avatar: title: "Profil Görseli" - header_title: "profil, mesajlar, imler ve tercihler" + header_title: "profil, iletiler, imler ve tercihler" title: title: "Başlık" filters: @@ -719,13 +721,13 @@ tr_TR: stream: posted_by: "Gönderen" sent_by: "Yollayan" - private_message: "mesaj" + private_message: "ileti" the_topic: "konu" loading: "Yükleniyor..." errors: - prev_page: "yüklemeye çalışırken" + prev_page: "şu sayfayı yüklemeye çalışırken:" reasons: - network: "Network Hatası" + network: "Ağ Hatası" server: "Sunucu Hatası" forbidden: "Erişim Reddedildi" unknown: "Hata" @@ -793,10 +795,10 @@ tr_TR: enable: "Silinen Gönderileri Gizle" disable: "Silinen Gönderileri Göster" private_message_info: - title: "Mesaj" + title: "İleti" invite: "Diğerlerini Davet Et..." - remove_allowed_user: "Bu mesajlaşmadan {{name}} isimli kullanıcıyı çıkarmak istediğinize emin misiniz?" - remove_allowed_group: "{{name}} bunu gerçekten mesajdan kaldırmak istiyor musunuz?" + remove_allowed_user: "Bu iletiden {{name}} isimli kullanıcıyı çıkarmak istediğinize emin misiniz?" + remove_allowed_group: "{{name}} bunu gerçekten iletiden kaldırmak istiyor musunuz?" email: 'E-posta' username: 'Kullanıcı Adı' last_seen: 'Son Görülme' @@ -885,7 +887,7 @@ tr_TR: unlist: "listelenmedi" add_warning: "Bu resmi bir uyarıdır." toggle_whisper: "Fısıldamayı Aç/Kapa" - toggle_unlisted: "Listelenmemiş Olanları Değiştir" + toggle_unlisted: "Listelenmeme aç/kapa" posting_not_on_topic: "Hangi konuyu cevaplamak istiyorsun?" saving_draft_tip: "kaydediliyor..." saved_draft_tip: "kaydedildi" @@ -909,7 +911,7 @@ tr_TR: reply: "Cevapla" cancel: "İptal et" create_topic: "Konu Oluştur" - create_pm: "Mesaj" + create_pm: "İleti" 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?" @@ -953,10 +955,10 @@ tr_TR: toggler: "yazım alanını gizle veya göster" modal_ok: "Tamam" modal_cancel: "İptal" - cant_send_pm: "Üzgünüz, %{username} kullanıcısına mesaj gönderemezsiniz." + cant_send_pm: "Üzgünüz, %{username} kullanıcısına ileti gönderemezsiniz." yourself_confirm: title: "Alıcıları eklemeyi unuttun mu?" - body: "Bu mesaj şu an sadece sana gönderiliyor!" + body: "Bu ileti şu an sadece sana gönderiliyor!" admin_options_title: "Bu konu için isteğe bağlı görevli ayarları" auto_close: label: "Başlığı otomatik kapatma zamanı:" @@ -968,7 +970,7 @@ tr_TR: units: "(saat sayısı)" examples: 'Saat sayısını giriniz (24).' notifications: - title: "@isim bahsedilişleri, gönderileriniz ve konularınıza verilen cevaplar, mesajlarla vb. ilgili bildiriler" + title: "@isim bahsedilişleri, gönderileriniz ve konularınıza verilen cevaplar, iletilerle vb. ilgili bildiriler" none: "Şu an için bildirimler yüklenemiyor." empty: "Bildirim yok." more: "daha eski bildirimleri görüntüle" @@ -983,8 +985,8 @@ tr_TR: liked_2: "

{{username}}, {{username2}} {{description}}

" liked_many: other: "

{{username}}, {{username2}} ve diğer {{count}} kişi {{description}}

" - private_message: "

{{username}} {{description}}

" - invited_to_private_message: "

{{username}} {{description}}

" + private_message: "

{{username}} {{description}}

" + invited_to_private_message: "

{{username}} {{description}}

" invited_to_topic: "

{{username}} {{description}}

" invitee_accepted: "

{{username}} davetini kabul etti!

" moved_post: "

{{username}} taşıdı {{description}}

" @@ -992,7 +994,7 @@ tr_TR: granted_badge: "

{{description}} rozeti kazandınız!

" watching_first_post: "

Yeni Konu {{description}}

" group_message_summary: - other: "

{{group_name}} isimli grubunuzun gelen kutusunda {{count}} adet mesaj var

" + other: "

{{group_name}} isimli grubunuzun gelen kutusunda {{count}} adet ileti var

" alt: mentioned: "Bahsedildi, şu kişi tarafından" quoted: "Alıntılandı, şu kişi tarafından" @@ -1000,21 +1002,21 @@ tr_TR: posted: "Gönderildi, şu kişi tarafından" edited: "Gönderiniz düzenlendi, şu kişi tarafından" liked: "Gönderiniz beğenildi" - private_message: "Özel mesaj, şu kişiden" - invited_to_private_message: "Bir özel mesaja davet edildiniz, şu kişi tarafından" + private_message: "Özel ileti, şu kişiden" + invited_to_private_message: "Şu kişi tarafından özel iletiyle davet edildiniz" invited_to_topic: "Bir konuya davet edildiniz, şu kişi tarafından" invitee_accepted: "Davet kabul edildi, şu kişi tarafından" moved_post: "Gönderiniz taşındı, şu kişi tarafından" linked: "Gönderinize bağlantı" granted_badge: "Rozet alındı" - group_message_summary: "Grup gelen kutusundaki mesajlar" + group_message_summary: "Grup gelen kutusundaki iletiler" popup: mentioned: '{{username}}, "{{topic}}" başlıklı konuda sizden bahsetti - {{site_title}}' group_mentioned: '{{username}} sizden bahsetti "{{topic}}" - {{site_title}}' quoted: '{{username}}, "{{topic}}" başlıklı konuda sizden alıntı yaptı - {{site_title}}' replied: '{{username}}, "{{topic}}" başlıklı konuda size cevap verdi - {{site_title}}' posted: '{{username}}, "{{topic}}" başlıklı konuya yazdı - {{site_title}}' - private_message: '{{username}}, "{{topic}}" başlıklı konuda size özel mesaj gönderdi - {{site_title}}' + private_message: '{{username}}, "{{topic}}" başlıklı konuda size özel ileti gönderdi - {{site_title}}' linked: '{{username}}, "{{topic}}" başlıklı konudaki gönderinize bağlantı yaptı - {{site_title}}' upload_selector: title: "Resim ekle" @@ -1044,14 +1046,48 @@ tr_TR: title: "konu, gönderi, kullanıcı veya kategori ara" no_results: "Hiç bir sonuç bulunamadı." no_more_results: "Başka sonuç yok." - search_help: Arama yardımı searching: "Aranıyor..." post_format: "{{username}} tarafından #{{post_number}}" context: user: "@{{username}} kullancısına ait gönderilerde ara" category: "#{{category}} kategorisini ara" topic: "Bu konuda ara" - private_messages: "Mesajlarda ara" + private_messages: "İletilerde ara" + advanced: + title: Gelişmiş Arama + posted_by: + label: Gönderen + in_category: + label: Şu Kategoride + in_group: + label: Şu Grupta + with_tags: + label: Şu Etiketli + filters: + label: Yalnızca bu özelliğe sahip konuları/gönderileri göster... + likes: beğendiğim + posted: gönderide bulunduğum + watching: gözlediğim + tracking: takip ettiğim + private: iletilerimde olan + bookmarks: imlediğim + pinned: tutturulmuş + unpinned: tutturulmamış + wiki: wiki olan + statuses: + label: Şöyle olan konular + open: açık + closed: kapalı + archived: arşivlenmiş + noreplies: sıfır cevabı olan + single_user: tek kullanıcı içeren + post: + count: + label: En az gönderi sayısı + time: + label: Gönderilme + before: önce + after: sonra hamburger_menu: "bir diğer konu ya da kategoriye git" new_item: "yeni" go_back: 'geri dön' @@ -1094,7 +1130,7 @@ tr_TR: search: "Arama sonuçları yok." educate: new: '

Yeni konular burada görünecektir.

Öntanımlı olarak son 2 gün içerisinde oluşturulmuş konular yeni olarak nitelendirilir ve yeni ibaresiyle işaretli olarak gösterilir.

tercihler sayfanızı ziyaret ederek bunu değiştirebilirsiniz.

' - unread: '

Okumadığınız konular burada görünecektir.

Öntanımlı olarak, konuların okunmamış sayılması ve kaç tane1 okunmamış mesaj olduğunun gösterilmesi için

  • Konuyu oluşturmuş olmanız
  • Konuya cevap vermiş olmanız
  • Konuyu 4 dakikadan fazla okumuş olmanız

Veya, konuyu her konunun altında bulunan bildirim kontrol alanından Gözleniyor veya Takip Ediliyor olarak seçmeniz durumlarından en az biri gerekir.

tercihler sayfanızı ziyaret ederek bunu değiştirebilirsiniz.

' + unread: '

Okumadığınız konular burada görünecektir.

Öntanımlı olarak, konuların okunmamış sayılması ve kaç tane1 okunmamış ileti olduğunun gösterilmesi için

  • Konuyu oluşturmuş olmanız
  • Konuya cevap vermiş olmanız
  • Konuyu 4 dakikadan fazla okumuş olmanız

Veya, konuyu her konunun altında bulunan bildirim kontrol alanından Gözleniyor veya Takip Ediliyor olarak seçmeniz durumlarından en az biri gerekir.

tercihler sayfanızı ziyaret ederek bunu değiştirebilirsiniz.

' bottom: latest: "Daha fazla son konu yok." hot: "Daha fazla sıcak bir konu yok." @@ -1114,13 +1150,13 @@ tr_TR: other: "konuda {{count}} tane gönderi var" create: 'Yeni Konu' create_long: 'Yeni bir konu oluştur' - private_message: 'Mesajlaşma başlat' + private_message: 'İleti başlat' archive_message: - help: 'Mesajı arşivine taşı' + help: 'İletiyi arşivine taşı' title: ' Arşiv' move_to_inbox: title: 'Gelen kutusuna taşı' - help: 'Mesajı yeniden gelen kutusuna taşı' + help: 'İletiyi yeniden gelen kutusuna taşı' list: 'Konular' new: 'yeni konu' unread: 'okunmamış' @@ -1160,7 +1196,7 @@ tr_TR: jump_reply_up: Daha önceki cevaba geç jump_reply_down: Daha sonraki cevaba geç deleted: "Konu silindi " - auto_close_notice: "Bu konu otomatik olarak kapanacak %{timeLeft}." + auto_close_notice: "Bu konu %{timeLeft} otomatik olarak kapanacak." auto_close_notice_based_on_last_post: "Bu konu son cevaptan %{duration} sonra kapanacak." auto_close_title: 'Otomatik Kapatma Ayarları' auto_close_save: "Kaydet" @@ -1203,13 +1239,13 @@ tr_TR: '0': 'Bu konuya ait tüm bildirimleri görmezden geliyorsunuz.' watching_pm: title: "Gözleniyor" - description: "Bu mesajlaşmada ki her yeni gönderi için bir bildirim alacaksınız. Okunmamış ve yeni gönderilerin sayısı konunun yanında belirecek." + description: "Bu iletideki her yeni gönderi için bir bildirim alacaksınız. Okunmamış ve yeni gönderilerin sayısı konunun yanında belirecek." watching: title: "Gözleniyor" description: "Bu konudaki her yeni gönderi için bildirim alacaksınız. Okunmamış ve yeni gönderilerin sayısı konunun yanında belirecek." tracking_pm: title: "Takip Ediliyor" - description: "Okunmamış ve yeni gönderi sayısı mesajın yanında belirecek. Birisi @isminizden bahsederse veya size cevap verirse bildirim alacaksınız." + description: "Okunmamış ve yeni gönderi sayısı iletinin yanında belirecek. Birisi @isminizden bahsederse veya size cevap verirse bildirim alacaksınız." tracking: title: "Takip Ediliyor" description: "Okunmamış ve yeni gönderi sayısı başlığın yanında belirecek. Birisi @isminizden bahsederse veya size cevap verirse bildirim alacaksınız." @@ -1221,7 +1257,7 @@ tr_TR: description: "Birisi @isminizden bahsederse veya size cevap verirse bildirim alacaksınız." muted_pm: title: "Susturuldu" - description: "Bu mesajlaşmayla ilgili hiç bir bildirim almayacaksınız." + description: "Bu ileti ile ilgili hiç bir bildirim almayacaksınız." muted: title: "Susturuldu" description: "Bu konu en son gönderilerde gözükmeyecek, ve hakkında hiçbir bildirim almayacaksınız." @@ -1240,7 +1276,7 @@ tr_TR: visible: "Görünür Yap" reset_read: "Görüntüleme Verilerini Sıfırla" make_public: "Herkese Açık Konu Yap" - make_private: "Özel Mesaj Oluştur" + make_private: "Özel İleti Oluştur" feature: pin: "Başa Tuttur" unpin: "Baştan Kaldır" @@ -1256,6 +1292,9 @@ tr_TR: share: title: 'Paylaş' help: 'bu konunun bağlantısını paylaşın' + print: + title: 'Yazdır' + help: 'Bu konunun yazıcı dostu olan sürümünü aç' flag_topic: title: 'Bildir' help: 'bu gönderiyi kontrol edilmesi için özel olarak bildirin ya da bununla ilgili özel bir bildirim yollayın' @@ -1287,12 +1326,12 @@ tr_TR: inviting: "Davet Ediliyor..." automatically_add_to_groups: "Bu davet aynı zamanda bu gruplara erişim izni sağlar:" invite_private: - title: 'Mesajlaşmaya Davet Et' + title: 'İletiye Davet Et' email_or_username: "Davet edilenin e-postası ya da kullanıcı adı" email_or_username_placeholder: "e-posta ya da kullanıcı adı" action: "Davet et" - success: "O kullanıcıyı bu mesajlaşmaya davet ettik." - success_group: "Grubu bu mesaja katılması için davet ettik." + success: "O kullanıcıyı bu iletiye davet ettik." + success_group: "Grubu bu iletiye katılması için davet ettik." error: "Üzgünüz, kullanıcı davet edilirken bir hata oluştu." group_name: "grup adı" controls: "Konu Kontrolleri" @@ -1343,8 +1382,8 @@ tr_TR: other: "Lütfen {{old_user}} kullanıcısına ait {{count}} gönderinin yeni sahibini seçin." instructions_warn: "Bu gönderi ile ilgili geriye dönük biriken bildirimler yeni kullanıcıya aktarılmayacak.
Uyarı: Şu an, yeni kullanıcıya hiç bir gönderi-tabanlı ek bilgi aktarılmıyor. Dikkatli olun." change_timestamp: - title: "Değişiklik Zaman Bilgisi" - action: "değişiklik zaman bilgisi" + title: "Zaman Bilgisini Değiştir" + action: "Zaman Bilgisini Değiştir" invalid_timestamp: "Zaman bilgisi gelecekte olamaz." error: "Konunun zaman bilgisini değiştirirken bir hata oluştu." instructions: "Lütfen konunun yeni zaman bilgisini seçiniz. Konudaki gönderiler aynı zaman farkına sahip olmaları için güncellenecekler." @@ -1368,7 +1407,7 @@ tr_TR: last_edited_on: "gönderinin en son düzenlenme tarihi" reply_as_new_topic: "Bağlantılı Konu Olarak Cevapla" continue_discussion: "{{postLink}} Gönderisinden tartışmaya devam ediliyor:" - follow_quote: "alıntılanan mesaja git" + follow_quote: "alıntılanan iletiye git" show_full: "Gönderinin Tamamını Göster" show_hidden: 'Gizlenmiş içeriği görüntüle.' deleted_by_author: @@ -1450,7 +1489,7 @@ tr_TR: spam: "istenmeyen olarak bildirildi" inappropriate: "uygunsuz olarak bildirildi" notify_moderators: "moderatörler bilgilendirdi" - notify_user: "mesaj gönderdi" + notify_user: "ileti gönderdi" bookmark: "bunu imledi" like: "beğendi" vote: "oyladı" @@ -1459,7 +1498,7 @@ tr_TR: spam: "Bunu istenmeyen olarak bildirdiniz" inappropriate: "Bunu uygunsuz olarak bildirdiniz" notify_moderators: "Bunu moderasyon için bildirdiniz" - notify_user: "Bu kullanıcıya mesaj yolladınız" + notify_user: "Bu kullanıcıya ileti yolladınız" bookmark: "Bu gönderiyi imlediniz" like: "Bunu beğendiniz" vote: "Bu gönderiyi oyladınız" @@ -1473,7 +1512,7 @@ tr_TR: notify_moderators: other: "Siz ve {{count}} diğer kişi bunu denetlenmesi için bildirdi" notify_user: - other: "Siz ve {{count}} diğer kişi bu kullanıcıya mesaj yolladı" + other: "Siz ve {{count}} diğer kişi bu kullanıcıya ileti yolladı" bookmark: other: "Siz ve {{count}} diğer kişi bu gönderiyi imledi" like: @@ -1490,7 +1529,7 @@ tr_TR: notify_moderators: other: "{{count}} kişi bunu moderasyon için bildirdi" notify_user: - other: "{{count}} bu kullanıcıya mesaj yolladı" + other: "{{count}} bu kullanıcıya ileti yolladı" bookmark: other: "{{count}} kişi bu gönderiyi imledi" like: @@ -1550,7 +1589,7 @@ tr_TR: name: "Kategori Adı" description: "Açıklama" topic: "kategori konusu" - logo: "Kategori Logosu Görseli" + logo: "Kategori Görseli" background_image: "Kategori Arka Planı Görseli" badge_colors: "Rozet renkleri" background_color: "Arka plan rengi" @@ -1602,7 +1641,7 @@ tr_TR: title: 'Topluluğumuzun düzenli kalmasına desteğiniz için teşekkürler!' action: 'Gönderiyi Bildir' take_action: "Harekete Geç" - notify_action: 'Mesaj' + notify_action: 'İleti' official_warning: 'Resmi uyarı' delete_spammer: "Spamcıyı Sil" delete_confirm_MF: "Bu kullanıcının {POSTS, plural, one {1 gönderisini} other {# gönderisini}} ve {TOPICS, plural, one {1 konusunu} other {# konusunu}} silmek üzeresiniz, ayrıca kullanıcının hesabı kaldırılacak, giriş yaptığı {ip_address} IP adresinden giriş yapması engellenecek ve {email} e-posta adresi kalıcı yasaklı listesine eklenecek. Bu kullanıcının gerçekten bir spamcı olduğuna emin misiniz?" @@ -1629,7 +1668,7 @@ tr_TR: flagging_topic: title: "Topluluğumuzun düzenli kalmasına desteğiniz için teşekkürler!" action: "Konuyu Bildir" - notify_action: "Mesaj" + notify_action: "İleti" topic_map: title: "Konu Özeti" participants_title: "Sıkça Yazanlar" @@ -1768,8 +1807,6 @@ tr_TR: readonly: "Bak" lightbox: download: "indir" - search_help: - title: 'Arama yardımı' keyboard_shortcuts_help: title: 'Klavye Kısayolları' jump_to: @@ -1782,7 +1819,7 @@ tr_TR: top: 'g, t En üst' bookmarks: 'g, b İmler' profile: 'g, p Profil' - messages: 'g, m Mesajlar' + messages: 'g, m İletiler' navigation: title: 'Navigasyon' jump: '# Gönderiye git #' @@ -1821,6 +1858,7 @@ tr_TR: mark_regular: 'm, r Öntanımlı konu' mark_tracking: 'm, t Konuyu takip et' mark_watching: 'm, w Konuyu gözle' + print: 'ctrl+p Konuyu yazdır' badges: earned_n_times: other: "Bu rozet %{count} defa kazanılmış" @@ -1930,8 +1968,8 @@ tr_TR: search: "Daha fazla arama sonucu bulunmuyor." invite: custom_message: "Davetini daha özel hale getirmek için şunu yaz" - custom_message_link: "kişiselleştirilmiş mesaj" - custom_message_placeholder: "Kişiselleştirilmiş mesajınızı düzenleyin" + custom_message_link: "kişiselleştirilmiş ileti" + custom_message_placeholder: "Kişiselleştirilmiş iletinizi düzenleyin" custom_message_template_forum: "Hey, bu foruma katılmalısın!" custom_message_template_topic: "Hey, bu konu senin için eğleceli olabilir!" admin_js: @@ -1960,8 +1998,8 @@ tr_TR: admins: 'Yöneticiler:' blocked: 'Engellenmiş:' suspended: 'Uzaklaştırılmışlar:' - private_messages_short: "Mesajlar" - private_messages_title: "Mesajlar" + private_messages_short: "İletiler" + private_messages_title: "İletiler" mobile_title: "Mobil" space_free: "{{size}} serbest" uploads: "yüklemeler" @@ -1981,7 +2019,7 @@ tr_TR: 30_days_ago: "30 Gün Önce" all: "Hepsi" view_table: "tablo" - view_graph: "grafik" + view_graph: "çizge" refresh_report: "Raporu Yenile" start_date: "Başlangıç tarihi" end_date: "Bitiş Tarihi" @@ -1996,8 +2034,8 @@ tr_TR: agree: "Onayla" agree_title: "Bu bildirimi geçerli ve doğru olarak onayla" agree_flag_modal_title: "Onayla ve..." - agree_flag_hide_post: "Onayla (gönderiyi gizle + özel mesaj yolla)" - agree_flag_hide_post_title: "Bu gönderiyi gizle ve otomatik olarak kullanıcıya acilen düzenleme yapmasını belirten bir mesaj gönder" + agree_flag_hide_post: "Onayla (gönderiyi gizle + özel ileti yolla)" + agree_flag_hide_post_title: "Bu gönderiyi gizle ve otomatik olarak kullanıcıya acilen düzenleme yapmasını belirten bir ileti gönder" agree_flag_restore_post: "Kabul ediyorum (gönderiyi geri getir)" agree_flag_restore_post_title: "Gönderiyi geri getir" agree_flag: "Bildirimi onayla" @@ -2080,7 +2118,7 @@ tr_TR: incoming_email: "Özel gelen e-posta adresi" incoming_email_placeholder: "e-posta adresi girin" flair_url: "Avatar Kabiliyet Resmi" - flair_url_placeholder: "(Seçeneksel) Resim URL'i ya da Font Awesome sınıfı" + flair_url_placeholder: "(İsteğe bağlı) Resim URL'i ya da Font Awesome sınıfı" flair_bg_color: "Avatar Kabiliyet Arkaplan Rengi" flair_bg_color_placeholder: "(İsteğe bağlı) Hex renk değeri" flair_color: "Avatar Kabiliyet Resmi" @@ -2235,7 +2273,7 @@ tr_TR: confirm: "Veritabanını çalışan son haline döndürmek istediğinize emin misiniz?" export_csv: user_archive_confirm: "Gönderilerinizi indirmek istediğinize emin misiniz ?" - success: "Dışarı aktarma başlatıldı, işlem tamamlandığında mesajla bilgilendirileceksiniz." + success: "Dışarı aktarma başlatıldı, işlem tamamlandığında iletiyle bilgilendirileceksiniz." failed: "Dışa aktarırken hata oluştu. Lütfen kayıtları kontrol edin." rate_limit_error: "Gönderiler günde bir kez indirilebilir, lütfen yarın tekrar deneyin." button_text: "Dışa aktar" @@ -2560,7 +2598,7 @@ tr_TR: edit_title: "Başlığı Düzenle" save_title: "Başlığı Kaydet" refresh_browsers: "Tarayıcıyı sayfa yenilemesine zorla" - refresh_browsers_message: "Mesaj tüm kullanıcılara gönderildi!" + refresh_browsers_message: "İleti tüm kullanıcılara gönderildi!" show_public_profile: "Herkese Açık Profili Görüntüle" impersonate: 'Rolüne gir' ip_lookup: "IP Arama" @@ -2765,7 +2803,7 @@ tr_TR: modal_title: Rozet Gruplamaları granted_by: Tarafından Verildi granted_at: Tarihinde Verildi - reason_help: (Bir mesaj ya da konuya bağlantı) + reason_help: (Bir gönderi ya da konuya bağlantı) save: Kaydet delete: Sil delete_confirm: Bu rozeti silmek istediğinize emin misiniz? diff --git a/config/locales/client.vi.yml b/config/locales/client.vi.yml index 3a4a237599..eec1dd04bf 100644 --- a/config/locales/client.vi.yml +++ b/config/locales/client.vi.yml @@ -942,7 +942,6 @@ vi: title: "tìm kiếm chủ đề, bài viết, tài khoản hoặc các danh mục" no_results: "Không tìm thấy kết quả." no_more_results: "Không tìm thấy kết quả" - search_help: Giúp đỡ tìm kiếm searching: "Đang tìm ..." post_format: "#{{post_number}} bởi {{username}}" context: diff --git a/config/locales/client.zh_CN.yml b/config/locales/client.zh_CN.yml index df00b96aac..3ccb7a07c4 100644 --- a/config/locales/client.zh_CN.yml +++ b/config/locales/client.zh_CN.yml @@ -1023,7 +1023,6 @@ zh_CN: title: "搜索主题、帖子、用户或分类" no_results: "没有找到结果。" no_more_results: "没有找到更多结果。" - search_help: 搜索帮助 searching: "搜索中..." post_format: "#{{post_number}} 来自于 {{username}}" context: @@ -1744,8 +1743,6 @@ zh_CN: readonly: "阅读" lightbox: download: "下载" - search_help: - title: '搜索帮助' keyboard_shortcuts_help: title: '键盘快捷键' jump_to: diff --git a/config/locales/client.zh_TW.yml b/config/locales/client.zh_TW.yml index c3f984e88d..07adb33be1 100644 --- a/config/locales/client.zh_TW.yml +++ b/config/locales/client.zh_TW.yml @@ -798,7 +798,6 @@ zh_TW: title: "搜尋討論話題、文章、用戶或分類" no_results: "未找到任何結果。" no_more_results: "沒有找到更多的結果。" - search_help: 搜尋幫助 searching: "正在搜尋..." post_format: "#{{post_number}} {{username}}" context: diff --git a/config/locales/server.bs_BA.yml b/config/locales/server.bs_BA.yml index 6b83559f6d..59505b6719 100644 --- a/config/locales/server.bs_BA.yml +++ b/config/locales/server.bs_BA.yml @@ -10,13 +10,32 @@ bs_BA: short_date_no_year: "D MMM" short_date: "D MMM, YYYY" long_date: "MMMM D, YYYY h:mma" + datetime_formats: &datetime_formats + formats: + short: "%d.%m.%Y." + short_no_year: "%B %-d" + date_only: "%B %-d, %Y" + long: "%B %-d, %Y, %l:%M%P" + date: + month_names: [null, Januar, Februar, Mart, April, Maj, Juni, Juli, August, Septembar, Oktobar, Novembar, Decembar] + <<: *datetime_formats + time: + am: "am" + pm: "pm" + <<: *datetime_formats title: "Discourse" topics: "Topics" posts: "posts" loading: "Loading" powered_by_html: 'Powered by Discourse, best viewed with JavaScript enabled' log_in: "Log In" + purge_reason: "Automatski obrisan kao napušten, deaktiviran račun" disable_remote_images_download_reason: "Remote images download was disabled because there wasn't enough disk space available." + anonymous: "Anoniman" + emails: + incoming: + default_subject: "Dolazna poruka pošte %{email}" + show_trimmed_content: "Prikaži skraćeni sadržaj" errors: &errors messages: too_long_validation: "is limited to %{max} characters; you entered %{length}." @@ -191,11 +210,19 @@ bs_BA: change_failed_explanation: "You attempted to demote %{user_name} to '%{new_trust_level}'. However their trust level is already '%{current_trust_level}'. %{user_name} will remain at '%{current_trust_level}' - if you wish to demote user lock trust level first" rate_limiter: too_many_requests: "We have a daily limit on how many times that action can be taken. Please wait %{time_left} before trying again." + hours: + one: "1 sat" + few: "Par sati" + other: "%{count} sati" datetime: distance_in_words: half_a_minute: "< 1m" distance_in_words_verbose: half_a_minute: "just now" + about_x_hours: + one: "Pred 1 sat" + few: "Pred par sati" + other: "Pred %{count} sata" password_reset: choose_new: "Odaberite novu šifru" choose: "Molimo vas odaberite šifru" @@ -347,6 +374,8 @@ bs_BA: title: "Top Referred Topics" xaxis: "Topic" num_clicks: "Clicks" + time_to_first_response: + yaxis: "Prosječno vrijeme (hours)" dashboard: rails_env_warning: "Your server is running in %{env} mode." host_names_warning: "Your config/database.yml file is using the default localhost hostname. Update it to use your site's hostname." diff --git a/config/locales/server.de.yml b/config/locales/server.de.yml index 94ee739cfa..1da5dc5b6a 100644 --- a/config/locales/server.de.yml +++ b/config/locales/server.de.yml @@ -964,6 +964,7 @@ de: external_system_avatars_enabled: "Benutze einen externen Avatar Service" external_system_avatars_url: "URL des externen Profilbild-Dienstes. Erlaubte Platzhalter sind {username} {first_letter} {color} {size}" default_opengraph_image_url: "URL des standardmäßigen Open-Graph-Bildes." + twitter_summary_large_image_url: "URL des Bildes, das standardmäßig in Twitter-Cards angezeigt wird (sollte mindestens 280 Pixel breit und 150 Pixel hoch sein)." allow_all_attachments_for_group_messages: "Erlaube alle E-Mail-Anhänge für Gruppen-Nachrichten." convert_pasted_images_to_hq_jpg: "Konvertiert eingefügte Bilder in JPG-Dateien mit hoher Qualität." convert_pasted_images_quality: "Qualität der umgewandelten JPG Datei (1 ist die niedrigste, 100 die beste Qualität)." @@ -996,6 +997,7 @@ de: tl3_links_no_follow: "rel=nofollow nicht von Links entfernen, die von Benutzern mit Vertrauensstufe 3 erstellt wurden." min_trust_to_create_topic: "Die minimale Vertrauensstufe wird benötigt um eine neues Thema zu erstellen." min_trust_to_edit_wiki_post: "Die minimal benötigte Vertrauensstufe, um als Wiki markierte Beiträge bearbeiten zu können." + min_trust_to_edit_post: "Die minimal benötigte Vertrauensstufe, um Beiträge bearbeiten zu können." min_trust_to_allow_self_wiki: "Die minimale Vertrauensstufe, die ein Benutzer haben muss, um einen eigenen Wiki Eintrag zu erstellen." min_trust_to_send_messages: "Benötigte Vertrauensstufe um neue private Nachrichten erstellen zu dürfen." newuser_max_links: "Maximale Anzahl der Links, die neue Benutzer Beiträgen hinzufügen dürfen." @@ -1133,6 +1135,7 @@ de: automatically_unpin_topics: "Themen automatisch loslösen, wenn ein Benutzer das Ende erreicht." read_time_word_count: "Wörter pro Minute für die Berechnung der geschätzten Lesezeit." topic_page_title_includes_category: "Name des Themas enthält den Namen der Kategorie." + max_prints_per_hour_per_user: "Maximale Anzahl von Aufrufen der Druckansicht pro Nutzer pro Stunde (0 zum deaktivieren)" full_name_required: "Der voller Name wird für das Benutzerprofil benötigt." enable_names: "Zeigt den vollen Namen eines Benutzers auf dem Profil, der Benutzerkarte und in E-Mails an. Wenn deaktiviert wird der volle Name überall ausgeblendet." display_name_on_posts: "Zeige zusätzlich zum @Benutzernamen auch den vollen Namen des Benutzers bei seinen Beiträgen." @@ -1166,6 +1169,7 @@ de: enforce_square_emoji: "Emojis immer mit quadratischem Seitenverhältnis darstellen." approve_post_count: "Anzahl der Beiträge eines neuen Benutzer oder Anwärters, die genehmigt werden müssen" approve_unless_trust_level: "Beiträge von Benutzer unterhalb dieser Vertrauensstufe müssen genehmigt werden" + approve_new_topics_unless_trust_level: "Beiträge von Benutzer unterhalb dieser Vertrauensstufe müssen genehmigt werden" notify_about_queued_posts_after: "Wenn es Beiträge gibt, die länger als diese Anzahl von Stunden auf ihre Überprüfung gewartet haben, sende eine E-Mail an contact_email. Setze sie auf 0, um diese E-Mails zu deaktivieren." auto_close_messages_post_count: "Maximale Anzahl von Beiträgen, die in einer Nachricht erlaubt sind, bevor sie automatisch geschlossen wird (0 = ausgeschaltet)" auto_close_topics_post_count: "Maximale Anzahl von Beiträgen, die in einem Thema erlaubt sind, bevor es automatisch geschlossen wird (0 = ausgeschaltet)" @@ -2587,35 +2591,6 @@ de: Wenn wir uns dazu entscheiden, unsere Datenschutzbestimmungen zu ändern, werden wir diese Änderungen auf dieser Seite veröffentlichen. Dieses Dokument ist als CC-BY-SA lizensiert. Es wurde zuletzt aktualisiert am am 31. Mai 2013. - static: - search_help: | -

Tipps

-

-

    -
  • Suchtreffer in Titeln haben Vorrang – im Zweifel einfach nach Titeln suchen
  • -
  • Eindeutige, seltene Wörter erzielen die besten Suchergebnisse
  • -
  • Versuche, innerhalb einer bestimmten Kategorie, eines bestimmten Themas oder Benutzers zu suchen
  • -
-

-

Optionen

-

- - - - - - - -
order:viewsorder:latestorder:likes@usernameuser:foo
status:openstatus:closedstatus:archivedstatus:norepliesstatus:single_user
#category-slugcategory:foogroup:foobadge:foo
in:likesin:postedin:watchingin:trackingin:private
in:bookmarksin:firstin:pinnedin:unpinnedin:wiki
posts_count:numbefore:days or dateafter:days or datetags:one,two
-

-

Beispiele

-

-

    -
  • Regenbogen #Parks sucht nach Themen in der Kategorie "Parks", die das Wort "Regenbogen" enthalten.
  • -
  • Regenbogen category:parks status:open order:latest sucht nach Themen in der Kategorie "Parks", die das Wort "Regenbogen" enthalten und die nicht geschlossen oder archiviert sind; die Treffer werden nach dem Datum des letzten Beitrags sortiert.
  • -
  • Regenbogen category:"Parks und Gärten" in:bookmarks sucht nach Themen, die das Wort "Regenbogen" in der Kategorie "Parks und Gärten" erhalten und von dir mit einem Lesezeichen markiert sind.
  • -
-

badges: editor: name: Bearbeiter diff --git a/config/locales/server.es.yml b/config/locales/server.es.yml index da3c816c80..2dfa6680ec 100644 --- a/config/locales/server.es.yml +++ b/config/locales/server.es.yml @@ -2195,35 +2195,6 @@ es: Si decidimos cambiar nuestra política de privacidad, publicaremos los cambios en esta misma página. Este documento tiene una licencia "CC-BY-SA". Última actualización: 31 de mayo del 2013. - static: - search_help: | -

Consejos

-

-

    -
  • Se priorizan las coincidencias por título – si tienes dudas, buscar por títulos
  • -
  • Buscar palabras diferentes, poco comunes, dará mejores resultados
  • -
  • Intenta centrar tu búsqueda con una categoría, tema o usuario en particular
  • -
-

-

Opciones

-

- - - - - - - -
order:viewsorder:latestorder:likes@usernameuser:foo
status:openstatus:closedstatus:archivedstatus:norepliesstatus:single_user
#category-slugcategory:foogroup:foobadge:foo
in:likesin:postedin:watchingin:trackingin:private
in:bookmarksin:firstin:pinnedin:unpinnedin:wiki
posts_count:numbefore:days or dateafter:days or datetags:one,two
-

-

Ejemplos

-

-

    -
  • arcoiris #parques buscará temas que contengan la palabra "arcoiris" en la categoría "parques".
  • -
  • arcoiris category:parques status:open order:latest buscará temas que contengan la palabra "arcoiris" en la categoría "parques" que no estén cerrados o archivados, ordenados por la fecha del último post.
  • -
  • arcoiris category:"parques" in:bookmarks buscará temas que contengan la palabra "arcoiris" en la categoría "parques" que hayas guardado en marcadores.
  • -
-

badges: editor: name: Editor diff --git a/config/locales/server.fi.yml b/config/locales/server.fi.yml index b811dd8f94..9c449eaf82 100644 --- a/config/locales/server.fi.yml +++ b/config/locales/server.fi.yml @@ -981,6 +981,7 @@ fi: tl3_links_no_follow: "Älä poista rel=nofollow -attribuuttia linkeistä luottamustason 3 käyttäjiltä." min_trust_to_create_topic: "Ketjun luomiseksi vaadittava luottamustaso." min_trust_to_edit_wiki_post: "Wikiviestin muokkaamiseen vaadittava luottamustaso." + min_trust_to_edit_post: "Viestin muokkaamiseen vaadittava luottamustaso." min_trust_to_allow_self_wiki: "Minimiluottamustaso, jolla käyttäjä voi tehdä omasta viestistään wiki-viestin." min_trust_to_send_messages: "Yksityisviestien luomiseen vaadittava luottamustaso" newuser_max_links: "Kuinka monta linkkiä uusi käyttäjä voi lisätä viestiin." @@ -1145,6 +1146,7 @@ fi: enforce_square_emoji: "Pakota neliö kuvasuhteeksi kaikille emojille." approve_post_count: "Viestien lukumäärä, joka tarkastetaan uusilta käyttäjiltä ja haastajilta." approve_unless_trust_level: "Tätä luottamustasoa alhaisempien käyttäjien viestit tarkastetaan" + approve_new_topics_unless_trust_level: "Tätä luottamustasoa alhaisempien käyttäjien luomat ketjut tarkastetaan" notify_about_queued_posts_after: "Jos viesti on odottanut hyväksyntää kauemmin kuin näin monta tuntia, sähköpostiviesti lähetetään contact_email osoitteeseen. Aseta 0 ottaaksesi pois käytöstä." auto_close_messages_post_count: "Maksimimäärä viestejä yksityisketjussa, kunnes se suljetaan automaattisesti (0 poistaaksesi käytöstä)" auto_close_topics_post_count: "Maksimimäärä viestejä ketjussa, kunnes se suljetaan automaattisesti (0 poistaaksesi käytöstä)" @@ -1663,6 +1665,7 @@ fi: Käyttäjätili tällä sähköpostiosoitteella on estetty. email_reject_reply_user_not_matching: + 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. @@ -1683,6 +1686,7 @@ fi: Jos saat tämän viestin ja viestisi _sisälsi_ sisältöä, yritä uudestaan yksinkertaisemmalla muotoilulla. email_reject_parsing: + 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. @@ -2268,36 +2272,6 @@ fi: title: "Käyttöehdot" privacy_topic: title: "Rekisteriseloste" - static: - search_help: |+ -

Vinkkejä

-

-

    -
  • Otsikon vastaavuudet ovat etusijalla – jos olet epävarma, hae otsikkoa
  • -
  • Parhaat tulokset saa uniikeilla ja harvinaisilla sanoilla
  • -
  • Voit kokeilla etsiä tietyn alueen, ketjun tai käyttäjän viesteistä
  • -
-

-

Valinnat

-

- - - - - - - -
order:viewsorder:latestorder:likes@usernameuser:foo
status:openstatus:closedstatus:archivedstatus:norepliesstatus:single_user
#category-slugcategory:foogroup:foobadge:foo
in:likesin:postedin:watchingin:trackingin:private
in:bookmarksin:firstin:pinnedin:unpinnedin:wiki
posts_count:numbefore:days or dateafter:days or datetags:one,two
-

-

Esimerkkejä

-

-

    -
  • rainbows #parks hakee alueelta "parks" ketjuja, joissa esiintyy sana "rainbows".
  • -
  • rainbows category:parks status:open order:latest etsii alueelta "parks" ketjuja, joissa esiintyy sana "rainbows" ja joita ei suljettu tai arkistoitu, ja esittää ylimmäisinä ne ketjut, joihin on viimeksi kirjoitettu.
  • -
  • rainbows category:"parks and gardens" in:bookmarks etsii alueelta "parks and gardens" kirjanmerkkeihin lisäämiäsi ketjuja, joissa esiintyy sana "rainbows".
  • -
-

- badges: editor: name: Muokkaaja diff --git a/config/locales/server.fr.yml b/config/locales/server.fr.yml index 2084394787..7ff157c55a 100644 --- a/config/locales/server.fr.yml +++ b/config/locales/server.fr.yml @@ -1135,6 +1135,7 @@ fr: automatically_unpin_topics: "Désépingler automatiquement le sujet lorsque l'utilisateur atteint la fin." read_time_word_count: "Nombre de mots par minute servant de base de calcul à l'estimation du temps de lecture." topic_page_title_includes_category: "Le titre de la page du sujet inclut le nom de la catégorie." + max_prints_per_hour_per_user: "Nombre maximum d'accès à la page /print (mettre à 0 pour désactiver)" full_name_required: "Le nom complet est requis dans le profil utilisateur." enable_names: "Autoriser l'affichage des noms complets des utilisateurs dans leur profil, sur leur carte d'utilisateur et dans les courriels. Décocher pour cacher les noms complets partout." display_name_on_posts: "Afficher le nom complet de l'utilisateur dans ses messages en plus de son @pseudo." @@ -1168,6 +1169,7 @@ fr: enforce_square_emoji: "Forcer tous les Emojis à être carrés." approve_post_count: "Le nombre de messages d'un utilisateur nouveau ou basique devant être approuvés" approve_unless_trust_level: "Les messages des utilisateurs qui n'ont pas atteint ce niveau de confiance doivent être approuvés" + approve_new_topics_unless_trust_level: "Les nouveaux sujets des utilisateurs en dessous de ce niveau de confiance doivent être approuvés" notify_about_queued_posts_after: "Si des messages sont en attente de modération depuis ce nombre d'heures, un courriel sera envoyé à l'email de contact. Mettre 0 pour désactiver ces courriels." auto_close_messages_post_count: "Nombre maximum de messages dans un message privé avant qu'il ne soit automatiquement fermé (0 pour désactiver)" auto_close_topics_post_count: "Nombre maximum de messages dans un sujet avant qu'il ne soit automatiquement fermé (0 pour désactiver)" @@ -1184,6 +1186,7 @@ fr: default_email_in_reply_to: "Inclure par défaut l'extrait du message auquel se fait la réponse dans les courriels." default_other_new_topic_duration_minutes: "Paramètre global de temps pendant lequel un sujet est considéré comme nouveau." default_other_auto_track_topics_after_msecs: "Paramètre global fixant le temps par défaut au bout duquel un sujet est suivi automatiquement." + default_other_notification_level_when_replying: "Niveau de notification global par défaut quand un utilisateur répond à un sujet." default_other_external_links_in_new_tab: "Par défaut, ouvrir tous les liens externes dans un nouvel onglet" default_other_enable_quoting: "Par défaut, proposer la citation du texte surligné." default_other_dynamic_favicon: "Par défaut, faire apparaître le nombre de sujets récemment créés ou mis à jour sur l'icône navigateur." @@ -2388,35 +2391,6 @@ fr: ## [Changements à notre politique de confidentialité](#changes) Si nous décidons de changer notre politique de confidentialité, nous afficherons ces modifications sur cette page. Ce document est soumis à la licence creative commons CC-BY-SA. Il a été mis à jour le 31 mai 2013. - static: - search_help: | -

Astuces

-

-

    -
  • Les résultats dont le titre correspond à la recherche sont retournés en priorité – en cas de doutes, recherchez dans les titres
  • -
  • Pour obtenir de meilleurs résultats, utilisez toujours des mots rares ou peu fréquents
  • -
  • Dès que possible, limitez vos recherches à une catégorie en particulier, à un utilisateur ou à un sujet
  • -
-

-

Options

-

- - - - - - - -
order:viewsorder:latestorder:likes@usernameuser:foo
status:openstatus:closedstatus:archivedstatus:norepliesstatus:single_user
#category-slugcategory:foogroup:foobadge:foo
in:likesin:postedin:watchingin:trackingin:private
in:bookmarksin:firstin:pinnedin:unpinnedin:wiki
posts_count:numbefore:days or dateafter:days or datetags:one,two
-

-

Exemples

-

-

    -
  • rainbows #parks cherchera les sujets dans la catégorie "parks" qui contiennent le mot "rainbows".
  • -
  • rainbows category:parks status:open order:latest cherchera les sujets dans la catégorie "parks" en ordre chronologique qui contiennent le mot "rainbows" et qui ne sont ni fermé ni archivé. -
  • rainbows category:"parks and gardens" in:bookmarks cherchera les sujets dans la catégorie "parks and gardens" qui contiennent le mot "rainbows" et qui sont dans vos signets.
  • -
-

badges: editor: name: Éditeur diff --git a/config/locales/server.he.yml b/config/locales/server.he.yml index b12467f980..c5e64c8080 100644 --- a/config/locales/server.he.yml +++ b/config/locales/server.he.yml @@ -502,7 +502,7 @@ he: email_body: "%{link}\n\n%{message}" inappropriate: title: 'לא ראוי' - description: 'פוסט זה מכיל תוכן שאדם סביר היה רואה כפוגעני, מתעלל או הפרה של כללי הקהילה .' + description: 'פוסט זה מכיל תוכן שאדם סביר היה רואה כפוגעני, מתעלל או הפרה של כללי הקהילה.' long_form: 'דוגלל כלא ראוי' notify_user: title: 'שלחו הודעה ל @{{username}}' @@ -1132,6 +1132,7 @@ he: automatically_unpin_topics: "הסרת נעיצה אוטומטית של נושאים כאשר המשתמשים מגיעים לתחתית." read_time_word_count: "מספר המילים לדקה כדי להעריך את זמן הקריאה." topic_page_title_includes_category: "כותרת דף נושא כוללת את שם הקטגוריה." + max_prints_per_hour_per_user: "מספר מקסימלי של צפיות בדף /print (הדפסה) (קיבעו ל 0 כדי לנטרל)" full_name_required: "שם מלא הוא שדה נדרש לפרופיל משתמש/ת." enable_names: "הצגת השם המלא של המשתמש/ת בעמודי הפרופיל שלהם, בכרטיסי המשתמ ובדוא\"ל שלהם. נטרול הסתרת השם המלא בכל מקום." display_name_on_posts: "הצגת שמם המלא של משתמשים בפרסומיהם, בנוסף ל@שם_המשתמש שלהם." @@ -1165,6 +1166,7 @@ he: enforce_square_emoji: "חובת מימדי ריבועיים בכל ה-emojis." approve_post_count: "מספר הפוסטים ממשתמשים חדשים או בסיסיים שחייבים לאשר אותם" approve_unless_trust_level: "פוסטים של משתמשים מתחת לרמת אמון זו חייבים לעבור אישור" + approve_new_topics_unless_trust_level: "נושאים חדשים עבור משתמשים מתחת לרמת אמון זו חייבים להיות מאושרים" notify_about_queued_posts_after: "אם יש פוסטים שהמתינו לסקירה ליותר מכמות השעות הזו, יישלח מייל ל contact_email. קבעו 0 כדי לנטרל את המיילים האלו." auto_close_messages_post_count: "מספר פוסטים מקסימלי בהודעה לפני שהיא נסגרת אוטומטית (0 לניטרול)" auto_close_topics_post_count: "מספר מקסימלי של פוסטים בנושא לפני שהוא נסגר אוטומטית (0 לניטרול)" @@ -1181,6 +1183,7 @@ he: default_email_in_reply_to: "הכללת קטע של פוסט עליו עונים במיילים כברירת מחדל." default_other_new_topic_duration_minutes: "ברירת המחדל הגלובאלית עבור תנאי שבשבילו נושא ייחשב חדש." default_other_auto_track_topics_after_msecs: "ברירת המחדל הגלובאלית עבור הזמן לפני שנושא נעקב אוטומטית" + default_other_notification_level_when_replying: "ברירת מחדל גלובלית של רמת התראה כאשר משתמשים מגיבים לנושא." default_other_external_links_in_new_tab: "פתח קישורים חיצונים בטאב חדש, בתור ברירת מחדל." default_other_enable_quoting: "איפשור תגובות עם ציטוט לטקסט מצוטט כברירת מחדל." default_other_dynamic_favicon: "הציגו ספירה של נושאים חדשים/מעודכנים באייקון של הדפדפן כברירת מחדל." @@ -2612,35 +2615,6 @@ he: אם נחליט לשנות את מדיניות הפרטיות שלנו, נפרסם שינויים אלו בדף זה. מסמך זה הוא CC-BY-SA. הוא עודכן לאחרונה ב 25 לספטמבר 2016. - static: - search_help: | -

טיפים

-

-

    -
  • התאמות לכותרות מתועדפות גבוה יותר - כשיש ספק, חפשו אחר כותרות
  • -
  • מילים ייחודיות ולא נפוצות יתנו את התוצאות הטובות ביותר
  • -
  • נסו לחפש בקטגוריה ספציפית, נושא ספציפי, או משתמש ספציפי
  • -
-

-

אפשרויות

-

- - - - - - - -
order:viewsorder:latestorder:likes@usernameuser:foo
status:openstatus:closedstatus:archivedstatus:norepliesstatus:single_user
#category-slugcategory:foogroup:foobadge:foo
in:likesin:postedin:watchingin:trackingin:private
in:bookmarksin:firstin:pinnedin:unpinnedin:wiki
posts_count:numbefore:days or dateafter:days or datetags:one,two
-

-

דוגמאות

-

-

    -
  • קשת-בענן #פארקים יחפש נושאים שמכילים את המילה ״קשת-בענן״ בקטגוריה שנקראת ״פארקים״.
  • -
  • קשת-בענן category:פארקים status:open order:latest יחפש אחר נושאים שמכילים את המילה ״קשת-בענן״ בקטגוריה ״פארקים״ שאינם סגורים או מאורכבים, מסודרים לפי תאריך הפוסט האחרון.
  • -
  • קשת-בענן category:"פארקים וגנים" in:bookmarks יחפש אחר נושאים שמכילים את המילה ״קשת-בענן״ בקטגוריה ״פארקים וגנים״ שסימנתם עם סימנייה.
  • -
-

badges: editor: name: עורכים diff --git a/config/locales/server.ja.yml b/config/locales/server.ja.yml index 1f0a0378cc..04cca44dab 100644 --- a/config/locales/server.ja.yml +++ b/config/locales/server.ja.yml @@ -1278,35 +1278,6 @@ ja: title: "利用規約" privacy_topic: title: "プライバシーポリシー" - static: - search_help: | -

Tips

-

-

    -
  • タイトルが優先されます – わからない時はタイトルで調べてみましょう
  • -
  • かぶりにくい単語、調べたいものに近い言葉を使うとピッタリな検索結果が出てきます。
  • -
  • カテゴリ、トピック、またはユーザ単位で検索してみましょう
  • -
-

-

オプション

-

- - - - - - - -
order:viewsorder:latestorder:likes@usernameuser:foo
status:openstatus:closedstatus:archivedstatus:norepliesstatus:single_user
#category-slugcategory:foogroup:foobadge:foo
in:likesin:postedin:watchingin:trackingin:private
in:bookmarksin:firstin:pinnedin:unpinnedin:wiki
posts_count:numbefore:days or dateafter:days or datetags:one,two
-

-

-

-

    -
  • rainbows #parks では"parks"のカテゴリから"rainbows"という単語を検索します。
  • -
  • rainbows category:parks status:open order:latest では"parks"のカテゴリ、"rainbows"という単語を検索し、最後の投稿の日付順に並べ、クローズ/アーカイブされていないトピックを検索します。
  • -
  • rainbows category:"parks and gardens" in:bookmarks では、ブックマークしている"parks and gardens"カテゴリから、"rainbows"という単語を含むトピックを検索します。
  • -
-

badges: editor: name: 編集者 diff --git a/config/locales/server.ro.yml b/config/locales/server.ro.yml index 9c053a5056..ff2a52d778 100644 --- a/config/locales/server.ro.yml +++ b/config/locales/server.ro.yml @@ -1175,6 +1175,7 @@ ro: automatically_unpin_topics: "Desprinde automat subiecte când utilizatorul ajunge la sfârșitul paginii." read_time_word_count: "Contor de cuvinte pe minut pentru calcularea timpului estimat de citire." topic_page_title_includes_category: "Titlul paginii subiectului include un nume de categorie." + max_prints_per_hour_per_user: "Numărul maxim de amprente de vizualizare lăsate pentru /print (0 pentru dezactivare)" full_name_required: "Numele întreg este un câmp obligatoriu în profilul utilizator." enable_names: "Afișează numele întreg al utilizatorului în profilul său, în cardul utilizator și în emailuri. Dezactivează pentru ascunde numele peste tot." display_name_on_posts: "Arată atât numele complet cât și numele de utilizator în postări." @@ -1208,6 +1209,7 @@ ro: enforce_square_emoji: "Forțează un aspect pătrățos la toti emoji." approve_post_count: "Numărul de postări de la un utilizator simplu trebuie să fie aprobat" approve_unless_trust_level: "Postările utilizatorilor care au un nivel de încredere mai mic decât acesta trebuie să fie aprobate." + approve_new_topics_unless_trust_level: "Crearea de subiecte noi pentru utilizatorii care se află sub acest nivel de încredere, trebuie aprobată" notify_about_queued_posts_after: "Dacă există postări care au așteptat să fie verificate mai mult de atâtea ore, un email va fi trimis către contact_email. Setează la 0 pentru a dezactiva aceste emailuri." auto_close_messages_post_count: "Numărul maxim de postări permise într-un mesaj privat înainte să fie închis automat (0 pentru dezactivare) " auto_close_topics_post_count: "Numărul maxim de postări permise într-un subiect înainte ca acesta să fie închis automat (0 pentru dezactivare)" @@ -1224,6 +1226,7 @@ ro: default_email_in_reply_to: "Implicit, include în email un extras postarea căreia i se răspunde." default_other_new_topic_duration_minutes: "Condiție implicită globală referitoare la durata timpului pentru care subiectul este considerat nou" default_other_auto_track_topics_after_msecs: "Durata de timp implicită la nivel global înainte ca un subiect să fie urmărit în mod automat." + default_other_notification_level_when_replying: "Nivelul global implicit de notificare atunci când un utilizator răspunde la un subiect." default_other_external_links_in_new_tab: "Implicit, deschide link-urile externe în taburi noi." default_other_enable_quoting: "Implicit, activează citarea textului evidențiat." default_other_dynamic_favicon: "Implicit, arată contorul de subiecte noi/actualizate în icoana browserului." @@ -2189,7 +2192,7 @@ ro: new_activity: "Activități noi în subiectele și postările tale:" top_topics: "Postări populare" other_new_topics: "Subiecte populare" - unsubscribe: "Acest rezumat este transmis de pe %{site_link} când a trecut ceva vreme de când nu te-am mai văzut. Pentru a te dezabona, dă clic pe %{unsubscribe_link}." + unsubscribe: "Acest rezumat este transmis de pe %{site_link} când a trecut ceva vreme de când nu te-am mai văzut. Pentru a te dezabona, %{unsubscribe_link}." click_here: "click aici" from: "%{site_name} rezumat" read_more: "Citește mai mult" @@ -2533,35 +2536,6 @@ ro: Dacă decidem să ne schimbăm politica de confidențialitate, vom afișa schimbările în această pagină. Acest document se supune licenței creative commons CC-BY-SA. A fost actualizat ultima dată pe 31 mai 2013. - static: - search_help: | -

Sfaturi

-

-

    -
  • Rezultatele în care titlul corespunde căutării sunt prioritizate – în caz de dubiu, caută în titluri
  • -
  • Cele mai bune rezultate le dau cuvintele unice, altele decât cele obșnuite
  • -
  • Încearcă căutarea în cadrul unei categorii anume, a unui subiect sau utilizator
  • -
-

-

Opțiuni

-

- - - - - - - -
ordine:vizualizăriordine:recenteordine:aprecieri@usernameutilizator:foo
stare:deschisestare:închisestare:arhivatestare:fărărăspunsstare:utilizator_unic
#categorie-slugcategorie:foogrup:fooecuson:foo
in:aprecieriîn:postateîn:urmărite_activîn:urmăriteîn:privat
în:semne de carteîn:primaîn:fixateîn:detașateîn:wiki
posts_count:numînainte:zile sau datădupă:zile sau datătags:one,two
-

-

Exemple

-

-

    -
  • curcubee #parcuri va căuta după postările care conțin cuvîntul "curcubee" în categoria "parcuri".
  • -
  • curcubee categorie:parcuri stare:deschise ordine:recente va căuta după subiecte care conțin cuvântul "curcubee" în categoria "parcuri" și care nu sunt închise or arhivate, ordonate după data ultimei postări.
  • -
  • curcubee categorie:"parcuri și grădini" în:semne de carte va căuta subiectele care conțin cuvântul "curcubee" în categoria "parcuri și grădini" și care sunt marcate de tine cu semn de carte.
  • -
-

badges: editor: name: Editor diff --git a/config/locales/server.sq.yml b/config/locales/server.sq.yml index 850fa168ad..d8dd1409a6 100644 --- a/config/locales/server.sq.yml +++ b/config/locales/server.sq.yml @@ -80,6 +80,11 @@ sq: replies: one: "1 përgjigje" other: "%{count} përgjigje" + no_mentions_allowed_newuser: "Na vjen keq, anëtarët e rinj nuk mund të citojnë anëtarë të tjerë." + too_many_mentions_newuser: + one: "Na vjen keq, anëtarët e rinj mund të citojnë vetëm 1 anëtar në një postim." + other: "Na vjen keq, anëtarët e rinj mund të citojnë vetëm %{count} anëtarë në një postim." + no_images_allowed: "Na vjen keq, anëtarët e rinj nuk kanë të drejtë të vendosin imazhe në një postim." spamming_host: "Na vjen keq, you cannot post a link to that host." invalid_characters: "përmban karaktere jo të vlefshëm" next_page: "faqja tjetër →" @@ -1226,6 +1231,16 @@ sq: visit_link_to_respond: "[Shiko Temën](%{base_url}%{url}) për tu përgjigjur." visit_link_to_respond_pm: "[Shiko Mesazhin](%{base_url}%/{url}) për tu përgjigjur." posted_by: "Postuar nga %{username} më %{post_date}" + invited_to_private_message_body: | + %{username} ju ftoi tek mesazhi + + > **%{topic_title}** + > + > %{topic_excerpt} + + në + + > %{site_title} -- %{site_description} invited_to_topic_body: | %{username} ju ftoi në një bisedë @@ -1330,8 +1345,18 @@ sq: %{context} %{respond_instructions} + user_watching_first_post: + subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_posted_pm: - subject_template: "[%{site_name}] [PM] %{topic_title}" + subject_template: "[%{site_name}] [MP] %{topic_title}" text_body_template: | %{header_instructions} @@ -1346,20 +1371,25 @@ sq: %{message} digest: - why: "Një përmbledhje e shkurtë e %{site_link} që prej vizitës tuaj të fundit më %{last_seen_at}" - subject_template: "[%{site_name}] Përmbledhje" - new_activity: "New activity on your topics and posts:" + why: "Një përmbledhje e shkurtër e temave tek %{site_link} që prej vizitës tuaj të fundit më %{last_seen_at}" + subject_template: "[%{site_name}] - Një përmbledhje e shkurtër" + new_activity: "Të rejat në temat e postimet tuaja:" top_topics: "Postimet më aktive" - other_new_topics: "Popular topics" + other_new_topics: "Temat më aktive" unsubscribe: "Kjo përmbledhje dërgohet nga %{site_link} kur nuk ju kemi parë prej disa kohësh. Për të çaktivizuar njoftimet %{unsubscribe_link}." click_here: "klikoni këtu" - from: "%{site_name} përmbledhje" - read_more: "Më Shumë" - more_topics: "There were %{new_topics_since_seen} other new topics." + from: "%{site_name} - Një përmbledhje e shkurtër" + read_more: "Më shumë" + more_topics: "Ka edhe %{new_topics_since_seen} tema të reja në faqe." more_topics_category: "Më shumë tema të reja:" mailing_list: subject_template: "[%{site_name}] Përmbledhja për %{date}" + unsubscribe: "Përmbledhja dërgohet përditë, duke qënë se faqja është në formatin \"mailing list\". %{unsubscribe_link} për t'u çabonuar." from: "%{site_name} përmbledhje" + new_topics: "Tema të reja" + topic_updates: "Tema të azhornuara" + view_this_topic: "Shiko këtë temë" + back_to_top: "Kthehu sipër" forgot_password: subject_template: "[%{site_name}] Rivendosje fjalëkalimi" text_body_template: | @@ -1394,7 +1424,14 @@ sq: Klikoni lidhjen e mëtejshme për të zgjedhur një fjalëkalim për llogarinë tuaj të re: %{base_url}/users/password-reset/%{email_token} + confirm_new_email: + subject_template: "[%{site_name}] Konfirmo adresën e re email" + text_body_template: | + Konfirmo adresën e re email për faqen %{site_name} duke klikuar në linkun më poshtë: + + %{base_url}/users/authorize-email/%{email_token} confirm_old_email: + subject_template: "[%{site_name}] Konfirmoni adresën e tanishme email" text_body_template: | Përpara se sa ta ndryshoni adresën tuaj email, nevojitet të konfirmoni që jeni i zoti i saj. Pasi ta përmbushni këtë hap, ne @@ -1403,6 +1440,15 @@ sq: Konfirmoni adresën tuaj të tanishme email për %{site_name} duke klikuar lidhjen e mëtejshme: %{base_url}/users/authorize-email/%{email_token} + notify_old_email: + subject_template: "[%{site_name}] Adresa juaj email u ndryshua" + text_body_template: | + Ky është një mesazh automatik që ju njofton se adresa juaj email për + %{site_name} u ndryshua. Nëse ky është një gabim, njoftoni një administrator + + Adresa e re email në sistem tani është: + + %{new_email} signup_after_approval: subject_template: "Jeni aprovuar tek %{site_name}!" text_body_template: | @@ -1721,34 +1767,6 @@ sq: Originally adapted from the [WordPress Terms of Service](http://en.wordpress.com/tos/). privacy_topic: title: "Politika e Privatësisë" - static: - search_help: | -

Ca sugjerime

-

-

    -
  • Titujt kanë prioritet
  • -
  • Kur jeni brenda një kategorie, teme apo etikete, mund të kërkoni temat e atij konteksti
  • -
-

-

Opsionet

-

- - - - - - - -
order:viewsorder:latestorder:likes@usernameuser:foo
status:openstatus:closedstatus:archivedstatus:norepliesstatus:single_user
#category-slugcategory:foogroup:foobadge:foo
in:likesin:postedin:watchingin:trackingin:private
in:bookmarksin:firstin:pinnedin:unpinnedin:wiki
posts_count:numbefore:days or dateafter:days or datetags:one,two
-

-

Ca shembuj

-

-

    -
  • rainbows #parks do kërkojë fjalën "rainbows" në kategorinë "parks".
  • -
  • rainbows category:parks status:open order:latest do kërkojë për tema me fjalën "rainbows" në kategorinë "parks" që nuk janë mbyllur apo arkivuar, renditur sipas datës së përgjigjes së fundit.
  • -
  • rainbows category:"parks and gardens" in:bookmarks do kërkojë për tema me fjalën "rainbows" në kategorinë "parks and gardens" që ju keni shtuar tek të preferuarat.
  • -
-

badges: editor: name: Redaktor diff --git a/config/locales/server.sv.yml b/config/locales/server.sv.yml index 9c59de1fd4..a05ce22dcb 100644 --- a/config/locales/server.sv.yml +++ b/config/locales/server.sv.yml @@ -2136,35 +2136,6 @@ sv: title: "Villkor" privacy_topic: title: "Integritetspolicy" - static: - search_help: | -

Tips

-

-

    -
  • Matchande rubriker prioriteras – sök efter rubriker om du är osäker
  • -
  • Unika, ovanliga ord kommer att ge bäst resultat
  • -
  • Försök att söka inom en kategori, ett ämne eller en användare
  • -
-

-

Alternativ

-

- - - - - - - -
order:viewsorder:latestorder:likes@usernameuser:foo
status:openstatus:closedstatus:archivedstatus:norepliesstatus:single_user
#category-slugcategory:foogroup:foobadge:foo
in:likesin:postedin:watchingin:trackingin:private
in:bookmarksin:firstin:pinnedin:unpinnedin:wiki
posts_count:numbefore:days or dateafter:days or datetags:one,two
-

-

Exempel

-

-

    -
  • rainbows #parks kommer att söka efter ämnen som innehåller ordet "rainbows" i kategorin "parks".
  • -
  • rainbows category:parks status:open order:latest kommer att söka efter ämnen som innehåller ordet "rainbows" i kategorin "parks" som inte är stängda eller arkiverade, sorterade efter datum på senaste inlägget.
  • -
  • rainbows category:"parks and gardens" in:bookmarks kommer att söka efter ämnen som innehåller ordet "rainbows" i kategorin "parks and gardens" som är bokmärkta av dig.
  • -
-

badges: editor: name: Redigerare diff --git a/config/locales/server.tr_TR.yml b/config/locales/server.tr_TR.yml index 6e7259e257..fca58b2cce 100644 --- a/config/locales/server.tr_TR.yml +++ b/config/locales/server.tr_TR.yml @@ -38,7 +38,7 @@ tr_TR: show_trimmed_content: "Kısaltılmış olan içeriği göster" errors: empty_email_error: "Bize ulaşan ham posta boş olduğunda olur." - no_message_id_error: "E-postanın 'Message-Id' başlığı olmadığında olur" + no_message_id_error: "E-postanın 'Message-Id' başlığı olmadığında olur." inactive_user_error: "Gönderici etkin olmadığında olur." blocked_user_error: "Gönderici engellendiğinde olur." errors: &errors @@ -148,13 +148,13 @@ tr_TR: num_posts: "Gönderiler:" num_participants: "Katılımcılar:" read_full_topic: "Konunun tamamını okuyun" - private_message_abbrev: "Mesaj" + private_message_abbrev: "İlt" rss_description: latest: "En son konular" hot: "Sıcak konular" top: "En iyi konular" posts: "Son gönderiler" - private_posts: "Son özel mesajlar" + private_posts: "Son özel iletiler" group_posts: "%{group_name} tarafından son gönderiler" group_mentions: "%{group_name} tarafından son bahsetmeler" user_posts: "@%{username} tarafından son gönderiler" @@ -255,9 +255,9 @@ tr_TR: topic: attributes: base: - warning_requires_pm: "Özel mesajlara sadece uyarı ekleyebilirsiniz. " + warning_requires_pm: "Özel iletilere sadece uyarı ekleyebilirsiniz. " too_many_users: "Uyarıları aynı anda sadece bir kişiye gönderebilirsiniz." - cant_send_pm: "Üzgünüz, seçtiğiniz kullanıcıya özel mesaj gönderemezsiniz." + cant_send_pm: "Üzgünüz, seçtiğiniz kullanıcıya özel ileti gönderemezsiniz." no_user_selected: "Geçerli bir kullanıcı seçmelisiniz." user: attributes: @@ -285,7 +285,7 @@ tr_TR: meta_category_description: "Bu site, sitenin organizasyonu, nasıl çalıştığı ve nasıl geliştirilebileceği ile ilgili tartışma alanı." staff_category_name: "Görevliler" staff_category_description: "Görevliler arası konuşmalar için özel kategori. Konular sadece yönetici ve moderatörlere gözükür." - assets_topic_body: "Bu kalıcı bir konudur, sadece görevlilere gözükür, site tasarımında kullanılan resim ve dosyaların depolanması için kullanılır. Sakın silmeyin!\n\n\nİşleyiş aşağıdaki gibidir:\n\n\n1. Bu konuyu cevaplayın.\n2. Logolar, simgecikler vb. kullanmak istediğiniz resimleri buraya yükleyin. (Gönderi düzenleyicisindeki yükleme düğmesini kullanabilir, veya resimleri sürükleyip bırakabilir veya kopyalayıp yapıştırabilirsiniz.)\n3. Cevabı gönderin.\n4. Yeni gönderinizdeki resimlere sağ tıklayarak ya da düzenleme ikonuna tıklayıp gönderinizi düzenleyerek resimlerin bağlantılarına ulaşabilirsiniz. Bağlantıları kopyalayın.\n5. Bağlantıları [basit ayarlar](/admin/site_settings/category/required) ilgili bölümlere yapıştırın.\n\n\nEğer farklı dosya tipleri yükleyebilmek istiyorsanız, [dosya ayarları](/admin/site_settings/category/files) sayfasındaki `authorized_extensions` ayarını düzenleyin." + assets_topic_body: "Bu kalıcı bir konudur, sadece görevlilere gözükür, site tasarımında kullanılan resim ve dosyaların depolanması için kullanılır. Sakın silmeyin!\n\n\nŞöyle ki:\n\n1. Bu konuyu cevaplayın.\n2. Görseller, simgecikler vb. kullanmak istediğiniz resimleri buraya yükleyin. (Gönderi düzenleyicisindeki yükleme düğmesini kullanabilir, resimleri sürükleyip bırakabilir veya kopyalayıp yapıştırabilirsiniz.)\n3. Cevabı gönderin.\n4. Yeni gönderinizdeki resimlere sağ tıklayarak ya da düzenleme ikonuna tıklayıp gönderinizi düzenleyerek resimlerin bağlantılarına ulaşabilirsiniz. Bağlantıları kopyalayın.\n5. Bağlantıları [basit ayarlarda](/admin/site_settings/category/required) ilgili bölümlere yapıştırın.\n\n\nEğer farklı dosya tipleri yükleyebilmek istiyorsanız, [dosya ayarları](/admin/site_settings/category/files) sayfasındaki `authorized_extensions` ayarını düzenleyin." lounge_welcome: title: "Lobiye hoş geldiniz" body: |2 @@ -300,7 +300,7 @@ tr_TR: * Herhangi bir konunun kategorisini değiştirebilirsiniz * Eklediğiniz linkler takip edilebilir durumunda olacaktır ([otomatik nofollow] (http://en.wikipedia.org/wiki/Nofollow) kaldırıldı) * Sadece 3. güven seviyesi ve üzerindekilere gözüken özel lobi kategorisine erişebilirsiniz - * Tek bildirmeyle spam içerikli mesajları gizleyebilirsiniz + * Tek bildirmeyle istenmeyen içerikli iletileri gizleyebilirsiniz [Şu anki müdavim seviyedeki kişilerin listesi](/badges/3/regular). Merhaba demeyi unutmayın. @@ -349,11 +349,12 @@ tr_TR: create_post: "Kısa sürede çok sayıda cevap yazmaya çalıştınız. Lütfen tekrar denemeden önce %{time_left} bekleyin." delete_post: "Kısa sürede çok sayıda gönderi silmeye çalıştınız. Lütfen tekrar denemek için %{time_left} bekleyin." topics_per_day: "Bugün oluşturabileceğiniz en fazla konu sayısına ulaştınız. Lütfen tekrar denemek için %{time_left} bekleyin." - pms_per_day: "Bugün oluşturabileceğiniz en fazla mesaj sayısına ulaştınız. Lütfen tekrar denemek için %{time_left} bekleyin." + pms_per_day: "Bugün oluşturabileceğiniz en fazla ileti sayısına ulaştınız. Lütfen tekrar denemek için %{time_left} bekleyin." create_like: "Bugün yapabileceğiniz en fazla beğeni sayısına ulaştınız. Lütfen tekrar denemek için %{time_left} bekleyin." create_bookmark: "Bugün yapabileceğiniz en fazla imleme sayısına ulaştınız. Lütfen tekrar denemek için %{time_left} bekleyin." edit_post: "Bugün yapabileceğiniz en fazla düzenleme sayısına ulaştınız. Lütfen tekrar denemek için %{time_left} bekleyin." live_post_counts: "Canlı gönderi sayımları için çok hızlı istek yapıyorsunuz. Lütfen tekrar denemeden önce %{time_left} bekleyin." + unsubscribe_via_email: "Günlük e-posta ile abonelikten çıkma limitinizi aştınız. Lütfen tekrar denemeden önce %{time_left} bekleyin." hours: other: "%{count} saat" minutes: @@ -452,9 +453,9 @@ tr_TR: description: 'Bu gönderi saldırgan, kötüleyici ya da topluluk yönergelerini ihlal eden içerik barındırmaktadır. ' long_form: 'bunu uygunsuz olarak bildirdi' notify_user: - title: '@{{username}} adlı kullanıcıya mesaj gönder' + title: '@{{username}} adlı kullanıcıya ileti gönder' description: 'Bu kişiyle gönderisi hakkında doğrudan ve gizli olarak konuşmak istiyorum.' - long_form: 'mesaj gönderilen kullanıcı' + long_form: 'ileti gönderilen kullanıcı' email_title: '"%{title}" başlıklı gönderiniz' email_body: "%{link}\n\n%{message}" notify_moderators: @@ -491,7 +492,7 @@ tr_TR: email_title: '"%{title}" konu başlığının moderatör tarafından kontrol edilmesi gerekiyor' email_body: "%{link}\n\n%{message}" flagging: - you_must_edit: '

Gönderiniz topluluk tarafından bildirildi. Lütfen mesajlarınıza göz atın.

' + you_must_edit: '

Gönderiniz topluluk tarafından bildirildi. Lütfen özel iletilerinize göz atın.

' user_must_edit: '

Bu gönderi topluluk tarafından bildirildi ve geçici olarak gizlendi.

' archetypes: regular: @@ -514,6 +515,7 @@ tr_TR: different_user_description: "E-posta gönderdiğimizden farklı bir kullanıcıyla giriş yapmışsınız. Lütfen çıkış yapın, veya anonim moduna geçip tekrar deneyin." log_out: "Çıkış" user_api_key: + title: "Uygulama erişimini yetkilendir" authorize: "Yetkilendir" read: "okuma" read_write: "okuma/yazma" @@ -566,23 +568,23 @@ tr_TR: user_to_user_private_messages: title: "Kullanıcıdan kullanıcıya" xaxis: "Gün" - yaxis: "Mesaj sayısı" + yaxis: "İleti sayısı" system_private_messages: title: "Sistem" xaxis: "Gün" - yaxis: "Mesaj sayısı" + yaxis: "İleti sayısı" moderator_warning_private_messages: title: "Moderatör uyarıları" xaxis: "Gün" - yaxis: "Mesaj sayısı" + yaxis: "İleti sayısı" notify_moderators_private_messages: title: "Moderatör bilgilendirme" xaxis: "Gün" - yaxis: "Mesaj sayısı" + yaxis: "İleti sayısı" notify_user_private_messages: title: "Kullanıcı bilgilendirme" xaxis: "Gün" - yaxis: "Mesaj sayısı" + yaxis: "İleti sayısı" top_referrers: title: "En çok atıfta bulunanlar" xaxis: "Kullanıcı" @@ -683,13 +685,15 @@ tr_TR: set_locale_from_accept_language_header: "anonim kullanıcıların arayüz dilini tarayıcılarının dil başlığından al. (DENEYSELDİR, anonim önbellek ile çalışmaz)" min_post_length: "Gönderide olması gereken en az karakter sayısı" min_first_post_length: "İlk gönderi için (konu içi) izin verilen en az karakter sayısı" - min_private_message_post_length: "Mesaj gönderileri için izin verilen en az karakter sayısı" + min_private_message_post_length: "İleti gönderileri için izin verilen en az karakter sayısı" max_post_length: "Gönderide izin verilen en fazla karakter sayısı" min_topic_title_length: "Konuda olması gereken en az karakter sayısı" max_topic_title_length: "Konu başlığında izin verilen en fazla karakter sayısı" - min_private_message_title_length: "Mesaj başlıkları için izin verilen en az karakter sayısı" + min_private_message_title_length: "İleti başlıkları için izin verilen en az karakter sayısı" min_search_term_length: "Arama için girilecek kelimede olması gereken en az karakter sayısı" search_tokenize_chinese_japanese_korean: " CJK olmayan siteler dahil, -Çince/Japonca/Korece için aramayı bilgileri sıfırlamaya zorla" + search_prefer_recent_posts: "Eğer büyük forumunuzda arama yavaş ise, bu seçenek daha yeni gönderilerin dizine eklenmesini deneyecek" + search_recent_posts_size: "Kaç tane son gönderi dizinde tutulacak" allow_uncategorized_topics: "Konuların kategori seçmeden oluşturulmasına izin ver. DİKKAT: Bu özelliği kapamadan önce kategorisiz tüm konuları kategorize etmeniz lazım." allow_duplicate_topic_titles: "Aynı başlık ile birden çok konu açılmasına izin ver." unique_posts_mins: "Kullanıcının aynı içerikle yeni bir gönderi oluşturmadan önce geçmesi gereken dakika" @@ -721,35 +725,35 @@ tr_TR: show_pinned_excerpt_desktop: "Masaüstü görünümünde başa tutturulmuş konuların özetini göster." post_onebox_maxlength: "Kutulanmış bir Discourse gönderisinin en fazla karakter uzunluğu" onebox_domains_whitelist: "Kutulamaya izin verilen alan adları listesi; bu alan adları OpenGraph ya da oEmbed desteklemeliler. http://iframely.com/debug adresinden test edebilirsiniz." - logo_url: "Sitenin üst solundaki logo resmi, geniş dikdörtgen şeklinde olmalıdır. Boş bırakılırsa site başlığı gösterilecektir." - logo_small_url: "Sitenin üst solundaki küçük logo resmi, kare şeklinde olmalıdır, aşağıya doğru kaydırılırken görünür. Boş bırakılırsa bir ev oyması gösterilecektir." + logo_url: "Sitenin üst solundaki görsel, geniş dikdörtgen şeklinde olmalıdır. Boş bırakılırsa site başlığı gösterilecektir." + logo_small_url: "Sitenin üst solundaki küçük görsel, kare şeklinde olmalıdır, aşağıya doğru kaydırılırken görünür. Boş bırakılırsa bir ev oyması gösterilecektir." favicon_url: "Site simgesi, bilgi için http://en.wikipedia.org/wiki/Favicon adresine bakınız, bir CDN ile doğru şekilde çalışmak için png olmalıdır." - mobile_logo_url: "Mobil sitenin üst solunda kullanılan sabit konumlu logo resmi. Kare şeklinde olmalıdır. Boş bırakılırsa, `logo_url` kullanılacaktır. Örneğin: http://example.com/uploads/default/logo.png" + mobile_logo_url: "Mobil sitenin üst solunda kullanılan sabit konumlu görsel. Kare şeklinde olmalıdır. Boş bırakılırsa, `logo_url` kullanılacaktır. Örneğin: http://ornek.com/uploads/default/gorsel.png" apple_touch_icon_url: "Apple dokunmatik cihazları için kullanılan ikon. Önerilen boyut; 144 x 144 pixel." notification_email: "Tüm önemli sistem e-postaları için kullanılacak olan gönderen e-posta adresi. E-postaların başarıyla ulaşması için buraya girilen alan adının SPF, DKIM ve reverse PTR kayıtlarının doğru yapılması lazım." email_custom_headers: "Sınırlandırılmış özel e-posta başlıkları listesi" email_subject: "Standart e-postaları için özelleştirilebilir konu biçimi. Bakınız https://meta.discourse.org/t/customize-subject-format-for-standard-emails/20801" - force_https: "Sitenizi HTTPS kullanmaya zorlayın. DİKKAT: bu seçeneği HTTPS'nin her yerde doğru bir şekilde çalıştığından emin olmadan SEÇMEYİN. Sitenizde bulunan paylaşım siteleri bağlantılarını, CDN' adresinizi, dışsal bağlantısı olan logolarınızı da kontrol ettiniz mi?" + force_https: "Sitenizi HTTPS kullanmaya zorlayın. DİKKAT: bu seçeneği HTTPS'nin her yerde doğru bir şekilde çalıştığından emin olmadan SEÇMEYİN. Sitenizde bulunan paylaşım siteleri bağlantılarını, CDN' adresinizi, dışsal bağlantısı olan görsellerinizi de kontrol ettiniz mi?" summary_score_threshold: "Bir gönderinin 'Bu Konuyu Özetle' içinde yer alması için gereken en az skor." summary_posts_required: "'Bu Konuyu Özetle'nin etkinleştirilmesi için konuda olması gereken en az gönderi sayısı" summary_likes_required: "'Bu Konuyu Özetle'nin etkinleştirilmesi için konuda olması gereken en az beğeni sayısı" summary_percent_filter: "Kullanıcı 'Bu Konuyu Özetle'ye tıkladığında, gönderinin ilk % kısmını göster" summary_max_results: "'Bu Konuyu Özetle'den dönen en fazla gönderi sayısı" - enable_private_messages: "Güven seviyesi 1'e(özel mesaj göndermek için en az seviye ayarıyla belirlenebilir) sahip kullanıcıların mesaj oluşturup cevaplamasına izin ver. Görevliler her durumda mesaj gönderebilir." - enable_long_polling: "Bildiri için kullanılan mesaj yolu uzun sorgular yapabilir" + enable_private_messages: "Güven seviyesi 1'e(özel ileti göndermek için en az seviye ayarıyla belirlenebilir) sahip kullanıcıların ileti oluşturup cevaplamasına izin ver. Görevliler her durumda ileti gönderebilir." + enable_long_polling: "Bildiri için kullanılan ileti yolu uzun sorgular yapabilir" long_polling_base_url: "Uzun sorgular için kullanılan baz URL (CDN dinamik içerik sunuyorsa, bunu origin olarak ayarladığına emin ol) ör: http://origin.site.com" long_polling_interval: "Gönderilecek bilgi olmadığı zaman sunucunun kullanıcılara geri dönmeden önce beklemesi gereken zaman (sadece giriş yapmış kullanıcın için)" polling_interval: "Uzun sorgular yapılmadığı zaman, kaç mili saniyede bir giriş yapmış kullanıcılar poll yapmalı" anon_polling_interval: "Kaç mili saniyede bir anonim kullanıcılar sorgu yapmalı" background_polling_interval: "(Pencere arkaplanda olduğu zaman) kaç mili saniyede bir kullanıcılan sorgu yapmalı" - flags_required_to_hide_post: "Gönderinin otomatik olarak gizlenip kullanıcıya mesaj gönderilmesi için gereken toplam bildirim sayısı (hiçbir zaman için 0)" + flags_required_to_hide_post: "Gönderinin otomatik olarak gizlenip kullanıcıya ileti gönderilmesi için gereken toplam bildirim sayısı (hiçbir zaman için 0)" cooldown_minutes_after_hiding_posts: "Topluluk tarafından bildirilerek gizlenen gönderiyi düzenleyebilmek için, kullanıcının beklemesi gereken dakika süresi " max_topics_in_first_day: "Kullanıcının ilk gönderisini oluşturduktan sonraki 24 saatlik zaman dilimi içerisinde oluşturmasına izin verilen konu sayısı." max_replies_in_first_day: "Kullanıcının ilk gönderisini oluşturduktan sonraki 24 saatlik zaman dilimi içerisinde oluşturabileceği cevap sayısı." tl2_additional_likes_per_day_multiplier: "Güvenlik seviyesi 2 (Üye) olanlar için günlük beğeni limitini bu rakamla çarparak artır" tl3_additional_likes_per_day_multiplier: "Güven seviyesi 3 (Müdavim) olanlar için günlük beğeni limitini bu rakamla çarparak artır" tl4_additional_likes_per_day_multiplier: "Güvenlik seviyesi 4 (Lider) olanlar için günlük beğeni limitini bu rakamla çarparak artır" - notify_mods_when_user_blocked: "Eğer bir kullanıcı otomatik olarak engellendiyse, tüm moderatörlere mesaj yolla." + notify_mods_when_user_blocked: "Eğer bir kullanıcı otomatik olarak engellendiyse, tüm moderatörlere ileti yolla." flag_sockpuppets: "Eğer, yeni kullanıcı konuya, konuyu başlatan yeni kullanıcı ile aynı IP adresinden cevap yazarsa, her iki gönderiyi de potansiyel istenmeyen olarak bildir. " traditional_markdown_linebreaks: "Markdown'da, satır sonundan önce yazının sağında iki tane boşluk gerektiren, geleneksel satır sonu metodunu kullan." allow_html_tables: "Tabloların HTML etiketleri kullanılarak Markdown ile oluşturulmasına izin verin. TABLE, THEAD, TD, TR, TH kabul edilir (tablo içeren tüm eski gönderilerin yenilenmesini gerektirir) " @@ -761,6 +765,7 @@ tr_TR: ga_domain_name: "ESKİ: Google analiz (ga.js) alan adı, ör: benimsitem.com; bakınız http://google.com/analytics" ga_universal_tracking_code: "Google Universal Analytics (analytics.js) takip kodu, ör: UA-12345678-9; bakınız http://google.com/analytics" ga_universal_domain_name: "Google Universal Analytics (analytics.js) alan adı, ör: mysite.com; bakınız http://google.com/analytics" + enable_escaped_fragments: "Eğer bir ağ gezgini tespit edilmezse Google'ın Ajax-Crawling API'sine dönün. Dahası için şuraya bakın : https://developers.google.com/webmasters/ajax-crawling/docs/learn-more" enable_noscript_support: "Noscript etiketi üzerinden standart webcrawler arama motoru desteğini etkinleştir" allow_moderators_to_create_categories: "Moderatörlerin yeni kategoriler oluşturmasına izin ver" cors_origins: "Cross-origin isteklerin (CORS) izin verilen originler. Her origin http:// veya https:// içermeli. CORS'u etkinleştirebilmek için DISCOURSE_ENABLE_CORS env değişkeni doğru olarak ayarlanmalı." @@ -770,8 +775,8 @@ tr_TR: post_menu_hidden_items: "Gönderi menüsündeki maddeler, genişletme üç noktasına tıklanmadığı takdirde otomatik olarak gizlenir. " share_links: "Paylaşım penceresinde hangi maddelerin ne sırada gözükeceğini belirleyin." track_external_right_clicks: "URL'leri tekrar yazdığı için, sağ tıklanan dış bağlantıların (ör: yeni bir sekmede aç) takibi öntanımlı ayarlarda devre dışı bırakılmıştır." - site_contact_username: "Tüm otomatik mesajlar için gönderen kişi olarak gözükecek geçerli bir görevli kullanıcı adı. Boş bırakılırsa öntanımlı Sistem hesabı kullanılacak." - send_welcome_message: "Tüm yeni kullanıcılara bir hoş geldiniz mesajı ile beraber hızlı başlangıç kılavuzu gönderin." + site_contact_username: "Tüm otomatik iletiler için gönderen kişi olarak gözükecek geçerli bir görevli kullanıcı adı. Boş bırakılırsa öntanımlı Sistem hesabı kullanılacak." + send_welcome_message: "Tüm yeni kullanıcılara bir hoş geldiniz iletisi ile beraber hızlı başlangıç kılavuzu gönderin." suppress_reply_directly_below: "Bu gönderinin direk altında sadece tek bir cevap varsa, gönderideki açılabilir cevap sayısı bölümünü gösterme." suppress_reply_directly_above: "Bu gönderinin direk üstünde sadece tek bir cevap varsa, gönderideki açılabilir hangi-cevaba-istinaden-cevapla bölümünü gösterme." suppress_reply_when_quoting: "Gönderi cevabı alıntılarsa, gönderideki açılabilir hangi-cevaba-istinaden-cevapla bölümünü gösterme." @@ -786,12 +791,12 @@ tr_TR: email_token_grace_period_hours: "Parolamı unuttum / hesabı etkinleştir jetonları kullanıldıktan sonra (n) saat boyunca hala geçerlidir." enable_badges: "Rozet sistemini etkinleştir" enable_whispers: "Konu içerisinde görevlilerin birbirleriyle gizli olarak iletişim kurmasına izin ver. (deneyseldir)" - allow_index_in_robots_txt: "robots.txt dosyasında bu sitenin arama motorları tarafından indekslenmesine izin verildiğini belirt." + allow_index_in_robots_txt: "robots.txt dosyasında bu sitenin arama motorları tarafından dizinlenmesine izin verildiğini belirt." email_domains_blacklist: "Kullanıcıların kayıt olurken kullanamayacağı e-posta alan adlarının, dikey çizgilerle ayrıştırılmış listesi. Örneğin: mailinator.com|trashmail.net" email_domains_whitelist: "Kullanıcıların kayıt olurken kullanmak ZORUNDA olduğu e-posta alan adlarının, dikey çizgilerle ayrıştırılmış listesi. UYARI: Bu listede yer almayan e-posta alan adları kabul edilmeyecektir!" forgot_password_strict: "Parola sıfırlama kullanıldığında kullanıcıyı hesabın varlığı ile ilgili olarak bilgilendirme." log_out_strict: "Çıkış yapılırken, kullanıcının tüm cihazlardaki TÜM seanslarını sonlandır" - version_checks: "Discourse Hub'a sürüm güncellemeleri için ping yolla ve yeni versiyon mesajlarına /admin gösterge panelinde yer ver" + version_checks: "Discourse Hub'a sürüm güncellemeleri için haber yolla ve yeni versiyon iletilerine /admin gösterge panelinde yer ver" new_version_emails: "Discourse'un yeni sürümü çıktığında contact_email adresine e-posta gönder." port: "SADECE YAZILIMCILAR İÇİN! UYARI! Öntanımlı 80 portu yerine bu HTTP portunu kullanın. Öntanımlı 80'i kullanmak için boş bırakın. " force_hostname: "SADECE YAZILIMCILAR İÇİN! DİKKAT! URL'de bir bilgisayar adı belirleyin. Öntanımlı için boş bırakın." @@ -802,8 +807,8 @@ tr_TR: min_username_length: "Karakter olarak en küçük kullanıcı adı uzunluğu." max_username_length: "Karakter olarak en büyük kullanıcı adı uzunluğu." reserved_usernames: "Kayıt için izin verilmeyen kullanıcı adları." - min_password_length: "En az parola uzunluğu." - min_admin_password_length: "Yönetici için en az parola uzunluğu." + min_password_length: "Parolanın en az uzunluğu." + min_admin_password_length: "Yönetici için parolanın en az uzunluğu." block_common_passwords: "En çok kullanılan 10,000 parola arasında yer alan parolalara izin verme." enable_sso: "Dış bir site aracılığı ile tek oturum açma sistemini etkinleştir. (UYARI: etkinleştirildiği takdirde, doğru yapılandırılmamışsa bazı kişilerin, SİZ DAHİL, oturum açmasını engelleyebilir! Ayrıca davetiye sistemini de devre dışı bırakır.)" enable_sso_provider: "/session/sso_provider son noktasında Discourse SSO sağlayıcı protokolünü uygula, sso_secret değerinin seçilmiş olmasını gerektirir" @@ -853,7 +858,7 @@ tr_TR: max_bookmarks_per_day: "Kullanıcı başına düşen günlük en fazla imleme sayısı." max_edits_per_day: "Bir günde, bir kullanıcının yapabileceği en fazla düzenleme sayısı." max_topics_per_day: "Bir günde, bir kullanıcının oluşturabileceği en fazla konu sayısı." - max_private_messages_per_day: "Bir günde kullanıcıların oluşturabileceği en fazla mesaj sayısı" + max_private_messages_per_day: "Bir günde kullanıcıların oluşturabileceği en fazla ileti sayısı" max_invites_per_day: "Bir günde, bir kullanıcının yollayabileceği en fazla davet sayısı." max_topic_invitations_per_day: "Bir günde, bir kullanıcının yollayabileceği en fazla başlık daveti sayısı." categories_topics: "/categories sayfasında gösterilecek olan konu sayısı." @@ -874,7 +879,7 @@ tr_TR: avatar_sizes: "Otomatik üretilen avatar ölçülerinin listesi." external_system_avatars_enabled: "Dışsal sistem avatarları hizmeti kullan." default_opengraph_image_url: "Öntanımlı opengraph imajının URL'si." - allow_all_attachments_for_group_messages: "Grup mesajları için tüm e-posta eklentilerine izin ver." + allow_all_attachments_for_group_messages: "Grup iletileri için tüm e-posta eklentilerine izin ver." convert_pasted_images_to_hq_jpg: "Yapıştırılan resimleri yüksek kaliteli JPG dosyalarına dönüştür." convert_pasted_images_quality: "Dönüştürülen JPG dosyasının kalitesi (1 en düşük kalite, 100 en iyi kalite)" enable_flash_video_onebox: "Kutularda swf ve flv (Adobe Flash) yerleştirmelerine izin ver. UYARI: güvenlik açıkları doğurabilir" @@ -906,7 +911,7 @@ tr_TR: min_trust_to_edit_wiki_post: "Wiki olarak işaretlenmiş bir gönderiyi düzenleyebilmek için gereken en az güven seviyesi." min_trust_to_edit_post: "Gönderilerin düzenlenebilmesi için gereken en düşük güven seviyesi." min_trust_to_allow_self_wiki: "Kullanıcının kendi wiki gönderisini oluşturabilmesi için gereken güven seviyesi." - min_trust_to_send_messages: "Özel bir mesaj oluşturabilmek için gerekli olan güven seviyesi." + min_trust_to_send_messages: "Özel bir ileti oluşturabilmek için gerekli olan güven seviyesi." newuser_max_links: "Yeni bir kullanıcının bir gönderiye ekleyebileceği bağlantı sayısı." newuser_max_images: "Yeni bir kullanıcının bir gönderiye ekleyebileceği resim sayısı." newuser_max_attachments: "Yeni bir kullanıcının bir gönderiye ekleyebileceği dosya sayısı." @@ -927,8 +932,8 @@ tr_TR: desktop_category_page_style: "/categories sayfasının görsel biçimi." category_colors: "Kategoriler için izin verilen onaltılı renk değerlerinin listesi" category_style: "Kategori rozetleri için görsel biçim." - max_image_size_kb: "KB cinsinden yüklenebilecek en fazla resim büyüklüğü. Bu nginx (client_max_body_size) / apache veya proxyde de ayarlanmalı." - max_attachment_size_kb: "KB cinsinden yüklenebilecek en fazla eklenti dosyası büyüklüğü. Bu nginx (client_max_body_size) / apache veya proxyde de ayarlanmalı." + max_image_size_kb: "Yüklenebilecek resmin KB cinsinden en fazla büyüklüğü. Bu nginx (client_max_body_size) / apache veya proxyde de ayarlanmalı." + max_attachment_size_kb: "Yüklenebilecek dosyaların KB cinsinden en fazla büyüklüğü. Bu nginx (client_max_body_size) / apache veya proxyde de ayarlanmalı." authorized_extensions: "Yüklenebilecek dosya uzantılarının listesi (tüm dosya türlerini etkinleştirmek için '*' kullanın)" max_similar_results: "Yeni bir konu oluştururken, düzenleyicinin üzerinde gösterilecek benzer konuların sayısı. Karşılaştırmalar başlık ve içerik üzerinden yapılır." title_prettify: "Tümü büyük harf, ilk karakteri küçük harf, çoklu ! ve ?, sonda ekstra . kullanımı gibi, sık yapılan yazım hatalarını önle." @@ -1012,7 +1017,7 @@ tr_TR: allow_profile_backgrounds: "Kullanıcıların profillerine arkaplan eklemesine izin ver." enable_mobile_theme: "Mobil cihazlar mobil uyumlu temayı kullanır, dilerse masaüstü görünüme geçebilirler. Eğer özel, duyarlı bir biçim kullanıyorsanız bunu devre dışı bırakın." dominating_topic_minimum_percent: "Konuyu domine ettiğine dair uyarı almadan önce konudaki gönderilerin yüzde kaçının kullanıcıya ait olması gerekir." - disable_avatar_education_message: "Avatar değiştirme için eğitici mesajları kapat." + disable_avatar_education_message: "Avatar değiştirme için eğitici iletileri kapat." suppress_uncategorized_badge: "Kategorisiz konular için olan rozeti konu listesinde gösterme." global_notice: "Tüm ziyaretçilere İVEDİ ACİL DURUM global manşet uyarısı göster, saklamak için boş bırakın (HTML kullanılabilir)." disable_edit_notifications: " 'download_remote_images_to_local' etkin olduğunda, sistem kullanıcısından gelen düzenleme bildirilerini devre dışı bırakır" @@ -1025,7 +1030,7 @@ tr_TR: invites_per_page: "Öntanımlı olarak kullanıcı sayfasında gösterilen davetler." short_progress_text_threshold: "Bir konudaki gönderi sayısı bu sayının üzerine çıktığında, ilerleme çubuğunda sadece şu anki gönderi sayısını göster. İlerleme çubuğunun kalınlığını değiştirirseniz, bu değeri de değiştirmeniz gerekebilir." default_code_lang: "GitHub kod bloklarına (lang-auto, ruby, python vs.) uygulanacak, öntanımlı programlama dili söz dizimi vurgulaması." - warn_reviving_old_topic_age: "Herhangi bir kullanıcı, son cevabın burada belirtilen gün sayısından daha önce yazıldığı bir konuya cevap yazmaya başladığında, bir uyarı mesajı çıkacak. Bu özelliği devre dışı bırakmak için 0 girin. " + warn_reviving_old_topic_age: "Herhangi bir kullanıcı, son cevabın burada belirtilen gün sayısından daha önce yazıldığı bir konuya cevap yazmaya başladığında, bir uyarı iletisi çıkacak. Bu özelliği devre dışı bırakmak için 0 girin. " autohighlight_all_code: "Tüm önceden biçimlendirilen kod bloklarına, açıkça dil seçimi yapılmamış olsa da, zorla kod vurgulaması uygula." highlighted_languages: "Dahil edilen kod renklendirme kuralları. (Uyarı: çok fazla dil eklemek performansı etkileyebilir) demo için bakınız: https://highlightjs.org/static/demo/" feed_polling_enabled: "SADECE YERLEŞTİRME İÇİN: RSS/ATOM beslemesinin gönderi olarak yerleştirilip yerleştirilemeyeceği." @@ -1039,7 +1044,7 @@ tr_TR: embed_blacklist_selector: "Yerleştirmelerden çıkartılmış öğeler için CSS seçicisi." notify_about_flags_after: "Bu kadar saat geçmesine rağmen hala ilgilenilmemiş bildirimler varsa, contact_email adresine e-posta gönder. Devre dışı bırakmak için 0 girin. " enable_cdn_js_debugging: "/logs 'ların asli hataları tüm js içeriklerine crossorigin izinleri ekleyerek göstermesine izin ver." - show_create_topics_notice: "Eğer sitede herkese açık konu sayısı 5'den az ise, adminden yeni konular oluşturmasını isteyen bir uyarı mesajı göster. " + show_create_topics_notice: "Eğer sitede herkese açık konu sayısı 5'den az ise, yöneticiden yeni konular oluşturmasını isteyen bir uyarı iletisi göster. " delete_drafts_older_than_n_days: (n) günden eski taslakları sil. bootstrap_mode_min_users: "bootstrap modunun edilgen olması için gereken en az kullanıcı sayısı (edilgen bırakmak için 0 yapın)" vacuum_db_days: "Geçiş sonrası DB alanı geri kazanmak için TAM VAKUM ANALİZİ'ni çalıştırın (devre dışı bırakmak için 0 girin)" @@ -1050,7 +1055,7 @@ tr_TR: enforce_square_emoji: "Tüm emojileri kare en-boy oranına zorla" approve_unless_trust_level: "Bu güven seviyesi altındaki kullanıcılardan gelen gönderilerin onaylanması gerekir" default_email_digest_frequency: "Öntanımlı olarak kullanıcılar ne sıklıkla e-posta özeti alacak." - default_email_private_messages: "Öntanımlı olarak birisi bir kullanıcıya mesaj attığında e-posta gönder." + default_email_private_messages: "Öntanımlı olarak birisi bir kullanıcıya ileti attığında e-posta gönder." default_email_direct: "Öntanımlı olarak birisi bir kullanıcı hakkında alıntı yapma, cevaplama, bahsetme ya da davet etme eylemlerini gerçekleştirdiğinde e-posta gönder." default_email_mailing_list_mode: "Öntanımlı olarak her yeni gönderi için bir e-posta gönder." disable_mailing_list_mode: "Kullanıcıların duyuru listesi modunu etkinleştirmesini engelle." @@ -1082,9 +1087,9 @@ tr_TR: staff_tags: "Yalnızca görevli kişiler tarafından kullanılabilecek etiket listesi" min_trust_level_to_tag_topics: "Konulara etiket eklemek için gereken en az güven seviyesi." suppress_overlapping_tags_in_list: "Eğer etiketler konu ismi içerisinde tam kelime olarak bulunuyorsa, etiketi gösterme" - company_short_name: "Şirket İsmi (kısa)" - company_full_name: "Şirket İsmi (tamamı)" - company_domain: "Şirket Alan Adı" + company_short_name: "Firma İsmi (kısa)" + company_full_name: "Firma İsmi (tamamı)" + company_domain: "Firma Alan Adı" errors: invalid_email: "Geçersiz e-posta adresi." invalid_username: "Bu kullanıcı adı ile bir kullanıcı bulunmuyor." @@ -1141,6 +1146,10 @@ tr_TR: archived_disabled: "Konu şimdi arşivden çıkarıldı. Artık donmuş değil, değiştirilebilir." closed_enabled: "Konu şimdi kapatıldı. Artık yeni cevap yazılmasına izin yok. " closed_disabled: "Konu şimdi açıldı. Yeni cevaplara izin var." + autoclosed_message_max_posts: + other: "Bu ileti %{count} olan en fazla cevap limitini aştığı için otomatik olarak kapatıldı." + autoclosed_topic_max_posts: + other: "Bu konu %{count} olan en fazla cevap limitini aştığı için otomatik olarak kapatıldı." autoclosed_enabled_days: other: "Bu konu %{count} gün sonunda konu otomatik olarak kapatıldı. Yeni cevap girilmesine izin verilmiyor." autoclosed_enabled_hours: @@ -1397,8 +1406,8 @@ tr_TR: Cevabınız basit HTML, BBCode, veya [Markdown](http://commonmark.org/help/) kullanılarak biçimlendirilebilir: Bu kalın. - Bu [b]kalın[/b]. - Bu **kalın**. + Bu da [b]kalın[/b]. + E bu da **kalın**. Daha fazla biçimlendirme ipucu için [10 dakikalık öğreticiyi](http://commonmark.org/help/tutorial/) deneyebilirsiniz! @@ -1440,7 +1449,7 @@ tr_TR: Bu ayarların herhangi birini değiştirmek için [kullanıcı tercihleri](%{base_url}/my/preferences) sayfasını ziyaret edin. - ## Community Trust + ## Topluluk Güvenilirliği It's great to meet you! As you participate here, over time we'll get to know you, and your temporary new user limitations will be lifted. Keep participating, and over time you'll gain new [trust levels](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) that include special abilities to help us manage our community together. welcome_user: @@ -1454,7 +1463,7 @@ tr_TR: Ziyaretinizin keyfini çıkarın! - (Eğer yeni bir kullanıcı olarak [görevlilerle](%{base_url}/about) iletişim kurmak isterseniz, bu mesajı cevaplamanız yeterli.) + (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: | @@ -1474,7 +1483,7 @@ tr_TR: Ziyaretinizin keyfini çıkarın! - (Eğer yeni bir kullanıcı olarak [görevlilerle](%{base_url}/about) iletişim kurmak isterseniz, bu mesajı cevaplamanız yeterli.) + (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: @@ -1563,15 +1572,12 @@ tr_TR: subject_template: "[%{site_name}] E-posta sorunu -- Bilinmeyen Hesap" email_reject_empty: subject_template: "[%{site_name}] E-posta sorunu -- İçerik Yok" - text_body_template: |+ + text_body_template: | Üzgünüz, ama %{destination} (titled %{former_title}) adresine göndermeye çalıştığınız e-posta başarısız oldu. E-postada herhangi bir cevap bulamadık. - Eğer bu mesajı alıyorsanız ve cevap eklediyseniz, daha basit bir biçimleme ile yeniden deneyin. - - - + Eğer bu iletiyi alıyorsanız ve cevap eklediyseniz, daha basit bir biçimleme ile yeniden deneyin. email_reject_parsing: subject_template: "[%{site_name}] E-posta sorunu -- İçerik Tanınamadı" text_body_template: | @@ -1603,9 +1609,9 @@ tr_TR: text_body_template: | Merhaba, - Bu, %{site_name} adresinden gönderilen, topluluk tarafından bildirildiği için kontrol edilmek için gizlenen gönderinizi size bildiren otomatik bir mesajdır. + Bu, %{site_name} adresinden size gönderilen, topluluk tarafından bildirildiği için kontrol edilmek üzere gizlenen gönderinizi bildiren otomatik bir iletidir. - As a precautionary measure, your new account has been blocked from creating new replies or topics until a staff member can review your account. We apologize for the inconvenience. + Bir önlem olarak, bir yetkili incelemesine kadar yeni hesabınızdan yeni cevaplar veya konular oluşturmanız engellendi. Bu rahatsızlık için üzgünüz. Ek bilgi için, [topluluk yönergelerine](%{base_url}/guidelines) başvurun. too_many_tl3_flags: @@ -1621,7 +1627,7 @@ tr_TR: text_body_template: | Merhaba, - Bu otomatik mesaj %{site_name} forumunda, görevli incelemesinin ardından hesabınızın artık askıda olmadığını bilmeniz amacıyla gönderilmiştir. + Bu otomatik ileti %{site_name} forumunda, görevli incelemesinin ardından hesabınızın artık askıda olmadığını bilmeniz amacıyla gönderilmiştir. Şimdi tekrar gönderi ve konular oluşturabilirsiniz. Sabrınız için teşekkürler. pending_users_reminder: @@ -1636,6 +1642,10 @@ tr_TR: text_body_template: "`download_remote_images_to_local` ayarı harddisk alanı limiti `download_remote_images_threshold` aşıldığı için devre dışı bırakıldı." dashboard_problems: subject_template: "Sorunlar bulundu" + text_body_template: | + Gösterge panelinde bazı hatalar bildirildi gibi gözüküyor. + + [Lütfen inceleyip düzeltin](%{base_url}/admin). unsubscribe_link: | Bu e-postaları almayı durdurmak için [buraya tıklayın](%{unsubscribe_url}). unsubscribe_link_and_mail: | @@ -1653,13 +1663,13 @@ tr_TR: title: "Aboneliği İptal Et" description: "Bu e-postalarla ilgilenmiyor musunuz? Sorun değil! Aşağıya tıklayarak aboneliğinizi hemen iptal edebilirsiniz:" reply_by_email: "Yanıtlamak için [konuyu ziyaret edin](%{base_url}%{url}) ya da bu e-postaya cevap verin." - reply_by_email_pm: "Yanıtlamak için [mesajı ziyaret edin](%{base_url}%{url}) ya da bu e-postaya cevap verin." + reply_by_email_pm: "Yanıtlamak için [iletiyi ziyaret edin](%{base_url}%{url}) ya da bu e-postaya cevap verin." only_reply_by_email: "Cevap vermek için bu e-postayı cevaplayın." visit_link_to_respond: "Cevaplamak için [konuyu ziyaret edin](%{base_url}%{url})." - visit_link_to_respond_pm: "Cevaplamak için [mesajı ziyaret edin](%{base_url}%{url})." + visit_link_to_respond_pm: "Cevaplamak için [iletiyi ziyaret edin](%{base_url}%{url})." posted_by: "%{post_date} tarihinde %{username} tarafından gönderildi" invited_to_private_message_body: | - %{username} sizi bir mesaja davet etti + %{username} sizi bir iletiye davet etti > **%{topic_title}** > @@ -1679,7 +1689,7 @@ tr_TR: > %{site_title} -- %{site_description} user_invited_to_private_message_pm: - subject_template: "[%{site_name}] %{username} sizi bir mesaja davet etti '%{topic_title}'" + subject_template: "[%{site_name}] %{username} sizi bir iletiye davet etti '%{topic_title}'" text_body_template: | %{header_instructions} @@ -1687,7 +1697,7 @@ tr_TR: %{respond_instructions} user_invited_to_private_message_pm_staged: - subject_template: "[%{site_name}] %{username} sizi bir mesaja davet etti '%{topic_title}'" + subject_template: "[%{site_name}] %{username} sizi bir iletiye davet etti '%{topic_title}'" text_body_template: | %{header_instructions} @@ -1866,7 +1876,7 @@ tr_TR: subject_template: "[%{site_name}] E-posta adresiniz değiştirildi" text_body_template: | Bu %{site_name} forumunda kullandığınız e-posta adresinizin değiştiğini - bildiren otomatik bir mesajdır. Bir hata olduğunu düşünüyorsanız lütfen + bildiren otomatik bir iletidir. Bir hata olduğunu düşünüyorsanız lütfen yönetici ile iletişime geçin. E-posta adresiniz şu e-posta ile değiştirildi: @@ -1889,7 +1899,7 @@ tr_TR: Ziyaretinizin keyfini çıkarın! - (Eğer yeni bir kullanıcı olarak [görevlilerle](%{base_url}/about) iletişim kurmak isterseniz, bu mesajı cevaplamanız yeterli.) + (Eğer yeni bir kullanıcı olarak [görevlilerle](%{base_url}/about) iletişim kurmak isterseniz, bu iletiyi cevaplamanız yeterli.) signup: subject_template: "[%{site_name}] Yeni hesabınızı onaylayın" text_body_template: | @@ -1931,7 +1941,7 @@ tr_TR: post_user_deleted: "Konunun kullanıcısı silindi." no_user: "%{user_id} id'sine sahip bir kullanıcı bulunamadı" anonymous_user: "Kullanıcı anonim" - suspended_not_pm: "Kullanıcı uzaklaştırıldı, mesaj değil" + suspended_not_pm: "Kullanıcı uzaklaştırıldı, ileti değil" seen_recently: "Kullanıcı kısa süre önce görüldü" post_not_found: "%{post_id} id'sine sahip bir gönderi bulunamadı" notification_already_read: "Bu e-postanın içerdiği bildiri önceden okundu" @@ -1941,7 +1951,7 @@ tr_TR: already_read: "kullanıcı bu gönderiyi önceden okumuş" exceeded_emails_limit: "max_emails_per_day_per_user aşıldı" exceeded_bounces_limit: "bounce_score_threshold aşıldı" - message_blank: "mesaj boş" + message_blank: "ileti boş" message_to_blank: "message.to boş" text_part_body_blank: "text_part.body boş" body_blank: "içerik boş" @@ -1962,51 +1972,22 @@ tr_TR: title: "Üyelik Sözleşmesi" privacy_topic: title: "Gizlilik İlkeleri" - static: - search_help: | -

İpuçları

-

-

    -
  • Başlığa göre öncelikli aranır – kuşkuya düşerseniz başlığa göre arama yapın
  • -
  • Özgün, sık kullanılmayan kelimeler en iyi sonucu verirler
  • -
  • Belirli bir kategori, konu veya kullanıcı ile ilgili aramayı demek faydalı olabilir
  • -
-

-

Ayarlar

-

- - - - - - - -
order:viewsorder:latestorder:likes@kullaniciadiuser:falanfilan
status:openstatus:closedstatus:archivedstatus:norepliesstatus:single_user
#category-slugcategory:falanfilangroup:falanfilanbadge:falanfilan
in:likesin:postedin:watchingin:trackingin:private
in:bookmarksin:firstin:pinnedin:unpinnedin:wiki
posts_count:numbefore:gün/tarihafter:gün/tarihtags:bir,iki
-

-

Örnekler

-

-

    -
  • gökkuşağı #parklar "parklar" kategorisi içerisinde bulunan konularda "gökkuşağı" kelimesini arar.
  • -
  • gökkuşağı category:parklar status:open order:latest "parklar" kategorisi içerisinde bulunan açık, arşivlenmemiş konularda "gökkuşağı" kelimesini arar, en son konuya göre sıralar
  • -
  • gökkuşağı category:"parklar ve bahçeler" in:bookmarks sizin tarafınızdan "parklar ve bahçeler" kategorisinde imlenmiş konularda "gökkuşağı" kelimesini arar.
  • -
-

badges: editor: name: Düzenleyici description: İlk gönderini düzenledin long_description: | - Bu rozet gönderilerinizden birini düzenlediğinizde verilecektir. Mesajlarınızı düzenlemek her zaman için iyidir — mesajlarınızı geliştirebilir, küçük hataları düzeltebilir, ya da unuttuğunuz ayrıntıları ekleyebilirsiniz. Daha iyi mesaj oluşturabilmek için düzenleyin. + Bu rozet gönderilerinizden birini düzenlediğinizde verilecektir. Gönderilerinizi düzenlemek her zaman için iyidir — gönderilerinizi geliştirebilir, küçük hataları düzeltebilir, ya da unuttuğunuz ayrıntıları ekleyebilirsiniz. Daha iyi gönderi oluşturabilmek için düzenleyin. basic_user: name: Acemi description: Bütün esas forum uygulamalarını kullanabilmeye hak kazanılmıştır long_description: | - Bu rozet 1. güven seviyesine ulaştığın için verildi. Forumda neler olduğunu takip ettiğin için ve konuları okuduğun için teşekkürler. Artık yeni özelliklere sahipsin; kişisel mesajlaşma, bildirme, düzenleme, ve çoklu resim ve bağlantı paylaşabilme gibi. + Bu rozet 1. güven seviyesine ulaştığın için verildi. Forumda neler olduğunu takip ettiğin için ve konuları okuduğun için teşekkürler. Artık yeni özelliklere sahipsin; özel iletiler, bildirme, düzenleme, ve çoklu resim ve bağlantı paylaşabilme gibi. member: name: Üye - description: Davetler, grup mesajlaşmaları, ve daha fazla beğeni hakkı kazanılmıştır + description: Davetler, grup iletileri, ve daha fazla beğeni hakkı kazanılmıştır long_description: | - Bu rozet 2. güven seviyesine ulaştığın için verildi. Birkaç haftadır aramızda zaman geçirdiğin için teşekkürler. Artık kullanıcı sayfandan ya da konu sayfandan davetler gönderebilirsin, kişisel grup mesajları oluşturabilirsin ve günlük daha fazla beğeni yapabilirsin. + Bu rozet 2. güven seviyesine ulaştığın için verildi. Birkaç haftadır aramızda zaman geçirdiğin için teşekkürler. Artık kullanıcı sayfandan ya da konu sayfandan davetler gönderebilirsin, kişisel grup iletileri oluşturabilirsin ve günlük daha fazla beğeni yapabilirsin. regular: name: Müdavim description: Yeniden kategorize etme, yeniden isimlendirme, takip edilen bağlantılar, ve daha fazla beğeni hakkı kazanılmıştır @@ -2016,22 +1997,22 @@ tr_TR: name: Lider description: Genel düzenleme, başa tutturma, kapama, arşivleme, ayırma ve birleştirme, daha fazla beğeni hakkı kazanılmıştır long_description: | - Bu rozet 4. güven seviyesine ulaştığın için verildi. Forumda yönetim tarafından seçilmiş bir lidersiniz ve yaptığınız paylaşımlarla diğer üyelere örnek oluyorsunuz. Bütün mesajları düzenleme hakkına sahipsiniz. Moderatörlerin yapabileceği, başa tutturma, kapama, arşivleme, ayırma ve birleştirme gibi işlemleri yapabilirsiniz. Artık günlük çok daha fazla beğeni yapabilirsiniz. + Bu rozet 4. güven seviyesine ulaştığın için verildi. Forumda yönetim tarafından seçilmiş bir lidersiniz ve yaptığınız paylaşımlarla diğer üyelere örnek oluyorsunuz. Bütün gönderileri düzenleme hakkına sahipsiniz. Moderatörlerin yapabileceği, başa tutturma, kapama, arşivleme, ayırma ve birleştirme gibi işlemleri yapabilirsiniz. Artık günlük çok daha fazla beğeni yapabilirsiniz. welcome: name: Hoş geldiniz description: İlk beğeni alma long_description: | - Bu rozet mesajına ilk beğenini aldığın için verildi. Tebrikler forumda diğer üyelerin ilgisini çeken, yararlı bir paylaşımda bulundun! + Bu rozet gönderine ilk beğenini aldığın için verildi. Tebrikler forumda diğer üyelerin ilgisini çeken, yararlı bir paylaşımda bulundun! autobiographer: name: Güncel Profil description: profil bilgilerini tamamlama long_description: | Bu rozet profil sayfasını tamamladığınız ve bir profil resmi seçtiğiniz için verilmiştir. Artık topluluk sizin hakkınızda daha fazla bilgi sahibi olup, sizin ilgi alanlarınızı daha yakından takip edebilir. anniversary: - name: Tanışma Yıldönümü + name: Yıldönümü description: Bir sene içerisinde, en az bir kere gönderi yazmış etkin üye long_description: | - Bu rozet en az bir mesaj yazarak bir yıllık üyeliğinizi tamamladığınız için size verilmiştir. Forumda zaman geçirdiğiniz ve bizlere katkıda bulunduğunuz için teşekkür ederiz. Sizler olmasanız yapamazdık. + Bu rozet en az bir gönderi yazarak bir yıllık üyeliğinizi tamamladığınız için size verilmiştir. Forumda zaman geçirdiğiniz ve bizlere katkıda bulunduğunuz için teşekkür ederiz. Sizler olmasanız yapamazdık. nice_post: name: Hoş Cevap description: Cevaba 10 beğeni alındı @@ -2081,12 +2062,12 @@ tr_TR: name: İlk Beğeni description: Bir gönderiyi beğendin long_description: | - Bu rozet ilk defa bir mesajı beğendiğin için verildi. Mesajları beğenmek diğer kullanıcıların yaptıkları paylaşımların ilgi çekici olduğunu onlara göstermek açısından oldukça önemlidir. Beğeninizi gösterin! + Bu rozet ilk defa bir gönderiyi beğendiğin için verildi. Gönderileri beğenmek diğer kullanıcıların yaptıkları paylaşımların ilgi çekici olduğunu onlara göstermek açısından oldukça önemlidir. Beğeninizi gösterin! first_flag: name: İlk Bildirim description: Gönderiyi bildirdi long_description: | - Bu rozet ilk kez bir mesajı bildirdiğiniz için verilmiştir. Bildirme daha huzurlu bir ortam oluşturmaya yardımcı olmak açısından oldukça önemlidir. Eğer herhangi bir mesajın yönetici tarafından incelenmesini istiyorsanız, lütfen bildirmekten çekinmeyin. Eğer mesajlarıyla ilgili bir sorun fark ederseniz, diğer üyelere de kişisel mesajlar gönderebilirsiniz. Eğer bir problem fark ederseniz, :flag_black: şikayet edin! + Bu rozet ilk kez bir gönderiyi bildirdiğiniz için verilmiştir. Bildirme daha huzurlu bir ortam oluşturmaya yardımcı olmak açısından oldukça önemlidir. Eğer herhangi bir gönderinin yönetici tarafından incelenmesini istiyorsanız, lütfen bildirmekten çekinmeyin. Eğer gönderileriyle ilgili bir sorun fark ederseniz, diğer üyelere de kişisel iletiler gönderebilirsiniz. Eğer bir problem fark ederseniz, :flag_black: şikayet edin! promoter: name: Destekçi description: Kullanıcı davet etme @@ -2116,7 +2097,7 @@ tr_TR: name: İlk Alıntı description: Bir gönderiyi alıntıladı long_description: | - Bu rozet cevabınızda başkasından alıntı yaptığınız için verilmiştir. Başka konulardan ve mesajlardan alıntı yapmak mesajlar arasındaki bağlantıyı kuvvetlendirir. En kolay alıntı yapma yolu alıntı yapacağınız bölümü seçip cevap düğmesine basmaktır. + Bu rozet cevabınızda başkasından alıntı yaptığınız için verilmiştir. Başka konulardan ve gönderilerden alıntı yapmak mesajlar arasındaki bağlantıyı kuvvetlendirir. En kolay alıntı yapma yolu alıntı yapacağınız bölümü seçip cevap düğmesine basmaktır. read_guidelines: name: Yönergeleri Okuma description: Topluluk yönergelerini okuma @@ -2144,17 +2125,17 @@ tr_TR: name: Takdire Layık description: 20 gönderine 1 beğeni aldın long_description: | - Bu rozet 20 farklı mesajda en az bir beğeni kazandığınız için verilmiştir. Topluluk olarak tartışmalara olan katkınızı takdir ediyoruz! + Bu rozet 20 farklı gönderide en az bir beğeni kazandığınız için verilmiştir. Topluluk olarak tartışmalara olan katkınızı takdir ediyoruz! respected: - name: Saygıdeğer + name: Saygın description: 100 gönderine 2 beğeni aldın long_description: | - Bu rozet 100 farklı mesajda en az 2 beğeni kazandığınız için verilmiştir. Katkılarınız forum için çok değerli. + Bu rozet 100 farklı gönderide en az 2 beğeni kazandığınız için verilmiştir. Katkılarınız forum için çok değerli. admired: - name: Çok Beğenilen + name: Takdir Edilen description: 300 gönderine 5 beğeni aldın long_description: | - Bu rozet farklı 300 mesajda en az 5 beğeni kazandığınız için verilmiştir. Süper! Tartışmalara olan katkınız muazzam. + Bu rozet farklı 300 gönderide en az 5 beğeni kazandığınız için verilmiştir. Süper! Tartışmalara olan katkınız muazzam. out_of_love: name: Sevgiden Öte description: Bir günde 50 beğeni kullanıldı @@ -2174,28 +2155,29 @@ tr_TR: name: Teşekkürler description: '20 beğeni sahibi olma ve 10 beğenme ' long_description: | - Bu rozet 20 beğenilmiş mesaj sahibi olduğunuz ve bunun karşılığında 10 ya da daha fazla beğeni yaptığınızdan dolayı size verilmiştir. + Bu rozet 20 beğenilmiş gönderi sahibi olduğunuz ve bunun karşılığında 10 ya da daha fazla beğeni yaptığınızdan dolayı size verilmiştir. gives_back: name: Beğenilip Beğenme description: '100 beğeni sahibi olma ve 100 beğenme ' long_description: | - Bu rozet 100 beğenilmiş mesaj sahibi olduğunuz ve bunun karşılığında 100 ya da daha fazla beğeni yaptığınızdan dolayı size verilmiştir. Teşekkür ederiz! + Bu rozet 100 beğenilmiş gönderi sahibi olduğunuz ve bunun karşılığında 100 ya da daha fazla beğeni yaptığınızdan dolayı size verilmiştir. Teşekkür ederiz! empathetic: name: Empatik description: 500 beğeni sahibi olma ve 1000 beğeni long_description: | - Bu rozet 500 beğenilmiş mesaj sahibi olduğunuz ve bunun karşılığında 1000 ya da daha fazla beğeni yaptığınızdan dolayı size verilmiştir. Süper! Cömetliğin ve takdirin örneğisin :two_hearts:. + Bu rozet 500 beğenilmiş gönderisahibi olduğunuz ve bunun karşılığında 1000 ya da daha fazla beğeni yaptığınızdan dolayı size verilmiştir. Süper! Cömetliğin ve takdirin örneğisin :two_hearts:. first_emoji: name: İlk Emoji - description: 'Bir mesajda emoji kullanma ' + description: 'Bir gönderide emoji kullanma ' long_description: | - Bu rozet mesajınıza ilk defa bir emoji eklediğiniz için verilmiştir :thumbsup:. + Bu rozet gönderinize ilk defa bir emoji eklediğiniz için verilmiştir :thumbsup:. first_mention: name: İlk Bahsetme description: 'Gönderide bir kullanıcıdan bahsetme ' - long_description: Bu rozet ilk defa mesajınızda başka bir kullanıcıdan bahsettiğiniz için verilmiştir. Her bahsetme bahsi geçen kullanıcıya bildirim gitmesini sağlar, böylece bu kullanıcı sizin mesajınızdan haberdar olur. Sadece bahsi geçen kullanıcı adına @ gerekir. + long_description: Bu rozet ilk defa gönderinizde başka bir kullanıcıdan bahsettiğiniz için verilmiştir. Her bahsetme bahsi geçen kullanıcıya bildirim gitmesini sağlar, böylece bu kullanıcı sizin gönderinizden haberdar olur. Sadece bahsi geçen kullanıcı adına @ gerekir. first_onebox: name: İlk Kutulama + description: Kutulanmış bir bağlantı gönderdi first_reply_by_email: name: Mail İle İlk Cevap description: 'Gönderiye mail yoluyla cevap verme ' @@ -2231,15 +2213,20 @@ tr_TR: fields: title: label: "Topluluğunuzun ismi" + placeholder: "Oktay'ın Yeri" site_description: label: "Topluluğunuzu kısa bir cümle ile tanımlayın" + placeholder: "Oktay ve arkadaşlarının ilginç şeyleri tartışabilecekleri bir yer" introduction: title: "Tanıtım" 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: @@ -2259,19 +2246,19 @@ tr_TR: label: "Ağ Sayfası" placeholder: "http://www.ornek.com/iletisim" site_contact: - label: "Otomatik Mesajlar" - description: "Discourse tarafından gönderilen tüm otomatik kişisel mesajlar 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." + 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: "Şirket İsmi (kısa)" + label: "Firma İsmi (kısa)" placeholder: "Falanteknik" company_full_name: - label: "Şirket İsmi (tamamı)" + label: "Firma İsmi (tamamı)" placeholder: "Falanteknik A.Ş" company_domain: - label: "Şirket Alan Adı" + label: "Firma Alan Adı" placeholder: "falanteknik.com" colors: title: "Tema" @@ -2284,12 +2271,14 @@ tr_TR: dark: label: "Basit Karanlık" logos: - title: "Logolar" + title: "Görseller" fields: logo_url: - label: "Birincil Logo" + label: "Birincil Görsel" + description: "Sitenizin sol üst kısmında gözükecek olan görsel. Geniş bir dikdörtgen olursa iyi olur." logo_small_url: - label: "Sadeleştirilmiş Logo" + label: "Sadeleştirilmiş Görsel" + description: "Site görselinizin öz bir sürümü, aşağıya doğru kaydırılma yapıldığında sol üstte gözükecek. Kare bir görsel iyi olur." icons: title: "Simgeler" fields: diff --git a/config/locales/server.zh_CN.yml b/config/locales/server.zh_CN.yml index 5225fdb649..be49a06f61 100644 --- a/config/locales/server.zh_CN.yml +++ b/config/locales/server.zh_CN.yml @@ -2355,35 +2355,6 @@ zh_CN: 如果我们决定更改我们的隐私政策,我们将在此页更新这些改变。 文档以 CC-BY-SA 发布。最后更新时间为2013年5月31日。 - static: - search_help: | -

小技巧

-

-

    -
  • 标题匹配优先 – 不知道搜什么时,搜索标题
  • -
  • 搜索独一无二且不常见的词可以找到最好的结果
  • -
  • 试试选定分类、用户或主题搜索
  • -
-

-

选项

-

- - - - - - - -
order:views(按照显示次数排序)order:latest(按照更新时间排序)order:likes(按照赞的次数排序)@用户名user:用户名
status:open(搜索正常状态的主题)status:closed(搜索锁定的主题)status:archived(搜索已经存档的主题)status:noreplies(搜索没有回复的主题)status:single_user(搜索只有一个人发言的主题)
#category-slug(搜索分类代号)category:分类名group:小组名badge:徽章名
in:likes(在已赞过的帖子里搜索)in:posted(在发表的帖子里搜索)in:watching(在关注的帖子里搜索)in:tracking(在追踪的帖子里搜索)in:private(在秘密帖子里搜索)
in:bookmarks(在收藏的帖子里搜索)in:first(在第一帖里搜索)in:pinned(在置顶主题里搜索)in:unpinned(在未置顶主题里搜索)in:wiki(在协作主题里搜索)
posts_count:N(搜索帖子数为 N 的)before:天数或日期after:天数或日期tags:一,二
-

-

例子

-

-

    -
  • 彩虹 #gong-yuan将搜索在“公园”分类中没有关闭或存档中的名字包含“彩虹”的主题。
  • -
  • 彩虹 category:公园 status:open order:latest将搜索在“公园”分类中没有锁定或存档中的名字包含“彩虹”的主题,并按最后一个帖子的日期来排序。
  • -
  • 彩虹 category:"公园和花园" in:bookmarks 将搜索在“公园和花园”分类中已被你收藏的且名字包含“彩虹”的主题。
  • -
-

badges: editor: name: 编辑 diff --git a/plugins/poll/config/locales/client.bs_BA.yml b/plugins/poll/config/locales/client.bs_BA.yml index da40be0d95..48f762a3cd 100644 --- a/plugins/poll/config/locales/client.bs_BA.yml +++ b/plugins/poll/config/locales/client.bs_BA.yml @@ -17,8 +17,34 @@ bs_BA: few: "ukupno glasova" other: "ukupno glasova" average_rating: "Prosječna ocjena: %{average}." + public: + title: "Glasovi su javni." + multiple: + help: + at_least_min_options: + one: "Odaberi barem 1 opciju" + few: "Odaberi barem %{name} opcije" + other: "Odaberi barem %{name} opcija" + up_to_max_options: + one: "Odaberi do 1 opcije" + few: "Odaberi do %{count} opcije" + other: "Odaberi do %{count} opcija" + x_options: + one: "Odaberi 1 opciju" + few: "Odaberi %{count} opcije" + other: "Odaberi %{count} opcija" + between_min_and_max_options: "Odaberi između %{min} i %{max} opcija" cast-votes: title: "ukupno glasova" label: "Glasaj" + show-results: + title: "Prikaži rezultate ankete" + label: "Prikaži rezultate" + hide-results: + title: "Nazad na glasove" + label: "Sakrij rezultate" + open: + title: "Otvori anketu" + label: "Otvori" close: label: "Zatvori" diff --git a/plugins/poll/config/locales/client.pt.yml b/plugins/poll/config/locales/client.pt.yml index 13415a2aa7..9153574ea8 100644 --- a/plugins/poll/config/locales/client.pt.yml +++ b/plugins/poll/config/locales/client.pt.yml @@ -19,6 +19,15 @@ pt: title: "Votos são públicos" multiple: help: + at_least_min_options: + one: "Escolha pelo menos 1 opção" + other: "Escolha pelo menos %{count} opções" + up_to_max_options: + one: "Escolha no máximo 1 opção" + other: "Escolha no máximo %{count} opções" + x_options: + one: "Escolha 1 opção" + other: "Escolha %{count} opções" between_min_and_max_options: "Escolha entre %{min} e %{max} opções" cast-votes: title: "Votar" diff --git a/plugins/poll/config/locales/server.bs_BA.yml b/plugins/poll/config/locales/server.bs_BA.yml index 17b984e399..8bf826b822 100644 --- a/plugins/poll/config/locales/server.bs_BA.yml +++ b/plugins/poll/config/locales/server.bs_BA.yml @@ -9,3 +9,27 @@ bs_BA: site_settings: poll_enabled: "Dozvolite korisnicima da kreiraju ankete?" poll_maximum_options: "Najveći broj dopuštenih izbora u anketi." + poll_edit_window_mins: "Period od objave posta u minutama u kojem je moguće urediti ankete." + poll: + multiple_polls_without_name: "Postoji više anketa bez imena. Koristi 'name' atribut za jedinstvenu indentifikaciju anketa." + multiple_polls_with_same_name: "Postoji više anketa s istim imenom: %{name}. Koristite atribut 'name' za jedinstvenu indentifikaciju anketa." + default_poll_must_have_at_least_2_options: "Anketa mora imati barem 2 opcije." + named_poll_must_have_at_least_2_options: "Anketa nazvana %{name} mora imati barem 2 opcije." + default_poll_must_have_less_options: + one: "Ankete moraju imati manje od 1 opcije." + few: "Ankete moraju imati manje od %{count} opcije." + other: "Ankete moraju imati manje od %{count} opcija." + named_poll_must_have_less_options: + one: "Anketa nazvana %{name} mora imati manje od 1 opcije." + few: "Anketa nazvana %{name} mora imati manje od %{count} opcije." + other: "Anketa nazvana %{name} mora imati manje od %{count} opcija." + default_poll_must_have_different_options: "Ankete moraju imati različite opcije." + named_poll_must_have_different_options: "Anketa nazvana %{name} mora imati različite opcije." + default_poll_with_multiple_choices_has_invalid_parameters: "Anketa s više opcija ima nevažeće parametre." + named_poll_with_multiple_choices_has_invalid_parameters: "Anketa nazvana %{name} s više opcija ima nevažeće parametre." + requires_at_least_1_valid_option: "Morate odabrati barem 1 valjanu opciju." + default_cannot_be_made_public: "Anketa s glasovima ne može biti postavljena kao javna." + named_cannot_be_made_public: "Anketa nazvana %{name} i ima glasove ne može biti postavljena kao javna." + edit_window_expired: + cannot_change_polls: "Možete dodati, ukloniti ili preimenovati ankete nakon prvih %{minutes} minuta." + op_cannot_edit_options: "Ne možete dodati ili ukloniti opcije ankete ankon prvih %{minutes} minuta. Molimo kontaktirajte moderatora ako morate urediti opciju ankete." diff --git a/public/500.bs_BA.html b/public/500.bs_BA.html index 9bc7547805..e7ef753acc 100644 --- a/public/500.bs_BA.html +++ b/public/500.bs_BA.html @@ -7,6 +7,6 @@

Oops

Softver koji pokreće ovaj forum za rasprave součen je sa neočekivanim problemom. Izvinjavamo se na poteškoćama.

Detaljna informacija o grešci je zapisana, i automatska poruka je stvorena. Pogledati ćemo o čemu je riječ.

-

No further action is necessary. However, if the error condition persists, you can provide additional detail, including steps to reproduce the error, by posting a discussion topic in the site's feedback category.

+

Daljnje akcije nisu potrebne. Ako se greška nastavi pojavljivati, možete nam proslijediti dodatne detalje, kao i korake za raprodukciju graške tako što objavite post u kategoriji povratnih informacija stranice.

From b85056f4cd9fef601be723cd3ef67b39c3afe445 Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Thu, 20 Oct 2016 10:49:55 -0400 Subject: [PATCH 0636/1447] Version bump to v1.7.0.beta6 --- lib/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/version.rb b/lib/version.rb index f680629e61..5dcf4ea1f9 100644 --- a/lib/version.rb +++ b/lib/version.rb @@ -5,7 +5,7 @@ module Discourse MAJOR = 1 MINOR = 7 TINY = 0 - PRE = 'beta5' + PRE = 'beta6' STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.') end From 35a79a70c3f1ddffacb5b120dbfd1e91b661e9b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Thu, 20 Oct 2016 19:53:41 +0200 Subject: [PATCH 0637/1447] FIX: uploading custom avatar was always hidden --- .../discourse/lib/utilities.js.es6 | 37 +++++++++---------- lib/validators/upload_validator.rb | 8 ++-- test/javascripts/lib/utilities-test.js.es6 | 31 +++++++++++++--- 3 files changed, 46 insertions(+), 30 deletions(-) diff --git a/app/assets/javascripts/discourse/lib/utilities.js.es6 b/app/assets/javascripts/discourse/lib/utilities.js.es6 index a46fdb0c8c..0385fa6555 100644 --- a/app/assets/javascripts/discourse/lib/utilities.js.es6 +++ b/app/assets/javascripts/discourse/lib/utilities.js.es6 @@ -190,10 +190,8 @@ export function validateUploadedFiles(files, bypassNewUserRestriction) { export function validateUploadedFile(file, type, bypassNewUserRestriction) { // check that the uploaded file is authorized - if (!authorizesAllExtensions() && - !isAuthorizedUpload(file)) { - var extensions = authorizedExtensions(); - bootbox.alert(I18n.t('post.errors.upload_not_authorized', { authorized_extensions: extensions })); + if (!authorizesAllExtensions() && !isAuthorizedUpload(file)) { + bootbox.alert(I18n.t('post.errors.upload_not_authorized', { authorized_extensions: authorizedExtensions() })); return false; } @@ -217,23 +215,24 @@ export function authorizesAllExtensions() { return Discourse.SiteSettings.authorized_extensions.indexOf("*") >= 0; } +function extensions() { + return Discourse.SiteSettings.authorized_extensions + .toLowerCase() + .replace(/[\s\.]+/g, "") + .split("|") + .filter(ext => ext.indexOf("*") === -1); +} + +function extensionsRegex() { + return new RegExp("\\.(" + extensions().join("|") + ")$", "i"); +} + export function isAuthorizedUpload(file) { - if (file && file.name) { - var extensions = _.chain(Discourse.SiteSettings.authorized_extensions.split("|")) - .reject(function(extension) { return extension.indexOf("*") >= 0; }) - .map(function(extension) { return (extension.indexOf(".") === 0 ? extension.substring(1) : extension).replace(".", "\\."); }) - .value(); - return new RegExp("\\.(" + extensions.join("|") + ")$", "i").test(file.name); - } - return false; + return file && file.name && extensionsRegex().test(file.name); } export function authorizedExtensions() { - return _.chain(Discourse.SiteSettings.authorized_extensions.split("|")) - .reject(function(extension) { return extension.indexOf("*") >= 0; }) - .map(function(extension) { return extension.toLowerCase(); }) - .value() - .join(", "); + return extensions().join(", "); } export function uploadLocation(url) { @@ -267,12 +266,12 @@ export function isAnImage(path) { export function allowsImages() { return authorizesAllExtensions() || - (/\.(png|jpe?g|gif|bmp|tiff?|svg|webp|ico)/i).test(authorizedExtensions()); + (/(png|jpe?g|gif|bmp|tiff?|svg|webp|ico)/i).test(authorizedExtensions()); } export function allowsAttachments() { return authorizesAllExtensions() || - !/^(\.(png|jpe?g|gif|bmp|tiff?|svg|webp|ico)(,\s)?)+$/i.test(authorizedExtensions()); + !/^((png|jpe?g|gif|bmp|tiff?|svg|webp|ico)(,\s)?)+$/i.test(authorizedExtensions()); } export function displayErrorForUpload(data) { diff --git a/lib/validators/upload_validator.rb b/lib/validators/upload_validator.rb index 9d871ba520..5612662cb1 100644 --- a/lib/validators/upload_validator.rb +++ b/lib/validators/upload_validator.rb @@ -49,12 +49,10 @@ class Validators::UploadValidator < ActiveModel::Validator authorized_uploads = Set.new SiteSetting.authorized_extensions - .tr(" ", "") + .gsub(/[\s\.]+/, "") + .downcase .split("|") - .each do |extension| - next if extension.include?("*") - authorized_uploads << (extension.start_with?(".") ? extension[1..-1] : extension).downcase - end + .each { |extension| authorized_uploads << extension unless extension.include?("*") } authorized_uploads end diff --git a/test/javascripts/lib/utilities-test.js.es6 b/test/javascripts/lib/utilities-test.js.es6 index fd3583de8c..403cb2c971 100644 --- a/test/javascripts/lib/utilities-test.js.es6 +++ b/test/javascripts/lib/utilities-test.js.es6 @@ -5,6 +5,8 @@ import { extractDomainFromUrl, isAnImage, avatarUrl, + authorizedExtensions, + allowsImages, allowsAttachments, getRawSize, avatarImg, @@ -63,12 +65,11 @@ test("new user cannot upload attachments", function() { }); test("ensures an authorized upload", function() { - var html = { name: "unauthorized.html" }; - var extensions = Discourse.SiteSettings.authorized_extensions.replace(/\|/g, ", "); + const html = { name: "unauthorized.html" }; sandbox.stub(bootbox, "alert"); not(validUpload([html])); - ok(bootbox.alert.calledWith(I18n.t('post.errors.upload_not_authorized', { authorized_extensions: extensions }))); + ok(bootbox.alert.calledWith(I18n.t('post.errors.upload_not_authorized', { authorized_extensions: authorizedExtensions() }))); }); var imageSize = 10 * 1024; @@ -163,15 +164,33 @@ test("avatarImg", function() { setDevicePixelRatio(oldRatio); }); +test("allowsImages", function() { + Discourse.SiteSettings.authorized_extensions = "jpg|jpeg|gif"; + ok(allowsImages(), "works"); + + Discourse.SiteSettings.authorized_extensions = ".jpg|.jpeg|.gif"; + ok(allowsImages(), "works with old extensions syntax"); + + Discourse.SiteSettings.authorized_extensions = "txt|pdf|*"; + ok(allowsImages(), "images are allowed when all extensions are allowed"); + + Discourse.SiteSettings.authorized_extensions = "json|jpg|pdf|txt"; + ok(allowsImages(), "images are allowed when at least one extension is an image extension"); +}); + + test("allowsAttachments", function() { - Discourse.SiteSettings.authorized_extensions = ".jpg, .jpeg, .gif"; + Discourse.SiteSettings.authorized_extensions = "jpg|jpeg|gif"; not(allowsAttachments(), "no attachments allowed by default"); - Discourse.SiteSettings.authorized_extensions = ".jpg, .jpeg, .gif, *"; + Discourse.SiteSettings.authorized_extensions = "jpg|jpeg|gif|*"; ok(allowsAttachments(), "attachments are allowed when all extensions are allowed"); - Discourse.SiteSettings.authorized_extensions = ".jpg, .jpeg, .gif, .pdf"; + Discourse.SiteSettings.authorized_extensions = "jpg|jpeg|gif|pdf"; ok(allowsAttachments(), "attachments are allowed when at least one extension is not an image extension"); + + Discourse.SiteSettings.authorized_extensions = ".jpg|.jpeg|.gif|.pdf"; + ok(allowsAttachments(), "works with old extensions syntax"); }); test("defaultHomepage", function() { From febbd27ba605fd85fd85e8852b7fb47791368991 Mon Sep 17 00:00:00 2001 From: Jeff Atwood Date: Thu, 20 Oct 2016 14:49:06 -0700 Subject: [PATCH 0638/1447] remove gmail/live SMTP warning --- app/models/admin_dashboard_data.rb | 6 +----- config/locales/server.en.yml | 3 +-- spec/models/admin_dashboard_data_spec.rb | 23 ----------------------- 3 files changed, 2 insertions(+), 30 deletions(-) diff --git a/app/models/admin_dashboard_data.rb b/app/models/admin_dashboard_data.rb index bfcaff65fa..5ac4bd55c3 100644 --- a/app/models/admin_dashboard_data.rb +++ b/app/models/admin_dashboard_data.rb @@ -94,7 +94,7 @@ class AdminDashboardData :ram_check, :google_oauth2_config_check, :facebook_config_check, :twitter_config_check, :github_config_check, :s3_config_check, :image_magick_check, - :failing_emails_check, :send_consumer_email_check, + :failing_emails_check, :subfolder_ends_in_slash_check, :pop3_polling_configuration, :email_polling_errored_recently @@ -214,10 +214,6 @@ class AdminDashboardData I18n.t('dashboard.failing_emails_warning', num_failed_jobs: num_failed_jobs) if num_failed_jobs > 0 end - def send_consumer_email_check - I18n.t('dashboard.consumer_email_warning') if Rails.env.production? and ActionMailer::Base.smtp_settings[:address] =~ /gmail\.com|live\.com|yahoo\.com/ - end - def subfolder_ends_in_slash_check I18n.t('dashboard.subfolder_ends_in_slash') if Discourse.base_uri =~ /\/$/ end diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index fd7ebcc9b6..01ba7f9cc8 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -816,8 +816,7 @@ en: s3_config_warning: 'The server is configured to upload files to s3, but at least one the following setting is not set: s3_access_key_id, s3_secret_access_key or s3_upload_bucket. Go to the Site Settings and update the settings. See "How to set up image uploads to S3?" to learn more.' s3_backup_config_warning: 'The server is configured to upload backups to s3, but at least one the following setting is not set: s3_access_key_id, s3_secret_access_key or s3_backup_bucket. Go to the Site Settings and update the settings. See "How to set up image uploads to S3?" to learn more.' image_magick_warning: 'The server is configured to create thumbnails of large images, but ImageMagick is not installed. Install ImageMagick using your favorite package manager or download the latest release.' - failing_emails_warning: 'There are %{num_failed_jobs} email jobs that failed. Check your app.yml and ensure that the mail server settings are correct. See the failed jobs in Sidekiq.' - consumer_email_warning: "Your site is configured to use Gmail (or another consumer email service) to send email. Gmail limits how many emails you can send. Consider using an email service provider like mandrill.com to ensure email deliverability." + failing_emails_warning: 'There are %{num_failed_jobs} email jobs that failed. Check your app.yml and ensure that the mail server settings are correct. See the failed jobs in Sidekiq.' subfolder_ends_in_slash: "Your subfolder setup is incorrect; the DISCOURSE_RELATIVE_URL_ROOT ends in a slash." email_polling_errored_recently: one: "Email polling has generated an error in the past 24 hours. Look at the logs for more details." diff --git a/spec/models/admin_dashboard_data_spec.rb b/spec/models/admin_dashboard_data_spec.rb index aa9f7080b3..6a0cd5a3ca 100644 --- a/spec/models/admin_dashboard_data_spec.rb +++ b/spec/models/admin_dashboard_data_spec.rb @@ -123,29 +123,6 @@ describe AdminDashboardData do end end - describe 'send_consumer_email_check' do - subject { described_class.new.send_consumer_email_check } - - it 'returns nil if gmail.com is not in the smtp_settings address' do - ActionMailer::Base.stubs(:smtp_settings).returns({address: 'mandrillapp.com'}) - expect(subject).to be_nil - end - - context 'gmail.com is in the smtp_settings address' do - before { ActionMailer::Base.stubs(:smtp_settings).returns({address: 'smtp.gmail.com'}) } - - it 'returns nil in development env' do - Rails.stubs(env: ActiveSupport::StringInquirer.new('development')) - expect(subject).to be_nil - end - - it 'returns a string when in production env' do - Rails.stubs(env: ActiveSupport::StringInquirer.new('production')) - expect(subject).not_to be_nil - end - end - end - describe 'auth_config_checks' do shared_examples 'problem detection for login providers' do From 35d248ab0d3d5338ae4ddd98960e94b0f5b7df65 Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 21 Oct 2016 10:53:58 +1100 Subject: [PATCH 0639/1447] FIX: if badge has an image do not override icon --- app/models/badge.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/models/badge.rb b/app/models/badge.rb index 9c743f14dd..6851b210dc 100644 --- a/app/models/badge.rb +++ b/app/models/badge.rb @@ -129,8 +129,10 @@ class Badge < ActiveRecord::Base end def default_icon=(val) - self.icon ||= val - self.icon = val if self.icon = "fa-certificate" + unless self.image + self.icon ||= val + self.icon = val if self.icon = "fa-certificate" + end end def default_name=(val) From 2a61cc8c88a361394edc080361faa9b607db4bd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Fri, 21 Oct 2016 12:37:03 +0200 Subject: [PATCH 0640/1447] FIX: email styling with blacklisted iframes --- lib/email/styles.rb | 9 +++++++-- spec/components/email/styles_spec.rb | 6 ++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/email/styles.rb b/lib/email/styles.rb index 9186bb3f13..cb20f3dca1 100644 --- a/lib/email/styles.rb +++ b/lib/email/styles.rb @@ -129,13 +129,18 @@ module Email # iframes can't go in emails, so replace them with clickable links @fragment.css('iframe').each do |i| begin - src_uri = URI(i['src']) + # sometimes, iframes are blacklisted... + if i["src"].blank? + i.remove + next + end + src_uri = URI(i['src']) # If an iframe is protocol relative, use SSL when displaying it display_src = "#{src_uri.scheme || 'https'}://#{src_uri.host}#{src_uri.path}#{src_uri.query.nil? ? '' : '?' + src_uri.query}#{src_uri.fragment.nil? ? '' : '#' + src_uri.fragment}" i.replace "

#{CGI.escapeHTML(display_src)}

" rescue URI::InvalidURIError - # If the URL is weird, remove it + # If the URL is weird, remove the iframe i.remove end end diff --git a/spec/components/email/styles_spec.rb b/spec/components/email/styles_spec.rb index d9824f4cf7..97e09c726c 100644 --- a/spec/components/email/styles_spec.rb +++ b/spec/components/email/styles_spec.rb @@ -95,6 +95,12 @@ describe Email::Styles do expect(frag.at('iframe')).to be_blank expect(frag.at('a')).to be_blank end + + it "won't allow empty iframe src, strips them with no link" do + frag = html_fragment("") + expect(frag.at('iframe')).to be_blank + expect(frag.at('a')).to be_blank + end end context "rewriting protocol relative URLs to the forum" do From bf915322603c0b7ec8157e99e00f4c3c7b280289 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Thu, 20 Oct 2016 13:26:41 -0400 Subject: [PATCH 0641/1447] Fixes some Ember Deprecations for 1.13: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove ArrayController - Remove {{view}} from templates - Replace many cases of needs: [‘controller’] with inject - Enable Ember Legacy Views --- .../admin-backups-logs.js.es6 | 19 +++-- .../admin/controllers/admin-api-keys.js.es6 | 54 ++---------- .../controllers/admin-backups-index.js.es6 | 13 +-- .../controllers/admin-backups-logs.js.es6 | 7 +- .../controllers/admin-badges-show.js.es6 | 82 +++++++++---------- .../admin/controllers/admin-badges.js.es6 | 2 +- .../controllers/admin-customize-colors.js.es6 | 19 ++--- .../admin/controllers/admin-emojis.js.es6 | 14 ++-- .../admin/controllers/admin-flags-list.js.es6 | 14 ++-- .../admin/controllers/admin-group.js.es6 | 8 +- .../controllers/admin-groups-type.js.es6 | 20 ++--- .../admin-logs-screened-emails.js.es6 | 13 ++- .../admin-logs-screened-ip-addresses.js.es6 | 7 +- .../admin-logs-screened-urls.js.es6 | 11 ++- .../admin-logs-staff-action-logs.js.es6 | 2 +- .../admin/controllers/admin-permalinks.js.es6 | 17 ++-- .../admin/controllers/admin-plugins.js.es6 | 11 ++- .../admin-site-settings-category.js.es6 | 4 +- .../controllers/admin-site-settings.js.es6 | 2 +- .../controllers/admin-user-badges.js.es6 | 43 ++++------ .../controllers/admin-users-list-show.js.es6 | 2 +- .../modals/admin-agree-flag.js.es6 | 13 ++- .../modals/admin-delete-flag.js.es6 | 31 +++---- .../javascripts/admin/models/backup.js.es6 | 3 - .../admin/routes/admin-backups-logs.js.es6 | 12 +-- .../admin/routes/admin-backups.js.es6 | 4 +- .../admin/routes/admin-badges.js.es6 | 21 +++-- .../javascripts/admin/templates/api-keys.hbs | 3 +- .../admin/templates/backups-logs.hbs | 1 + .../admin/templates/backups_index.hbs | 10 +-- .../javascripts/admin/templates/emojis.hbs | 4 +- .../admin/templates/groups_type.hbs | 2 +- .../bulk-notification-level.js.es6 | 4 +- .../discourse/controllers/group-posts.js.es6 | 7 +- .../preferences/badge-title.js.es6 | 15 ++-- .../controllers/preferences/card-badge.js.es6 | 15 ++-- .../controllers/tag-groups-show.js.es6 | 13 ++- .../discourse/controllers/tag-groups.js.es6 | 8 +- .../controllers/topic-bulk-actions.js.es6 | 2 +- .../discourse/controllers/topic.js.es6 | 1 + .../discourse/controllers/user-badges.js.es6 | 24 ++---- .../controllers/user-notifications.js.es6 | 10 +-- .../templates/discovery/categories.hbs | 4 +- .../templates/modal/topic-bulk-actions.hbs | 2 +- .../javascripts/discourse/templates/topic.hbs | 2 +- .../discourse/templates/user/badges.hbs | 4 +- .../templates/user/notifications.hbs | 2 +- .../javascripts/discourse/views/topic.js.es6 | 5 +- app/assets/javascripts/env.js | 3 +- .../controllers/admin-user-badges-test.js.es6 | 2 +- 50 files changed, 255 insertions(+), 336 deletions(-) rename app/assets/javascripts/admin/{views => components}/admin-backups-logs.js.es6 (82%) create mode 100644 app/assets/javascripts/admin/templates/backups-logs.hbs diff --git a/app/assets/javascripts/admin/views/admin-backups-logs.js.es6 b/app/assets/javascripts/admin/components/admin-backups-logs.js.es6 similarity index 82% rename from app/assets/javascripts/admin/views/admin-backups-logs.js.es6 rename to app/assets/javascripts/admin/components/admin-backups-logs.js.es6 index 1929abf5a2..cb9e39eb60 100644 --- a/app/assets/javascripts/admin/views/admin-backups-logs.js.es6 +++ b/app/assets/javascripts/admin/components/admin-backups-logs.js.es6 @@ -2,17 +2,20 @@ import debounce from 'discourse/lib/debounce'; import { renderSpinner } from 'discourse/helpers/loading-spinner'; import { escapeExpression } from 'discourse/lib/utilities'; -export default Ember.View.extend({ +export default Ember.Component.extend({ classNames: ["admin-backups-logs"], - _initialize: function() { this._reset(); }.on("init"), + init() { + this._super(); + this._reset(); + }, _reset() { this.setProperties({ formattedLogs: "", index: 0 }); }, _updateFormattedLogs: debounce(function() { - const logs = this.get("controller.model"); + const logs = this.get("logs"); if (logs.length === 0) { this._reset(); // reset the cached logs whenever the model is reset } else { @@ -28,7 +31,7 @@ export default Ember.View.extend({ // force rerender this.rerender(); } - }, 150).observes("controller.model.[]"), + }, 150).observes("logs.[]").on('init'), render(buffer) { const formattedLogs = this.get("formattedLogs"); @@ -40,14 +43,14 @@ export default Ember.View.extend({ buffer.push("

" + I18n.t("admin.backups.logs.none") + "

"); } // add a loading indicator - if (this.get("controller.status.model.isOperationRunning")) { + if (this.get("status.isOperationRunning")) { buffer.push(renderSpinner('small')); } }, - _forceScrollToBottom: function() { + didInsertElement() { + this._super(); const $div = this.$()[0]; $div.scrollTop = $div.scrollHeight; - }.on("didInsertElement") - + }, }); diff --git a/app/assets/javascripts/admin/controllers/admin-api-keys.js.es6 b/app/assets/javascripts/admin/controllers/admin-api-keys.js.es6 index 82366d3bd7..529538263c 100644 --- a/app/assets/javascripts/admin/controllers/admin-api-keys.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-api-keys.js.es6 @@ -1,66 +1,30 @@ import ApiKey from 'admin/models/api-key'; -/** - This controller supports the interface for dealing with API keys - - @class AdminApiController - @extends Ember.ArrayController - @namespace Discourse - @module Discourse -**/ -export default Ember.ArrayController.extend({ +export default Ember.Controller.extend({ actions: { - /** - Generates a master api key - - @method generateMasterKey - **/ - generateMasterKey: function() { - var self = this; - ApiKey.generateMasterKey().then(function (key) { - self.get('model').pushObject(key); - }); + generateMasterKey() { + ApiKey.generateMasterKey().then(key => this.get('model').pushObject(key)); }, - /** - Creates an API key instance with internal user object - - @method regenerateKey - @param {ApiKey} key the key to regenerate - **/ - regenerateKey: function(key) { - bootbox.confirm(I18n.t("admin.api.confirm_regen"), I18n.t("no_value"), I18n.t("yes_value"), function(result) { + regenerateKey(key) { + bootbox.confirm(I18n.t("admin.api.confirm_regen"), I18n.t("no_value"), I18n.t("yes_value"), result => { if (result) { key.regenerate(); } }); }, - /** - Revokes an API key - - @method revokeKey - @param {ApiKey} key the key to revoke - **/ - revokeKey: function(key) { - var self = this; - bootbox.confirm(I18n.t("admin.api.confirm_revoke"), I18n.t("no_value"), I18n.t("yes_value"), function(result) { + revokeKey(key) { + bootbox.confirm(I18n.t("admin.api.confirm_revoke"), I18n.t("no_value"), I18n.t("yes_value"), result => { if (result) { - key.revoke().then(function() { - self.get('model').removeObject(key); - }); + key.revoke().then(() => this.get('model').removeObject(key)); } }); } }, - /** - Has a master key already been generated? - - @property hasMasterKey - @type {Boolean} - **/ + // Has a master key already been generated? hasMasterKey: function() { return !!this.get('model').findBy('user', null); }.property('model.[]') diff --git a/app/assets/javascripts/admin/controllers/admin-backups-index.js.es6 b/app/assets/javascripts/admin/controllers/admin-backups-index.js.es6 index 98f76405a2..605ebe83af 100644 --- a/app/assets/javascripts/admin/controllers/admin-backups-index.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-backups-index.js.es6 @@ -1,19 +1,20 @@ import { ajax } from 'discourse/lib/ajax'; -export default Ember.ArrayController.extend({ - needs: ["adminBackups"], - status: Ember.computed.alias("controllers.adminBackups"), + +export default Ember.Controller.extend({ + adminBackups: Ember.inject.controller(), + status: Ember.computed.alias('adminBackups.model'), uploadLabel: function() { return I18n.t("admin.backups.upload.label"); }.property(), restoreTitle: function() { - if (!this.get('status.model.allowRestore')) { + if (!this.get('status.allowRestore')) { return "admin.backups.operations.restore.is_disabled"; - } else if (this.get("status.model.isOperationRunning")) { + } else if (this.get("status.isOperationRunning")) { return "admin.backups.operations.is_running"; } else { return "admin.backups.operations.restore.title"; } - }.property("status.model.{allowRestore,isOperationRunning}"), + }.property("status.{allowRestore,isOperationRunning}"), actions: { diff --git a/app/assets/javascripts/admin/controllers/admin-backups-logs.js.es6 b/app/assets/javascripts/admin/controllers/admin-backups-logs.js.es6 index 1b3d90346a..38bdd6f571 100644 --- a/app/assets/javascripts/admin/controllers/admin-backups-logs.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-backups-logs.js.es6 @@ -1,4 +1,5 @@ -export default Ember.ArrayController.extend({ - needs: ["adminBackups"], - status: Em.computed.alias("controllers.adminBackups") +export default Ember.Controller.extend({ + logs: [], + adminBackups: Ember.inject.controller(), + status: Em.computed.alias("adminBackups.model") }); diff --git a/app/assets/javascripts/admin/controllers/admin-badges-show.js.es6 b/app/assets/javascripts/admin/controllers/admin-badges-show.js.es6 index 5ec2cb4541..122a63c42d 100644 --- a/app/assets/javascripts/admin/controllers/admin-badges-show.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-badges-show.js.es6 @@ -3,14 +3,14 @@ import BufferedContent from 'discourse/mixins/buffered-content'; import { propertyNotEqual } from 'discourse/lib/computed'; export default Ember.Controller.extend(BufferedContent, { - needs: ['admin-badges'], + adminBadges: Ember.inject.controller(), saving: false, savingStatus: '', - badgeTypes: Em.computed.alias('controllers.admin-badges.badgeTypes'), - badgeGroupings: Em.computed.alias('controllers.admin-badges.badgeGroupings'), - badgeTriggers: Em.computed.alias('controllers.admin-badges.badgeTriggers'), - protectedSystemFields: Em.computed.alias('controllers.admin-badges.protectedSystemFields'), + badgeTypes: Em.computed.alias('adminBadges.badgeTypes'), + badgeGroupings: Em.computed.alias('adminBadges.badgeGroupings'), + badgeTriggers: Em.computed.alias('adminBadges.badgeTriggers'), + protectedSystemFields: Em.computed.alias('adminBadges.protectedSystemFields'), readOnly: Ember.computed.alias('buffered.system'), showDisplayName: propertyNotEqual('name', 'displayName'), @@ -30,16 +30,15 @@ export default Ember.Controller.extend(BufferedContent, { }.observes('model.id'), actions: { - save: function() { + save() { if (!this.get('saving')) { - var fields = ['allow_title', 'multiple_grant', - 'listable', 'auto_revoke', - 'enabled', 'show_posts', - 'target_posts', 'name', 'description', - 'long_description', - 'icon', 'image', 'query', 'badge_grouping_id', - 'trigger', 'badge_type_id'], - self = this; + let fields = ['allow_title', 'multiple_grant', + 'listable', 'auto_revoke', + 'enabled', 'show_posts', + 'target_posts', 'name', 'description', + 'long_description', + 'icon', 'image', 'query', 'badge_grouping_id', + 'trigger', 'badge_type_id']; if (this.get('buffered.system')){ var protectedFields = this.get('protectedSystemFields'); @@ -51,54 +50,55 @@ export default Ember.Controller.extend(BufferedContent, { this.set('saving', true); this.set('savingStatus', I18n.t('saving')); - var boolFields = ['allow_title', 'multiple_grant', - 'listable', 'auto_revoke', - 'enabled', 'show_posts', - 'target_posts' ]; + const boolFields = ['allow_title', 'multiple_grant', + 'listable', 'auto_revoke', + 'enabled', 'show_posts', + 'target_posts' ]; - var data = {}, - buffered = this.get('buffered'); + const data = {}; + const buffered = this.get('buffered'); fields.forEach(function(field){ var d = buffered.get(field); if (_.include(boolFields, field)) { d = !!d; } data[field] = d; }); - var newBadge = !this.get('id'), - model = this.get('model'); - this.get('model').save(data).then(function() { + const newBadge = !this.get('id'); + const model = this.get('model'); + this.get('model').save(data).then(() => { if (newBadge) { - var adminBadgesController = self.get('controllers.admin-badges'); - if (!adminBadgesController.contains(model)) adminBadgesController.pushObject(model); - self.transitionToRoute('adminBadges.show', model.get('id')); + const adminBadges = this.get('adminBadges.model'); + if (!adminBadges.contains(model)) { + adminBadges.pushObject(model); + } + this.transitionToRoute('adminBadges.show', model.get('id')); } else { - self.commitBuffer(); - self.set('savingStatus', I18n.t('saved')); + this.commitBuffer(); + this.set('savingStatus', I18n.t('saved')); } - }).catch(popupAjaxError).finally(function() { - self.set('saving', false); - self.set('savingStatus', ''); + }).catch(popupAjaxError).finally(() => { + this.set('saving', false); + this.set('savingStatus', ''); }); } }, - destroy: function() { - var self = this, - adminBadgesController = this.get('controllers.admin-badges'), - model = this.get('model'); + destroy() { + const adminBadges = this.get('adminBadges.model'); + const model = this.get('model'); if (!model.get('id')) { - self.transitionToRoute('adminBadges.index'); + this.transitionToRoute('adminBadges.index'); return; } - return bootbox.confirm(I18n.t("admin.badges.delete_confirm"), I18n.t("no_value"), I18n.t("yes_value"), function(result) { + return bootbox.confirm(I18n.t("admin.badges.delete_confirm"), I18n.t("no_value"), I18n.t("yes_value"), result => { if (result) { - model.destroy().then(function() { - adminBadgesController.removeObject(model); - self.transitionToRoute('adminBadges.index'); - }).catch(function() { + model.destroy().then(() => { + adminBadges.removeObject(model); + this.transitionToRoute('adminBadges.index'); + }).catch(() => { bootbox.alert(I18n.t('generic_error')); }); } diff --git a/app/assets/javascripts/admin/controllers/admin-badges.js.es6 b/app/assets/javascripts/admin/controllers/admin-badges.js.es6 index 24c4c05139..77c79b724a 100644 --- a/app/assets/javascripts/admin/controllers/admin-badges.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-badges.js.es6 @@ -1 +1 @@ -export default Ember.ArrayController.extend(); +export default Ember.Controller.extend(); diff --git a/app/assets/javascripts/admin/controllers/admin-customize-colors.js.es6 b/app/assets/javascripts/admin/controllers/admin-customize-colors.js.es6 index 4a6a58021b..ae253aec84 100644 --- a/app/assets/javascripts/admin/controllers/admin-customize-colors.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-customize-colors.js.es6 @@ -1,4 +1,4 @@ -export default Ember.ArrayController.extend({ +export default Ember.Controller.extend({ onlyOverridden: false, baseColorScheme: function() { @@ -13,8 +13,8 @@ export default Ember.ArrayController.extend({ return baseColorsHash; }.property('baseColorScheme'), - removeSelected: function() { - this.removeObject(this.get('selectedItem')); + removeSelected() { + this.get('model').removeObject(this.get('selectedItem')); this.set('selectedItem', null); }, @@ -26,8 +26,7 @@ export default Ember.ArrayController.extend({ return; } - var matches = Em.A(); - + const matches = []; _.each(this.get('selectedItem.colors'), function(color){ if (color.get('overridden')) matches.pushObject(color); }); @@ -58,10 +57,10 @@ export default Ember.ArrayController.extend({ this.filterContent(); }, - newColorScheme: function() { - var newColorScheme = Em.copy(this.get('baseColorScheme'), true); + newColorScheme() { + const newColorScheme = Em.copy(this.get('baseColorScheme'), true); newColorScheme.set('name', I18n.t('admin.customize.colors.new_name')); - this.pushObject(newColorScheme); + this.get('model').pushObject(newColorScheme); this.send('selectColorScheme', newColorScheme); this.set('onlyOverridden', false); }, @@ -86,10 +85,10 @@ export default Ember.ArrayController.extend({ this.updateEnabled(); }, - copy: function(colorScheme) { + copy(colorScheme) { var newColorScheme = Em.copy(colorScheme, true); newColorScheme.set('name', I18n.t('admin.customize.colors.copy_name_prefix') + ' ' + colorScheme.get('name')); - this.pushObject(newColorScheme); + this.get('model').pushObject(newColorScheme); this.send('selectColorScheme', newColorScheme); }, diff --git a/app/assets/javascripts/admin/controllers/admin-emojis.js.es6 b/app/assets/javascripts/admin/controllers/admin-emojis.js.es6 index b111a5952b..29aecc4773 100644 --- a/app/assets/javascripts/admin/controllers/admin-emojis.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-emojis.js.es6 @@ -1,23 +1,23 @@ import { ajax } from 'discourse/lib/ajax'; -export default Ember.ArrayController.extend({ - sortProperties: ["name"], +export default Ember.Controller.extend({ + sortedEmojis: Ember.computed.sort('model', 'emojiSorting'), + emojiSorting: ['name'], actions: { emojiUploaded(emoji) { emoji.url += "?t=" + new Date().getTime(); - this.pushObject(Ember.Object.create(emoji)); + this.get('model').pushObject(Ember.Object.create(emoji)); }, destroy(emoji) { - const self = this; return bootbox.confirm( I18n.t("admin.emoji.delete_confirm", { name: emoji.get("name") }), I18n.t("no_value"), I18n.t("yes_value"), - function(destroy) { + destroy => { if (destroy) { - return ajax("/admin/customize/emojis/" + emoji.get("name"), { type: "DELETE" }).then(function() { - self.removeObject(emoji); + return ajax("/admin/customize/emojis/" + emoji.get("name"), { type: "DELETE" }).then(() => { + this.get('model').removeObject(emoji); }); } } diff --git a/app/assets/javascripts/admin/controllers/admin-flags-list.js.es6 b/app/assets/javascripts/admin/controllers/admin-flags-list.js.es6 index 0c85749775..e3101e2fa3 100644 --- a/app/assets/javascripts/admin/controllers/admin-flags-list.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-flags-list.js.es6 @@ -1,6 +1,6 @@ import FlaggedPost from 'admin/models/flagged-post'; -export default Ember.ArrayController.extend({ +export default Ember.Controller.extend({ query: null, adminOldFlagsView: Em.computed.equal("query", "old"), @@ -8,18 +8,16 @@ export default Ember.ArrayController.extend({ actions: { disagreeFlags(flaggedPost) { - var self = this; - flaggedPost.disagreeFlags().then(function () { - self.removeObject(flaggedPost); + flaggedPost.disagreeFlags().then(() => { + this.get('model').removeObject(flaggedPost); }, function () { bootbox.alert(I18n.t("admin.flags.error")); }); }, deferFlags(flaggedPost) { - var self = this; - flaggedPost.deferFlags().then(function () { - self.removeObject(flaggedPost); + flaggedPost.deferFlags().then(() => { + this.get('model').removeObject(flaggedPost); }, function () { bootbox.alert(I18n.t("admin.flags.error")); }); @@ -29,7 +27,7 @@ export default Ember.ArrayController.extend({ this.send("disagreeFlags", item); }, - loadMore(){ + loadMore() { const flags = this.get('model'); return FlaggedPost.findAll(this.get('query'), flags.length+1).then(data => { if (data.length===0) { diff --git a/app/assets/javascripts/admin/controllers/admin-group.js.es6 b/app/assets/javascripts/admin/controllers/admin-group.js.es6 index bf19293117..e7d53800e7 100644 --- a/app/assets/javascripts/admin/controllers/admin-group.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-group.js.es6 @@ -4,7 +4,7 @@ import { escapeExpression } from 'discourse/lib/utilities'; import computed from 'ember-addons/ember-computed-decorators'; export default Ember.Controller.extend({ - needs: ['adminGroupsType'], + adminGroupsType: Ember.inject.controller(), disableSave: false, savingStatus: '', @@ -131,13 +131,13 @@ export default Ember.Controller.extend({ save() { const group = this.get('model'), - groupsController = this.get("controllers.adminGroupsType"), + groupsController = this.get("adminGroupsType"), groupType = groupsController.get("type"); this.set('disableSave', true); this.set('savingStatus', I18n.t('saving')); - let promise = group.get("id") ? group.save() : group.create().then(() => groupsController.addObject(group)); + let promise = group.get("id") ? group.save() : group.create().then(() => groupsController.get('model').addObject(group)); promise.then(() => { this.transitionToRoute("adminGroup", groupType, group.get('name')); @@ -148,7 +148,7 @@ export default Ember.Controller.extend({ destroy() { const group = this.get('model'), - groupsController = this.get('controllers.adminGroupsType'), + groupsController = this.get('adminGroupsType'), self = this; if (!group.get('id')) { diff --git a/app/assets/javascripts/admin/controllers/admin-groups-type.js.es6 b/app/assets/javascripts/admin/controllers/admin-groups-type.js.es6 index 9a5962cccf..10d7ad01cf 100644 --- a/app/assets/javascripts/admin/controllers/admin-groups-type.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-groups-type.js.es6 @@ -1,18 +1,18 @@ import { ajax } from 'discourse/lib/ajax'; -export default Ember.ArrayController.extend({ - sortProperties: ['name'], +export default Ember.Controller.extend({ + sortedGroups: Ember.computed.sort('model', 'groupSorting'), + groupSorting: ['name'], + refreshingAutoGroups: false, - isAuto: function(){ - return this.get('type') === 'automatic'; - }.property('type'), + + isAuto: Ember.computed.equal('type', 'automatic'), actions: { - refreshAutoGroups: function(){ - var self = this; + refreshAutoGroups() { this.set('refreshingAutoGroups', true); - ajax('/admin/groups/refresh_automatic_groups', {type: 'POST'}).then(function() { - self.transitionToRoute("adminGroupsType", "automatic").then(function() { - self.set('refreshingAutoGroups', false); + ajax('/admin/groups/refresh_automatic_groups', {type: 'POST'}).then(() => { + this.transitionToRoute("adminGroupsType", "automatic").then(() => { + this.set('refreshingAutoGroups', false); }); }); } diff --git a/app/assets/javascripts/admin/controllers/admin-logs-screened-emails.js.es6 b/app/assets/javascripts/admin/controllers/admin-logs-screened-emails.js.es6 index fe158a33ab..13685f16b9 100644 --- a/app/assets/javascripts/admin/controllers/admin-logs-screened-emails.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-logs-screened-emails.js.es6 @@ -2,12 +2,12 @@ import { exportEntity } from 'discourse/lib/export-csv'; import { outputExportResult } from 'discourse/lib/export-result'; import ScreenedEmail from 'admin/models/screened-email'; -export default Ember.ArrayController.extend({ +export default Ember.Controller.extend({ loading: false, actions: { clearBlock(row){ - row.clearBlock().then(function(){ + row.clearBlock().then(function() { // feeling lazy window.location.reload(); }); @@ -19,11 +19,10 @@ export default Ember.ArrayController.extend({ }, show() { - var self = this; - self.set('loading', true); - ScreenedEmail.findAll().then(function(result) { - self.set('model', result); - self.set('loading', false); + this.set('loading', true); + ScreenedEmail.findAll().then(result => { + this.set('model', result); + this.set('loading', false); }); } }); diff --git a/app/assets/javascripts/admin/controllers/admin-logs-screened-ip-addresses.js.es6 b/app/assets/javascripts/admin/controllers/admin-logs-screened-ip-addresses.js.es6 index 88f46d6ccb..b654e6d65f 100644 --- a/app/assets/javascripts/admin/controllers/admin-logs-screened-ip-addresses.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-logs-screened-ip-addresses.js.es6 @@ -3,7 +3,7 @@ import { outputExportResult } from 'discourse/lib/export-result'; import { exportEntity } from 'discourse/lib/export-csv'; import ScreenedIpAddress from 'admin/models/screened-ip-address'; -export default Ember.ArrayController.extend({ +export default Ember.Controller.extend({ loading: false, filter: null, savedIpAddress: null, @@ -63,16 +63,15 @@ export default Ember.ArrayController.extend({ }, destroy(record) { - const self = this; return bootbox.confirm( I18n.t("admin.logs.screened_ips.delete_confirm", { ip_address: record.get('ip_address') }), I18n.t("no_value"), I18n.t("yes_value"), - function (result) { + result => { if (result) { record.destroy().then(deleted => { if (deleted) { - self.get("content").removeObject(record); + this.get("model").removeObject(record); } else { bootbox.alert(I18n.t("generic_error")); } diff --git a/app/assets/javascripts/admin/controllers/admin-logs-screened-urls.js.es6 b/app/assets/javascripts/admin/controllers/admin-logs-screened-urls.js.es6 index 5f5e333960..d57a151d21 100644 --- a/app/assets/javascripts/admin/controllers/admin-logs-screened-urls.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-logs-screened-urls.js.es6 @@ -2,15 +2,14 @@ import { exportEntity } from 'discourse/lib/export-csv'; import { outputExportResult } from 'discourse/lib/export-result'; import ScreenedUrl from 'admin/models/screened-url'; -export default Ember.ArrayController.extend({ +export default Ember.Controller.extend({ loading: false, show() { - const self = this; - self.set('loading', true); - ScreenedUrl.findAll().then(function(result) { - self.set('model', result); - self.set('loading', false); + this.set('loading', true); + ScreenedUrl.findAll().then(result => { + this.set('model', result); + this.set('loading', false); }); }, diff --git a/app/assets/javascripts/admin/controllers/admin-logs-staff-action-logs.js.es6 b/app/assets/javascripts/admin/controllers/admin-logs-staff-action-logs.js.es6 index 956a737e57..98f135dc57 100644 --- a/app/assets/javascripts/admin/controllers/admin-logs-staff-action-logs.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-logs-staff-action-logs.js.es6 @@ -2,7 +2,7 @@ import { exportEntity } from 'discourse/lib/export-csv'; import { outputExportResult } from 'discourse/lib/export-result'; import StaffActionLog from 'admin/models/staff-action-log'; -export default Ember.ArrayController.extend({ +export default Ember.Controller.extend({ loading: false, filters: null, diff --git a/app/assets/javascripts/admin/controllers/admin-permalinks.js.es6 b/app/assets/javascripts/admin/controllers/admin-permalinks.js.es6 index 9c5ab4bb3e..6bfcc66922 100644 --- a/app/assets/javascripts/admin/controllers/admin-permalinks.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-permalinks.js.es6 @@ -1,16 +1,14 @@ import debounce from 'discourse/lib/debounce'; import Permalink from 'admin/models/permalink'; -export default Ember.ArrayController.extend({ +export default Ember.Controller.extend({ loading: false, filter: null, show: debounce(function() { - var self = this; - self.set('loading', true); - Permalink.findAll(self.get("filter")).then(function(result) { - self.set('model', result); - self.set('loading', false); + Permalink.findAll(this.get("filter")).then(result => { + this.set('model', result); + this.set('loading', false); }); }, 250).observes("filter"), @@ -20,12 +18,11 @@ export default Ember.ArrayController.extend({ }, destroy: function(record) { - const self = this; - return bootbox.confirm(I18n.t("admin.permalink.delete_confirm"), I18n.t("no_value"), I18n.t("yes_value"), function(result) { + return bootbox.confirm(I18n.t("admin.permalink.delete_confirm"), I18n.t("no_value"), I18n.t("yes_value"), result => { if (result) { - record.destroy().then(function(deleted) { + record.destroy().then(deleted => { if (deleted) { - self.removeObject(record); + this.get('model').removeObject(record); } else { bootbox.alert(I18n.t("generic_error")); } diff --git a/app/assets/javascripts/admin/controllers/admin-plugins.js.es6 b/app/assets/javascripts/admin/controllers/admin-plugins.js.es6 index b2eb1335ed..5393a27c8f 100644 --- a/app/assets/javascripts/admin/controllers/admin-plugins.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-plugins.js.es6 @@ -1,10 +1,9 @@ -export default Ember.ArrayController.extend({ - +export default Ember.Controller.extend({ adminRoutes: function() { - return this.get('model').map(function(p) { - if (p.get('enabled')) { - return p.admin_route; - } + return this.get('model').map(p => { + if (p.get('enabled')) { + return p.admin_route; + } }).compact(); }.property() }); diff --git a/app/assets/javascripts/admin/controllers/admin-site-settings-category.js.es6 b/app/assets/javascripts/admin/controllers/admin-site-settings-category.js.es6 index b16db34e3e..3feb90f40e 100644 --- a/app/assets/javascripts/admin/controllers/admin-site-settings-category.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-site-settings-category.js.es6 @@ -1,11 +1,11 @@ export default Ember.Controller.extend({ categoryNameKey: null, - needs: ['adminSiteSettings'], + adminSiteSettings: Ember.inject.controller(), filteredContent: function() { if (!this.get('categoryNameKey')) { return []; } - const category = this.get('controllers.adminSiteSettings.content').findProperty('nameKey', this.get('categoryNameKey')); + const category = this.get('adminSiteSettings.allSiteSettings').findProperty('nameKey', this.get('categoryNameKey')); if (category) { return category.siteSettings; } else { diff --git a/app/assets/javascripts/admin/controllers/admin-site-settings.js.es6 b/app/assets/javascripts/admin/controllers/admin-site-settings.js.es6 index b7c4302e87..02a907d7af 100644 --- a/app/assets/javascripts/admin/controllers/admin-site-settings.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-site-settings.js.es6 @@ -1,6 +1,6 @@ import debounce from 'discourse/lib/debounce'; -export default Ember.ArrayController.extend({ +export default Ember.Controller.extend({ filter: null, onlyOverridden: false, filtered: Ember.computed.notEmpty('filter'), diff --git a/app/assets/javascripts/admin/controllers/admin-user-badges.js.es6 b/app/assets/javascripts/admin/controllers/admin-user-badges.js.es6 index c8c0ba6219..a2b7c94f17 100644 --- a/app/assets/javascripts/admin/controllers/admin-user-badges.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-user-badges.js.es6 @@ -1,10 +1,11 @@ import UserBadge from 'discourse/models/user-badge'; -export default Ember.ArrayController.extend({ - needs: ["adminUser"], - user: Em.computed.alias('controllers.adminUser.model'), - sortProperties: ['granted_at'], - sortAscending: false, +export default Ember.Controller.extend({ + adminUser: Ember.inject.controller(), + user: Ember.computed.alias('adminUser.model'), + + sortedBadges: Ember.computed.sort('model', 'badgeSortOrder'), + badgeSortOrder: ['granted_at:desc'], groupedBadges: function(){ const allBadges = this.get('model'); @@ -38,8 +39,6 @@ export default Ember.ArrayController.extend({ }); return _(expanded).sortBy(group => group.granted_at).reverse().value(); - - }.property('model', 'model.[]', 'model.expandedBadges.[]'), /** @@ -80,22 +79,15 @@ export default Ember.ArrayController.extend({ model.get('expandedBadges').pushObject(userBadge.badge.id); }, - /** - Grant the selected badge to the user. - - @method grantBadge - @param {Integer} badgeId id of the badge we want to grant. - **/ - grantBadge: function(badgeId) { - var self = this; - UserBadge.grant(badgeId, this.get('user.username'), this.get('badgeReason')).then(function(userBadge) { - self.set('badgeReason', ''); - self.pushObject(userBadge); - Ember.run.next(function() { + grantBadge(badgeId) { + UserBadge.grant(badgeId, this.get('user.username'), this.get('badgeReason')).then(userBadge => { + this.set('badgeReason', ''); + this.get('model').pushObject(userBadge); + Ember.run.next(() => { // Update the selected badge ID after the combobox has re-rendered. - var newSelectedBadge = self.get('grantableBadges')[0]; + const newSelectedBadge = this.get('grantableBadges')[0]; if (newSelectedBadge) { - self.set('selectedBadgeId', newSelectedBadge.get('id')); + this.set('selectedBadgeId', newSelectedBadge.get('id')); } }); }, function() { @@ -104,12 +96,11 @@ export default Ember.ArrayController.extend({ }); }, - revokeBadge: function(userBadge) { - var self = this; - return bootbox.confirm(I18n.t("admin.badges.revoke_confirm"), I18n.t("no_value"), I18n.t("yes_value"), function(result) { + revokeBadge(userBadge) { + return bootbox.confirm(I18n.t("admin.badges.revoke_confirm"), I18n.t("no_value"), I18n.t("yes_value"), result => { if (result) { - userBadge.revoke().then(function() { - self.get('model').removeObject(userBadge); + userBadge.revoke().then(() => { + this.get('model').removeObject(userBadge); }); } }); diff --git a/app/assets/javascripts/admin/controllers/admin-users-list-show.js.es6 b/app/assets/javascripts/admin/controllers/admin-users-list-show.js.es6 index af4a0297ef..d3ea899d81 100644 --- a/app/assets/javascripts/admin/controllers/admin-users-list-show.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-users-list-show.js.es6 @@ -2,7 +2,7 @@ import debounce from 'discourse/lib/debounce'; import { i18n } from 'discourse/lib/computed'; import AdminUser from 'admin/models/admin-user'; -export default Ember.ArrayController.extend({ +export default Ember.Controller.extend({ query: null, showEmails: false, refreshing: false, diff --git a/app/assets/javascripts/admin/controllers/modals/admin-agree-flag.js.es6 b/app/assets/javascripts/admin/controllers/modals/admin-agree-flag.js.es6 index 2924eb6699..7f1f4f2e49 100644 --- a/app/assets/javascripts/admin/controllers/modals/admin-agree-flag.js.es6 +++ b/app/assets/javascripts/admin/controllers/modals/admin-agree-flag.js.es6 @@ -1,16 +1,15 @@ import ModalFunctionality from 'discourse/mixins/modal-functionality'; export default Ember.Controller.extend(ModalFunctionality, { - needs: ["admin-flags-list"], + adminFlagsList: Ember.inject.controller(), _agreeFlag: function (actionOnPost) { - var adminFlagController = this.get("controllers.admin-flags-list"); - var post = this.get("content"); - var self = this; + const adminFlagController = this.get("adminFlagsList"); + const post = this.get("content"); - return post.agreeFlags(actionOnPost).then(function () { - adminFlagController.removeObject(post); - self.send("closeModal"); + return post.agreeFlags(actionOnPost).then(() => { + adminFlagController.get('model').removeObject(post); + this.send("closeModal"); }, function () { bootbox.alert(I18n.t("admin.flags.error")); }); diff --git a/app/assets/javascripts/admin/controllers/modals/admin-delete-flag.js.es6 b/app/assets/javascripts/admin/controllers/modals/admin-delete-flag.js.es6 index 284b8bfd09..fc2e062794 100644 --- a/app/assets/javascripts/admin/controllers/modals/admin-delete-flag.js.es6 +++ b/app/assets/javascripts/admin/controllers/modals/admin-delete-flag.js.es6 @@ -1,36 +1,31 @@ import ModalFunctionality from 'discourse/mixins/modal-functionality'; export default Ember.Controller.extend(ModalFunctionality, { - needs: ["admin-flags-list"], + adminFlagsList: Ember.inject.controller(), actions: { + deletePostDeferFlag() { + const adminFlagController = this.get("adminFlagsList"); + const post = this.get("content"); - deletePostDeferFlag: function () { - var adminFlagController = this.get("controllers.admin-flags-list"); - var post = this.get("content"); - var self = this; - - return post.deferFlags(true).then(function () { - adminFlagController.removeObject(post); - self.send("closeModal"); + return post.deferFlags(true).then(() => { + adminFlagController.get('model').removeObject(post); + this.send("closeModal"); }, function () { bootbox.alert(I18n.t("admin.flags.error")); }); }, - deletePostAgreeFlag: function () { - var adminFlagController = this.get("controllers.admin-flags-list"); - var post = this.get("content"); - var self = this; + deletePostAgreeFlag() { + const adminFlagController = this.get("adminFlagsList"); + const post = this.get("content"); - return post.agreeFlags("delete").then(function () { - adminFlagController.removeObject(post); - self.send("closeModal"); + return post.agreeFlags("delete").then(() => { + adminFlagController.get('model').removeObject(post); + this.send("closeModal"); }, function () { bootbox.alert(I18n.t("admin.flags.error")); }); } - } - }); diff --git a/app/assets/javascripts/admin/models/backup.js.es6 b/app/assets/javascripts/admin/models/backup.js.es6 index d7baceebac..7fe81441c3 100644 --- a/app/assets/javascripts/admin/models/backup.js.es6 +++ b/app/assets/javascripts/admin/models/backup.js.es6 @@ -2,7 +2,6 @@ import { ajax } from 'discourse/lib/ajax'; import PreloadStore from 'preload-store'; const Backup = Discourse.Model.extend({ - destroy() { return ajax("/admin/backups/" + this.get("filename"), { type: "DELETE" }); }, @@ -13,11 +12,9 @@ const Backup = Discourse.Model.extend({ data: { client_id: window.MessageBus.clientId } }); } - }); Backup.reopenClass({ - find() { return PreloadStore.getAndRemove("backups", () => ajax("/admin/backups.json")) .then(backups => backups.map(backup => Backup.create(backup))); diff --git a/app/assets/javascripts/admin/routes/admin-backups-logs.js.es6 b/app/assets/javascripts/admin/routes/admin-backups-logs.js.es6 index cd01295f5d..c036a10742 100644 --- a/app/assets/javascripts/admin/routes/admin-backups-logs.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-backups-logs.js.es6 @@ -5,17 +5,17 @@ export default Ember.Route.extend({ // since the logs are pushed via the message bus // we only want to preload them (hence the beforeModel hook) beforeModel() { - const logsController = this.controllerFor("adminBackupsLogs"); + const logs = this.controllerFor("adminBackupsLogs").get('logs'); // preload the logs if any PreloadStore.getAndRemove("logs").then(function (preloadedLogs) { if (preloadedLogs && preloadedLogs.length) { // we need to filter out message like: "[SUCCESS]" // and convert POJOs to Ember Objects - const logs = _.chain(preloadedLogs) - .reject(function (log) { return log.message.length === 0 || log.message[0] === "["; }) - .map(function (log) { return Em.Object.create(log); }) - .value(); - logsController.pushObjects(logs); + const newLogs = _.chain(preloadedLogs) + .reject(function (log) { return log.message.length === 0 || log.message[0] === "["; }) + .map(function (log) { return Em.Object.create(log); }) + .value(); + logs.pushObjects(newLogs); } }); }, diff --git a/app/assets/javascripts/admin/routes/admin-backups.js.es6 b/app/assets/javascripts/admin/routes/admin-backups.js.es6 index d590019431..ad6f79a8cb 100644 --- a/app/assets/javascripts/admin/routes/admin-backups.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-backups.js.es6 @@ -15,7 +15,7 @@ export default Discourse.Route.extend({ _processLogMessage(log) { if (log.message === "[STARTED]") { this.controllerFor("adminBackups").set("model.isOperationRunning", true); - this.controllerFor("adminBackupsLogs").clear(); + this.controllerFor("adminBackupsLogs").get('logs').clear(); } else if (log.message === "[FAILED]") { this.controllerFor("adminBackups").set("model.isOperationRunning", false); bootbox.alert(I18n.t("admin.backups.operations.failed", { operation: log.operation })); @@ -27,7 +27,7 @@ export default Discourse.Route.extend({ window.location.pathname = Discourse.getURL("/"); } } else { - this.controllerFor("adminBackupsLogs").pushObject(Em.Object.create(log)); + this.controllerFor("adminBackupsLogs").get('logs').pushObject(Em.Object.create(log)); } }, diff --git a/app/assets/javascripts/admin/routes/admin-badges.js.es6 b/app/assets/javascripts/admin/routes/admin-badges.js.es6 index 68da5edb6b..96ecddab23 100644 --- a/app/assets/javascripts/admin/routes/admin-badges.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-badges.js.es6 @@ -5,21 +5,20 @@ import BadgeGrouping from 'discourse/models/badge-grouping'; export default Discourse.Route.extend({ _json: null, - model: function() { - var self = this; - return ajax('/admin/badges.json').then(function(json) { - self._json = json; + model() { + return ajax('/admin/badges.json').then(json => { + this._json = json; return Badge.createFromJson(json); }); }, - setupController: function(controller, model) { - var json = this._json, - triggers = [], - badgeGroupings = []; + setupController(controller, model) { + const json = this._json; + const badgeTriggers = []; + const badgeGroupings = []; _.each(json.admin_badges.triggers,function(v,k){ - triggers.push({id: v, name: I18n.t('admin.badges.trigger_type.'+k)}); + badgeTriggers.push({id: v, name: I18n.t('admin.badges.trigger_type.'+k)}); }); json.badge_groupings.forEach(function(badgeGroupingJson) { @@ -30,8 +29,8 @@ export default Discourse.Route.extend({ badgeGroupings: badgeGroupings, badgeTypes: json.badge_types, protectedSystemFields: json.admin_badges.protected_system_fields, - badgeTriggers: triggers, - model: model + badgeTriggers, + model }); } }); diff --git a/app/assets/javascripts/admin/templates/api-keys.hbs b/app/assets/javascripts/admin/templates/api-keys.hbs index 4123e57638..60449052bb 100644 --- a/app/assets/javascripts/admin/templates/api-keys.hbs +++ b/app/assets/javascripts/admin/templates/api-keys.hbs @@ -30,5 +30,4 @@ {{#unless hasMasterKey}} -{{/unless }} - +{{/unless}} diff --git a/app/assets/javascripts/admin/templates/backups-logs.hbs b/app/assets/javascripts/admin/templates/backups-logs.hbs new file mode 100644 index 0000000000..34ec15f84a --- /dev/null +++ b/app/assets/javascripts/admin/templates/backups-logs.hbs @@ -0,0 +1 @@ +{{admin-backups-logs logs=logs status=status}} diff --git a/app/assets/javascripts/admin/templates/backups_index.hbs b/app/assets/javascripts/admin/templates/backups_index.hbs index c7323ebea0..308e73f0fd 100644 --- a/app/assets/javascripts/admin/templates/backups_index.hbs +++ b/app/assets/javascripts/admin/templates/backups_index.hbs @@ -6,9 +6,9 @@
{{resumable-upload target="/admin/backups/upload" success="uploadSuccess" error="uploadError" uploadText=uploadLabel title="admin.backups.upload.title"}} {{#if site.isReadOnly}} - {{d-button icon="eye" action="toggleReadOnlyMode" disabled=status.model.isOperationRunning title="admin.backups.read_only.disable.title" label="admin.backups.read_only.disable.label"}} + {{d-button icon="eye" action="toggleReadOnlyMode" disabled=status.isOperationRunning title="admin.backups.read_only.disable.title" label="admin.backups.read_only.disable.label"}} {{else}} - {{d-button icon="eye" action="toggleReadOnlyMode" disabled=status.model.isOperationRunning title="admin.backups.read_only.enable.title" label="admin.backups.read_only.enable.label"}} + {{d-button icon="eye" action="toggleReadOnlyMode" disabled=status.isOperationRunning title="admin.backups.read_only.enable.title" label="admin.backups.read_only.enable.label"}} {{/if}}
@@ -20,12 +20,12 @@
{{fa-icon "download"}}{{i18n 'admin.backups.operations.download.label'}} - {{#if status.model.isOperationRunning}} + {{#if status.isOperationRunning}} {{d-button icon="trash-o" action="destroyBackup" actionParam=backup class="btn-danger" disabled="true" title="admin.backups.operations.is_running"}} - {{d-button icon="play" action="startRestore" actionParam=backup disabled=status.model.restoreDisabled title=restoreTitle label="admin.backups.operations.restore.label"}} + {{d-button icon="play" action="startRestore" actionParam=backup disabled=status.restoreDisabled title=restoreTitle label="admin.backups.operations.restore.label"}} {{else}} {{d-button icon="trash-o" action="destroyBackup" actionParam=backup class="btn-danger" title="admin.backups.operations.destroy.title"}} - {{d-button icon="play" action="startRestore" actionParam=backup disabled=status.model.restoreDisabled title=restoreTitle label="admin.backups.operations.restore.label"}} + {{d-button icon="play" action="startRestore" actionParam=backup disabled=status.restoreDisabled title=restoreTitle label="admin.backups.operations.restore.label"}} {{/if}}
diff --git a/app/assets/javascripts/admin/templates/emojis.hbs b/app/assets/javascripts/admin/templates/emojis.hbs index ca6fd742d4..8972e2ab27 100644 --- a/app/assets/javascripts/admin/templates/emojis.hbs +++ b/app/assets/javascripts/admin/templates/emojis.hbs @@ -5,7 +5,7 @@

{{emoji-uploader done="emojiUploaded"}}

- {{#if model}} + {{#if sortedEmojis}}
@@ -16,7 +16,7 @@ - {{#each model as |e|}} + {{#each sortedEmojis as |e|}} diff --git a/app/assets/javascripts/admin/templates/groups_type.hbs b/app/assets/javascripts/admin/templates/groups_type.hbs index 45bb054ad7..d1d2223c2b 100644 --- a/app/assets/javascripts/admin/templates/groups_type.hbs +++ b/app/assets/javascripts/admin/templates/groups_type.hbs @@ -2,7 +2,7 @@

{{i18n 'admin.groups.edit'}}

    - {{#each model as |group|}} + {{#each sortedGroups as |group|}}
  • {{#link-to "adminGroup" group.type group.name}}{{group.name}} {{#if group.userCountDisplay}} diff --git a/app/assets/javascripts/discourse/controllers/bulk-notification-level.js.es6 b/app/assets/javascripts/discourse/controllers/bulk-notification-level.js.es6 index d4a3ebbd2a..cd0cf9c11b 100644 --- a/app/assets/javascripts/discourse/controllers/bulk-notification-level.js.es6 +++ b/app/assets/javascripts/discourse/controllers/bulk-notification-level.js.es6 @@ -3,7 +3,7 @@ import { topicLevels } from 'discourse/lib/notification-levels'; // Support for changing the notification level of various topics export default Ember.Controller.extend({ - needs: ['topic-bulk-actions'], + topicBulkActions: Ember.inject.controller(), notificationLevelId: null, @computed @@ -21,7 +21,7 @@ export default Ember.Controller.extend({ actions: { changeNotificationLevel() { - this.get('controllers.topic-bulk-actions').performAndRefresh({ + this.get('topicBulkActions').performAndRefresh({ type: 'change_notification_level', notification_level_id: this.get('notificationLevelId') }); diff --git a/app/assets/javascripts/discourse/controllers/group-posts.js.es6 b/app/assets/javascripts/discourse/controllers/group-posts.js.es6 index c9e791c1f1..c2434c83c6 100644 --- a/app/assets/javascripts/discourse/controllers/group-posts.js.es6 +++ b/app/assets/javascripts/discourse/controllers/group-posts.js.es6 @@ -1,19 +1,18 @@ import { fmt } from 'discourse/lib/computed'; -export default Ember.ArrayController.extend({ - needs: ['group'], +export default Ember.Controller.extend({ + group: Ember.inject.controller(), loading: false, emptyText: fmt('type', 'groups.empty.%@'), actions: { loadMore() { - if (this.get('loading')) { return; } this.set('loading', true); const posts = this.get('model'); if (posts && posts.length) { const beforePostId = posts[posts.length-1].get('id'); - const group = this.get('controllers.group.model'); + const group = this.get('group.model'); const opts = { beforePostId, type: this.get('type') }; group.findPosts(opts).then(newPosts => { diff --git a/app/assets/javascripts/discourse/controllers/preferences/badge-title.js.es6 b/app/assets/javascripts/discourse/controllers/preferences/badge-title.js.es6 index b71660d17f..f2c543e6be 100644 --- a/app/assets/javascripts/discourse/controllers/preferences/badge-title.js.es6 +++ b/app/assets/javascripts/discourse/controllers/preferences/badge-title.js.es6 @@ -1,27 +1,26 @@ import { ajax } from 'discourse/lib/ajax'; import BadgeSelectController from "discourse/mixins/badge-select-controller"; -export default Ember.ArrayController.extend(BadgeSelectController, { +export default Ember.Controller.extend(BadgeSelectController, { filteredList: function() { return this.get('model').filterBy('badge.allow_title', true); }.property('model'), actions: { - save: function() { + save() { this.setProperties({ saved: false, saving: true }); - var self = this; ajax(this.get('user.path') + "/preferences/badge_title", { type: "PUT", - data: { user_badge_id: self.get('selectedUserBadgeId') } - }).then(function() { - self.setProperties({ + data: { user_badge_id: this.get('selectedUserBadgeId') } + }).then(() => { + this.setProperties({ saved: true, saving: false, - "user.title": self.get('selectedUserBadge.badge.name') + "user.title": this.get('selectedUserBadge.badge.name') }); - }, function() { + }, () => { bootbox.alert(I18n.t('generic_error')); }); } diff --git a/app/assets/javascripts/discourse/controllers/preferences/card-badge.js.es6 b/app/assets/javascripts/discourse/controllers/preferences/card-badge.js.es6 index d0c42fb558..9f820f9647 100644 --- a/app/assets/javascripts/discourse/controllers/preferences/card-badge.js.es6 +++ b/app/assets/javascripts/discourse/controllers/preferences/card-badge.js.es6 @@ -1,7 +1,7 @@ import { ajax } from 'discourse/lib/ajax'; import BadgeSelectController from "discourse/mixins/badge-select-controller"; -export default Ember.ArrayController.extend(BadgeSelectController, { +export default Ember.Controller.extend(BadgeSelectController, { filteredList: function() { return this.get('model').filter(function(b) { return !Ember.isEmpty(b.get('badge.image')); @@ -12,18 +12,17 @@ export default Ember.ArrayController.extend(BadgeSelectController, { save: function() { this.setProperties({ saved: false, saving: true }); - var self = this; ajax(this.get('user.path') + "/preferences/card-badge", { type: "PUT", - data: { user_badge_id: self.get('selectedUserBadgeId') } - }).then(function() { - self.setProperties({ + data: { user_badge_id: this.get('selectedUserBadgeId') } + }).then(() => { + this.setProperties({ saved: true, saving: false, - "user.card_image_badge": self.get('selectedUserBadge.badge.image') + "user.card_image_badge": this.get('selectedUserBadge.badge.image') }); - }).catch(function() { - self.set('saving', false); + }).catch(() => { + this.set('saving', false); bootbox.alert(I18n.t('generic_error')); }); } diff --git a/app/assets/javascripts/discourse/controllers/tag-groups-show.js.es6 b/app/assets/javascripts/discourse/controllers/tag-groups-show.js.es6 index 1eca5728ab..d575844cad 100644 --- a/app/assets/javascripts/discourse/controllers/tag-groups-show.js.es6 +++ b/app/assets/javascripts/discourse/controllers/tag-groups-show.js.es6 @@ -1,5 +1,5 @@ export default Ember.Controller.extend({ - needs: ['tagGroups'], + tagGroups: Ember.inject.controller(), actions: { save() { @@ -7,17 +7,16 @@ export default Ember.Controller.extend({ }, destroy() { - const self = this; return bootbox.confirm( I18n.t("tagging.groups.confirm_delete"), I18n.t("no_value"), I18n.t("yes_value"), - function(destroy) { + destroy => { if (destroy) { - const c = self.controllerFor('tagGroups'); - return self.get('model').destroy().then(function() { - c.removeObject(self.get('model')); - self.transitionToRoute('tagGroups'); + const c = this.get('tagGroups.model'); + return this.get('model').destroy().then(() => { + c.removeObject(this.get('model')); + this.transitionToRoute('tagGroups'); }); } } diff --git a/app/assets/javascripts/discourse/controllers/tag-groups.js.es6 b/app/assets/javascripts/discourse/controllers/tag-groups.js.es6 index 4e52a8ce47..d4785f36aa 100644 --- a/app/assets/javascripts/discourse/controllers/tag-groups.js.es6 +++ b/app/assets/javascripts/discourse/controllers/tag-groups.js.es6 @@ -1,6 +1,6 @@ -export default Ember.ArrayController.extend({ +export default Ember.Controller.extend({ actions: { - selectTagGroup: function(tagGroup) { + selectTagGroup(tagGroup) { if (this.get('selectedItem')) { this.get('selectedItem').set('selected', false); } this.set('selectedItem', tagGroup); tagGroup.set('selected', true); @@ -8,10 +8,10 @@ export default Ember.ArrayController.extend({ this.transitionToRoute('tagGroups.show', tagGroup); }, - newTagGroup: function() { + newTagGroup() { const newTagGroup = this.store.createRecord('tag-group'); newTagGroup.set('name', I18n.t('tagging.groups.new_name')); - this.pushObject(newTagGroup); + this.get('model').pushObject(newTagGroup); this.send('selectTagGroup', newTagGroup); } } diff --git a/app/assets/javascripts/discourse/controllers/topic-bulk-actions.js.es6 b/app/assets/javascripts/discourse/controllers/topic-bulk-actions.js.es6 index e1c710115c..49c5e1d7fb 100644 --- a/app/assets/javascripts/discourse/controllers/topic-bulk-actions.js.es6 +++ b/app/assets/javascripts/discourse/controllers/topic-bulk-actions.js.es6 @@ -17,7 +17,7 @@ addBulkButton('unlistTopics', 'unlist_topics'); addBulkButton('showTagTopics', 'change_tags'); // Modal for performing bulk actions on topics -export default Ember.ArrayController.extend(ModalFunctionality, { +export default Ember.Controller.extend(ModalFunctionality, { tags: null, buttonRows: null, diff --git a/app/assets/javascripts/discourse/controllers/topic.js.es6 b/app/assets/javascripts/discourse/controllers/topic.js.es6 index cf634b9832..c6af25b50b 100644 --- a/app/assets/javascripts/discourse/controllers/topic.js.es6 +++ b/app/assets/javascripts/discourse/controllers/topic.js.es6 @@ -24,6 +24,7 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { retrying: false, userTriggeredProgress: null, _progressIndex: null, + hasScrolled: null, topicDelegated: [ 'toggleMultiSelect', diff --git a/app/assets/javascripts/discourse/controllers/user-badges.js.es6 b/app/assets/javascripts/discourse/controllers/user-badges.js.es6 index 76b2a05cd9..3089a07377 100644 --- a/app/assets/javascripts/discourse/controllers/user-badges.js.es6 +++ b/app/assets/javascripts/discourse/controllers/user-badges.js.es6 @@ -1,20 +1,6 @@ -export default Ember.ArrayController.extend({ - needs: ["user"], - user: Em.computed.alias("controllers.user.model"), - sortProperties: ['badge.badge_type.sort_order', 'badge.name'], - orderBy: function(ub1, ub2){ - var sr1 = ub1.get('badge.badge_type.sort_order'); - var sr2 = ub2.get('badge.badge_type.sort_order'); - - - if(sr1 > sr2) { - return -1; - } - - if(sr2 > sr1) { - return 1; - } - - return ub1.get('badge.name') < ub2.get('badge.name') ? -1 : 1; - } +export default Ember.Controller.extend({ + user: Ember.inject.controller(), + username: Ember.computed.alias('user.model.username_lower'), + sortedBadges: Ember.computed.sort('model', 'badgeSortOrder'), + badgeSortOrder: ['badge.badge_type.sort_order', 'badge.name'], }); diff --git a/app/assets/javascripts/discourse/controllers/user-notifications.js.es6 b/app/assets/javascripts/discourse/controllers/user-notifications.js.es6 index c185d2c29a..44b25f1043 100644 --- a/app/assets/javascripts/discourse/controllers/user-notifications.js.es6 +++ b/app/assets/javascripts/discourse/controllers/user-notifications.js.es6 @@ -1,12 +1,12 @@ import { ajax } from 'discourse/lib/ajax'; import { default as computed, observes } from 'ember-addons/ember-computed-decorators'; -export default Ember.ArrayController.extend({ - needs: ['application'], +export default Ember.Controller.extend({ + application: Ember.inject.controller(), @observes('model.canLoadMore') _showFooter() { - this.set("controllers.application.showFooter", !this.get("model.canLoadMore")); + this.set("application.showFooter", !this.get("model.canLoadMore")); }, @computed('model.content.length') @@ -16,11 +16,9 @@ export default Ember.ArrayController.extend({ @computed('model.content.@each.read') allNotificationsRead() { - return !this.get('model.content').some((notification) => !notification.get('read')); + return !this.get('model.content').some(notification => !notification.get('read')); }, - currentPath: Em.computed.alias('controllers.application.currentPath'), - actions: { resetNew() { ajax('/notifications/mark-read', { method: 'PUT' }).then(() => { diff --git a/app/assets/javascripts/discourse/templates/discovery/categories.hbs b/app/assets/javascripts/discourse/templates/discovery/categories.hbs index 70f1e8e387..ae53e4cc78 100644 --- a/app/assets/javascripts/discourse/templates/discovery/categories.hbs +++ b/app/assets/javascripts/discourse/templates/discovery/categories.hbs @@ -1,6 +1,6 @@ {{#discovery-categories refresh="refresh"}} - {{component controller.categoryPageStyle + {{component categoryPageStyle categories=model.categories - latestTopicOnly=controller.latestTopicOnly + latestTopicOnly=latestTopicOnly topics=model.topics}} {{/discovery-categories}} diff --git a/app/assets/javascripts/discourse/templates/modal/topic-bulk-actions.hbs b/app/assets/javascripts/discourse/templates/modal/topic-bulk-actions.hbs index 330de1ad81..3e4734e9da 100644 --- a/app/assets/javascripts/discourse/templates/modal/topic-bulk-actions.hbs +++ b/app/assets/javascripts/discourse/templates/modal/topic-bulk-actions.hbs @@ -1,6 +1,6 @@ - <%= submit_tag(t('first_installation.register.button'), class: 'wizard-btn primary') %> + <%= submit_tag(t('finish_installation.register.button'), class: 'wizard-btn primary') %> <%- end %> <%- else -%> -

    <%= raw(t 'first_installation.register.no_emails') %>

    +

    <%= raw(t 'finish_installation.register.no_emails') %>

    <%- end %> diff --git a/config/application.rb b/config/application.rb index 70d4427f77..20fe3f0426 100644 --- a/config/application.rb +++ b/config/application.rb @@ -73,7 +73,7 @@ module Discourse 'admin.js', 'admin.css', 'shiny/shiny.css', 'preload-store.js.es6', 'browser-update.js', 'embed.css', 'break_string.js', 'ember_jquery.js', 'pretty-text-bundle.js', 'wizard.css', 'wizard-application.js', - 'wizard-vendor.js'] + 'wizard-vendor.js', 'plugin.js', 'plugin-third-party.js'] # Precompile all available locales Dir.glob("#{config.root}/app/assets/javascripts/locales/*.js.erb").each do |file| diff --git a/lib/discourse.rb b/lib/discourse.rb index 666c9292f7..1ac6e1b00d 100644 --- a/lib/discourse.rb +++ b/lib/discourse.rb @@ -97,6 +97,7 @@ module Discourse set end + def self.activate_plugins! all_plugins = Plugin::Instance.find_all("#{Rails.root}/plugins") @@ -138,6 +139,14 @@ module Discourse @plugins ||= [] end + def self.official_plugins + plugins.find_all{|p| p.metadata.official?} + end + + def self.unofficial_plugins + plugins.find_all{|p| !p.metadata.official?} + end + def self.assets_digest @assets_digest ||= begin digest = Digest::MD5.hexdigest(ActionView::Base.assets_manifest.assets.values.sort.join) diff --git a/lib/discourse_plugin_registry.rb b/lib/discourse_plugin_registry.rb index d4c82e1e28..1eee3fca07 100644 --- a/lib/discourse_plugin_registry.rb +++ b/lib/discourse_plugin_registry.rb @@ -16,6 +16,10 @@ class DiscoursePluginRegistry attr_accessor :custom_html + def plugins + @plugins ||= [] + end + # Default accessor values def javascripts @javascripts ||= Set.new @@ -93,8 +97,11 @@ class DiscoursePluginRegistry end end + JS_REGEX = /\.js$|\.js\.erb$|\.js\.es6$/ + HANDLEBARS_REGEX = /\.hbs$|\.js\.handlebars$/ + def self.register_asset(asset, opts=nil) - if asset =~ /\.js$|\.js\.erb$|\.js\.es6$/ + if asset =~ JS_REGEX if opts == :admin self.admin_javascripts << asset else @@ -111,9 +118,7 @@ class DiscoursePluginRegistry self.stylesheets << asset end - elsif asset =~ /\.hbs$/ - self.handlebars << asset - elsif asset =~ /\.js\.handlebars$/ + elsif asset =~ HANDLEBARS_REGEX self.handlebars << asset end end diff --git a/lib/plugin/instance.rb b/lib/plugin/instance.rb index c1f9660c37..199c3af035 100644 --- a/lib/plugin/instance.rb +++ b/lib/plugin/instance.rb @@ -393,6 +393,37 @@ JS end end + def handlebars_includes + assets.map do |asset, opts| + next if opts == :admin + next unless asset =~ DiscoursePluginRegistry::HANDLEBARS_REGEX + asset + end.compact + end + + def javascript_includes + assets.map do |asset, opts| + next if opts == :admin + next unless asset =~ DiscoursePluginRegistry::JS_REGEX + asset + end.compact + end + + def each_globbed_asset + if @path + # Automatically include all ES6 JS and hbs files + root_path = "#{File.dirname(@path)}/assets/javascripts" + + Dir.glob("#{root_path}/**/*") do |f| + if File.directory?(f) + yield [f,true] + elsif f.to_s.ends_with?(".js.es6") || f.to_s.ends_with?(".hbs") + yield [f,false] + end + end + end + end + protected def register_assets! diff --git a/lib/plugin/metadata.rb b/lib/plugin/metadata.rb index f154d2a2e2..bcf8954d2b 100644 --- a/lib/plugin/metadata.rb +++ b/lib/plugin/metadata.rb @@ -2,8 +2,34 @@ module Plugin; end class Plugin::Metadata + + OFFICIAL_PLUGINS = Set.new([ + "customer-flair", + "discourse-adplugin", + "discourse-akismet", + "discourse-backup-uploads-to-s3", + "discourse-cakeday", + "Canned Replies", + "discourse-data-explorer", + "discourse-details", + "discourse-nginx-performance-report", + "discourse-push-notifications", + "discourse-slack-official", + "discourse-solved", + "Spoiler Alert!", + "staff-notes", + "GitHub badges", + "hosted-site", + "lazyYT", + "logster-rate-limit-checker", + "poll", + "discourse-plugin-linkedin-auth", + "discourse-plugin-office365-auth", + "discourse-oauth2-basic" + ]) + FIELDS ||= [:name, :about, :version, :authors, :url, :required_version] - attr_accessor *FIELDS + attr_accessor(*FIELDS) def self.parse(text) metadata = self.new @@ -13,6 +39,10 @@ class Plugin::Metadata metadata end + def official? + OFFICIAL_PLUGINS.include?(name) + end + def parse_line(line) line = line.strip diff --git a/spec/components/plugin/metadata_spec.rb b/spec/components/plugin/metadata_spec.rb index 4f8783b0d6..44b509a0b6 100644 --- a/spec/components/plugin/metadata_spec.rb +++ b/spec/components/plugin/metadata_spec.rb @@ -24,4 +24,31 @@ TEXT end end + def official(name) + metadata = Plugin::Metadata.parse < Date: Tue, 15 Nov 2016 13:29:54 +1100 Subject: [PATCH 0819/1447] FEATURE: add TOS and Privacy links to sign up --- .../discourse/controllers/create-account.js.es6 | 7 +++++++ .../discourse/templates/modal/create-account.hbs | 1 + app/assets/stylesheets/common/base/login.scss | 4 ++++ config/locales/client.en.yml | 1 + 4 files changed, 13 insertions(+) diff --git a/app/assets/javascripts/discourse/controllers/create-account.js.es6 b/app/assets/javascripts/discourse/controllers/create-account.js.es6 index 3135eb0f95..ea7dee4409 100644 --- a/app/assets/javascripts/discourse/controllers/create-account.js.es6 +++ b/app/assets/javascripts/discourse/controllers/create-account.js.es6 @@ -78,6 +78,13 @@ export default Ember.Controller.extend(ModalFunctionality, { return Ember.isEmpty(this.get('authOptions.auth_provider')); }.property('authOptions.auth_provider'), + disclaimerHtml: function() { + return I18n.t('create_account.disclaimer', { + tos_link: this.get('siteSettings.tos_url') || Discourse.getURL('/tos'), + privacy_link: this.get('siteSettings.privacy_policy_url') || Discourse.getURL('/privacy') + }); + }.property(), + passwordInstructions: function() { return this.get('isDeveloper') ? I18n.t('user.password.instructions', {count: Discourse.SiteSettings.min_admin_password_length}) : I18n.t('user.password.instructions', {count: Discourse.SiteSettings.min_password_length}); }.property('isDeveloper'), diff --git a/app/assets/javascripts/discourse/templates/modal/create-account.hbs b/app/assets/javascripts/discourse/templates/modal/create-account.hbs index 4089c7055f..67ac3aa293 100644 --- a/app/assets/javascripts/discourse/templates/modal/create-account.hbs +++ b/app/assets/javascripts/discourse/templates/modal/create-account.hbs @@ -90,6 +90,7 @@ {{/if}} +
    {{{disclaimerHtml}}}
{{/if}} {{/d-modal-body}} diff --git a/app/assets/stylesheets/common/base/login.scss b/app/assets/stylesheets/common/base/login.scss index c22321d81c..5061ed5a4a 100644 --- a/app/assets/stylesheets/common/base/login.scss +++ b/app/assets/stylesheets/common/base/login.scss @@ -27,6 +27,10 @@ $input-width: 220px; } } + .disclaimer { + font-size: 0.9em; + } + .user-field.confirm { margin-top: 20px; } diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 26fbdbaa1a..99415e82d0 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -946,6 +946,7 @@ en: search_hint: 'username, email or IP address' create_account: + disclaimer: "By registering, you agree to the privacy policy and terms of service." title: "Create New Account" failed: "Something went wrong, perhaps this email is already registered, try the forgot password link" From 7d531910a4400d236b4c98ea98228fa0d3d6dedd Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 15 Nov 2016 13:30:03 +1100 Subject: [PATCH 0820/1447] fix tests --- test/javascripts/test_helper.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/javascripts/test_helper.js b/test/javascripts/test_helper.js index b0e8b7471b..c899e19bb2 100644 --- a/test/javascripts/test_helper.js +++ b/test/javascripts/test_helper.js @@ -22,7 +22,8 @@ //= require vendor //= require ember-shim //= require pretty-text-bundle -//= require main_include +//= require application +//= require plugin //= require htmlparser.js //= require admin From 095767bdb44a0dfc1456c908dea3f75d90e9adb1 Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 15 Nov 2016 13:41:43 +1100 Subject: [PATCH 0821/1447] tweak position and style of registrations disclaimer --- .../javascripts/discourse/templates/modal/create-account.hbs | 3 ++- app/assets/stylesheets/common/base/login.scss | 1 + app/assets/stylesheets/desktop/login.scss | 4 ++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/templates/modal/create-account.hbs b/app/assets/javascripts/discourse/templates/modal/create-account.hbs index 67ac3aa293..7921b2a245 100644 --- a/app/assets/javascripts/discourse/templates/modal/create-account.hbs +++ b/app/assets/javascripts/discourse/templates/modal/create-account.hbs @@ -90,7 +90,6 @@ {{/if}} -
{{{disclaimerHtml}}}
{{/if}} {{/d-modal-body}} @@ -103,6 +102,8 @@ {{i18n 'log_in'}} {{/conditional-loading-spinner}} + +
{{{disclaimerHtml}}}
{{/if}} {{/unless}} diff --git a/app/assets/stylesheets/common/base/login.scss b/app/assets/stylesheets/common/base/login.scss index 5061ed5a4a..b24e1ccc5c 100644 --- a/app/assets/stylesheets/common/base/login.scss +++ b/app/assets/stylesheets/common/base/login.scss @@ -29,6 +29,7 @@ $input-width: 220px; .disclaimer { font-size: 0.9em; + color: dark-light-choose(scale-color($primary, $lightness: 50%), scale-color($secondary, $lightness: 50%)); } .user-field.confirm { diff --git a/app/assets/stylesheets/desktop/login.scss b/app/assets/stylesheets/desktop/login.scss index 1bf2a7988a..69be797a69 100644 --- a/app/assets/stylesheets/desktop/login.scss +++ b/app/assets/stylesheets/desktop/login.scss @@ -53,4 +53,8 @@ margin-bottom: 12px; } + .disclaimer { + margin-top: 15px; + } + } From 5613c5f81abb179be1f3ae36b5284af147ec3577 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Tue, 15 Nov 2016 10:56:34 +0800 Subject: [PATCH 0822/1447] UX: Add "spotlight" on first notification. --- app/assets/javascripts/discourse/widgets/header.js.es6 | 5 ++++- app/assets/stylesheets/common/base/discourse.scss | 10 ++++++++++ app/assets/stylesheets/common/base/header.scss | 4 ++-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/discourse/widgets/header.js.es6 b/app/assets/javascripts/discourse/widgets/header.js.es6 index 1e01d0263d..9445e8fb90 100644 --- a/app/assets/javascripts/discourse/widgets/header.js.es6 +++ b/app/assets/javascripts/discourse/widgets/header.js.es6 @@ -42,7 +42,10 @@ createWidget('header-notifications', { const unreadPMs = currentUser.get('unread_private_messages'); if (!!unreadPMs) { - if (!currentUser.get('read_first_notification')) contents.push(h('span.ring')); + if (!currentUser.get('read_first_notification')) { + contents.push(h('span.ring')); + contents.push(h('span.ring-backdrop')); + }; contents.push(this.attach('link', { action: attrs.action, className: 'badge-notification unread-private-messages', diff --git a/app/assets/stylesheets/common/base/discourse.scss b/app/assets/stylesheets/common/base/discourse.scss index f6795dd00e..1684695bdc 100644 --- a/app/assets/stylesheets/common/base/discourse.scss +++ b/app/assets/stylesheets/common/base/discourse.scss @@ -166,6 +166,16 @@ body { &.badge-notification[href] {color: $secondary;} } +.ring-backdrop { + width: 80px; + height: 80px; + top: -18px !important; + right: -18px !important; + box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.8); + border-radius: 100%; + z-index: 1040; +} + .ring { $gradient-start: transparent; $gradient-end: #090; diff --git a/app/assets/stylesheets/common/base/header.scss b/app/assets/stylesheets/common/base/header.scss index 1991799767..196b5d9dce 100644 --- a/app/assets/stylesheets/common/base/header.scss +++ b/app/assets/stylesheets/common/base/header.scss @@ -123,7 +123,7 @@ .notifications { position: relative; } - .badge-notification, .ring { + .badge-notification, .ring, .ring-backdrop { position: absolute; top: -9px; z-index: 1; @@ -133,7 +133,7 @@ right: 0; background-color: scale-color($tertiary, $lightness: 50%); } - .unread-private-messages, .ring { + .unread-private-messages, .ring, .ring-backdrop { right: 25px; } .flagged-posts { From 824c2357608dd4b227fab861a3306cf56c539f07 Mon Sep 17 00:00:00 2001 From: cpradio Date: Mon, 14 Nov 2016 22:03:16 -0500 Subject: [PATCH 0823/1447] FEATURE: Notify user when mention can't see the reply they were mentioned in FIX: Group Mention Notifications --- .../components/composer-editor.js.es6 | 30 ++++++++++++---- .../discourse/controllers/composer.js.es6 | 16 +++++++++ .../discourse/lib/link-mentions.js.es6 | 21 +++++++---- .../discourse/templates/composer.hbs | 1 + app/controllers/users_controller.rb | 9 ++++- config/locales/client.en.yml | 3 ++ spec/controllers/users_controller_spec.rb | 35 +++++++++++++++++++ 7 files changed, 100 insertions(+), 15 deletions(-) diff --git a/app/assets/javascripts/discourse/components/composer-editor.js.es6 b/app/assets/javascripts/discourse/components/composer-editor.js.es6 index 4ba0c20057..06e04cf75c 100644 --- a/app/assets/javascripts/discourse/components/composer-editor.js.es6 +++ b/app/assets/javascripts/discourse/components/composer-editor.js.es6 @@ -137,9 +137,10 @@ export default Ember.Component.extend({ }, _renderUnseenMentions($preview, unseen) { - fetchUnseenMentions(unseen).then(() => { + fetchUnseenMentions(unseen, this.get('topic.id')).then(() => { linkSeenMentions($preview, this.siteSettings); this._warnMentionedGroups($preview); + this._warnCannotSeeMention($preview); }); }, @@ -170,19 +171,33 @@ export default Ember.Component.extend({ _warnMentionedGroups($preview) { Ember.run.scheduleOnce('afterRender', () => { - this._warnedMentions = this._warnedMentions || []; - var found = []; + var found = this.get('warnedGroupMentions') || []; $preview.find('.mention-group.notify').each((idx,e) => { const $e = $(e); var name = $e.data('name'); - found.push(name); - if (this._warnedMentions.indexOf(name) === -1){ - this._warnedMentions.push(name); + if (found.indexOf(name) === -1){ this.sendAction('groupsMentioned', [{name: name, user_count: $e.data('mentionable-user-count')}]); + found.push(name); } }); - this._warnedMentions = found; + this.set('warnedGroupMentions', found); + }); + }, + + _warnCannotSeeMention($preview) { + Ember.run.scheduleOnce('afterRender', () => { + var found = this.get('warnedCannotSeeMentions') || []; + $preview.find('.mention.cannot-see').each((idx,e) => { + const $e = $(e); + var name = $e.data('name'); + if (found.indexOf(name) === -1) { + this.sendAction('cannotSeeMention', [{name: name}]); + found.push(name); + } + }); + + this.set('warnedCannotSeeMentions', found); }); }, @@ -490,6 +505,7 @@ export default Ember.Component.extend({ } this._warnMentionedGroups($preview); + this._warnCannotSeeMention($preview); // Paint category hashtags const unseenCategoryHashtags = linkSeenCategoryHashtags($preview); diff --git a/app/assets/javascripts/discourse/controllers/composer.js.es6 b/app/assets/javascripts/discourse/controllers/composer.js.es6 index da85c4a66d..b25d7d76f6 100644 --- a/app/assets/javascripts/discourse/controllers/composer.js.es6 +++ b/app/assets/javascripts/discourse/controllers/composer.js.es6 @@ -344,6 +344,22 @@ export default Ember.Controller.extend({ }); }); } + }, + + cannotSeeMention(mentions) { + mentions.forEach(mention => { + const translation = (this.get('topic.isPrivateMessage')) ? + 'composer.cannot_see_mention.private' : + 'composer.cannot_see_mention.category'; + const body = I18n.t(translation, { + username: "@" + mention.name + }); + this.appEvents.trigger('composer-messages:create', { + extraClass: 'custom-body', + templateName: 'custom-body', + body + }); + }); } }, diff --git a/app/assets/javascripts/discourse/lib/link-mentions.js.es6 b/app/assets/javascripts/discourse/lib/link-mentions.js.es6 index d41bd7e5b9..bed1ba9b51 100644 --- a/app/assets/javascripts/discourse/lib/link-mentions.js.es6 +++ b/app/assets/javascripts/discourse/lib/link-mentions.js.es6 @@ -1,16 +1,21 @@ import { ajax } from 'discourse/lib/ajax'; function replaceSpan($e, username, opts) { + let extra = ""; + let extraClass = ""; + if (opts && opts.group) { - let extra = ""; - let extraClass = ""; if (opts.mentionable) { extra = `data-name='${username}' data-mentionable-user-count='${opts.mentionable.user_count}'`; extraClass = "notify"; } $e.replaceWith(`@${username}`); } else { - $e.replaceWith(`@${username}`); + if (opts && opts.cannot_see) { + extra = `data-name='${username}'`; + extraClass = "cannot-see"; + } + $e.replaceWith(`@${username}`); } } @@ -18,6 +23,7 @@ const found = {}; const foundGroups = {}; const mentionableGroups = {}; const checked = {}; +const cannotSee = []; function updateFound($mentions, usernames) { Ember.run.scheduleOnce('afterRender', function() { @@ -25,7 +31,7 @@ function updateFound($mentions, usernames) { const $e = $(e); const username = usernames[i]; if (found[username.toLowerCase()]) { - replaceSpan($e, username); + replaceSpan($e, username, { cannot_see: cannotSee[username] }); } else if (foundGroups[username]) { replaceSpan($e, username, { group: true, mentionable: mentionableGroups[username] }); } else if (checked[username]) { @@ -45,11 +51,12 @@ export function linkSeenMentions($elem, siteSettings) { return []; } -export function fetchUnseenMentions(usernames) { - return ajax("/users/is_local_username", { data: { usernames } }).then(r => { +export function fetchUnseenMentions(usernames, topic_id) { + return ajax("/users/is_local_username", { data: { usernames, topic_id } }).then(r => { r.valid.forEach(v => found[v] = true); r.valid_groups.forEach(vg => foundGroups[vg] = true); - r.mentionable_groups.forEach(mg => mentionableGroups[mg] = true); + r.mentionable_groups.forEach(mg => mentionableGroups[mg.name] = mg); + r.cannot_see.forEach(cs => cannotSee[cs] = true); usernames.forEach(u => checked[u] = true); return r; }); diff --git a/app/assets/javascripts/discourse/templates/composer.hbs b/app/assets/javascripts/discourse/templates/composer.hbs index 2c47fc8fcd..144427d9ef 100644 --- a/app/assets/javascripts/discourse/templates/composer.hbs +++ b/app/assets/javascripts/discourse/templates/composer.hbs @@ -88,6 +88,7 @@ draftStatus=model.draftStatus isUploading=isUploading groupsMentioned="groupsMentioned" + cannotSeeMention="cannotSeeMention" importQuote="importQuote" showOptions="showOptions" hideOptions="hideOptions" diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 4f85726b51..ea8e2c12a8 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -242,11 +242,18 @@ class UsersController < ApplicationController usernames -= groups usernames.each(&:downcase!) + cannot_see = [] + topic_id = params[:topic_id] + unless topic_id.blank? + topic = Topic.find_by(id: topic_id) + usernames.each{ |username| cannot_see.push(username) unless Guardian.new(User.find_by_username(username)).can_see?(topic) } + end + result = User.where(staged: false) .where(username_lower: usernames) .pluck(:username_lower) - render json: {valid: result, valid_groups: groups, mentionable_groups: mentionable_groups} + render json: {valid: result, valid_groups: groups, mentionable_groups: mentionable_groups, cannot_see: cannot_see} end def render_available_true diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 99415e82d0..9fe08a651d 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -1045,6 +1045,9 @@ en: group_mentioned: one: "By mentioning {{group}}, you are about to notify 1 person – are you sure?" other: "By mentioning {{group}}, you are about to notify {{count}} people – are you sure?" + cannot_see_mention: + category: "You mentioned {{username}} but they won't be notified because they do not have access to this category. Would you like to add them to a group that has access to this category?" + private: "You mentioned {{username}} but they won't be notified because they are unable to see this personal message. Would you like to add them to this PM?" duplicate_link: "It looks like your link to {{domain}} was already posted in the topic by @{{username}} in a reply {{ago}} – are you sure you want to post it again?" error: diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb index 3f6331f0bc..95a8f2e573 100644 --- a/spec/controllers/users_controller_spec.rb +++ b/spec/controllers/users_controller_spec.rb @@ -1602,6 +1602,9 @@ describe UsersController do let(:user) { Fabricate(:user) } let(:group) { Fabricate(:group, name: "Discourse") } + let(:topic) { Fabricate(:topic) } + let(:allowed_user) { Fabricate(:user) } + let(:private_topic) { Fabricate(:private_message_topic, user: allowed_user) } it "finds the user" do xhr :get, :is_local_username, username: user.username @@ -1632,6 +1635,38 @@ describe UsersController do expect(json["valid"].size).to eq(0) end + it "returns user who cannot see topic" do + Guardian.any_instance.expects(:can_see?).with(topic).returns(false) + xhr :get, :is_local_username, usernames: [user.username], topic_id: topic.id + expect(response).to be_success + json = JSON.parse(response.body) + expect(json["cannot_see"].size).to eq(1) + end + + it "never returns a user who can see the topic" do + Guardian.any_instance.expects(:can_see?).with(topic).returns(true) + xhr :get, :is_local_username, usernames: [user.username], topic_id: topic.id + expect(response).to be_success + json = JSON.parse(response.body) + expect(json["cannot_see"].size).to eq(0) + end + + it "returns user who cannot see a private topic" do + Guardian.any_instance.expects(:can_see?).with(private_topic).returns(false) + xhr :get, :is_local_username, usernames: [user.username], topic_id: private_topic.id + expect(response).to be_success + json = JSON.parse(response.body) + expect(json["cannot_see"].size).to eq(1) + end + + it "never returns a user who can see the topic" do + Guardian.any_instance.expects(:can_see?).with(private_topic).returns(true) + xhr :get, :is_local_username, usernames: [allowed_user.username], topic_id: private_topic.id + expect(response).to be_success + json = JSON.parse(response.body) + expect(json["cannot_see"].size).to eq(0) + end + end describe '.topic_tracking_state' do From beefc50407a9e441ad6d0eba4e3b05ff1fc91551 Mon Sep 17 00:00:00 2001 From: cpradio Date: Mon, 14 Nov 2016 22:07:07 -0500 Subject: [PATCH 0824/1447] Update copy to use a statement instead of a question (per @jomaxro) --- config/locales/client.en.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 9fe08a651d..f4689a6843 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -1046,8 +1046,8 @@ en: one: "By mentioning {{group}}, you are about to notify 1 person – are you sure?" other: "By mentioning {{group}}, you are about to notify {{count}} people – are you sure?" cannot_see_mention: - category: "You mentioned {{username}} but they won't be notified because they do not have access to this category. Would you like to add them to a group that has access to this category?" - private: "You mentioned {{username}} but they won't be notified because they are unable to see this personal message. Would you like to add them to this PM?" + category: "You mentioned {{username}} but they won't be notified because they do not have access to this category. You will need to add them to a group that has access to this category." + private: "You mentioned {{username}} but they won't be notified because they are unable to see this personal message. You will need to invite them to this PM." duplicate_link: "It looks like your link to {{domain}} was already posted in the topic by @{{username}} in a reply {{ago}} – are you sure you want to post it again?" error: From 63d9d4f3010521eb6a2285e773d83b557e7c343f Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 15 Nov 2016 17:00:28 +1100 Subject: [PATCH 0825/1447] FIX: properly specify default on no cache on all resources --- app/controllers/application_controller.rb | 7 +++++++ spec/controllers/topics_controller_spec.rb | 1 + spec/controllers/user_avatars_controller_spec.rb | 1 + 3 files changed, 9 insertions(+) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index ec302c3966..223189b28d 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -45,6 +45,7 @@ class ApplicationController < ActionController::Base before_filter :check_xhr after_filter :add_readonly_header after_filter :perform_refresh_session + after_filter :dont_cache_page layout :set_layout @@ -64,6 +65,12 @@ class ApplicationController < ActionController::Base refresh_session(current_user) end + def dont_cache_page + if !response.headers["Cache-Control"] && response.cache_control.blank? + response.headers["Cache-Control"] = "no-store, must-revalidate, no-cache, private" + end + end + def slow_platform? request.user_agent =~ /Android/ end diff --git a/spec/controllers/topics_controller_spec.rb b/spec/controllers/topics_controller_spec.rb index ee523583bd..7ee8aa42b3 100644 --- a/spec/controllers/topics_controller_spec.rb +++ b/spec/controllers/topics_controller_spec.rb @@ -529,6 +529,7 @@ describe TopicsController do get :show, topic_id: topic.id, slug: topic.slug expect(response).to be_success expect(css_select("link[rel=canonical]").length).to eq(1) + expect(response.headers["Cache-Control"]).to eq("no-store, must-revalidate, no-cache, private") end end diff --git a/spec/controllers/user_avatars_controller_spec.rb b/spec/controllers/user_avatars_controller_spec.rb index 55a3272da8..7c40e2ba72 100644 --- a/spec/controllers/user_avatars_controller_spec.rb +++ b/spec/controllers/user_avatars_controller_spec.rb @@ -46,6 +46,7 @@ describe UserAvatarsController do get :show, size: 98, username: user.username, version: upload.id, hostname: 'default' expect(response.body).to eq("image") + expect(response.headers["Cache-Control"]).to eq('max-age=31557600, public') end it 'serves image even if size missing and its in local mode' do From 68f9c7142f3821261432a8570745735565544304 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Tue, 15 Nov 2016 14:42:35 +0800 Subject: [PATCH 0826/1447] FIX: Display first notification spotlight only once each page load. --- app/assets/javascripts/discourse/widgets/header.js.es6 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/widgets/header.js.es6 b/app/assets/javascripts/discourse/widgets/header.js.es6 index 9445e8fb90..ad38475d48 100644 --- a/app/assets/javascripts/discourse/widgets/header.js.es6 +++ b/app/assets/javascripts/discourse/widgets/header.js.es6 @@ -20,6 +20,8 @@ const dropdown = { } }; +let hideRingBackdrop = false; + createWidget('header-notifications', { settings: { avatarSize: 'medium' @@ -44,7 +46,10 @@ createWidget('header-notifications', { if (!!unreadPMs) { if (!currentUser.get('read_first_notification')) { contents.push(h('span.ring')); - contents.push(h('span.ring-backdrop')); + if (!attrs.active && !hideRingBackdrop) { + contents.push(h('span.ring-backdrop')); + hideRingBackdrop = true; + } }; contents.push(this.attach('link', { action: attrs.action, From 7e8a975e20dd89d80cb3a46fb80cb549f79670b5 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Tue, 15 Nov 2016 15:23:53 +0800 Subject: [PATCH 0827/1447] Reduce number of tries when tests time out. --- lib/tasks/qunit.rake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tasks/qunit.rake b/lib/tasks/qunit.rake index f3ec75b8db..9109111134 100644 --- a/lib/tasks/qunit.rake +++ b/lib/tasks/qunit.rake @@ -55,7 +55,7 @@ task "qunit:test" => :environment do exit if ENV['RETRY'].present? && ENV['RETRY'] == 'false' sleep 2 tries += 1 - retry unless tries == 10 + retry unless tries == 3 end # A bit of a hack until we can figure this out on Travis From a76d834fd5e6369cc20fa7595e9749ba6ebc8bbd Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Tue, 15 Nov 2016 15:24:19 +0800 Subject: [PATCH 0828/1447] Fix invalid command. --- lib/tasks/qunit.rake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tasks/qunit.rake b/lib/tasks/qunit.rake index 9109111134..70ff6d5e45 100644 --- a/lib/tasks/qunit.rake +++ b/lib/tasks/qunit.rake @@ -63,7 +63,7 @@ task "qunit:test" => :environment do while tries < 3 && $?.exitstatus == 124 tries += 1 puts "\nTimed Out. Trying again...\n" - rake_system(cmd) + sh(cmd) end success &&= $?.success? From c24b9d609b0601cfce192d98238cffdba6080cff Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Tue, 15 Nov 2016 15:30:38 +0800 Subject: [PATCH 0829/1447] Use PostgreSQL 9.5 on travis. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 807cfa25fe..ca3ba4a081 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ env: - "RAILS_MASTER=1" addons: - postgresql: 9.3 + postgresql: 9.5 apt: packages: - gifsicle From 95c6e97587c7bd8a1da4c2e51c397e607bd671fa Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Tue, 15 Nov 2016 17:01:29 +0800 Subject: [PATCH 0830/1447] Ensure we don't run `$redis.keys` in production. --- app/services/random_topic_selector.rb | 4 ---- spec/components/topic_query_spec.rb | 11 +++++++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/app/services/random_topic_selector.rb b/app/services/random_topic_selector.rb index bb71d251e9..003dcc629e 100644 --- a/app/services/random_topic_selector.rb +++ b/app/services/random_topic_selector.rb @@ -77,10 +77,6 @@ class RandomTopicSelector results end - def self.clear_cache! - $redis.keys('random_topic_cache*').each{|k| $redis.del k} - end - def self.cache_key(category=nil) "random_topic_cache_#{category.try(:id)}" end diff --git a/spec/components/topic_query_spec.rb b/spec/components/topic_query_spec.rb index 6fe6552615..c50319ff27 100644 --- a/spec/components/topic_query_spec.rb +++ b/spec/components/topic_query_spec.rb @@ -642,9 +642,12 @@ describe TopicQuery do end context 'suggested_for' do + def clear_cache! + $redis.keys('random_topic_cache*').each{|k| $redis.del k} + end before do - RandomTopicSelector.clear_cache! + clear_cache! end context 'when anonymous' do @@ -674,7 +677,7 @@ describe TopicQuery do let(:suggested_topics) { tt = topic # lets clear cache once category is created - working around caching is hard - RandomTopicSelector.clear_cache! + clear_cache! topic_query.list_suggested_for(tt).topics.map{|t| t.id} } @@ -691,11 +694,11 @@ describe TopicQuery do SiteSetting.suggested_topics_max_days_old = 1365 tt = topic - RandomTopicSelector.clear_cache! + clear_cache! expect(topic_query.list_suggested_for(tt).topics.length).to eq(2) SiteSetting.suggested_topics_max_days_old = 365 - RandomTopicSelector.clear_cache! + clear_cache! expect(topic_query.list_suggested_for(tt).topics.length).to eq(1) end From 0f9e45f283cae7c3544b6663addb729581caa4b4 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 15 Nov 2016 11:41:16 -0500 Subject: [PATCH 0831/1447] Allow the loader to understand when files are moved --- .../assets/javascripts/discourse-loader.js | 30 +++++++++++++++---- app/assets/javascripts/ember_jquery.js | 2 +- .../javascripts/wizard/test/test_helper.js | 2 +- lib/discourse_iife.rb | 2 ++ lib/pretty_text.rb | 2 +- 5 files changed, 29 insertions(+), 9 deletions(-) rename vendor/assets/javascripts/loader.js => app/assets/javascripts/discourse-loader.js (83%) diff --git a/vendor/assets/javascripts/loader.js b/app/assets/javascripts/discourse-loader.js similarity index 83% rename from vendor/assets/javascripts/loader.js rename to app/assets/javascripts/discourse-loader.js index 61f4a1c767..4f36e91a39 100644 --- a/vendor/assets/javascripts/loader.js +++ b/app/assets/javascripts/discourse-loader.js @@ -2,6 +2,14 @@ var define, requireModule, require, requirejs; (function() { + var MOVED_MODULES = { + "discourse/views/list/post-count-or-badges": "discourse/raw-views/list/post-count-or-badges", + "discourse/views/list/posts-count-column" : "discourse/raw-views/list/posts-count-column", + "discourse/views/list/visited-line" : "discourse/raw-views/list/visited-line", + "discourse/views/topic-list-header-column" : "discourse/raw-views/topic-list-header-column", + "discourse/views/topic-status" : "discourse/raw-views/topic-status" + }; + var _isArray; if (!Array.isArray) { _isArray = function (x) { @@ -48,7 +56,7 @@ var define, requireModule, require, requirejs; return this._require || (this._require = function(dep) { return require(resolve(dep, name)); }); - } + }; define = function(name, deps, callback) { if (arguments.length < 2) { @@ -76,7 +84,7 @@ var define, requireModule, require, requirejs; return new Alias(path); }; - function reify(mod, name, seen) { + function reify(mod, name, rseen) { var deps = mod.deps; var length = deps.length; var reified = new Array(length); @@ -88,11 +96,11 @@ var define, requireModule, require, requirejs; for (var i = 0, l = length; i < l; i++) { dep = deps[i]; if (dep === 'exports') { - module.exports = reified[i] = seen; + module.exports = reified[i] = rseen; } else if (dep === 'require') { reified[i] = mod.makeRequire(); } else if (dep === 'module') { - mod.exports = seen; + mod.exports = rseen; module = reified[i] = mod; } else { reified[i] = requireFrom(resolve(dep, name), name); @@ -106,7 +114,16 @@ var define, requireModule, require, requirejs; } function requireFrom(name, origin) { + var mod = registry[name]; + if (!mod) { + var moved = MOVED_MODULES[name]; + if (moved) { + console.warn("DEPRECATION: `" + name + "` was moved to `" + moved + "`"); + } + mod = registry[moved]; + } + if (!mod) { throw new Error('Could not find module `' + name + '` imported from `' + origin + '`'); } @@ -116,8 +133,9 @@ var define, requireModule, require, requirejs; function missingModule(name) { throw new Error('Could not find module ' + name); } + requirejs = require = requireModule = function(name) { - var mod = registry[name]; + var mod = registry[name] || registry[MOVED_MODULES[name]]; if (mod && mod.callback instanceof Alias) { @@ -189,6 +207,6 @@ var define, requireModule, require, requirejs; requirejs.entries = requirejs._eak_seen = registry; requirejs.clear = function() { requirejs.entries = requirejs._eak_seen = registry = {}; - seen = state = {}; + seen = {}; }; })(); diff --git a/app/assets/javascripts/ember_jquery.js b/app/assets/javascripts/ember_jquery.js index 23e6b286b1..8c0c4b784f 100644 --- a/app/assets/javascripts/ember_jquery.js +++ b/app/assets/javascripts/ember_jquery.js @@ -1,5 +1,5 @@ //= require env //= require jquery_include //= require ember_include -//= require loader +//= require discourse-loader //= require ember-shim diff --git a/app/assets/javascripts/wizard/test/test_helper.js b/app/assets/javascripts/wizard/test/test_helper.js index 699abf0174..1c3b18a477 100644 --- a/app/assets/javascripts/wizard/test/test_helper.js +++ b/app/assets/javascripts/wizard/test/test_helper.js @@ -2,7 +2,7 @@ //= require env //= require jquery.debug -//= require loader +//= require discourse-loader //= require jquery.debug //= require handlebars //= require ember.debug diff --git a/lib/discourse_iife.rb b/lib/discourse_iife.rb index 10bfb78374..4810aae4c3 100644 --- a/lib/discourse_iife.rb +++ b/lib/discourse_iife.rb @@ -34,6 +34,8 @@ class DiscourseIIFE return data if path =~ /\.hbrs/ return data if path =~ /\.hbs/ + return data if path =~ /discourse-loader/ + "(function () {\n\nvar $ = window.jQuery;\n// IIFE Wrapped Content Begins:\n\n#{data}\n\n// IIFE Wrapped Content Ends\n\n })(this);" end diff --git a/lib/pretty_text.rb b/lib/pretty_text.rb index 412ca02d3a..d9c08d7b2b 100644 --- a/lib/pretty_text.rb +++ b/lib/pretty_text.rb @@ -59,7 +59,7 @@ module PrettyText ctx.attach("console.log", proc{|l| p l }) end - ctx_load(ctx, "vendor/assets/javascripts/loader.js") + ctx_load(ctx, "#{Rails.root}/app/assets/javascripts/discourse-loader.js") ctx_load(ctx, "vendor/assets/javascripts/lodash.js") manifest = File.read("#{Rails.root}/app/assets/javascripts/pretty-text-bundle.js") root_path = "#{Rails.root}/app/assets/javascripts/" From edd49bc953759bb2038a9a8f9459630e1861d9e0 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 15 Nov 2016 12:10:18 -0500 Subject: [PATCH 0832/1447] FIX: ESLint --- app/assets/javascripts/discourse-loader.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/discourse-loader.js b/app/assets/javascripts/discourse-loader.js index 4f36e91a39..b80e3aac0c 100644 --- a/app/assets/javascripts/discourse-loader.js +++ b/app/assets/javascripts/discourse-loader.js @@ -1,4 +1,4 @@ -var define, requireModule, require, requirejs; +var define, require, requirejs; (function() { @@ -134,7 +134,7 @@ var define, requireModule, require, requirejs; throw new Error('Could not find module ' + name); } - requirejs = require = requireModule = function(name) { + requirejs = require = function(name) { var mod = registry[name] || registry[MOVED_MODULES[name]]; @@ -180,6 +180,7 @@ var define, requireModule, require, requirejs; return (seen[name] = obj); }; + window.requireModule = requirejs; function resolve(child, name) { if (child.charAt(0) !== '.') { return child; } From bd1b7bd330ab78a13762699c841d8fadce48c854 Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Tue, 15 Nov 2016 12:15:02 -0500 Subject: [PATCH 0833/1447] new plugin outlet extra-nav-item --- .../discourse/templates/components/navigation-bar.hbs | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/javascripts/discourse/templates/components/navigation-bar.hbs b/app/assets/javascripts/discourse/templates/components/navigation-bar.hbs index e24d25bfb2..c7d381e567 100644 --- a/app/assets/javascripts/discourse/templates/components/navigation-bar.hbs +++ b/app/assets/javascripts/discourse/templates/components/navigation-bar.hbs @@ -2,3 +2,4 @@ {{navigation-item content=navItem filterMode=filterMode}} {{/each}} {{custom-html "extraNavItem"}} +{{plugin-outlet "extra-nav-item" tagName="li"}} From 852639e27a883d9c53bccbe3c3d24987bbfdcb0e Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 15 Nov 2016 12:15:13 -0500 Subject: [PATCH 0834/1447] FIX: Restore functionality of `custom-html` for now --- .../javascripts/discourse/helpers/custom-html.js.es6 | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/helpers/custom-html.js.es6 b/app/assets/javascripts/discourse/helpers/custom-html.js.es6 index 5c77dbaf49..5a389ea49c 100644 --- a/app/assets/javascripts/discourse/helpers/custom-html.js.es6 +++ b/app/assets/javascripts/discourse/helpers/custom-html.js.es6 @@ -20,7 +20,15 @@ export function setCustomHTML(key, html) { _customizations[key] = html; } -registerHelper('custom-html', function([id]) { +registerHelper('custom-html', function([id, contextString], hash, options, env) { const html = getCustomHTML(id); if (html) { return html; } + + if (env) { + const target = (env || contextString); + const container = target.container || target.data.view.container; + if (container.lookup('template:' + id)) { + return env.helpers.partial.helperFunction.apply(this, arguments); + } + } }); From 2567fdc402d7ef11f88eba21d10e7191c6c8e458 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 15 Nov 2016 12:41:12 -0500 Subject: [PATCH 0835/1447] FIX: Wrong path to loader --- test/javascripts/test_helper.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/javascripts/test_helper.js b/test/javascripts/test_helper.js index c899e19bb2..6985595014 100644 --- a/test/javascripts/test_helper.js +++ b/test/javascripts/test_helper.js @@ -12,7 +12,7 @@ //= require fake_xml_http_request //= require route-recognizer //= require pretender -//= require loader +//= require discourse-loader //= require preload-store //= require locales/i18n From d57adfed02311cc6c9df1b8d8025fb2a4aa49bf5 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 15 Nov 2016 14:06:36 -0500 Subject: [PATCH 0836/1447] Migration `upload-selector` to component --- .../controllers/upload-selector.js.es6 | 41 ++++++++++--------- .../templates/modal/upload-selector.hbs | 8 ++-- .../discourse/views/upload-selector.js.es6 | 33 --------------- 3 files changed, 25 insertions(+), 57 deletions(-) delete mode 100644 app/assets/javascripts/discourse/views/upload-selector.js.es6 diff --git a/app/assets/javascripts/discourse/controllers/upload-selector.js.es6 b/app/assets/javascripts/discourse/controllers/upload-selector.js.es6 index bc083efcc4..0fee68472b 100644 --- a/app/assets/javascripts/discourse/controllers/upload-selector.js.es6 +++ b/app/assets/javascripts/discourse/controllers/upload-selector.js.es6 @@ -1,30 +1,37 @@ import ModalFunctionality from 'discourse/mixins/modal-functionality'; -import { default as computed } from 'ember-addons/ember-computed-decorators'; +import { default as computed, observes } from 'ember-addons/ember-computed-decorators'; import { allowsAttachments, authorizesAllExtensions, authorizedExtensions } from 'discourse/lib/utilities'; -export function uploadTranslate(key, options) { - options = options || {}; +function uploadTranslate(key) { if (allowsAttachments()) { key += "_with_attachments"; } - return I18n.t(`upload_selector.${key}`, options); + return `upload_selector.${key}`; } export default Ember.Controller.extend(ModalFunctionality, { showMore: false, - local: true, imageUrl: null, imageLink: null, - remote: Ember.computed.not("local"), + local: Ember.computed.equal('selection', 'local'), + remote: Ember.computed.equal('selection', 'remote'), + selection: 'local', - @computed - uploadIcon() { - return allowsAttachments() ? "upload" : "picture-o"; + @computed() + uploadIcon: () => allowsAttachments() ? "upload" : "picture-o", + + @computed() + title: () => uploadTranslate("title"), + + @computed('selection') + tip(selection) { + const authorized_extensions = authorizesAllExtensions() ? "" : `(${authorizedExtensions()})`; + return I18n.t(uploadTranslate(`${selection}_tip`), { authorized_extensions }); }, - @computed('local') - tip(local) { - const source = local ? "local" : "remote"; - const authorized_extensions = authorizesAllExtensions() ? "" : `(${authorizedExtensions()})`; - return uploadTranslate(`${source}_tip`, { authorized_extensions }); + @observes('selection') + _selectionChanged() { + if (this.get('local')) { + this.set('showMore', false); + } }, actions: { @@ -45,12 +52,6 @@ export default Ember.Controller.extend(ModalFunctionality, { this.send('closeModal'); }, - useLocal() { - this.setProperties({ local: true, showMore: false}); - }, - useRemote() { - this.set("local", false); - }, toggleShowMore() { this.toggleProperty("showMore"); } diff --git a/app/assets/javascripts/discourse/templates/modal/upload-selector.hbs b/app/assets/javascripts/discourse/templates/modal/upload-selector.hbs index 943ad5004a..e0cd9a3134 100644 --- a/app/assets/javascripts/discourse/templates/modal/upload-selector.hbs +++ b/app/assets/javascripts/discourse/templates/modal/upload-selector.hbs @@ -1,6 +1,6 @@ -
{{/if}} diff --git a/app/assets/javascripts/discourse/templates/topic-entrance.hbs b/app/assets/javascripts/discourse/templates/components/topic-entrance.hbs similarity index 100% rename from app/assets/javascripts/discourse/templates/topic-entrance.hbs rename to app/assets/javascripts/discourse/templates/components/topic-entrance.hbs diff --git a/app/assets/javascripts/discourse/templates/topic.hbs b/app/assets/javascripts/discourse/templates/topic.hbs index af3c187fde..8a8710f332 100644 --- a/app/assets/javascripts/discourse/templates/topic.hbs +++ b/app/assets/javascripts/discourse/templates/topic.hbs @@ -184,10 +184,9 @@ {{#if model.isPrivateMessage}} {{basic-topic-list hideCategory="true" showPosters="true" - topics=model.details.suggested_topics - postsAction="showTopicEntrance"}} + topics=model.details.suggested_topics}} {{else}} - {{basic-topic-list topics=model.details.suggested_topics postsAction="showTopicEntrance"}} + {{basic-topic-list topics=model.details.suggested_topics}} {{/if}}

{{{browseMoreMessage}}}

diff --git a/app/assets/javascripts/discourse/templates/user-topics-list.hbs b/app/assets/javascripts/discourse/templates/user-topics-list.hbs index 7f8cc03f84..6ce1c11705 100644 --- a/app/assets/javascripts/discourse/templates/user-topics-list.hbs +++ b/app/assets/javascripts/discourse/templates/user-topics-list.hbs @@ -6,7 +6,6 @@ canBulkSelect=canBulkSelect bulkSelectEnabled=bulkSelectEnabled selected=selected - postsAction="showTopicEntrance" skipHeader=true}} {{conditional-loading-spinner condition=model.loadingMore}} diff --git a/app/assets/javascripts/discourse/views/topic-entrance.js.es6 b/app/assets/javascripts/discourse/views/topic-entrance.js.es6 deleted file mode 100644 index aadc5b7e31..0000000000 --- a/app/assets/javascripts/discourse/views/topic-entrance.js.es6 +++ /dev/null @@ -1,52 +0,0 @@ -import CleansUp from 'discourse/mixins/cleans-up'; - -export default Ember.View.extend(CleansUp, { - elementId: 'topic-entrance', - classNameBindings: ['visible::hidden'], - visible: Em.computed.notEmpty('controller.model'), - - _positionChanged: function() { - const pos = this.get('controller.position'); - if (!pos) { return; } - - const $self = this.$(); - - // Move after we render so the height is correct - Em.run.schedule('afterRender', function() { - const width = $self.width(), - height = $self.height(); - pos.left = (parseInt(pos.left) - (width / 2)); - pos.top = (parseInt(pos.top) - (height / 2)); - - const windowWidth = $(window).width(); - if (pos.left + width > windowWidth) { - pos.left = (windowWidth - width) - 15; - } - $self.css(pos); - }); - - $('html').off('mousedown.topic-entrance').on('mousedown.topic-entrance', e => { - const $target = $(e.target); - if (($target.prop('id') === 'topic-entrance') || ($self.has($target).length !== 0)) { - return; - } - this.cleanUp(); - }); - }.observes('controller.position'), - - _removed: function() { - $('html').off('mousedown.topic-entrance'); - }.on('willDestroyElement'), - - cleanUp() { - this.set('controller.model', null); - $('html').off('mousedown.topic-entrance'); - }, - - keyDown(e) { - if (e.which === 27) { - this.cleanUp(); - } - } - -}); From bf49c38faf76af07a54afbe59d9b7918bcbea9d1 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 15 Nov 2016 16:18:33 -0500 Subject: [PATCH 0840/1447] Migrate Login modal to use components --- .../discourse/components/login-modal.js.es6 | 26 ++++ .../discourse/controllers/login.js.es6 | 3 +- .../discourse/templates/modal/login.hbs | 117 +++++++++--------- .../javascripts/discourse/views/login.js.es6 | 34 ----- 4 files changed, 88 insertions(+), 92 deletions(-) create mode 100644 app/assets/javascripts/discourse/components/login-modal.js.es6 delete mode 100644 app/assets/javascripts/discourse/views/login.js.es6 diff --git a/app/assets/javascripts/discourse/components/login-modal.js.es6 b/app/assets/javascripts/discourse/components/login-modal.js.es6 new file mode 100644 index 0000000000..0e25a1719f --- /dev/null +++ b/app/assets/javascripts/discourse/components/login-modal.js.es6 @@ -0,0 +1,26 @@ +export default Ember.Component.extend({ + didInsertElement() { + this._super(); + + const prefillUsername = $('#hidden-login-form input[name=username]').val(); + if (prefillUsername) { + this.set('loginName', prefillUsername); + this.set('loginPassword', $('#hidden-login-form input[name=password]').val()); + } else if ($.cookie('email')) { + this.set('loginName', $.cookie('email')); + } + + Ember.run.schedule('afterRender', function() { + $('#login-account-password, #login-account-name').keydown(e => { + if (e.keyCode === 13) { + this.sendAction(); + } + }); + }); + }, + + mouseMove(e) { + this.set('screenX', e.screenX); + this.set('screenY', e.screenY); + } +}); diff --git a/app/assets/javascripts/discourse/controllers/login.js.es6 b/app/assets/javascripts/discourse/controllers/login.js.es6 index 1996e723b6..5c97bbbf82 100644 --- a/app/assets/javascripts/discourse/controllers/login.js.es6 +++ b/app/assets/javascripts/discourse/controllers/login.js.es6 @@ -51,8 +51,9 @@ export default Ember.Controller.extend(ModalFunctionality, { }.property('loggingIn', 'authenticate'), actions: { - login: function() { + login() { const self = this; + if (this.get('loginDisabled')) { return; } if(Ember.isEmpty(this.get('loginName')) || Ember.isEmpty(this.get('loginPassword'))){ self.flash(I18n.t('login.blank_username_or_password'), 'error'); diff --git a/app/assets/javascripts/discourse/templates/modal/login.hbs b/app/assets/javascripts/discourse/templates/modal/login.hbs index f275f99006..f7a7d616bc 100644 --- a/app/assets/javascripts/discourse/templates/modal/login.hbs +++ b/app/assets/javascripts/discourse/templates/modal/login.hbs @@ -1,60 +1,63 @@ -
:{{e.name}}: {{#each c.featuredTopics as |t|}} - {{featured-topic topic=t - latestTopicOnly=latestTopicOnly - action="showTopicEntrance"}} + {{featured-topic topic=t latestTopicOnly=latestTopicOnly}} {{/each}}
- - - - - - - - - - - - - - - -
- - - {{text-field value=loginName placeholderKey="login.email_placeholder" id="login-account-name" autocorrect="off" autocapitalize="off" autofocus="autofocus"}} -
- - - {{password-field value=loginPassword type="password" id="login-account-password" maxlength="200" capsLockOn=capsLockOn}}   - - {{i18n 'forgot_password.action'}} -
{{i18n 'login.caps_lock_warning'}}
-
- - {{/if}} - {{authMessage}} -
{{alert}}
-
- +{{/login-modal}} diff --git a/app/assets/javascripts/discourse/views/login.js.es6 b/app/assets/javascripts/discourse/views/login.js.es6 deleted file mode 100644 index 656c476bad..0000000000 --- a/app/assets/javascripts/discourse/views/login.js.es6 +++ /dev/null @@ -1,34 +0,0 @@ -import ModalBodyView from "discourse/views/modal-body"; - -export default ModalBodyView.extend({ - templateName: 'modal/login', - title: I18n.t('login.title'), - classNames: ['login-modal'], - - mouseMove: function(e) { - this.set('controller.lastX', e.screenX); - this.set('controller.lastY', e.screenY); - }, - - _setup: function() { - const loginController = this.get('controller'); - - // Get username and password from the browser's password manager, - // if it filled the hidden static login form: - var prefillUsername = $('#hidden-login-form input[name=username]').val(); - if (prefillUsername) { - loginController.set('loginName', prefillUsername); - loginController.set('loginPassword', $('#hidden-login-form input[name=password]').val()); - } else if ($.cookie('email')) { - loginController.set('loginName', $.cookie('email')); - } - - Em.run.schedule('afterRender', function() { - $('#login-account-password, #login-account-name').keydown(function(e) { - if (e.keyCode === 13 && !loginController.get('loginDisabled')) { - loginController.send('login'); - } - }); - }); - }.on('didInsertElement') -}); From 33fd84c990a04c28c44c14c5b731723064c5ce42 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 15 Nov 2016 16:27:10 -0500 Subject: [PATCH 0841/1447] Migrate reorder categories to components --- .../templates/modal/reorder-categories.hbs | 4 +- .../discourse/views/reorder-categories.js.es6 | 80 ------------------- 2 files changed, 2 insertions(+), 82 deletions(-) delete mode 100644 app/assets/javascripts/discourse/views/reorder-categories.js.es6 diff --git a/app/assets/javascripts/discourse/templates/modal/reorder-categories.hbs b/app/assets/javascripts/discourse/templates/modal/reorder-categories.hbs index 64c36b959d..25228caf71 100644 --- a/app/assets/javascripts/discourse/templates/modal/reorder-categories.hbs +++ b/app/assets/javascripts/discourse/templates/modal/reorder-categories.hbs @@ -1,4 +1,4 @@ - +{{/d-modal-body}}