From bc06b7f0aa0ab073f104691cc5de5351d9648a68 Mon Sep 17 00:00:00 2001 From: riking Date: Mon, 9 Feb 2015 13:38:09 -0800 Subject: [PATCH 01/49] FIX: :sa: Pluralization rules had wrong lang keys --- config/locales/plurals.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/config/locales/plurals.rb b/config/locales/plurals.rb index 95b0e2481e..6a2e21f25a 100644 --- a/config/locales/plurals.rb +++ b/config/locales/plurals.rb @@ -65,7 +65,7 @@ :mt => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n == 1 ? :one : n == 0 || [2, 3, 4, 5, 6, 7, 8, 9, 10].include?(n % 100) ? :few : [11, 12, 13, 14, 15, 16, 17, 18, 19].include?(n % 100) ? :many : :other } } } }, :my => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, :nah => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, - :nb => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :nb_NO => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, :ne => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, :nl => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, :nn => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, @@ -75,10 +75,10 @@ :or => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, :pa => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, :pap => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, - :pl => { :i18n => { :plural => { :keys => [:one, :few, :other], :rule => lambda { |n| n == 1 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : :other } } } }, + :pl_PL => { :i18n => { :plural => { :keys => [:one, :few, :other], :rule => lambda { |n| n == 1 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : :other } } } }, :ps => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, :pt => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, - :"pt-PT" => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :pt_BR => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, :ro => { :i18n => { :plural => { :keys => [:one, :few, :other], :rule => lambda { |n| n == 1 ? :one : n == 0 ? :few : :other } } } }, :ru => { :i18n => { :plural => { :keys => [:one, :few, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : :other } } } }, :se => { :i18n => { :plural => { :keys => [:one, :two, :other], :rule => lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } }, @@ -102,7 +102,7 @@ :tk => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, :tl => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, :to => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, - :tr => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :tr_TR => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, :uk => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } }, :ur => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, :vi => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, From c50205725fa76fe502a74c84c4b63df47116ecc1 Mon Sep 17 00:00:00 2001 From: Ed Gibbs Date: Sun, 15 Feb 2015 17:37:11 -0800 Subject: [PATCH 02/49] FIX: Default sort grantable badges by name Currently has no default sort and was stated as a bug here: https://meta.discourse.org/t/badges-not-sorted-in-grant-badge-dropdown/23739 (Post was recently deleted or made private?) --- .../admin/controllers/admin-user-badges.js.es6 | 2 +- .../controllers/admin-user-badges-test.js.es6 | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 test/javascripts/admin/controllers/admin-user-badges-test.js.es6 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 91340b2bb4..5bb53c4b81 100644 --- a/app/assets/javascripts/admin/controllers/admin-user-badges.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-user-badges.js.es6 @@ -32,7 +32,7 @@ export default Ember.ArrayController.extend({ } }); - return badges; + return _.sortBy(badges, "name"); }.property('badges.@each', 'model.@each'), /** diff --git a/test/javascripts/admin/controllers/admin-user-badges-test.js.es6 b/test/javascripts/admin/controllers/admin-user-badges-test.js.es6 new file mode 100644 index 0000000000..db4637ce79 --- /dev/null +++ b/test/javascripts/admin/controllers/admin-user-badges-test.js.es6 @@ -0,0 +1,16 @@ +moduleFor('controller:admin-user-badges', 'Admin User Badges Controller', { + needs: ['controller:adminUser'] +}); + +test("grantableBadges", function() { + var badge_first = Discourse.Badge.create({id: 3, name: "A Badge"}); + var badge_middle = Discourse.Badge.create({id: 1, name: "My Badge"}); + var badge_last = Discourse.Badge.create({id: 2, name: "Zoo Badge"}); + var controller = this.subject({ badges: [badge_last, badge_first, badge_middle] }); + var sorted_names = [badge_first.name, badge_middle.name, badge_last.name]; + var badge_names = controller.get('grantableBadges').map(function(badge) { + return badge.name; + }); + + deepEqual(badge_names, sorted_names, "sorts badges by name"); +}); From 6c09b6739db33e2494b92fbd2af60f3b71ad1f1e Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 17 Feb 2015 09:54:45 +1100 Subject: [PATCH 03/49] BUG: minor, do not send access origin if not set --- app/controllers/static_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/static_controller.rb b/app/controllers/static_controller.rb index 78d9c277e7..0b1bd1baa1 100644 --- a/app/controllers/static_controller.rb +++ b/app/controllers/static_controller.rb @@ -90,7 +90,7 @@ class StaticController < ApplicationController expires_in 1.year, public: true response.headers["Expires"] = 1.year.from_now.httpdate - response.headers["Access-Control-Allow-Origin"] = params[:origin] + response.headers["Access-Control-Allow-Origin"] = params[:origin] if params[:origin] begin response.headers["Last-Modified"] = File.ctime(path).httpdate From cdef67667a0754c7119aa0f1700f47f4124c1f0b Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 17 Feb 2015 09:56:21 +1100 Subject: [PATCH 04/49] PERF: allow background jobs to flush between requests in same thread --- config/initializers/99-unicorn.rb | 14 +++++++-- lib/scheduler/defer.rb | 38 +++++++++++++++++++++---- spec/components/scheduler/defer_spec.rb | 28 +++++++++++++++++- 3 files changed, 70 insertions(+), 10 deletions(-) diff --git a/config/initializers/99-unicorn.rb b/config/initializers/99-unicorn.rb index 9014f5ab7d..072283c07c 100644 --- a/config/initializers/99-unicorn.rb +++ b/config/initializers/99-unicorn.rb @@ -1,4 +1,12 @@ -if ENV['UNICORN_ENABLE_OOBGC'] == '1' - require 'middleware/unicorn_oobgc' - Middleware::UnicornOobgc.init +require_dependency 'scheduler/defer' + +if defined? Unicorn::HttpServer + ObjectSpace.each_object(Unicorn::HttpServer) do |s| + s.extend(Scheduler::Defer::Unicorn) + end + + if ENV['UNICORN_ENABLE_OOBGC'] == '1' + require 'middleware/unicorn_oobgc' + Middleware::UnicornOobgc.init + end end diff --git a/lib/scheduler/defer.rb b/lib/scheduler/defer.rb index 804deb62aa..7f20afe0ca 100644 --- a/lib/scheduler/defer.rb +++ b/lib/scheduler/defer.rb @@ -4,9 +4,17 @@ module Scheduler @async = !Rails.env.test? @queue = Queue.new @mutex = Mutex.new + @paused = false @thread = nil - start_thread + end + def pause + stop! + @paused = true + end + + def resume + @paused = false end # for test @@ -16,7 +24,7 @@ module Scheduler def later(desc = nil, db=RailsMultisite::ConnectionManagement.current_db, &blk) if @async - start_thread unless @thread.alive? + start_thread unless (@thread && @thread.alive?) || @paused @queue << [db, blk, desc] else blk.call @@ -24,12 +32,19 @@ module Scheduler end def stop! - @thread.kill + @thread.kill if @thread && @thread.alive? + @thread = nil end # test only def stopped? - !@thread.alive? + !(@thread && @thread.alive?) + end + + def do_all_work + while !@queue.empty? + do_work(_non_block=true) + end end private @@ -45,8 +60,9 @@ module Scheduler end end - def do_work - db, job, desc = @queue.deq + # using non_block to match Ruby #deq + def do_work(non_block=false) + db, job, desc = @queue.deq(non_block) begin RailsMultisite::ConnectionManagement.establish_connection(db: db) if db job.call @@ -62,6 +78,16 @@ module Scheduler end class Defer + + module Unicorn + def process_client(client) + Defer.pause + super(client) + Defer.do_all_work + Defer.resume + end + end + extend Deferrable initialize end diff --git a/spec/components/scheduler/defer_spec.rb b/spec/components/scheduler/defer_spec.rb index 60a3699ba3..6f8d30ebf0 100644 --- a/spec/components/scheduler/defer_spec.rb +++ b/spec/components/scheduler/defer_spec.rb @@ -1,6 +1,6 @@ # encoding: utf-8 require 'spec_helper' -require 'scheduler/scheduler' +require_dependency 'scheduler/defer' describe Scheduler::Defer do class DeferInstance @@ -23,6 +23,32 @@ describe Scheduler::Defer do @defer.stop! end + it "can pause and resume" do + x = 1 + @defer.pause + + @defer.later do + x = 2 + end + + @defer.do_all_work + + expect(x).to eq(2) + + @defer.resume + + + @defer.later do + x = 3 + end + + wait_for(10) do + x == 3 + end + + expect(x).to eq(3) + end + it "recovers from a crash / fork" do s = nil @defer.stop! From d56b71851ba869cb8de9a6df2e340a0059037c3b Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 17 Feb 2015 09:58:23 +1100 Subject: [PATCH 05/49] FEATURE: configurable connection reaping settings --- config/discourse_defaults.conf | 7 +++++++ lib/discourse.rb | 25 ++++++++++++++++++------- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/config/discourse_defaults.conf b/config/discourse_defaults.conf index 9265ecfac7..7972879f28 100644 --- a/config/discourse_defaults.conf +++ b/config/discourse_defaults.conf @@ -108,3 +108,10 @@ rtl_css = false # this is global so it is easier to set in multisites # TODO allow for global overrides new_version_emails = true + +# connection reaping helps keep connection counts down, postgres +# will not work properly with huge numbers of open connections +# reap connections from pool that are older than 30 seconds +connection_reaper_age = 30 +# run reap check every 30 seconds +connection_reaper_interval = 30 diff --git a/lib/discourse.rb b/lib/discourse.rb index eb982e1dff..1e2827306d 100644 --- a/lib/discourse.rb +++ b/lib/discourse.rb @@ -289,21 +289,32 @@ module Discourse nil end - def self.start_connection_reaper(interval=30, age=30) + def self.start_connection_reaper + return if GlobalSetting.connection_reaper_age < 1 || + GlobalSetting.connection_reaper_interval < 1 + # this helps keep connection counts in check Thread.new do while true - sleep interval - pools = [] - ObjectSpace.each_object(ActiveRecord::ConnectionAdapters::ConnectionPool){|pool| pools << pool} - - pools.each do |pool| - pool.drain(age.seconds) + begin + sleep GlobalSetting.connection_reaper_interval + reap_connections(GlobalSetting.connection_reaper_age) + rescue => e + Discourse.handle_exception(e, {message: "Error reaping connections"}) end end end end + def self.reap_connections(age) + pools = [] + ObjectSpace.each_object(ActiveRecord::ConnectionAdapters::ConnectionPool){|pool| pools << pool} + + pools.each do |pool| + pool.drain(age.seconds) + end + end + def self.sidekiq_redis_config { url: $redis.url, namespace: 'sidekiq' } end From 73a59322d5c90aa833876698421efdefb303e9d2 Mon Sep 17 00:00:00 2001 From: Jeff Atwood Date: Mon, 16 Feb 2015 23:35:37 -0800 Subject: [PATCH 06/49] "Page Views" is confusing; say "API Requests" --- config/locales/client.de.yml | 4 ++-- config/locales/client.en.yml | 4 ++-- config/locales/server.en.yml | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/config/locales/client.de.yml b/config/locales/client.de.yml index f459415abe..642d5edeb1 100644 --- a/config/locales/client.de.yml +++ b/config/locales/client.de.yml @@ -1382,8 +1382,8 @@ de: backups: "Backups" traffic_short: "Traffic" traffic: "Web Requests der Applikation" - page_views: "Page Views" - page_views_short: "Page Views" + page_views: "API Requests" + page_views_short: "API Requests" show_traffic_report: "Zeige detaillierten Traffic-Bericht" reports: today: "Heute" diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 705331a269..684535c611 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -1538,8 +1538,8 @@ en: backups: "backups" traffic_short: "Traffic" traffic: "Application web requests" - page_views: "Page Views" - page_views_short: "Page Views" + page_views: "API Requests" + page_views_short: "API Requests" show_traffic_report: "Show Detailed Traffic Report" reports: diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index b6638d8233..cf77af6a00 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -637,19 +637,19 @@ en: page_view_anon_reqs: title: "Anonymous" xaxis: "Day" - yaxis: "Anonymous Page Views" + yaxis: "Anonymous API Requests" page_view_logged_in_reqs: title: "Logged In" xaxis: "Day" - yaxis: "Logged In Page Views" + yaxis: "Logged In API Requests" page_view_crawler_reqs: title: "Web Crawlers" xaxis: "Day" - yaxis: "Web Crawler Page Views" + yaxis: "Web Crawler API Requests" page_view_total_reqs: title: "Total" xaxis: "Day" - yaxis: "Total Page Views" + yaxis: "Total API Requests" http_background_reqs: title: "Background" xaxis: "Day" From daea3bb687b85276c783a4841e2873b0b3c720ea Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Tue, 17 Feb 2015 13:33:43 +0530 Subject: [PATCH 07/49] UX: add user invite link on admin interface --- app/assets/javascripts/admin/routes/admin-users-list.js.es6 | 4 ++++ app/assets/javascripts/admin/templates/users_list.hbs | 1 + config/locales/client.en.yml | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/app/assets/javascripts/admin/routes/admin-users-list.js.es6 b/app/assets/javascripts/admin/routes/admin-users-list.js.es6 index 1fcc890955..5a028a9693 100644 --- a/app/assets/javascripts/admin/routes/admin-users-list.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-users-list.js.es6 @@ -7,6 +7,10 @@ export default Discourse.Route.extend({ Discourse.ExportCsv.exportUserList().then(outputExportResult); }, + sendInvites: function() { + this.transitionTo('user.invited', Discourse.User.current()); + }, + deleteUser: function(user) { Discourse.AdminUser.create(user).destroy({ deletePosts: true }); } diff --git a/app/assets/javascripts/admin/templates/users_list.hbs b/app/assets/javascripts/admin/templates/users_list.hbs index bbc7709e5c..45879d1b6f 100644 --- a/app/assets/javascripts/admin/templates/users_list.hbs +++ b/app/assets/javascripts/admin/templates/users_list.hbs @@ -13,6 +13,7 @@
+ {{d-button action="sendInvites" title="admin.invite.button_title" icon="envelope" label="admin.invite.button_text"}} {{d-button action="exportUsers" title="admin.export_csv.button_title.user" icon="download" label="admin.export_csv.button_text"}}
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 684535c611..cf25357015 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -1741,6 +1741,10 @@ en: screened_ip: "Export full screened IP list in CSV format." screened_url: "Export full screened URL list in CSV format." + invite: + button_text: "Send Invites" + button_title: "Send Invites" + customize: title: "Customize" long_title: "Site Customizations" From eddbfc555ffceb81007e5c8862b84c424994bf2d Mon Sep 17 00:00:00 2001 From: Jeff Atwood Date: Tue, 17 Feb 2015 00:38:56 -0800 Subject: [PATCH 08/49] add info on how to add more staff members --- docs/ADMIN-QUICK-START-GUIDE.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/ADMIN-QUICK-START-GUIDE.md b/docs/ADMIN-QUICK-START-GUIDE.md index 9cbc25b03c..f235ba2654 100644 --- a/docs/ADMIN-QUICK-START-GUIDE.md +++ b/docs/ADMIN-QUICK-START-GUIDE.md @@ -40,7 +40,11 @@ Staff members are official representatives of this community. There are two kind 1. **Admins**, who can do anything and configure anything on this site. 2. **Moderators**, who can edit all posts and users, but cannot add categories or change any site settings. -You may want to grant other users staff abilities – to do so click the admin button :wrench: on their user page, then look for the grant buttons. +To add additional staff members: + +- have them sign up on the site (or send out an invitation to join via your user page) +- click the admin button :wrench: on their user page +- look for the Grant Admin and Grant Moderator buttons there ### Private or Public? From 8fe47539c87d1329ec491b19f6f23cf830320e5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Tue, 17 Feb 2015 17:22:51 +0100 Subject: [PATCH 09/49] add missing translation --- config/locales/client.en.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index cf25357015..ba7629a580 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -1174,6 +1174,7 @@ en: people: off_topic: "{{icons}} flagged this as off-topic" spam: "{{icons}} flagged this as spam" + spam_with_url: "{{icons}} flagged this as spam" inappropriate: "{{icons}} flagged this as inappropriate" notify_moderators: "{{icons}} notified moderators" notify_moderators_with_url: "{{icons}} notified moderators" From 38cc1bf6c16136cf28430d823704ebe75b246798 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Tue, 17 Feb 2015 18:20:19 +0100 Subject: [PATCH 10/49] FIX: columns of uncategorized pinned topics shift when the topic gets unpinned --- .../templates/list/topic_list_item.raw.hbs | 2 +- .../discourse/views/topic-list-item.js.es6 | 20 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/assets/javascripts/discourse/templates/list/topic_list_item.raw.hbs b/app/assets/javascripts/discourse/templates/list/topic_list_item.raw.hbs index b45f2d55a1..9ec92ec1df 100644 --- a/app/assets/javascripts/discourse/templates/list/topic_list_item.raw.hbs +++ b/app/assets/javascripts/discourse/templates/list/topic_list_item.raw.hbs @@ -1,6 +1,6 @@ {{#if controller.bulkSelectEnabled}} - + {{/if}} diff --git a/app/assets/javascripts/discourse/views/topic-list-item.js.es6 b/app/assets/javascripts/discourse/views/topic-list-item.js.es6 index dbe3fb042b..7286c85ca6 100644 --- a/app/assets/javascripts/discourse/views/topic-list-item.js.es6 +++ b/app/assets/javascripts/discourse/views/topic-list-item.js.es6 @@ -1,6 +1,7 @@ import StringBuffer from 'discourse/mixins/string-buffer'; export default Discourse.View.extend(StringBuffer, { + topic: Em.computed.alias("content"), rerenderTriggers: ['controller.bulkSelectEnabled', 'topic.pinned'], tagName: 'tr', rawTemplate: 'list/topic_list_item.raw', @@ -8,6 +9,8 @@ export default Discourse.View.extend(StringBuffer, { ':topic-list-item', 'unboundClassNames', 'selected'], + attributeBindings: ['data-topic-id'], + 'data-topic-id': Em.computed.alias('topic.id'), actions: { select: function(){ @@ -47,14 +50,11 @@ export default Discourse.View.extend(StringBuffer, { return classes.join(' '); }.property(), - attributeBindings: ['data-topic-id'], - 'data-topic-id': Em.computed.alias('content.id'), titleColSpan: function(){ return (!this.get('controller.hideCategory') && - this.get('content.isPinnedUncategorized') ? 2 : 1); - }.property(), + this.get('topic.isPinnedUncategorized') ? 2 : 1); + }.property("topic.isPinnedUncategorized"), - topic: Em.computed.alias("content"), hasLikes: function(){ return this.get('topic.like_count') > 0; @@ -88,13 +88,13 @@ export default Discourse.View.extend(StringBuffer, { if(target.prop('tagName') !== 'A'){ target = target.find('a'); } - this.container.lookup('controller:application').send("showTopicEntrance", {topic: this.get('content'), position: target.offset()}); + this.container.lookup('controller:application').send("showTopicEntrance", {topic: this.get('topic'), position: target.offset()}); return false; } if(target.hasClass('bulk-select')){ var selected = this.get('controller.selected'); - var topic = this.get('content'); + var topic = this.get('topic'); if(target.is(':checked')){ selected.addObject(topic); @@ -122,12 +122,12 @@ export default Discourse.View.extend(StringBuffer, { _highlightIfNeeded: function() { // highlight the last topic viewed - if (this.session.get('lastTopicIdViewed') === this.get('content.id')) { + if (this.session.get('lastTopicIdViewed') === this.get('topic.id')) { this.session.set('lastTopicIdViewed', null); this.highlight(); - } else if (this.get('content.highlight')) { + } else if (this.get('topic.highlight')) { // highlight new topics that have been loaded from the server or the one we just created - this.set('content.highlight', false); + this.set('topic.highlight', false); this.highlight(); } }.on('didInsertElement') From 6e5540c1076cc21acb8abd1856a1e59c8374dd13 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Wed, 18 Feb 2015 01:07:22 +0530 Subject: [PATCH 11/49] FIX: do not show name in email if name on posts are disabled --- app/mailers/user_notifications.rb | 4 ++-- spec/mailers/user_notifications_spec.rb | 18 +++++++++++++----- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/app/mailers/user_notifications.rb b/app/mailers/user_notifications.rb index 4c249adcac..5fede4157e 100644 --- a/app/mailers/user_notifications.rb +++ b/app/mailers/user_notifications.rb @@ -129,7 +129,7 @@ class UserNotifications < ActionMailer::Base title: post.topic.title, post: post, username: post.user.username, - from_alias: (SiteSetting.enable_names && !post.user.name.empty?) ? post.user.name : post.user.username, + from_alias: (SiteSetting.enable_names && SiteSetting.display_name_on_posts && !post.user.name.empty?) ? post.user.name : post.user.username, allow_reply_by_email: true, use_site_subject: true, add_re_to_subject: true, @@ -174,7 +174,7 @@ class UserNotifications < ActionMailer::Base return unless @post = opts[:post] user_name = @notification.data_hash[:original_username] - if @post && SiteSetting.enable_names + if @post && SiteSetting.enable_names && SiteSetting.display_name_on_posts user_name = User.find_by(id: @post.user_id).name if !User.find_by(id: @post.user_id).name.empty? end diff --git a/spec/mailers/user_notifications_spec.rb b/spec/mailers/user_notifications_spec.rb index ec52ce477c..18921cfb97 100644 --- a/spec/mailers/user_notifications_spec.rb +++ b/spec/mailers/user_notifications_spec.rb @@ -90,7 +90,8 @@ describe UserNotifications do let(:notification) { Fabricate(:notification, user: user) } it 'generates a correct email' do - SiteSetting.stubs(:enable_names).returns(true) + SiteSetting.enable_names = true + SiteSetting.display_name_on_posts = true mail = UserNotifications.user_replied(response.user, post: response, notification: notification) # from should include full user name @@ -138,7 +139,7 @@ describe UserNotifications do let(:notification) { Fabricate(:notification, user: user, data: {original_username: response_by_user.username}.to_json) } it 'generates a correct email' do - SiteSetting.stubs(:enable_names).returns(false) + SiteSetting.enable_names = false mail = UserNotifications.user_posted(response.user, post: response, notification: notification) # from should not include full user name if "show user full names" is disabled @@ -170,7 +171,7 @@ describe UserNotifications do let(:notification) { Fabricate(:notification, user: user, data: {original_username: response_by_user.username}.to_json) } it 'generates a correct email' do - SiteSetting.stubs(:enable_names).returns(true) + SiteSetting.enable_names = true mail = UserNotifications.user_private_message(response.user, post: response, notification: notification) # from should include username if full user name is not provided @@ -267,11 +268,18 @@ describe UserNotifications do expects_build_with(has_key(:topic_id)) end - it "has a from alias" do - SiteSetting.stubs(:enable_names).returns(true) + it "should have user name as from_alias" do + SiteSetting.enable_names = true + SiteSetting.display_name_on_posts = true expects_build_with(has_entry(:from_alias, "#{user.name}")) end + it "should not have user name as from_alias if display_name_on_posts is disabled" do + SiteSetting.enable_names = false + SiteSetting.display_name_on_posts = false + expects_build_with(has_entry(:from_alias, "walterwhite")) + end + it "should explain how to respond" do expects_build_with(Not(has_entry(:include_respond_instructions, false))) end From 2104c08fb7c08ffde0821db36921acedc74cdc3d Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 17 Feb 2015 15:31:50 -0500 Subject: [PATCH 12/49] FIX: About user count was off by 1 --- app/models/about.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/about.rb b/app/models/about.rb index ad77c59150..dedf9a0ea7 100644 --- a/app/models/about.rb +++ b/app/models/about.rb @@ -38,7 +38,7 @@ class About @stats ||= { topic_count: Topic.listable_topics.count, post_count: Post.count, - user_count: User.count, + user_count: User.real.count, topics_7_days: Topic.listable_topics.where('created_at > ?', 7.days.ago).count, topics_30_days: Topic.listable_topics.where('created_at > ?', 30.days.ago).count, posts_7_days: Post.where('created_at > ?', 7.days.ago).count, From 762e60c0a6e8fe1468769b7209019ccf7f8f4808 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 17 Feb 2015 16:21:30 -0500 Subject: [PATCH 13/49] FIX: Back button was wonky at times --- app/assets/javascripts/discourse/lib/url.js | 5 --- .../discourse/routes/application.js.es6 | 7 +++ .../discourse/routes/discourse_route.js | 7 --- .../javascripts/discourse/routes/topic.js.es6 | 44 +++++++++---------- 4 files changed, 29 insertions(+), 34 deletions(-) diff --git a/app/assets/javascripts/discourse/lib/url.js b/app/assets/javascripts/discourse/lib/url.js index 2c6c212a28..00117831b2 100644 --- a/app/assets/javascripts/discourse/lib/url.js +++ b/app/assets/javascripts/discourse/lib/url.js @@ -53,11 +53,6 @@ Discourse.URL = Ember.Object.createWithMixins({ Em.run.next(function() { var location = Discourse.URL.get('router.location'); if (location && location.replaceURL) { - - if (Ember.FEATURES.isEnabled("query-params-new")) { - var search = Discourse.__container__.lookup('router:main').get('location.location.search') || ''; - path += search; - } location.replaceURL(path); } }); diff --git a/app/assets/javascripts/discourse/routes/application.js.es6 b/app/assets/javascripts/discourse/routes/application.js.es6 index 4497cf3b18..d185e9cc4f 100644 --- a/app/assets/javascripts/discourse/routes/application.js.es6 +++ b/app/assets/javascripts/discourse/routes/application.js.es6 @@ -8,6 +8,13 @@ const ApplicationRoute = Discourse.Route.extend({ Discourse.set('_docTitle', tokens.join(' - ')); }, + // Ember doesn't provider a router `willTransition` event so let's make one + willTransition() { + var router = this.container.lookup('router:main'); + Ember.run.once(router, router.trigger, 'willTransition'); + return this._super(); + }, + // This is here as a bugfix for when an Ember Cloaked view triggers // a scroll after a controller has been torn down. The real fix // should be to fix ember cloaking to not do that, but this catches diff --git a/app/assets/javascripts/discourse/routes/discourse_route.js b/app/assets/javascripts/discourse/routes/discourse_route.js index f6e32c4914..8f0cc516aa 100644 --- a/app/assets/javascripts/discourse/routes/discourse_route.js +++ b/app/assets/javascripts/discourse/routes/discourse_route.js @@ -27,13 +27,6 @@ Discourse.Route = Ember.Route.extend({ actions: { - // Ember doesn't provider a router `willTransition` event so let's make one - willTransition: function() { - var router = this.container.lookup('router:main'); - Ember.run.once(router, router.trigger, 'willTransition'); - return this._super(); - }, - _collectTitleTokens: function(tokens) { // If there's a title token method, call it and get the token if (this.titleToken) { diff --git a/app/assets/javascripts/discourse/routes/topic.js.es6 b/app/assets/javascripts/discourse/routes/topic.js.es6 index a384f362c1..9fa8fdd533 100644 --- a/app/assets/javascripts/discourse/routes/topic.js.es6 +++ b/app/assets/javascripts/discourse/routes/topic.js.es6 @@ -7,7 +7,7 @@ import ShowFooter from "discourse/mixins/show-footer"; import Topic from 'discourse/models/topic'; var TopicRoute = Discourse.Route.extend(ShowFooter, { - redirect: function() { return this.redirectIfLoginRequired(); }, + redirect() { return this.redirectIfLoginRequired(); }, queryParams: { filter: { replace: true }, @@ -15,7 +15,7 @@ var TopicRoute = Discourse.Route.extend(ShowFooter, { show_deleted: { replace: true } }, - titleToken: function() { + titleToken() { var model = this.modelFor('topic'); if (model) { var result = model.get('title'), @@ -38,31 +38,31 @@ var TopicRoute = Discourse.Route.extend(ShowFooter, { actions: { - showTopicAdminMenu: function() { + showTopicAdminMenu() { this.controllerFor("topic-admin-menu").send("show"); }, - showFlags: function(post) { + showFlags(post) { Discourse.Route.showModal(this, 'flag', post); this.controllerFor('flag').setProperties({ selected: null }); }, - showFlagTopic: function(topic) { + showFlagTopic(topic) { Discourse.Route.showModal(this, 'flag', topic); this.controllerFor('flag').setProperties({ selected: null, flagTopic: true }); }, - showAutoClose: function() { + showAutoClose() { Discourse.Route.showModal(this, 'editTopicAutoClose', this.modelFor('topic')); this.controllerFor('modal').set('modalClass', 'edit-auto-close-modal'); }, - showInvite: function() { + showInvite() { Discourse.Route.showModal(this, 'invite', this.modelFor('topic')); this.controllerFor('invite').reset(); }, - showPrivateInvite: function() { + showPrivateInvite() { Discourse.Route.showModal(this, 'invitePrivate', this.modelFor('topic')); this.controllerFor('invitePrivate').setProperties({ email: null, @@ -72,31 +72,31 @@ var TopicRoute = Discourse.Route.extend(ShowFooter, { }); }, - showHistory: function(post) { + showHistory(post) { Discourse.Route.showModal(this, 'history', post); this.controllerFor('history').refresh(post.get("id"), "latest"); this.controllerFor('modal').set('modalClass', 'history-modal'); }, - showRawEmail: function(post) { + showRawEmail(post) { Discourse.Route.showModal(this, 'raw-email', post); this.controllerFor('raw_email').loadRawEmail(post.get("id")); }, - mergeTopic: function() { + mergeTopic() { Discourse.Route.showModal(this, 'mergeTopic', this.modelFor('topic')); }, - splitTopic: function() { + splitTopic() { Discourse.Route.showModal(this, 'split-topic', this.modelFor('topic')); }, - changeOwner: function() { + changeOwner() { Discourse.Route.showModal(this, 'changeOwner', this.modelFor('topic')); }, // Use replaceState to update the URL once it changes - postChangedRoute: function(currentPost) { + postChangedRoute(currentPost) { // do nothing if we are transitioning to another route if (isTransitioning || Discourse.TopicRoute.disableReplaceState) { return; } @@ -111,12 +111,12 @@ var TopicRoute = Discourse.Route.extend(ShowFooter, { } }, - didTransition: function() { + didTransition() { this.controllerFor("topic")._showFooter(); return true; }, - willTransition: function() { + willTransition() { this._super(); this.controllerFor("quote-button").deselectText(); Em.run.cancel(scheduledReplace); @@ -127,7 +127,7 @@ var TopicRoute = Discourse.Route.extend(ShowFooter, { // replaceState can be very slow on Android Chrome. This function debounces replaceState // within a topic until scrolling stops - _replaceUnlessScrolling: function(url) { + _replaceUnlessScrolling(url) { var currentPos = parseInt($(document).scrollTop(), 10); if (currentPos === lastScrollPos) { Discourse.URL.replaceState(url); @@ -137,7 +137,7 @@ var TopicRoute = Discourse.Route.extend(ShowFooter, { scheduledReplace = Em.run.later(this, '_replaceUnlessScrolling', url, SCROLL_DELAY); }, - setupParams: function(topic, params) { + setupParams(topic, params) { var postStream = topic.get('postStream'); postStream.set('summary', Em.get(params, 'filter') === 'summary'); postStream.set('show_deleted', !!Em.get(params, 'show_deleted')); @@ -153,7 +153,7 @@ var TopicRoute = Discourse.Route.extend(ShowFooter, { return topic; }, - model: function(params, transition) { + model(params, transition) { var queryParams = transition.queryParams; var topic = this.modelFor('topic'); @@ -168,7 +168,7 @@ var TopicRoute = Discourse.Route.extend(ShowFooter, { } }, - activate: function() { + activate() { this._super(); isTransitioning = false; @@ -177,7 +177,7 @@ var TopicRoute = Discourse.Route.extend(ShowFooter, { this.controllerFor('search').set('searchContext', topic.get('searchContext')); }, - deactivate: function() { + deactivate() { this._super(); // Clear the search context @@ -200,7 +200,7 @@ var TopicRoute = Discourse.Route.extend(ShowFooter, { } }, - setupController: function(controller, model) { + setupController(controller, model) { // In case we navigate from one topic directly to another isTransitioning = false; From 59da28bda49466fb8cdb68361a2034cdeb230197 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Tue, 17 Feb 2015 23:10:34 +0100 Subject: [PATCH 14/49] FIX: editing a PM should never change the category_id --- app/assets/javascripts/discourse/models/topic.js.es6 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/assets/javascripts/discourse/models/topic.js.es6 b/app/assets/javascripts/discourse/models/topic.js.es6 index cd134683a2..c2a4d0517d 100644 --- a/app/assets/javascripts/discourse/models/topic.js.es6 +++ b/app/assets/javascripts/discourse/models/topic.js.es6 @@ -365,6 +365,9 @@ Topic.reopenClass({ delete props.categoryId; } + // Make sure we never change the category for private messages + if (topic.get("isPrivateMessage")) { delete props.category_id; } + // Annoyingly, empty arrays are not sent across the wire. This // allows us to make a distinction between arrays that were not // sent and arrays that we specifically want to be empty. From cd978def7009f695ad6ed9ef73a617f127400c98 Mon Sep 17 00:00:00 2001 From: Jeff Atwood Date: Tue, 17 Feb 2015 15:08:48 -0800 Subject: [PATCH 15/49] slight copyedit on seq reply edu panel --- config/locales/server.cs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/server.cs.yml b/config/locales/server.cs.yml index c9cb7c6c58..d277771795 100644 --- a/config/locales/server.cs.yml +++ b/config/locales/server.cs.yml @@ -151,7 +151,7 @@ cs: sequential_replies: | ### Consider replying to several posts at once - Rather than many sequential replies to a topic, please consider a single reply that includes quotes or @name references to previous posts. + Rather than many sequential replies to a topic, please consider a single reply that includes quotes from previous posts or @name references. You can edit your previous reply to add a quote by highlighting text and selecting the quote reply button that appears. From fe31d45131a64594943860472261e0bd74e51980 Mon Sep 17 00:00:00 2001 From: Jeff Atwood Date: Tue, 17 Feb 2015 15:22:56 -0800 Subject: [PATCH 16/49] edited the wrong language file DOH --- config/locales/server.en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index cf77af6a00..56b2ceaa27 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -237,7 +237,7 @@ en: sequential_replies: | ### Consider replying to several posts at once - Rather than many sequential replies to a topic, please consider a single reply that includes quotes or @name references to previous posts. + Rather than many sequential replies to a topic, please consider a single reply that includes quotes from previous posts or @name references. You can edit your previous reply to add a quote by highlighting text and selecting the quote reply button that appears. From 395654bf2413d235899efae7c7277cd8fcad22da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guitaut?= Date: Wed, 18 Feb 2015 00:35:52 +0100 Subject: [PATCH 17/49] Fix regression on editing private messages v1.2.0beta9 has introduced a regression in edit of a private topic (first post). Previously a check for no change in TopicsController was made but it has been changed without considering that the topic could be private. By simply forcing a conversion of `topic.category_id` to integer, the case where its value is nil is handled correctly as it was previously. --- app/controllers/topics_controller.rb | 2 +- spec/controllers/topics_controller_spec.rb | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/app/controllers/topics_controller.rb b/app/controllers/topics_controller.rb index df0a0c6855..ea002db4f8 100644 --- a/app/controllers/topics_controller.rb +++ b/app/controllers/topics_controller.rb @@ -133,7 +133,7 @@ class TopicsController < ApplicationController end changes.delete(:title) if topic.title == changes[:title] - changes.delete(:category_id) if topic.category_id == changes[:category_id].to_i + changes.delete(:category_id) if topic.category_id.to_i == changes[:category_id].to_i success = true if changes.length > 0 diff --git a/spec/controllers/topics_controller_spec.rb b/spec/controllers/topics_controller_spec.rb index f355d340e8..651e2fbc95 100644 --- a/spec/controllers/topics_controller_spec.rb +++ b/spec/controllers/topics_controller_spec.rb @@ -752,6 +752,22 @@ describe TopicsController do expect(response).to be_success end + context 'when topic is private' do + before do + @topic.archetype = Archetype.private_message + @topic.category = nil + @topic.save! + end + + context 'when there are no changes' do + it 'does not call the PostRevisor' do + PostRevisor.any_instance.expects(:revise!).never + xhr :put, :update, topic_id: @topic.id, slug: @topic.title, title: @topic.title, category_id: nil + expect(response).to be_success + end + end + end + context "allow_uncategorized_topics is false" do before do SiteSetting.stubs(:allow_uncategorized_topics).returns(false) From fff55e0ee359699b1ffd9262b97b2cd5c4a0288b Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 18 Feb 2015 11:16:53 +1100 Subject: [PATCH 18/49] FEATURE: allow users to specify if prepared statements are allowed (they need to be disabled for pgpool based setups) --- app/models/global_setting.rb | 2 ++ config/discourse_defaults.conf | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/app/models/global_setting.rb b/app/models/global_setting.rb index 1d89a03122..6f3581d813 100644 --- a/app/models/global_setting.rb +++ b/app/models/global_setting.rb @@ -26,6 +26,8 @@ class GlobalSetting hash["host_names"] = [ hostname ] hash["database"] = db_name + hash["prepared_statements"] = !!self.db_prepared_statements + {"production" => hash} end diff --git a/config/discourse_defaults.conf b/config/discourse_defaults.conf index 7972879f28..248aff6421 100644 --- a/config/discourse_defaults.conf +++ b/config/discourse_defaults.conf @@ -39,6 +39,10 @@ db_username = discourse # password used to access the db db_password = +# allow usage of prepared statements, must be disabled for +# pgpool transaction pooling +db_prepared_statements = true + # hostname running the forum hostname = "www.example.com" From 206d3233c9fba64482acbf87751db8f841165bfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Wed, 18 Feb 2015 12:17:54 +0100 Subject: [PATCH 19/49] FEATURE: when PMing a user from the topic page, insert a link to the current post --- .../discourse/controllers/composer.js.es6 | 1 - .../discourse/controllers/user-card.js.es6 | 20 +++++++++---------- .../discourse/routes/application.js.es6 | 4 ++-- .../javascripts/discourse/routes/user.js.es6 | 9 ++++++--- .../discourse/templates/user-card.hbs | 2 +- .../discourse/views/user-card.js.es6 | 3 ++- 6 files changed, 20 insertions(+), 19 deletions(-) diff --git a/app/assets/javascripts/discourse/controllers/composer.js.es6 b/app/assets/javascripts/discourse/controllers/composer.js.es6 index bcef6b4826..8130901ad0 100644 --- a/app/assets/javascripts/discourse/controllers/composer.js.es6 +++ b/app/assets/javascripts/discourse/controllers/composer.js.es6 @@ -371,7 +371,6 @@ export default DiscourseController.extend({ // If it's the same draft, just open it up again. if (composerModel.get('composeState') === Discourse.Composer.DRAFT && composerModel.get('draftKey') === opts.draftKey) { - composerModel.set('composeState', Discourse.Composer.OPEN); return resolve(); } diff --git a/app/assets/javascripts/discourse/controllers/user-card.js.es6 b/app/assets/javascripts/discourse/controllers/user-card.js.es6 index ce1c665f86..7701837f38 100644 --- a/app/assets/javascripts/discourse/controllers/user-card.js.es6 +++ b/app/assets/javascripts/discourse/controllers/user-card.js.es6 @@ -9,6 +9,7 @@ export default ObjectController.extend({ avatar: null, userLoading: null, cardTarget: null, + post: null, postStream: Em.computed.alias('controllers.topic.postStream'), enoughPostsForFiltering: Em.computed.gte('participant.post_count', 2), @@ -31,7 +32,7 @@ export default ObjectController.extend({ return img && img.indexOf('fa-') !== 0; }.property('user.card_badge.image'), - show: function(username, target) { + show: function(username, postId, target) { // XSS protection (should be encapsulated) username = username.toString().replace(/[^A-Za-z0-9_]/g, ""); var url = "/users/" + username; @@ -43,14 +44,14 @@ export default ObjectController.extend({ } var currentUsername = this.get('username'), - wasVisible = this.get('visible'); + wasVisible = this.get('visible'), + post = this.get('viewingTopic') && postId ? this.get('controllers.topic.postStream').findLoadedPost(postId) : null; - this.set('avatar', null); - this.set('username', username); + this.setProperties({ avatar: null, post: post, username: username }); // If we click the avatar again, close it (unless its diff element on the screen). if (target === this.get('cardTarget') && wasVisible) { - this.setProperties({ visible: false, username: null, avatar: null, cardTarget: null }); + this.setProperties({ visible: false, username: null, cardTarget: null }); return; } @@ -67,11 +68,9 @@ export default ObjectController.extend({ this.set('participant', participants.findBy('username', username)); } - var self = this; - self.set('user', null); - self.set('userLoading', username); - self.set('cardTarget', target); + this.setProperties({ user: null, userLoading: username, cardTarget: target }); + var self = this; Discourse.User.findByUsername(username).then(function (user) { user = Discourse.User.create(user); self.setProperties({ user: user, avatar: user, visible: true}); @@ -82,8 +81,7 @@ export default ObjectController.extend({ }, close: function() { - this.set('visible', false); - this.set('cardTarget', null); + this.setProperties({ visible: false, cardTarget: null }); }, actions: { diff --git a/app/assets/javascripts/discourse/routes/application.js.es6 b/app/assets/javascripts/discourse/routes/application.js.es6 index d185e9cc4f..f8aa629589 100644 --- a/app/assets/javascripts/discourse/routes/application.js.es6 +++ b/app/assets/javascripts/discourse/routes/application.js.es6 @@ -25,10 +25,10 @@ const ApplicationRoute = Discourse.Route.extend({ this.controllerFor('topic-entrance').send('show', data); }, - composePrivateMessage(user) { + composePrivateMessage(user, post) { const self = this; this.transitionTo('userActivity', user).then(function () { - self.controllerFor('user-activity').send('composePrivateMessage', user); + self.controllerFor('user-activity').send('composePrivateMessage', user, post); }); }, diff --git a/app/assets/javascripts/discourse/routes/user.js.es6 b/app/assets/javascripts/discourse/routes/user.js.es6 index 6f65c7c390..bf8e231235 100644 --- a/app/assets/javascripts/discourse/routes/user.js.es6 +++ b/app/assets/javascripts/discourse/routes/user.js.es6 @@ -15,13 +15,16 @@ export default Discourse.Route.extend({ Discourse.logout(); }, - composePrivateMessage: function(user) { - var recipient = user ? user.get('username') : ''; + composePrivateMessage: function(user, post) { + var recipient = user ? user.get('username') : '', + reply = post ? window.location.protocol + "//" + window.location.host + post.get("url") : null + return this.controllerFor('composer').open({ action: Discourse.Composer.PRIVATE_MESSAGE, usernames: recipient, archetypeId: 'private_message', - draftKey: 'new_private_message' + draftKey: 'new_private_message', + reply: reply }); }, diff --git a/app/assets/javascripts/discourse/templates/user-card.hbs b/app/assets/javascripts/discourse/templates/user-card.hbs index 5b0f4e5b23..1db3b3f328 100644 --- a/app/assets/javascripts/discourse/templates/user-card.hbs +++ b/app/assets/javascripts/discourse/templates/user-card.hbs @@ -24,7 +24,7 @@
    {{#if user.can_send_private_message_to_user}} -
  • {{fa-icon "envelope"}}{{i18n 'user.private_message'}}
  • +
  • {{fa-icon "envelope"}}{{i18n 'user.private_message'}}
  • {{/if}} {{#if showFilter}} diff --git a/app/assets/javascripts/discourse/views/user-card.js.es6 b/app/assets/javascripts/discourse/views/user-card.js.es6 index e6e1d12539..2cf2801f27 100644 --- a/app/assets/javascripts/discourse/views/user-card.js.es6 +++ b/app/assets/javascripts/discourse/views/user-card.js.es6 @@ -43,8 +43,9 @@ export default Discourse.View.extend(CleansUp, { }); var expand = function(username, $target){ + var postId = $target.parents('article').data('post-id'); self._willShow($target); - self.get('controller').show(username, $target[0]); + self.get('controller').show(username, postId, $target[0]); return false; }; From e9f161e2bce0b4ac522f27eaf949cfc89c122e4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Wed, 18 Feb 2015 12:37:32 +0100 Subject: [PATCH 20/49] make jshint happy --- app/assets/javascripts/discourse/routes/user.js.es6 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/discourse/routes/user.js.es6 b/app/assets/javascripts/discourse/routes/user.js.es6 index bf8e231235..0ab1271fd8 100644 --- a/app/assets/javascripts/discourse/routes/user.js.es6 +++ b/app/assets/javascripts/discourse/routes/user.js.es6 @@ -17,8 +17,8 @@ export default Discourse.Route.extend({ composePrivateMessage: function(user, post) { var recipient = user ? user.get('username') : '', - reply = post ? window.location.protocol + "//" + window.location.host + post.get("url") : null - + reply = post ? window.location.protocol + "//" + window.location.host + post.get("url") : null; + return this.controllerFor('composer').open({ action: Discourse.Composer.PRIVATE_MESSAGE, usernames: recipient, From f3daae6decd3c34d250a394117772e0c6c020e18 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Wed, 18 Feb 2015 18:53:51 +0530 Subject: [PATCH 21/49] Improve auto generated email reply error message --- app/jobs/scheduled/poll_mailbox.rb | 2 ++ config/locales/server.en.yml | 7 +++++++ lib/email/receiver.rb | 3 ++- spec/components/email/receiver_spec.rb | 4 ++-- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/app/jobs/scheduled/poll_mailbox.rb b/app/jobs/scheduled/poll_mailbox.rb index 85490681d8..910b936888 100644 --- a/app/jobs/scheduled/poll_mailbox.rb +++ b/app/jobs/scheduled/poll_mailbox.rb @@ -49,6 +49,8 @@ module Jobs message_template = :email_reject_topic_not_found when Email::Receiver::TopicClosedError message_template = :email_reject_topic_closed + when Email::Receiver::AutoGeneratedEmailError + message_template = :email_reject_auto_generated when ActiveRecord::Rollback message_template = :email_reject_post_error when Email::Receiver::InvalidPost diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 56b2ceaa27..0569ea615e 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -1665,6 +1665,13 @@ en: The topic is closed. If you believe this is in error, contact a staff member. + email_reject_auto_generated: + subject_template: "Email issue -- Auto Generated Reply" + text_body_template: | + We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work. + + Your email reply was auto generated, which we don't accept. If you believe this is in error, contact a staff member. + email_error_notification: subject_template: "Email issue -- POP authentication error" text_body_template: | diff --git a/lib/email/receiver.rb b/lib/email/receiver.rb index bc8d43e81a..bf8f825b25 100644 --- a/lib/email/receiver.rb +++ b/lib/email/receiver.rb @@ -17,6 +17,7 @@ module Email class BadDestinationAddress < ProcessingError; end class TopicNotFoundError < ProcessingError; end class TopicClosedError < ProcessingError; end + class AutoGeneratedEmailError < ProcessingError; end class EmailLogNotFound < ProcessingError; end class InvalidPost < ProcessingError; end @@ -41,7 +42,7 @@ module Email end raise BadDestinationAddress if dest_info[:type] == :invalid - raise TopicNotFoundError if message.header.to_s =~ /auto-generated/ || message.header.to_s =~ /auto-replied/ + raise AutoGeneratedEmailError if message.header.to_s =~ /auto-generated/ || message.header.to_s =~ /auto-replied/ # TODO get to a state where we can remove this @message = message diff --git a/spec/components/email/receiver_spec.rb b/spec/components/email/receiver_spec.rb index b21d7a5f2e..dedb2a8635 100644 --- a/spec/components/email/receiver_spec.rb +++ b/spec/components/email/receiver_spec.rb @@ -349,8 +349,8 @@ This is a link http://example.com" describe "auto response email replies should not be accepted" do let!(:reply_key) { '636ca428858779856c226bb145ef4fad' } let!(:email_raw) { fixture_file("emails/auto_reply.eml") } - it "raises a TopicNotFoundError" do - expect { receiver.process }.to raise_error(Email::Receiver::TopicNotFoundError) + it "raises a AutoGeneratedEmailError" do + expect { receiver.process }.to raise_error(Email::Receiver::AutoGeneratedEmailError) end end From 2a4b30346cc7fa5a46ce0ce6c32c02a64d8f3905 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Wed, 18 Feb 2015 12:30:41 -0500 Subject: [PATCH 22/49] FIX: Category images were not using the CDN --- app/assets/javascripts/discourse.js | 2 ++ .../javascripts/discourse/components/cdn-img.js.es6 | 8 ++++++++ .../discourse/templates/navigation/category.hbs | 8 ++++---- 3 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 app/assets/javascripts/discourse/components/cdn-img.js.es6 diff --git a/app/assets/javascripts/discourse.js b/app/assets/javascripts/discourse.js index 5673a41e12..c426b54e65 100644 --- a/app/assets/javascripts/discourse.js +++ b/app/assets/javascripts/discourse.js @@ -6,6 +6,8 @@ window.Discourse = Ember.Application.createWithMixins(Discourse.Ajax, { _docTitle: document.title, getURL: function(url) { + if (!url) { return url; } + // If it's a non relative URL, return it. if (url.indexOf('http') === 0) return url; diff --git a/app/assets/javascripts/discourse/components/cdn-img.js.es6 b/app/assets/javascripts/discourse/components/cdn-img.js.es6 new file mode 100644 index 0000000000..007d9cb903 --- /dev/null +++ b/app/assets/javascripts/discourse/components/cdn-img.js.es6 @@ -0,0 +1,8 @@ +export default Ember.Component.extend({ + tagName: 'img', + attributeBindings: ['cdnSrc:src'], + + cdnSrc: function() { + return Discourse.getURLWithCDN(this.get('src')); + }.property('src') +}); diff --git a/app/assets/javascripts/discourse/templates/navigation/category.hbs b/app/assets/javascripts/discourse/templates/navigation/category.hbs index 4eb82f2fe4..5e511700e2 100644 --- a/app/assets/javascripts/discourse/templates/navigation/category.hbs +++ b/app/assets/javascripts/discourse/templates/navigation/category.hbs @@ -15,18 +15,18 @@ {{/if}} {{#if canCreateTopic}} - + {{d-button id="create-topic" class="btn-default" action="createTopic" icon="plus" label="topic.create"}} {{/if}} {{#if canEditCategory}} - + {{d-button class="btn-default" action="editCategory" actionParam=category icon="wrench" label="category.edit_long"}} {{/if}}
    {{#if category.logo_url}} - + {{cdn-img src=category.logo_url class="category-logo"}} {{#if category.description}} -

    {{{category.description}}}

    +

    {{{category.description}}}

    {{/if}} {{/if}}
    From 0fca0e97580dc175676e9b4e53d6f0a3c3b0cc36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Wed, 18 Feb 2015 19:30:07 +0100 Subject: [PATCH 23/49] FEATURE: 1 year anniversary badge --- app/models/badge.rb | 18 ++++++++++++++++++ db/fixtures/006_badges.rb | 12 ++++++++++++ 2 files changed, 30 insertions(+) diff --git a/app/models/badge.rb b/app/models/badge.rb index e040d761be..41a2d7922a 100644 --- a/app/models/badge.rb +++ b/app/models/badge.rb @@ -19,6 +19,7 @@ class Badge < ActiveRecord::Base NiceShare = 21 GoodShare = 22 GreatShare = 23 + OneYearAnniversary = 24 # other consts AutobiographerMinBioLength = 10 @@ -171,6 +172,23 @@ SQL (:backfill OR u.id IN (:user_ids) ) SQL + # member for a year + has posted at least once during that year + OneYearAnniversary = <<-SQL + SELECT u.id AS user_id, MIN(u.created_at + interval '1 year') AS granted_at + FROM users u + JOIN posts p ON p.user_id = u.id + WHERE u.id > 0 + AND u.active + AND NOT u.blocked + AND u.created_at + interval '1 year' < now() + AND p.deleted_at IS NULL + AND NOT p.hidden + AND p.created_at + interval '1 year' > now() + AND (:backfill OR u.id IN (:user_ids)) + GROUP BY u.id + HAVING COUNT(p.id) > 0 +SQL + def self.like_badge(count, is_topic) # we can do better with dates, but its hard work " diff --git a/db/fixtures/006_badges.rb b/db/fixtures/006_badges.rb index 08c61684d5..a7c726e484 100644 --- a/db/fixtures/006_badges.rb +++ b/db/fixtures/006_badges.rb @@ -238,6 +238,18 @@ like_badges.each do |spec| end end +Badge.seed do |b| + b.id = Badge::OneYearAnniversary + b.default_name = "1 year anniversary" + b.default_icon = "fa-birthday-cake" + b.badge_type_id = BadgeType::Bronze + b.query = Badge::Queries::OneYearAnniversary + b.default_badge_grouping_id = BadgeGrouping::Community + b.trigger = Badge::Trigger::None + b.auto_revoke = false + b.system = true +end + Badge.where("NOT system AND id < 100").each do |badge| new_id = [Badge.maximum(:id) + 1, 100].max old_id = badge.id From fed9943d909ab2da81f1e1f0a329179086486ffb Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Wed, 18 Feb 2015 14:21:36 -0500 Subject: [PATCH 24/49] Minor ES6 tweaks --- .../javascripts/admin/controllers/admin-flags-list.js.es6 | 8 ++++---- .../discourse/controllers/discovery/topics.js.es6 | 2 +- .../javascripts/discourse/views/discovery-topics.js.es6 | 7 +++---- 3 files changed, 8 insertions(+), 9 deletions(-) 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 da81f2e38d..9ef1a43272 100644 --- a/app/assets/javascripts/admin/controllers/admin-flags-list.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-flags-list.js.es6 @@ -5,7 +5,7 @@ export default Ember.ArrayController.extend({ adminActiveFlagsView: Em.computed.equal("query", "active"), actions: { - disagreeFlags: function (flaggedPost) { + disagreeFlags(flaggedPost) { var self = this; flaggedPost.disagreeFlags().then(function () { self.removeObject(flaggedPost); @@ -14,7 +14,7 @@ export default Ember.ArrayController.extend({ }); }, - deferFlags: function (flaggedPost) { + deferFlags(flaggedPost) { var self = this; flaggedPost.deferFlags().then(function () { self.removeObject(flaggedPost); @@ -23,12 +23,12 @@ export default Ember.ArrayController.extend({ }); }, - doneTopicFlags: function(item) { + doneTopicFlags(item) { this.send("disagreeFlags", item); }, }, - loadMore: function(){ + loadMore(){ var flags = this.get("model"); return Discourse.FlaggedPost.findAll(this.get("query"),flags.length+1).then(function(data){ if(data.length===0){ diff --git a/app/assets/javascripts/discourse/controllers/discovery/topics.js.es6 b/app/assets/javascripts/discourse/controllers/discovery/topics.js.es6 index 9d3a7f2928..520e517078 100644 --- a/app/assets/javascripts/discourse/controllers/discovery/topics.js.es6 +++ b/app/assets/javascripts/discourse/controllers/discovery/topics.js.es6 @@ -174,7 +174,7 @@ var controllerOpts = { }); }.property('allLoaded', 'topics.length'), - loadMoreTopics: function() { + loadMoreTopics() { return this.get('model').loadMore(); } }; diff --git a/app/assets/javascripts/discourse/views/discovery-topics.js.es6 b/app/assets/javascripts/discourse/views/discovery-topics.js.es6 index cdafd0e5c0..4e1ae4e8c6 100644 --- a/app/assets/javascripts/discourse/views/discovery-topics.js.es6 +++ b/app/assets/javascripts/discourse/views/discovery-topics.js.es6 @@ -5,7 +5,7 @@ export default Discourse.View.extend(LoadMore, UrlRefresh, { eyelineSelector: '.topic-list-item', actions: { - loadMore: function() { + loadMore() { var self = this; Discourse.notifyTitle(0); this.get('controller').loadMoreTopics().then(function (hasMoreResults) { @@ -34,14 +34,13 @@ export default Discourse.View.extend(LoadMore, UrlRefresh, { }.observes('controller.topicTrackingState.incomingCount'), // Remember where we were scrolled to - saveScrollPosition: function() { + saveScrollPosition() { this.session.set('topicListScrollPosition', $(window).scrollTop()); }, // When the topic list is scrolled - scrolled: function() { + scrolled() { this._super(); this.saveScrollPosition(); } }); - From f916087e81ff70119c10745acea94917d7cae9e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Wed, 18 Feb 2015 20:33:05 +0100 Subject: [PATCH 25/49] FIX: poll plugin wasn't working when the OP was deleted Alternatively fixes issue reported -> https://meta.discourse.org/t/bug-with-flag-as-spam/25359 --- plugins/poll/poll.rb | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/plugins/poll/poll.rb b/plugins/poll/poll.rb index 9d663951fc..35ceab7c37 100644 --- a/plugins/poll/poll.rb +++ b/plugins/poll/poll.rb @@ -6,20 +6,16 @@ module ::PollPlugin end def is_poll? - if !@post.post_number.nil? and @post.post_number > 1 - # Not a new post, and also not the first post. - return false - end + # Not a new post, and also not the first post. + return false if @post.post_number.present? && @post.post_number > 1 topic = @post.topic # Topic is not set in a couple of cases in the Discourse test suite. - return false if topic.nil? + return false if topic.nil? || topic.user.nil? - if @post.post_number.nil? and topic.highest_post_number > 0 - # New post, but not the first post in the topic. - return false - end + # New post, but not the first post in the topic. + return false if @post.post_number.nil? && topic.highest_post_number > 0 I18n.with_locale(topic.user.effective_locale) do topic.title =~ /^(#{I18n.t('poll.prefix').strip}|#{I18n.t('poll.closed_prefix').strip})\s?:/i From c2ce45668cf9d253af22bc339b3f3ca30fded102 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Thu, 19 Feb 2015 01:08:52 +0530 Subject: [PATCH 26/49] UX: change user visits stat position --- .../javascripts/admin/templates/dashboard.hbs | 17 +---------------- .../templates/reports/per_day_counts_report.hbs | 1 + config/locales/server.en.yml | 2 +- 3 files changed, 3 insertions(+), 17 deletions(-) diff --git a/app/assets/javascripts/admin/templates/dashboard.hbs b/app/assets/javascripts/admin/templates/dashboard.hbs index 4fe9b13346..74a508fe60 100644 --- a/app/assets/javascripts/admin/templates/dashboard.hbs +++ b/app/assets/javascripts/admin/templates/dashboard.hbs @@ -51,6 +51,7 @@ {{#unless loading}} + {{ render 'admin/templates/reports/per_day_counts_report' visits tagName="tbody"}} {{ render 'admin_report_counts' signups }} {{ render 'admin_report_counts' topics }} {{ render 'admin_report_counts' posts }} @@ -106,22 +107,6 @@ -
    - - - - - - - - - - - {{#unless loading}} - {{ render 'admin/templates/reports/per_day_counts_report' visits tagName="tbody"}} - {{/unless}} -
     {{i18n 'admin.dashboard.reports.today'}}{{i18n 'admin.dashboard.reports.yesterday'}}{{i18n 'admin.dashboard.reports.7_days_ago'}}{{i18n 'admin.dashboard.reports.30_days_ago'}}
    -
    diff --git a/app/assets/javascripts/admin/templates/reports/per_day_counts_report.hbs b/app/assets/javascripts/admin/templates/reports/per_day_counts_report.hbs index abd92d27f5..bc025cdf8f 100644 --- a/app/assets/javascripts/admin/templates/reports/per_day_counts_report.hbs +++ b/app/assets/javascripts/admin/templates/reports/per_day_counts_report.hbs @@ -4,4 +4,5 @@ + diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 0569ea615e..97a73223e9 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -564,7 +564,7 @@ en: xaxis: "Day" yaxis: "Number of visits" signups: - title: "Users" + title: "New Users" xaxis: "Day" yaxis: "Number of new users" topics: From def034cd08e4fcfd0f12b77f40d4aab8e8a87cac Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Wed, 18 Feb 2015 15:01:05 -0500 Subject: [PATCH 27/49] FEATURE: carry username or email from login form to the forgot password and signup forms --- .../discourse/controllers/login.js.es6 | 18 ++++++++++++++++-- .../discourse/templates/modal/login.hbs | 2 +- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/discourse/controllers/login.js.es6 b/app/assets/javascripts/discourse/controllers/login.js.es6 index 8e6c722c6a..9b94de7b6a 100644 --- a/app/assets/javascripts/discourse/controllers/login.js.es6 +++ b/app/assets/javascripts/discourse/controllers/login.js.es6 @@ -2,7 +2,7 @@ import ModalFunctionality from 'discourse/mixins/modal-functionality'; import DiscourseController from 'discourse/controllers/controller'; export default DiscourseController.extend(ModalFunctionality, { - needs: ['modal', 'createAccount', 'application'], + needs: ['modal', 'createAccount', 'forgotPassword', 'application'], authenticate: null, loggingIn: false, loggedIn: false, @@ -122,8 +122,22 @@ export default DiscourseController.extend(ModalFunctionality, { createAccount: function() { var createAccountController = this.get('controllers.createAccount'); - createAccountController.resetForm(); + if (createAccountController) { + createAccountController.resetForm(); + var loginName = this.get('loginName'); + if (loginName && loginName.indexOf('@') > 0) { + createAccountController.set("accountEmail", loginName); + } else { + createAccountController.set("accountUsername", loginName); + } + } this.send('showCreateAccount'); + }, + + forgotPassword: function() { + var forgotPasswordController = this.get('controllers.forgotPassword'); + if (forgotPasswordController) { forgotPasswordController.set("accountEmailOrUsername", this.get("loginName")); } + this.send("showForgotPassword"); } }, diff --git a/app/assets/javascripts/discourse/templates/modal/login.hbs b/app/assets/javascripts/discourse/templates/modal/login.hbs index 41568d1c8e..3034d390d9 100644 --- a/app/assets/javascripts/discourse/templates/modal/login.hbs +++ b/app/assets/javascripts/discourse/templates/modal/login.hbs @@ -21,7 +21,7 @@ {{password-field value=loginPassword type="password" id="login-account-password" maxlength="200" capsLockOn=capsLockOn}}   From b041b3f67f0b310ffadb229eeb1b4cd85cdcf2f1 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 19 Feb 2015 10:58:57 +1100 Subject: [PATCH 28/49] FIX: bookmark topic was not working intuitively - explicitly call out "clear bookmarks" - correct keyboard shortcuts - properly remove bookmarks when toggeling --- .../discourse/lib/keyboard_shortcuts.js | 24 ++++++++++- .../javascripts/discourse/models/_post.js | 24 ++++++++--- .../javascripts/discourse/models/topic.js.es6 | 42 ++++++++++++++++--- .../discourse/views/bookmark-button.js.es6 | 5 ++- app/controllers/posts_controller.rb | 4 +- app/controllers/topics_controller.rb | 21 +++++++--- config/locales/client.en.yml | 7 ++-- config/routes.rb | 1 + spec/controllers/topics_controller_spec.rb | 23 +++++++++- 9 files changed, 125 insertions(+), 26 deletions(-) diff --git a/app/assets/javascripts/discourse/lib/keyboard_shortcuts.js b/app/assets/javascripts/discourse/lib/keyboard_shortcuts.js index 76ec7b4c90..893f34b98c 100644 --- a/app/assets/javascripts/discourse/lib/keyboard_shortcuts.js +++ b/app/assets/javascripts/discourse/lib/keyboard_shortcuts.js @@ -17,7 +17,6 @@ var PATH_BINDINGS = { }, CLICK_BINDINGS = { - 'f': '#topic-footer-buttons button.bookmark', // bookmark topic 'm m': 'div.notification-options li[data-id="0"] a', // mark topic as muted 'm r': 'div.notification-options li[data-id="1"] a', // mark topic as regular 'm t': 'div.notification-options li[data-id="2"] a', // mark topic as tracking @@ -50,7 +49,8 @@ var PATH_BINDINGS = { 'command+f': 'showBuiltinSearch', '?': 'showHelpModal', // open keyboard shortcut help 'q': 'quoteReply', - 'b': 'toggleBookmark' + 'b': 'toggleBookmark', + 'f': 'toggleBookmarkTopic' }; @@ -70,6 +70,16 @@ Discourse.KeyboardShortcuts = Ember.Object.createWithMixins({ this.sendToTopicListItemView('toggleBookmark'); }, + toggleBookmarkTopic: function(){ + var topic = this.currentTopic(); + // BIG hack, need a cleaner way + if(topic && $('.posts-wrapper').length > 0) { + topic.toggleBookmark(); + } else { + this.sendToTopicListItemView('toggleBookmark'); + } + }, + quoteReply: function(){ $('.topic-post.selected button.create').click(); // lazy but should work for now @@ -170,6 +180,16 @@ Discourse.KeyboardShortcuts = Ember.Object.createWithMixins({ } }, + currentTopic: function(){ + var topicController = this.container.lookup('controller:topic'); + if(topicController) { + var topic = topicController.get('model'); + if(topic){ + return topic; + } + } + }, + sendToSelectedPost: function(action){ var container = this.container; // TODO: We should keep track of the post without a CSS class diff --git a/app/assets/javascripts/discourse/models/_post.js b/app/assets/javascripts/discourse/models/_post.js index 7eeb44b25e..4311bbbe0e 100644 --- a/app/assets/javascripts/discourse/models/_post.js +++ b/app/assets/javascripts/discourse/models/_post.js @@ -413,15 +413,27 @@ Discourse.Post = Discourse.Model.extend({ }, toggleBookmark: function() { - var self = this; + var self = this, + bookmarkedTopic; this.toggleProperty("bookmarked"); - if (this.get("post_number") === 1) { this.toggleProperty("topic.bookmarked"); } - return Discourse.Post.updateBookmark(this.get('id'), this.get('bookmarked')).catch(function() { - self.toggleProperty("bookmarked"); - if (this.get("post_number") === 1) { this.toggleProperty("topic.bookmarked"); } - }); + if(this.get("bookmarked") && !this.get("topic.bookmarked")) { + this.set("topic.bookmarked", true); + bookmarkedTopic = true; + } + + // need to wait to hear back from server (stuff may not be loaded) + + return Discourse.Post.updateBookmark(this.get('id'), this.get('bookmarked')) + .then(function(result){ + self.set("topic.bookmarked", result.topic_bookmarked); + }) + .catch(function(e) { + self.toggleProperty("bookmarked"); + if (bookmarkedTopic) {self.set("topic.bookmarked", false); } + throw e; + }); } }); diff --git a/app/assets/javascripts/discourse/models/topic.js.es6 b/app/assets/javascripts/discourse/models/topic.js.es6 index c2a4d0517d..7dff779589 100644 --- a/app/assets/javascripts/discourse/models/topic.js.es6 +++ b/app/assets/javascripts/discourse/models/topic.js.es6 @@ -183,18 +183,48 @@ const Topic = Discourse.Model.extend({ }.property('word_count'), toggleBookmark() { - const self = this, firstPost = this.get("postStream.posts")[0]; + const self = this, + stream = this.get('postStream'), + posts = Em.get(stream, 'posts'), + firstPost = posts && + posts[0] && + posts[0].get('post_number') === 1 && + posts[0], + bookmark = !self.get('bookmarked'); + + var path = bookmark ? '/bookmark' : '/remove_bookmarks'; + var unbookmarkedPosts = [], + bookmarkedPost; this.toggleProperty('bookmarked'); - if (this.get("postStream.firstPostPresent")) { firstPost.toggleProperty("bookmarked"); } + if (bookmark && firstPost) { + firstPost.set('bookmarked', true); + bookmarkedPost = firstPost; + } - return Discourse.ajax('/t/' + this.get('id') + '/bookmark', { + if (!bookmark && posts) { + posts.forEach(function(post){ + if(post.get('bookmarked')){ + post.set('bookmarked', false); + unbookmarkedPosts.push(post); + } + }); + } + + return Discourse.ajax('/t/' + this.get('id') + path, { type: 'PUT', - data: { bookmarked: self.get('bookmarked') }, }).catch(function(error) { + self.toggleProperty('bookmarked'); - if (self.get("postStream.firstPostPresent")) { firstPost.toggleProperty('bookmarked'); } + + if(bookmarkedPost) { + bookmarkedPost.set('bookmarked', false); + } + + unbookmarkedPosts.forEach(function(p){ + p.set('bookmarked', true); + }); let showGenericError = true; if (error && error.responseText) { @@ -207,6 +237,8 @@ const Topic = Discourse.Model.extend({ if(showGenericError){ bootbox.alert(I18n.t('generic_error')); } + + throw error; }); }, diff --git a/app/assets/javascripts/discourse/views/bookmark-button.js.es6 b/app/assets/javascripts/discourse/views/bookmark-button.js.es6 index 2a9188d573..c99f955c8c 100644 --- a/app/assets/javascripts/discourse/views/bookmark-button.js.es6 +++ b/app/assets/javascripts/discourse/views/bookmark-button.js.es6 @@ -2,9 +2,12 @@ import ButtonView from 'discourse/views/button'; export default ButtonView.extend({ classNames: ['bookmark'], - textKey: 'bookmarked.title', attributeBindings: ['disabled'], + textKey: function() { + return this.get('controller.bookmarked') ? 'bookmarked.clear_bookmarks' : 'bookmarked.title'; + }.property('controller.bookmarked'), + rerenderTriggers: ['controller.bookmarked'], helpKey: function() { diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index b33655d349..300027454c 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -285,7 +285,9 @@ class PostsController < ApplicationController PostAction.remove_act(current_user, post, PostActionType.types[:bookmark]) end - render nothing: true + tu = TopicUser.get(post.topic, current_user) + + render_json_dump(topic_bookmarked: tu.bookmarked) end def wiki diff --git a/app/controllers/topics_controller.rb b/app/controllers/topics_controller.rb index ea002db4f8..499fba7bb0 100644 --- a/app/controllers/topics_controller.rb +++ b/app/controllers/topics_controller.rb @@ -217,15 +217,24 @@ class TopicsController < ApplicationController render nothing: true end + def remove_bookmarks + topic = Topic.find(params[:topic_id].to_i) + + PostAction.joins(:post) + .where(user_id: current_user.id) + .where('topic_id = ?', topic.id).each do |pa| + + PostAction.remove_act(current_user, pa.post, PostActionType.types[:bookmark]) + end + + render nothing: true + end + def bookmark - topic = Topic.find_by(id: params[:topic_id]) + topic = Topic.find(params[:topic_id].to_i) first_post = topic.ordered_posts.first - if params[:bookmarked] == "true" - PostAction.act(current_user, first_post, PostActionType.types[:bookmark]) - else - PostAction.remove_act(current_user, first_post, PostActionType.types[:bookmark]) - end + PostAction.act(current_user, first_post, PostActionType.types[:bookmark]) render nothing: true end diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index ba7629a580..c93330443e 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -167,9 +167,10 @@ en: bookmarked: title: "Bookmark" + clear_bookmarks: "Clear Bookmarks" help: - bookmark: "Click to bookmark this topic" - unbookmark: "Click to remove bookmark to this topic" + bookmark: "Click to bookmark the first post on this topic" + unbookmark: "Click to remove all bookmarks in this topic" bookmarks: not_logged_in: "sorry, you must be logged in to bookmark posts" @@ -2287,7 +2288,7 @@ en: dismiss_topics: 'x, t Dismiss Topics' actions: title: 'Actions' - bookmark_topic: 'f Bookmark topic' + bookmark_topic: 'f Toggle bookmark topic' pin_unpin_topic: 'shift+p Pin/Unpin topic' share_topic: 'shift+s Share topic' share_post: 's Share post' diff --git a/config/routes.rb b/config/routes.rb index a6b2875f76..94d7d9ebd4 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -426,6 +426,7 @@ Discourse::Application.routes.draw do post "t/:topic_id/change-owner" => "topics#change_post_owners", constraints: {topic_id: /\d+/} delete "t/:topic_id/timings" => "topics#destroy_timings", constraints: {topic_id: /\d+/} put "t/:topic_id/bookmark" => "topics#bookmark", constraints: {topic_id: /\d+/} + put "t/:topic_id/remove_bookmarks" => "topics#remove_bookmarks", constraints: {topic_id: /\d+/} post "t/:topic_id/notifications" => "topics#set_notifications" , constraints: {topic_id: /\d+/} diff --git a/spec/controllers/topics_controller_spec.rb b/spec/controllers/topics_controller_spec.rb index 651e2fbc95..4432b25b49 100644 --- a/spec/controllers/topics_controller_spec.rb +++ b/spec/controllers/topics_controller_spec.rb @@ -790,7 +790,7 @@ describe TopicsController do it "works correctly" do group = Fabricate(:group) topic = Fabricate(:topic) - admin = log_in(:admin) + _admin = log_in(:admin) xhr :post, :invite, topic_id: topic.id, email: 'hiro@from.heros', group_ids: "#{group.id}" @@ -857,7 +857,7 @@ describe TopicsController do end it 'needs you to be an admin or mod' do - user = log_in + log_in xhr :put, :autoclose, topic_id: 99, auto_close_time: '24', auto_close_based_on_last_post: false expect(response).to be_forbidden end @@ -959,6 +959,25 @@ describe TopicsController do end end + describe 'remove_bookmarks' do + it "should remove bookmarks properly from non first post" do + bookmark = PostActionType.types[:bookmark] + user = log_in + + post = create_post + post2 = create_post(topic_id: post.topic_id) + + PostAction.act(user, post2, bookmark) + + xhr :put, :bookmark, topic_id: post.topic_id + PostAction.where(user_id: user.id, post_action_type: bookmark).count.should == 2 + + xhr :put, :remove_bookmarks, topic_id: post.topic_id + PostAction.where(user_id: user.id, post_action_type: bookmark).count.should == 0 + + end + end + describe 'reset_new' do it 'needs you to be logged in' do From 1aa1e30e88c6a30da2e96bd207b06079afb18a37 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 19 Feb 2015 11:17:30 +1100 Subject: [PATCH 29/49] anniversary is silver added copy --- config/locales/client.en.yml | 3 +++ db/fixtures/006_badges.rb | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index c93330443e..453000fa4c 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -2354,6 +2354,9 @@ en: autobiographer: name: Autobiographer description: Filled user profile information + anniversary: + name: Anniversary + description: Active member for a year, posted at least once nice_post: name: Nice Post description: Received 10 likes on a post. This badge can be granted multiple times diff --git a/db/fixtures/006_badges.rb b/db/fixtures/006_badges.rb index a7c726e484..32f23d0ab1 100644 --- a/db/fixtures/006_badges.rb +++ b/db/fixtures/006_badges.rb @@ -240,8 +240,8 @@ end Badge.seed do |b| b.id = Badge::OneYearAnniversary - b.default_name = "1 year anniversary" - b.default_icon = "fa-birthday-cake" + b.default_name = "Anniversary" + b.default_icon = "fa-clock-o" b.badge_type_id = BadgeType::Bronze b.query = Badge::Queries::OneYearAnniversary b.default_badge_grouping_id = BadgeGrouping::Community From 59a28bf5c155c04ada36f95416bd1520779a691e Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 19 Feb 2015 11:42:01 +1100 Subject: [PATCH 30/49] regression: bookmarked may be missing, do not fail --- app/controllers/posts_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index 300027454c..a43cd4a6b7 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -287,7 +287,7 @@ class PostsController < ApplicationController tu = TopicUser.get(post.topic, current_user) - render_json_dump(topic_bookmarked: tu.bookmarked) + render_json_dump(topic_bookmarked: tu.try(:bookmarked)) end def wiki From 67f404d281b7dbd5867fe5332968f7855ffa4e9c Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 19 Feb 2015 12:40:00 +1100 Subject: [PATCH 31/49] FIX: remove notifications on deleted topics from the stream --- app/controllers/notifications_controller.rb | 1 + app/models/notification.rb | 20 +++++++++++++++----- app/models/user.rb | 4 ++-- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/app/controllers/notifications_controller.rb b/app/controllers/notifications_controller.rb index 09a1cc6306..7325fc8fac 100644 --- a/app/controllers/notifications_controller.rb +++ b/app/controllers/notifications_controller.rb @@ -28,6 +28,7 @@ class NotificationsController < ApplicationController end notifications = Notification.where(user_id: user.id) + .visible .includes(:topic) .limit(60) .where('created_at < ?', params[:before]) diff --git a/app/models/notification.rb b/app/models/notification.rb index 55ebdcae66..bd96c36dc9 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -8,7 +8,10 @@ class Notification < ActiveRecord::Base validates_presence_of :notification_type scope :unread, lambda { where(read: false) } - scope :recent, lambda {|n=nil| n ||= 10; order('created_at desc').limit(n) } + scope :recent, lambda {|n=nil| n ||= 10; order('notifications.created_at desc').limit(n) } + scope :visible , lambda { where('notifications.topic_id IS NULL OR notifications.topic_id IN ( + SELECT id FROM topics + WHERE deleted_at IS NULL)') } after_save :refresh_notification_count after_destroy :refresh_notification_count @@ -39,6 +42,7 @@ class Notification < ActiveRecord::Base def self.interesting_after(min_date) result = where("created_at > ?", min_date) .includes(:topic) + .visible .unread .limit(20) .order("CASE WHEN notification_type = #{Notification.types[:replied]} THEN 1 @@ -98,13 +102,19 @@ class Notification < ActiveRecord::Base def self.recent_report(user, count = nil) count ||= 10 - notifications = user.notifications.recent(count).includes(:topic).to_a + notifications = user.notifications + .visible + .recent(count) + .includes(:topic) + .to_a if notifications.present? - notifications += user.notifications - .order('created_at desc') + notifications += user + .notifications + .order('notifications.created_at desc') .where(read: false, notification_type: Notification.types[:private_message]) - .where('id < ?', notifications.last.id) + .joins(:topic) + .where('notifications.id < ?', notifications.last.id) .limit(count) notifications.sort do |x,y| diff --git a/app/models/user.rb b/app/models/user.rb index 20f159e86f..17d1d88359 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -237,7 +237,7 @@ class User < ActiveRecord::Base end def unread_notifications_by_type - @unread_notifications_by_type ||= notifications.where("id > ? and read = false", seen_notification_id).group(:notification_type).count + @unread_notifications_by_type ||= notifications.visible.where("id > ? and read = false", seen_notification_id).group(:notification_type).count end def reload @@ -248,7 +248,7 @@ class User < ActiveRecord::Base end def unread_private_messages - @unread_pms ||= notifications.where("read = false AND notification_type = ?", Notification.types[:private_message]).count + @unread_pms ||= notifications.visible.where("read = false AND notification_type = ?", Notification.types[:private_message]).count end def unread_notifications From 451788b95d3b552f3925765e764c41ebb9592dbb Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 19 Feb 2015 12:56:49 +1100 Subject: [PATCH 32/49] FIX: allow searching in PMs when "search this topic" is selected --- lib/search.rb | 6 ++++-- spec/components/search_spec.rb | 7 +++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/search.rb b/lib/search.rb index 68d2553d69..454aa5b7c5 100644 --- a/lib/search.rb +++ b/lib/search.rb @@ -294,7 +294,9 @@ class Search .where("topics.deleted_at" => nil) .where("topics.visible") - if opts[:private_messages] + is_topic_search = @search_context.present? && @search_context.is_a?(Topic) + + if opts[:private_messages] || (is_topic_search && @search_context.private_message?) posts = posts.where("topics.archetype = ?", Archetype.private_message) unless @guardian.is_admin? @@ -304,7 +306,7 @@ class Search posts = posts.where("topics.archetype <> ?", Archetype.private_message) end - if @search_context.present? && @search_context.is_a?(Topic) + if is_topic_search posts = posts.joins('JOIN users u ON u.id = posts.user_id') posts = posts.where("posts.raw || ' ' || u.username || ' ' || u.name ilike ?", "%#{@term}%") else diff --git a/spec/components/search_spec.rb b/spec/components/search_spec.rb index 1c62078d56..cdc5a31fc2 100644 --- a/spec/components/search_spec.rb +++ b/spec/components/search_spec.rb @@ -126,6 +126,13 @@ describe Search do results.posts.length.should == 1 + + results = Search.execute('mars', + search_context: topic, + guardian: Guardian.new(reply.user)) + + results.posts.length.should == 1 + # does not leak out results = Search.execute('mars', type_filter: 'private_messages', From 81733eb8857dd53082cb1c5bdbe874c94fa60254 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 19 Feb 2015 13:17:31 +1100 Subject: [PATCH 33/49] FIX: stop allowing nested SUP in topic bodies --- app/assets/stylesheets/common/base/topic.scss | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/assets/stylesheets/common/base/topic.scss b/app/assets/stylesheets/common/base/topic.scss index 1afcedb7fe..13201331cc 100644 --- a/app/assets/stylesheets/common/base/topic.scss +++ b/app/assets/stylesheets/common/base/topic.scss @@ -18,3 +18,9 @@ .topic-title-outlet { clear: both; } + +.topic-body { + sup sup { + top: 0; + } +} From 709ab731c7c65a4cd2f83d064db7e1a5e6ccb3a7 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 19 Feb 2015 13:20:25 +1100 Subject: [PATCH 34/49] don't put missing notifications in the stream for tests. --- spec/models/notification_spec.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/spec/models/notification_spec.rb b/spec/models/notification_spec.rb index 3071a86576..f23085650f 100644 --- a/spec/models/notification_spec.rb +++ b/spec/models/notification_spec.rb @@ -187,16 +187,18 @@ describe Notification do it 'correctly updates the read state' do user = Fabricate(:user) + t = Fabricate(:topic) + Notification.create!(read: false, user_id: user.id, - topic_id: 2, + topic_id: t.id, post_number: 1, data: '{}', notification_type: Notification.types[:private_message]) other = Notification.create!(read: false, user_id: user.id, - topic_id: 2, + topic_id: t.id, post_number: 1, data: '{}', notification_type: Notification.types[:mentioned]) From 1da5060bf8382a96b1bc073f69529c57e5094308 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 19 Feb 2015 14:07:35 +1100 Subject: [PATCH 35/49] FIX: HR in profile causing user badge to behave weirdly makes no sense to have HR in card anyway so removing them --- app/assets/javascripts/discourse/components/text-overflow.js.es6 | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/javascripts/discourse/components/text-overflow.js.es6 b/app/assets/javascripts/discourse/components/text-overflow.js.es6 index ae4e2a8259..99b24c525a 100644 --- a/app/assets/javascripts/discourse/components/text-overflow.js.es6 +++ b/app/assets/javascripts/discourse/components/text-overflow.js.es6 @@ -1,5 +1,6 @@ export default Ember.Component.extend({ _parse: function() { + this.$().find('hr').remove(); this.$().ellipsis(); }.on('didInsertElement'), From a7d6bc8d3c8e667c3f9cf43bf133bc502ad79b3f Mon Sep 17 00:00:00 2001 From: riking Date: Wed, 18 Feb 2015 19:50:01 -0800 Subject: [PATCH 36/49] FEATURE: Use HTML badge description on individual display --- app/assets/javascripts/discourse/templates/badges/show.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/templates/badges/show.hbs b/app/assets/javascripts/discourse/templates/badges/show.hbs index 102c4abc63..c686df798e 100644 --- a/app/assets/javascripts/discourse/templates/badges/show.hbs +++ b/app/assets/javascripts/discourse/templates/badges/show.hbs @@ -9,7 +9,7 @@ - + From 103d42a9d9887135871f1e8c1a60bff1120af882 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 19 Feb 2015 16:58:05 +1100 Subject: [PATCH 37/49] FIX: emoji cache could get corrupt FEATURE: enforce 1 day expiry by default on discourse cache remove family expiry concept as the implementation was fragile --- app/models/emoji.rb | 10 +++++--- lib/cache.rb | 47 ++++++++++------------------------- spec/components/cache_spec.rb | 24 ++++++++---------- 3 files changed, 30 insertions(+), 51 deletions(-) diff --git a/app/models/emoji.rb b/app/models/emoji.rb index b67d7e01bd..0ae75aee09 100644 --- a/app/models/emoji.rb +++ b/app/models/emoji.rb @@ -20,15 +20,15 @@ class Emoji end def self.all - Discourse.cache.fetch("all", family: "emoji") { standard | custom } + Discourse.cache.fetch("all_emojis") { standard | custom } end def self.standard - Discourse.cache.fetch("standard", family: "emoji") { load_standard } + Discourse.cache.fetch("standard_emojis") { load_standard } end def self.custom - Discourse.cache.fetch("custom", family: "emoji") { load_custom } + Discourse.cache.fetch("custom_emojis") { load_custom } end def self.exists?(name) @@ -72,7 +72,9 @@ class Emoji end def self.clear_cache - Discourse.cache.delete_by_family("emoji") + Discourse.cache.delete("custom_emojis") + Discourse.cache.delete("standard_emojis") + Discourse.cache.delete("all_emojis") end def self.db_file diff --git a/lib/cache.rb b/lib/cache.rb index 819bddfb72..00ca6365a5 100644 --- a/lib/cache.rb +++ b/lib/cache.rb @@ -1,9 +1,15 @@ -# Discourse specific cache supports expire by family missing from standard cache +# Discourse specific cache, enforces 1 day expiry class Cache < ActiveSupport::Cache::Store + # nothing is cached for longer than 1 day EVER + # there is no reason to have data older than this clogging redis + # it is dangerous cause if we rename keys we will be stuck with + # pointless data + MAX_CACHE_AGE = 1.day unless defined? MAX_CACHE_AGE + def initialize(opts = {}) - opts[:namespace] ||= "_CACHE_" + @namespace = opts[:namespace] || "_CACHE_" super(opts) end @@ -11,27 +17,18 @@ class Cache < ActiveSupport::Cache::Store $redis end - def delete_by_family(key) - k = family_key(key, options) - redis.smembers(k).each do |member| - redis.del(member) - end - redis.del(k) - end - def reconnect redis.reconnect end def clear - redis.keys.each do |k| - redis.del(k) if k =~ /^_CACHE_:/ + redis.keys("#{@namespace}:*").each do |k| + redis.del(k) end end def namespaced_key(key, opts=nil) - opts ||= options - super(key,opts) + "#{@namespace}:" << key end protected @@ -47,17 +44,8 @@ class Cache < ActiveSupport::Cache::Store def write_entry(key, entry, options) dumped = Marshal.dump(entry.value) - - if expiry = options[:expires_in] - redis.setex(key, expiry, dumped) - else - redis.set(key, dumped) - end - - if family = family_key(options[:family], options) - redis.sadd(family, key) - end - + expiry = options[:expires_in] || MAX_CACHE_AGE + redis.setex(key, expiry, dumped) true end @@ -65,13 +53,4 @@ class Cache < ActiveSupport::Cache::Store redis.del key end - private - - def family_key(name, options) - if name - key = namespaced_key(name, options) - key << "FAMILY:#{name}" - end - end - end diff --git a/spec/components/cache_spec.rb b/spec/components/cache_spec.rb index 8479b50784..385ab58428 100644 --- a/spec/components/cache_spec.rb +++ b/spec/components/cache_spec.rb @@ -19,24 +19,15 @@ describe Cache do end it "can be cleared" do + $redis.set("boo", "boo") cache.write("hello0", "world") cache.write("hello1", "world") cache.clear + expect($redis.get("boo")).to eq("boo") expect(cache.read("hello0")).to eq(nil) end - it "can delete by family" do - cache.write("key2", "test", family: "my_family") - cache.write("key", "test", expires_in: 1.minute, family: "my_family") - - cache.delete_by_family("my_family") - - expect(cache.fetch("key")).to eq(nil) - expect(cache.fetch("key2")).to eq(nil) - - end - it "can delete correctly" do cache.fetch("key", expires_in: 1.minute) do "test" @@ -46,16 +37,23 @@ describe Cache do expect(cache.fetch("key")).to eq(nil) end - #TODO yuck on this mock it "calls setex in redis" do cache.delete("key") + cache.delete("bla") key = cache.namespaced_key("key") - $redis.expects(:setex).with(key, 60 , Marshal.dump("bob")) cache.fetch("key", expires_in: 1.minute) do "bob" end + + expect($redis.ttl(key)).to be_within(2.seconds).of(1.minute) + + # we always expire withing a day + cache.fetch("bla"){ "hi" } + + key = cache.namespaced_key("bla") + expect($redis.ttl(key)).to be_within(2.seconds).of(1.day) end it "can store and fetch correctly" do From da036e7de3b49ca5b7d2fc6a92c1f0cccb74b27c Mon Sep 17 00:00:00 2001 From: Jeff Atwood Date: Wed, 18 Feb 2015 23:05:28 -0800 Subject: [PATCH 38/49] fix mobile user page alignment on larger devices --- app/assets/stylesheets/mobile/user.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/mobile/user.scss b/app/assets/stylesheets/mobile/user.scss index 7bddfa1792..b723606ffe 100644 --- a/app/assets/stylesheets/mobile/user.scss +++ b/app/assets/stylesheets/mobile/user.scss @@ -292,6 +292,7 @@ img.avatar { float: left; + margin-right: 15px; } .suspended { @@ -310,7 +311,6 @@ float: left; a[href] { color: dark-light-diff($secondary, $primary, 75%, -10%); - } } From bf03209f4234ec124e536f589b777f8ae16aeacf Mon Sep 17 00:00:00 2001 From: Jeff Atwood Date: Wed, 18 Feb 2015 23:55:04 -0800 Subject: [PATCH 39/49] let's try to vertically align small logo --- .../discourse/templates/components/home-logo.hbs | 3 +++ app/assets/stylesheets/common/base/header.scss | 11 ++++++----- app/assets/stylesheets/mobile/header.scss | 6 +++--- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/app/assets/javascripts/discourse/templates/components/home-logo.hbs b/app/assets/javascripts/discourse/templates/components/home-logo.hbs index b2b8f9e6db..976aefd88f 100644 --- a/app/assets/javascripts/discourse/templates/components/home-logo.hbs +++ b/app/assets/javascripts/discourse/templates/components/home-logo.hbs @@ -1,15 +1,18 @@ {{#if showSmallLogo}} {{#if smallLogoUrl}} + {{else}} {{/if}} {{else}} {{#if showMobileLogo}} + {{else}} {{#if bigLogoUrl}} + {{else}} diff --git a/app/assets/stylesheets/common/base/header.scss b/app/assets/stylesheets/common/base/header.scss index 74e9803c1e..8549fabc48 100644 --- a/app/assets/stylesheets/common/base/header.scss +++ b/app/assets/stylesheets/common/base/header.scss @@ -16,12 +16,13 @@ } .title { - display: table; float: left; - > a { - display: table-cell; - vertical-align: middle; - } + } + + .valign-helper { + display: inline-block; + height: 100%; + vertical-align: middle; } #site-logo { diff --git a/app/assets/stylesheets/mobile/header.scss b/app/assets/stylesheets/mobile/header.scss index f6a027afe0..8f9e0dbf98 100644 --- a/app/assets/stylesheets/mobile/header.scss +++ b/app/assets/stylesheets/mobile/header.scss @@ -5,17 +5,17 @@ .d-header { #site-logo { - max-width: 122px; + max-width: 135px; } // some protection for text-only site titles .title { margin-left: 10px; - max-width: 135px; + max-width: 140px; + height: 39px; overflow: hidden; padding: 0; text-overflow: clip; - display: block; // table causes clipping fail oddities here } .icons { From 08e330bb715360d13a414c3ccca76b33165b97a4 Mon Sep 17 00:00:00 2001 From: Jeff Atwood Date: Thu, 19 Feb 2015 00:13:15 -0800 Subject: [PATCH 40/49] a few mobile CSS tweaks --- app/assets/stylesheets/mobile/header.scss | 1 - app/assets/stylesheets/mobile/topic-post.scss | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/app/assets/stylesheets/mobile/header.scss b/app/assets/stylesheets/mobile/header.scss index 8f9e0dbf98..bfabc70897 100644 --- a/app/assets/stylesheets/mobile/header.scss +++ b/app/assets/stylesheets/mobile/header.scss @@ -10,7 +10,6 @@ // some protection for text-only site titles .title { - margin-left: 10px; max-width: 140px; height: 39px; overflow: hidden; diff --git a/app/assets/stylesheets/mobile/topic-post.scss b/app/assets/stylesheets/mobile/topic-post.scss index 56111455bd..d4f4540d4f 100644 --- a/app/assets/stylesheets/mobile/topic-post.scss +++ b/app/assets/stylesheets/mobile/topic-post.scss @@ -3,7 +3,7 @@ padding: 5px 15px; color: $primary; text-align: center; - margin: 0 10px; + margin: 10px 0; } .topic-post { From 873f6b748754daef2f572ebf18d6f89204ee87dd Mon Sep 17 00:00:00 2001 From: Jeff Atwood Date: Thu, 19 Feb 2015 02:52:28 -0800 Subject: [PATCH 41/49] tweak for text-only mobile site titles --- app/assets/stylesheets/mobile/discourse.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/stylesheets/mobile/discourse.scss b/app/assets/stylesheets/mobile/discourse.scss index 65e4468141..1aaab8a820 100644 --- a/app/assets/stylesheets/mobile/discourse.scss +++ b/app/assets/stylesheets/mobile/discourse.scss @@ -81,4 +81,5 @@ blockquote { h2#site-text-logo { margin: 0; + margin-left: 10px; } From e09e8e0b76e25391288b9043439b0d5685a7617a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Thu, 19 Feb 2015 16:43:12 +0100 Subject: [PATCH 42/49] FIX: error when re-bookmarking a topic/post --- app/models/post_action.rb | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/app/models/post_action.rb b/app/models/post_action.rb index e0330cc93b..cb7cda7ece 100644 --- a/app/models/post_action.rb +++ b/app/models/post_action.rb @@ -242,28 +242,26 @@ class PostAction < ActiveRecord::Base post_action_type_id: post_action_type_id } - action_attributes = { + action_attrs = { staff_took_action: staff_took_action, related_post_id: related_post_id, targets_topic: !!targets_topic } # First try to revive a trashed record - row_count = PostAction.where(where_attrs) - .with_deleted - .where("deleted_at IS NOT NULL") - .update_all(action_attributes.merge(deleted_at: nil)) + post_action = PostAction.where(where_attrs) + .with_deleted + .where("deleted_at IS NOT NULL") + .first - if row_count == 0 - post_action = create(where_attrs.merge(action_attributes)) + if post_action + post_action.recover! + post_action.save + else + post_action = create(where_attrs.merge(action_attrs)) if post_action && post_action.errors.count == 0 BadgeGranter.queue_badge_grant(Badge::Trigger::PostAction, post_action: post_action) end - else - post_action = PostAction.where(where_attrs).first - - # after_commit is not called on an 'update_all' so do the notify ourselves - post_action.notify_subscribers end # agree with other flags From 5c61661b7cb75b2f6495955d08b127e2c5348850 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Thu, 19 Feb 2015 21:41:24 +0530 Subject: [PATCH 43/49] Update Translations --- config/locales/client.ar.yml | 29 +++ config/locales/client.da.yml | 12 +- config/locales/client.es.yml | 4 +- config/locales/client.fi.yml | 57 +++++- config/locales/client.fr.yml | 10 ++ config/locales/client.he.yml | 16 ++ config/locales/client.it.yml | 12 +- config/locales/client.ko.yml | 16 +- config/locales/client.nb_NO.yml | 5 + config/locales/client.nl.yml | 8 + config/locales/client.pl_PL.yml | 10 ++ config/locales/client.pt_BR.yml | 10 ++ config/locales/client.te.yml | 146 ++++++++++++++- config/locales/client.zh_CN.yml | 24 ++- config/locales/server.da.yml | 1 - config/locales/server.de.yml | 20 ++- config/locales/server.es.yml | 39 +--- config/locales/server.fi.yml | 194 +++++++++++++++++++- config/locales/server.fr.yml | 67 ++++--- config/locales/server.he.yml | 29 +-- config/locales/server.it.yml | 146 +++++++++++++-- config/locales/server.ja.yml | 3 + config/locales/server.ko.yml | 1 - config/locales/server.pl_PL.yml | 1 - config/locales/server.pt.yml | 32 ---- config/locales/server.pt_BR.yml | 115 ++++-------- config/locales/server.ru.yml | 1 - config/locales/server.sq.yml | 69 -------- config/locales/server.sv.yml | 3 + config/locales/server.te.yml | 206 +++++++++++++++++++++- config/locales/server.tr_TR.yml | 101 ----------- config/locales/server.zh_CN.yml | 57 +++--- plugins/poll/config/locales/client.te.yml | 2 +- public/403.te.html | 2 +- public/500.te.html | 4 +- 35 files changed, 985 insertions(+), 467 deletions(-) diff --git a/config/locales/client.ar.yml b/config/locales/client.ar.yml index ce063b78e5..ed6ea462d4 100644 --- a/config/locales/client.ar.yml +++ b/config/locales/client.ar.yml @@ -992,9 +992,38 @@ ar: delete: 'حذف الصنف' create: 'قسم جديد' save: 'حفظ القسم' + slug: 'عنوان التصنيف/Slug' creation_error: حدثت مشكلة اثناء انشاء القسم + save_error: حدث خطأ أثناء حفظ التصنيف + name: "اسم التصنيف" + description: "الوصف" + topic: "موضوع التصنيف" + logo: "شعار التصنيف" + background_image: "خلفية التصنيف" + badge_colors: "ألوان الشارة" + background_color: "لون الخلفية" + foreground_color: "لون الخط" + name_placeholder: "كلمة أو كلمتين على الأكثر" + color_placeholder: "أي لون " + delete_confirm: "هل أنت متأكد من رغبتك في حذف هذا التصنيف؟" + delete_error: "حدث خطأ أثناء حذف التصنيف" + list: "عرض التصنيفات" + no_description: "الرجاء إضافة وصف لهذا التصنيف." + change_in_category_topic: "تعديل الوصف" + already_used: 'هذا اللون تم استخدامه سابقا في تصنيف آخر' + security: "الأمن" + images: "الصور" + auto_close_label: "الإغلاق التلقائي للمواضيع بعد:" + auto_close_units: "ساعات" + email_in_allow_strangers: "قبول بريد إلكتروني من مستخدمين لا يملكون حسابات" + email_in_disabled: "إضافة مواضيع جديدة من خلال البريد الإلكتروني موقف في الوقت الحالي من خلال إعدادات الموقع. لتفعيل إضافة مواضيع جديدة من خلال البريد الإلكتروني," + email_in_disabled_click: 'قم بتفعيل خيار "email in" في الإعدادات' + allow_badges_label: "السماح بالحصول على الشارات في هذا التصنيف" edit_permissions: "تعديل الصلاحيات" add_permission: "اضف صلاحية" + this_year: "هذه السنة" + position: "المكان" + default_position: "المكان الافتراضي" admin_js: admin: dashboard: diff --git a/config/locales/client.da.yml b/config/locales/client.da.yml index e679af67ab..6f4ad312e8 100644 --- a/config/locales/client.da.yml +++ b/config/locales/client.da.yml @@ -147,7 +147,7 @@ da: user_count: "Nye brugere" active_user_count: "Aktive brugere" contact: "Kontakt os" - contact_info: "I tilfælde af kritiske situationer eller vigtige spørgsmål angående denne side, kontakt os venligst på %{contact_emal}." + contact_info: "I tilfælde af kritiske situationer eller vigtige spørgsmål angående denne side, kontakt os venligst på %{contact_email}." bookmarked: title: "Bogmærke" help: @@ -979,6 +979,7 @@ da: attachment_too_large: "Beklager, filen, som du forsøger at uploade, er for store (den maksimale størrelse er {{max_size_kb}}kb)." file_too_large: "Beklager, filen, som du forsøger at uploade, er for store (den maksimale størrelse er {{max_size_kb}}kb)." too_many_uploads: "Beklager, men du kan kun uploade én fil ad gangen." + too_many_dragged_and_dropped_files: "Beklager, du kan kun drag & drope'e op til 10 filer af gangen." upload_not_authorized: "Beklager, filen, som du forsøger at uploade, er ikke godkendt (godkendte filendelser: {{authorized_extensions}})." image_upload_not_allowed_for_new_user: "Beklager, nye brugere kan ikke uploade billeder." attachment_upload_not_allowed_for_new_user: "Beklager, nye brugere kan ikke uploade vedhæftede filer." @@ -1498,6 +1499,14 @@ da: info_html: "Din API-nøgle giver dig mulighed for at oprette og opdatere emner vha. JSON-kald." all_users: "Alle brugere" note_html: "Hold denne nøgle hemmelig, alle brugere som har den kan oprette vilkårlige indlæg, som enhver bruger." + plugins: + title: "Plugins" + installed: "Installerede Plugins" + name: "Navn" + none_installed: "Du har ikke nogen plugins installeret" + version: "Version" + change_settings: "Skift indstillinger" + howto: "Hvordan installerer jeg plugins?" backups: title: "Backups" menu: @@ -1747,6 +1756,7 @@ da: label: "Ny:" ip_address: "IP-adresse" add: "Tilføj" + filter: "Søg" roll_up: text: "Saml sammen" title: "Laver et nyt subnet forbud hvis der er mindst 'min_ban_entries_for_roll_up' forbud." diff --git a/config/locales/client.es.yml b/config/locales/client.es.yml index ca9348f222..13766830aa 100644 --- a/config/locales/client.es.yml +++ b/config/locales/client.es.yml @@ -1253,7 +1253,7 @@ es: invisible: help: "Este tema es invisible; no se mostrará en la lista de temas y solo puede acceder a él a través de su enlace directo." posts: "Posts" - posts_lowercase: "publicaciones" + posts_lowercase: "posts" posts_long: "{{number}} posts en este tema" posts_likes_MF: | Este tema tiene {count, plural, one {1 post} other {# posts}} {ratio, select, @@ -1284,7 +1284,7 @@ es: with_category: "Temas de %{filter} %{category}" latest: title: "Recientes" - help: "temas con publicaciones más recientes" + help: "temas con posts recientes" hot: title: "Popular" help: "una selección de los temas más populares" diff --git a/config/locales/client.fi.yml b/config/locales/client.fi.yml index 7260b9f192..e670e36601 100644 --- a/config/locales/client.fi.yml +++ b/config/locales/client.fi.yml @@ -91,6 +91,7 @@ fi: google+: 'jaa tämä linkki Google+:ssa' email: 'lähetä tämä linkki sähköpostissa' topic_admin_menu: "ketjun ylläpitotoimet" + 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ä." edit: 'muokkaa tämän ketjun otsikkoa ja aluetta' not_implemented: "Tätä toimintoa ei ole vielä toteutettu, pahoittelut!" no_value: "Ei" @@ -137,11 +138,14 @@ fi: our_admins: "Ylläpitäjät" our_moderators: "Valvojat" stat: - all_time: "Kaikki" - last_7_days: "Viimeiset 7 päivää" + all_time: "Yhteensä" + last_7_days: "7 päivän aikana" + last_30_days: "30 päivän aikana" like_count: "Tykkäyksiä" topic_count: "Ketjuja" post_count: "Viestejä" + user_count: "Uusia käyttäjiä" + active_user_count: "Aktiivisia käyttäjiä" contact: "Yhteystiedot" contact_info: "Sivustoon liittyvissä kiireellisissä asioissa, ota yhteyttä osoitteeseen %{contact_email}." bookmarked: @@ -278,6 +282,7 @@ fi: notifications: "Ilmoitukset" dismiss_notifications: "Merkitse kaikki luetuiksi" dismiss_notifications_tooltip: "Merkitse kaikki lukemattomat ilmoitukset luetuiksi" + disable_jump_reply: "Älä siirry uuteen viestiini lähetettyäni sen" dynamic_favicon: "Näytä ilmoitukset viesteistä faviconissa (kokeellinen)" edit_history_public: "Anna muiden nähdä viestieni revisiot" external_links_in_new_tab: "Avaa sivuston ulkopuoliset linkit uudessa välilehdessä" @@ -290,6 +295,7 @@ fi: suspended_notice: "Tämä käyttäjätili on hyllytetty {{date}} asti." suspended_reason: "Syy:" github_profile: "GitHub" + mailing_list_mode: "Lähetä minulle sähköposti jokaisesta uudesta viestistä (paitsi jos vaimennan ketjun tai alueen)." watched_categories: "Tarkkaillut" watched_categories_instructions: "Näiden alueiden ketjut asetetaan automaattisesti tarkkailuun. Saat ilmoituksen kaikista uusista viesteistä ja ketjuista ja uusien ja lukemattomien viestien lukumäärä näytetään ketjujen listauksissa. " tracked_categories: "Seuratut" @@ -355,6 +361,8 @@ fi: authenticated: "{{provider}} on todentanut sähköpostiosoitteesi" frequency: zero: "Lähetämme sähköpostia heti, jos et ole lukenut sähköpostin aihetta." + one: "Lähetämme sähköpostia vain, jos emme ole nähneet sinua edellisen minuutin aikana." + other: "Lähetämme sähköpostia vain, jos emme ole nähneet sinua edellisen {{count}} minuutin aikana." name: title: "Nimi" instructions: "Koko nimesi (valinnainen)" @@ -390,20 +398,26 @@ fi: website: "Nettisivu" email_settings: "Sähköposti" email_digests: + title: "Lähetä tiivistelmä uusista viesteistä sähköpostilla, jos en käy sivustolla " daily: "päivittäin" weekly: "viikottain" bi_weekly: "joka toinen viikko" + email_direct: "Lähetä minulle sähköposti, jos joku lainaa viestiäni, vastaa viestiini tai viittaa @nimeeni." + email_private_messages: "Lähetä minulle sähköposti jos joku lähettää minulle yksityisviestin" email_always: "Älä jätä lähettämättä sähköposti-ilmoituksia, vaikka olen aktiivinen palstalla." other_settings: "Muut" categories_settings: "Keskustelualueet" new_topic_duration: label: "Tulkitse ketju uudeksi, kun" + not_viewed: "en ole avannut sitä vielä" + last_here: "se on luotu edellisen käyntini jälkeen" after_n_days: one: "se on luotu edellisen päivän aikana" other: "se on luotu edellisen {{count}} päivän aikana" after_n_weeks: one: "se on luotu edellisen viikon aikana" other: "se on luotu edellisen {{count}} viikon aikana" + auto_track_topics: "Seuraa automaattisesti ketjuja, jotka avaan" auto_track_options: never: "ei koskaan" always: "aina" @@ -653,6 +667,7 @@ fi: examples: 'Syötä aika tunteina (24).' notifications: title: "ilmoitukset @nimeen viittauksista, vastauksista omiin viesteihin ja ketjuihin, yksityisviesteistä ym." + none: "Ilmoitusten lataaminen ei onnistunut." more: "vanhat ilmoitukset" total_flagged: "yhteensä liputettuja viestejä" mentioned: "@

    {{username}} {{description}}

    " @@ -719,6 +734,7 @@ fi: posted: "Et ole kirjoittanut vielä yhteenkään ketjuun." latest: "Tuoreimpia ketjuja ei ole. Ompa harmi." hot: "Kuumia ketjuja ei ole." + bookmarks: "Et ole vielä merkinnyt kirjanmerkkejä." category: "Alueella {{category}} ei ole ketjua." top: "Huippuketjuja ei ole." educate: @@ -733,6 +749,7 @@ fi: unread: "Lukemattomia ketjuja ei ole enempää." category: "Alueen {{category}} ketjuja ei ole enempää." top: "Huippuketjuja ei ole enempää." + bookmarks: "Merkattuja ketjuja ei ole enempää." topic: filter_to: "{{post_count}} viestiä ketjussa" create: 'Uusi ketju' @@ -886,6 +903,7 @@ fi: to_forum: "Lähetämme lyhyen sähköpostin jonka avulla ystäväsi voi liittyä klikkaamalla linkkiä, sisäänkirjautumista ei tarvita." email_placeholder: 'nimi@esimerkki.fi' success: "Olemme lähettäneet kutsun osoitteeseen {{email}}. Ilmoitamme, kun kutsuun on vastattu. Voit seurata käyttäjäsivusi kutsut-välilehdeltä kutsujesi tilannetta." + error: "Pahoittelut, emme pystyneet kutsumaan tätä henkilöä. Ehkäpä hän on jo rekisteröitynyt? (Huomaa, että kutsumistiheyttä rajoitetaan)" login_reply: 'Kirjaudu sisään vastataksesi' filters: n_posts: @@ -961,6 +979,7 @@ fi: attachment_too_large: "Pahoittelut, tiedosto jonka latausta yritit on liian suuri ( suurin tiedostokoko on {{max_size_kb}}kb)." file_too_large: "Pahoittelut, tiedosto jonka latausta yritit on liian suuri ( suurin tiedostokoko on {{max_size_kb}}kb)" too_many_uploads: "Pahoittelut, voit ladata vain yhden tiedoston kerrallaan." + too_many_dragged_and_dropped_files: "Pahoittelut, voit raahata korkeintaan 10 tiedostoa kerrallaan." upload_not_authorized: "Pahoittelut, tiedostomuoto ei ole sallittu (sallitut tiedostopäätteet: {{authorized_extensions}})." image_upload_not_allowed_for_new_user: "Pahoittelut, uudet käyttjät eivät saa ladata kuvia." attachment_upload_not_allowed_for_new_user: "Pahoittelut, uudet käyttäjät eivät saa ladata liitteitä." @@ -1299,6 +1318,9 @@ fi: posted: title: "Viestini" help: "ketjut, joihin olet kirjoittanut" + bookmarks: + title: "Kirjanmerkit" + help: "ketjut, jotka olet merkinnyt kirjanmerkillä" category: title: zero: "{{categoryName}}" @@ -1354,6 +1376,14 @@ fi: suspended: 'Hyllytetyt:' private_messages_short: "YV:t" private_messages_title: "Yksityisviestit" + space_free: "{{size}} vapaata" + uploads: "lataukset" + backups: "varmuuskopiot" + traffic_short: "Liikenne" + traffic: "Sovelluksen web-pyynnöt" + page_views: "Sivunkatselut" + page_views_short: "Katselut" + show_traffic_report: "Näytä yksityiskohtainen liikenneraportti" reports: today: "Tänään" yesterday: "Eilen" @@ -1451,6 +1481,10 @@ fi: name: "Nimi" add: "Lisää" add_members: "Lisää jäseniä" + custom: "Mukautetut" + automatic: "Automaattiset" + automatic_membership_email_domains: "Käyttäjät, jotka luovat tunnuksen sähköpostiosoitteella, jonka verkkotunnus on tällä listalla, lisätään tähän ryhmään:" + automatic_membership_retroactive: "Lisää jo olemassa olevat käyttäjät käyttäen samaa sääntöä verkkotunnuksista" api: generate_master: "Luo rajapinnan pääavain" none: "Aktiivisia API avaimia ei ole määritelty." @@ -1465,6 +1499,14 @@ fi: info_html: "API avaimen avulla voi luoda ja pävittää ketjuja käyttämällä JSON kutsuja." all_users: "Kaikki käyttäjät" note_html: "Pidä tämä avain salaisena, sen haltija voi luoda viestejä esiintyen minä hyvänsä käyttäjänä." + plugins: + title: "Lisäosat" + installed: "Asennetut lisäosat" + name: "Nimi" + none_installed: "Sinulla ei ole yhtään asennettua lisäosaa." + version: "Versio" + change_settings: "Asetukset" + howto: "Kuinka asennan lisäosia?" backups: title: "Varmuuskopiot" menu: @@ -1676,6 +1718,7 @@ fi: actions: delete_user: "poista käyttäjä" change_trust_level: "vaihda luottamustasoa" + change_username: "vaihda käyttäjätunnus" change_site_setting: "muuta sivuston asetusta" change_site_customization: "vaihda sivuston mukautusta" delete_site_customization: "poista sivuston mukautus" @@ -1713,6 +1756,7 @@ fi: label: "Uusi:" ip_address: "IP-osoite" add: "Lisää" + filter: "Etsi" roll_up: text: "Kääri" title: "Luo uusia aliverkkojen laajuisia porttikieltoja, jos kieltoja on asetettu vähintään 'min_ban_entries_for_roll_up' asetuksen määrä." @@ -1848,6 +1892,8 @@ fi: suspended_explanation: "Hyllytetty käyttäjä ei voi kirjautua sisään." block_explanation: "Estetty käyttäjä ei voi luoda viestejä tai ketjuja." trust_level_change_failed: "Käyttäjän luottamustason vaihtamisessa tapahtui virhe." + grant_admin_failed: "Ylläpitäjän oikeuksian antaminen ei onnistunut." + grant_moderation_failed: "Moderaattorin oikeuksien antaminen ei onnistunut." suspend_modal_title: "Hyllytä käyttäjä" trust_level_2_users: "Käyttäjät luottamustasolla 2" trust_level_3_requirements: "Luottamustaso 3 vaatimukset" @@ -1908,6 +1954,10 @@ fi: title: "Muokattavissa tilin luomisen jälkeen?" enabled: "muokattavissa" disabled: "ei muokattavissa" + show_on_profile: + title: "Näytä julkisessa profiilissa?" + enabled: "näytetään profiilissa" + disabled: "ei näytetä profiilissa" field_types: text: 'Tekstikenttä' confirm: 'Vahvistus' @@ -1941,6 +1991,7 @@ fi: uncategorized: 'Muut' backups: "Varmuuskopiot" login: "Kirjautuminen" + plugins: "Lisäosat" badges: title: Arvomerkit new_badge: Uusi arvomerkki @@ -2064,6 +2115,8 @@ fi: mark_watching: 'm, w Tarkkaile ketjua' badges: title: Arvomerkit + allow_title: "voidaan käyttää tittelinä" + multiple_grant: "voidaan myöntää useita kertoja" badge_count: one: "1 Arvomerkki" other: "%{count} Arvomerkkiä" diff --git a/config/locales/client.fr.yml b/config/locales/client.fr.yml index 01f064cba4..d44fb8198f 100644 --- a/config/locales/client.fr.yml +++ b/config/locales/client.fr.yml @@ -983,6 +983,7 @@ fr: attachment_too_large: "Désolé, le fichier que vous êtes en train d'envoyer est trop grand (taille maximum de {{max_size_kb}} Ko)." file_too_large: "Désolé, le fichier que vous êtes en train d'envoyer est trop grand (taille maximum de {{max_size_kb}} Ko)" too_many_uploads: "Désolé, vous ne pouvez envoyer qu'un seul fichier à la fois." + too_many_dragged_and_dropped_files: "Désolé, vous pouvez seulement glisser-déposer jusqu'à 10 fichiers à la fois." upload_not_authorized: "Désolé, le fichier que vous êtes en train d'envoyer n'est pas autorisé (extensions autorisées : {{authorized_extensions}})." image_upload_not_allowed_for_new_user: "Désolé, les nouveaux utilisateurs ne peuvent pas envoyer d'image." attachment_upload_not_allowed_for_new_user: "Désolé, les nouveaux utilisateurs ne peuvent pas envoyer de fichier." @@ -1502,6 +1503,14 @@ fr: info_html: "Cette clé vous permettra de créer et mettre à jour des sujets à l'aide d'appels JSON." all_users: "Tous les Utilisateurs" note_html: "Gardez cette clé secrète ! Tous les personnes qui la possède peuvent créer des messages au nom de n'import quel utilisateur." + plugins: + title: "Plugins" + installed: "Plugins installés" + name: "Nom du plugin" + none_installed: "Vous n'avez aucun plugin installé." + version: "Version du plugin" + change_settings: "Changer les paramètres" + howto: "Comment installer des plugins ?" backups: title: "Sauvegardes" menu: @@ -1751,6 +1760,7 @@ fr: label: "Nouveau :" ip_address: "Adresse IP" add: "Ajouter" + filter: "Rechercher" roll_up: text: "Consolider" title: "Créer de nouvelles plages de sous réseaux à bannir s'il y a au moins 'min_ban_entries_for_roll_up' entrées." diff --git a/config/locales/client.he.yml b/config/locales/client.he.yml index 5610b0d50a..2dbec9d410 100644 --- a/config/locales/client.he.yml +++ b/config/locales/client.he.yml @@ -84,12 +84,14 @@ he: other: "לפני %{count} ימים" share: topic: 'שתפו קישור לנושא זה' + post: 'פרסום #%{postNumber}' close: 'סגור' twitter: 'שתפו קישור זה בטוויטר' facebook: 'שתפו קישור זה בפייסבוק' google+: 'שתף קישור זה בגוגל+' email: 'שלח קישור בדוא"ל' topic_admin_menu: "פעולות ניהול לנושא" + emails_are_disabled: "כל הדוא\"ל היוצא נוטרל באופן גורף על ידי מנהל אתר. שום הודעת דוא\"ל, מכל סוג שהוא, תשלח." edit: 'ערוך את הכותרת והקטגוריה של הנושא' not_implemented: "סליחה, תכונה זו עדיין לא מומשה!" no_value: "לא" @@ -138,9 +140,19 @@ he: stat: all_time: "כל הזמנים" last_7_days: "7 הימים האחרונים" + last_30_days: "ב-30 הימים האחרונים" like_count: "לייקים" topic_count: "נושאים" post_count: "פרסומים" + user_count: "חדשים" + active_user_count: "משתמשים פעילים" + contact: "צרו קשר" + contact_info: "במקרה של עניין קריטי או דחוף המשפיע על אתר זה, אנא צרו קשר ב-%{contact_email}." + bookmarked: + title: "סימניה" + help: + bookmark: "הקליקו כדי לסמן נושא זה" + unbookmark: "הקליקו להסיר סימניה מנושא זה" bookmarks: not_logged_in: "סליחה, עליך להיות מחובר כדי להוסיף פוסט למועדפים" created: "סימנת הודעה זו כמועדפת" @@ -257,6 +269,7 @@ he: profile: "פרופיל" mute: "השתק" edit: "ערוך העדפות" + download_archive: "הורדת הפרסומים שלי" new_private_message: "מסר פרטי חדש" private_message: "הודעה פרטית" private_messages: "הודעות" @@ -269,6 +282,7 @@ he: notifications: "התראות" dismiss_notifications: "סימון הכל כנקרא" dismiss_notifications_tooltip: "סימון כל ההתראות שלא נקראו כהתראות שנקראו" + disable_jump_reply: "אל תקפצו לפרסומים שלי לאחר שאני משיב/ה" dynamic_favicon: "הראה התראה על הודעות חדשות באייקון העמוד (נסיוני)" edit_history_public: "אפשרו למשתמשים אחרים לראות את תיקוני הפרסומים שלי" external_links_in_new_tab: "פתח את כל הקישורים החיצוניים בעמוד חדש" @@ -281,6 +295,7 @@ he: suspended_notice: "המשתמש הזה מושעה עד לתאריך: {{date}}." suspended_reason: "הסיבה: " github_profile: "גיטהאב" + mailing_list_mode: "שלחו לי דוא\"ל על כל פרסום חדש (אלא אם אשתיק את המעקב אחר הנושא או הקטגוריה)" watched_categories: "נצפה" watched_categories_instructions: "את/ה תצפו אוטומטית בכל הנושאים החדשים בקטגוריות האלה ותקבלו התראות על כל ההודעות והנושאים החדשים. כמו כן כמות ההודעות החדשות ואלו שלא נקראו תופיע לצד כל נושא." tracked_categories: "במעקב" @@ -323,6 +338,7 @@ he: error: "הייתה שגיאה בשינוי כתובת הדואר האלקטרוני שלך. אולי היא תפוסה?" success: "שלחנו דואר אלקטרוני לכתובת הדואר הזו. בבקשה עקוב אחרי הוראות האישור שם." change_avatar: + title: "שינוי תמונת הפרופיל" gravatar: "
    Gravatar, מבוסס על" refresh_gravatar_title: "רענון האווטר שלכם" uploaded_avatar: "תמונה אישית" diff --git a/config/locales/client.it.yml b/config/locales/client.it.yml index 5bffc26dff..bec2b0ddf4 100644 --- a/config/locales/client.it.yml +++ b/config/locales/client.it.yml @@ -979,6 +979,7 @@ it: attachment_too_large: "Spiacenti, il file che stai tentando di caricare è troppo grande (il massimo consentito è {{max_size_kb}}kb)." file_too_large: "Spiacenti, il file che stai cercando di caricare è troppo grande (la grandezza massima è {{max_size_kb}}kb)" too_many_uploads: "Spiacenti, puoi caricare un solo file per volta." + too_many_dragged_and_dropped_files: "Mi dispiace, puoi trascinare e spostare solo 10 file alla volta." upload_not_authorized: "Spiacenti, il file che stai cercando di caricare non è autorizzato (estensioni autorizzate: {{authorized_extensions}})." image_upload_not_allowed_for_new_user: "Spiacenti, i nuovi utenti non possono caricare immagini." attachment_upload_not_allowed_for_new_user: "Spiacenti, i nuovi utenti non possono caricare allegati." @@ -1381,7 +1382,7 @@ it: traffic_short: "Traffico" page_views: "Pagine Viste" page_views_short: "Pagine Viste" - show_traffic_report: "Mostra Rapporto di Traffico Dettagliato" + show_traffic_report: "Mostra rapporto di traffico dettagliato" reports: today: "Oggi" yesterday: "Ieri" @@ -1497,6 +1498,14 @@ it: info_html: "La tua chiave API ti permetterà di creare e aggiornare gli argomenti usando chiamate JSON." all_users: "Tutti gli Utenti" note_html: "Mantieni segreta questa chiave, tutti gli utenti che la possiedono possono creare messaggi per conto di altri." + plugins: + title: "Plugin" + installed: "Plugin installati" + name: "Nome" + none_installed: "Non hai installato nessun plugin." + version: "Versione" + change_settings: "Cambia le impostazioni" + howto: "Come installare i plugin?" backups: title: "Backup" menu: @@ -1746,6 +1755,7 @@ it: label: "Nuovo:" ip_address: "Indirizzo IP" add: "Aggiungi" + filter: "Cerca" roll_up: text: "Sintetizza" title: "Crea nuovi elenchi di indirizzi IP interdetti se ci sono almeno 'min_ban_entries_for_roll_up' elementi." diff --git a/config/locales/client.ko.yml b/config/locales/client.ko.yml index 28912f035c..52cbd37d8f 100644 --- a/config/locales/client.ko.yml +++ b/config/locales/client.ko.yml @@ -471,7 +471,7 @@ ko: logout: "로그아웃 되었습니다." refresh: "새로고침" read_only_mode: - enabled: "관리자가 일기 전용모드를 활성화 하였습니다. 컨텐츠를 읽을 수는 있지만 활동할 수는 없습니다." + enabled: "관리자가 읽기 전용모드를 활성화 하였습니다. 컨텐츠를 읽을 수는 있지만 활동할 수는 없습니다." login_disabled: "사이트가 읽기 전용모드로 되면서 로그인은 비활성화되었습니다." too_few_topics_notice: "토론을 시작하기 위해 최소 5개의 공개 토픽을 %{posts}개의 공개 포스트를 만들어주세요. 읽을거리가 없으면 새로운 사용자가 신뢰도를 올릴 수 없습니다. 이 메시지는 관리자에게만 보입니다." learn_more: "더 배우기" @@ -937,6 +937,7 @@ ko: attachment_too_large: "업로드하려는 파일의 크기가 너무 큽니다. 최대 크기는 {{max_size_kb}}kb 입니다." file_too_large: "업로드하시려는 파일이 너무 커요. (최대 허용 파일 크기는 {{max_size_kb}}kb입니다)" too_many_uploads: "한번에 한 파일만 업로드 하실 수 있습니다." + too_many_dragged_and_dropped_files: "Sorry, 한번에 10개까지만 드래그앤 드롭 할 수 있어요." upload_not_authorized: "업로드 하시려는 파일 확장자는 사용이 불가능합니다 (사용가능 확장자: {{authorized_extensions}})." image_upload_not_allowed_for_new_user: "죄송합니다. 새로운 유저는 이미지를 업로드 하실 수 없습니다." attachment_upload_not_allowed_for_new_user: "죄송합니다. 새로운 유저는 파일 첨부를 업로드 하실 수 없습니다." @@ -1431,6 +1432,14 @@ ko: info_html: "당신의 API 키는 JSON콜을 이용하여 토픽을 생성하거나 수정할 수 있습니다." all_users: "전체 유저" note_html: "이 키의 보안에 특별히 주의하세요. 이 키를 아는 모든 사용자는 다른 사용자의 이름으로 게시물을 작성할 수 있습니다." + plugins: + title: "플러그인" + installed: "설치된 플러그인" + name: "이름" + none_installed: "설치된 플러그인이 없습니다." + version: "버전" + change_settings: "설정 변경" + howto: "플러그인은 어떻게 설치하나요?" backups: title: "백업" menu: @@ -1679,6 +1688,7 @@ ko: label: "새 IP:" ip_address: "IP 주소" add: "추가" + filter: "검색" logster: title: "에러 로그" impersonate: @@ -1862,6 +1872,9 @@ ko: title: "가입 후 편집 가능?" enabled: "편집 가능" disabled: "편집 불가" + show_on_profile: + enabled: "프로필에 표시" + disabled: "프로필에 표시하지 않기" field_types: text: '텍스트 필드' confirm: '확인' @@ -1895,6 +1908,7 @@ ko: uncategorized: '카테고리 없음' backups: "백업" login: "로그인" + plugins: "플러그인" badges: title: 뱃지 new_badge: 새로운 뱃지 diff --git a/config/locales/client.nb_NO.yml b/config/locales/client.nb_NO.yml index a4d41bd3ce..ca0b002c10 100644 --- a/config/locales/client.nb_NO.yml +++ b/config/locales/client.nb_NO.yml @@ -140,9 +140,12 @@ nb_NO: stat: all_time: "Gjennom tidene" last_7_days: "Siste 7 dager" + last_30_days: "Siste 30 dager" like_count: "Likes" topic_count: "Emner" post_count: "Innlegg" + user_count: "Nye brukere" + active_user_count: "Aktive brukere" contact: "Kontakt Oss" contact_info: "Hvis noe kritisk skulle oppstå eller det er en hastesak som påvirker siden kontakt oss på %{contact_email}." bookmarked: @@ -292,6 +295,7 @@ nb_NO: suspended_notice: "Denne brukeren er bannlyst til {{date}}." suspended_reason: "Begrunnelse:" github_profile: "Github" + mailing_list_mode: "Send meg en e-post for hvert nye innlegg (hvis ikke emnet eller kategorien er dempet)" watched_categories: "Følger" watched_categories_instructions: "Du vil automatisk følge alle nye emner i disse kategoriene. Du vil bli varslet om alle nye innlegg og emner samt at antallet uleste og nye innlegg vil vises sammen med emneoppføringen." tracked_categories: "Sporet" @@ -654,6 +658,7 @@ nb_NO: examples: 'Før inn antall timer (24).' notifications: title: "varsler når @brukernavn nevnes, svar til dine innlegg og emner, private meldinger, osv" + none: "Notifikasjoner er ikke tilgjengelig for øyeblikket." more: "se gamle varsler" total_flagged: "totalt rapporterte innlegg" mentioned: "@

    {{username}} {{description}}

    " diff --git a/config/locales/client.nl.yml b/config/locales/client.nl.yml index bfb60e8624..8c8e245cdf 100644 --- a/config/locales/client.nl.yml +++ b/config/locales/client.nl.yml @@ -139,10 +139,14 @@ nl: stat: all_time: "Sinds het begin" last_7_days: "Afgelopen 7 dagen" + last_30_days: "Afgelopen 30 dagen" like_count: "Likes" topic_count: "Topics" post_count: "Berichten" + user_count: "Nieuwe leden" + active_user_count: "Actieve leden" contact: "Neem contact op" + contact_info: "In het geval van een kritieke probleem of dringende vraagstukken in verband met deze site neem contact op met ons op via% {contact_email}." bookmarked: title: "Bewaar" help: @@ -276,6 +280,7 @@ nl: notifications: "Notificaties" dismiss_notifications: "Markeer alles als gelezen" dismiss_notifications_tooltip: "Markeer alle ongelezen berichten als gelezen" + disable_jump_reply: "Niet naar je nieuwe bericht gaan na reageren" dynamic_favicon: "Laat notificatie voor nieuw bericht zien in favicon (experiment)" edit_history_public: "Laat andere gebruikers mijn aanpassingen aan dit bericht zien." external_links_in_new_tab: "Open alle externe links in een nieuw tabblad" @@ -287,6 +292,8 @@ nl: admin_tooltip: "Deze gebruiker is een admin" suspended_notice: "Deze gebruiker is geschorst tot {{date}}." suspended_reason: "Reden: " + github_profile: "Github" + mailing_list_mode: "Ontvang een mail als er een nieuw bericht op het forum geplaatst is (tenzij je het topic of de betreffende categorie op stil zet)" watched_categories: "In de gaten gehouden" watched_categories_instructions: "Je zal automatisch alle nieuwe topics in deze categorieën bekijken. Je ontvangt een notificatie van alle nieuwe berichten en topics. Daarnaast zal het aantal ongelezen en nieuwe berichten naast de topiclijst verschijnen." tracked_categories: "Gevolgd" @@ -390,6 +397,7 @@ nl: categories_settings: "Categorieën" new_topic_duration: label: "Beschouw topics als nieuw wanneer" + not_viewed: "Ik heb ze nog niet bekeken" after_n_days: one: "gemaakt gisteren" other: "gemaakt in de afgelopen {{count}} dagen" diff --git a/config/locales/client.pl_PL.yml b/config/locales/client.pl_PL.yml index ae095ccc0e..27e658d20a 100644 --- a/config/locales/client.pl_PL.yml +++ b/config/locales/client.pl_PL.yml @@ -1023,6 +1023,7 @@ pl_PL: attachment_too_large: "Przepraszamy, ale plik, który chcesz wgrać jest za duży (maksymalny rozmiar to {{max_size_kb}}KB)." file_too_large: "Przepraszamy, plik który chcesz wczytać jest zbyt duży (maximum to {{max_size_kb}}kb)" too_many_uploads: "Przepraszamy, ale możesz wgrać tylko jeden plik naraz." + too_many_dragged_and_dropped_files: "Przepraszamy, możesz wczytać maksymalnie 10 plików naraz." upload_not_authorized: "Przepraszamy, ale plik który chcesz wgrać jest niedozwolony (dozwolone rozszerzenia: {{authorized_extensions}})." image_upload_not_allowed_for_new_user: "Przepraszamy, ale nowi użytkownicy nie mogą wgrywać obrazów." attachment_upload_not_allowed_for_new_user: "Przepraszamy, ale nowi użytkownicy nie mogą wgrywać załączników." @@ -1561,6 +1562,14 @@ pl_PL: info_html: "Twoje klucze API dają dostęp do tworzenia i aktualizowania tenatów przez wywołania JSON." all_users: "Wszyscy użytkownicy" note_html: "Zachowaj ten klucz w tajemnicy, wszyscy którzy go posiadają mogą tworzyć wpisy jako dowolny użytkownik." + plugins: + title: "Wtyczki" + installed: "Zainstalowane wtyczki" + name: "Nazwa" + none_installed: "Brak zainstalowanych wtyczek." + version: "Wersja" + change_settings: "Zmień ustawienia" + howto: "Jak zainstalować wtyczkę?" backups: title: "Kopie zapasowe" menu: @@ -1810,6 +1819,7 @@ pl_PL: label: "Nowy:" ip_address: "Adres IP" add: "Dodaj" + filter: "Wyszukaj" roll_up: text: "Zgrupuj" title: "Tworzy nowy ban dla podsieci jeśli jest co najmniej 'min_ban_entries_for_roll_up' pozycji." diff --git a/config/locales/client.pt_BR.yml b/config/locales/client.pt_BR.yml index 6c705426c3..a80e9beb9e 100644 --- a/config/locales/client.pt_BR.yml +++ b/config/locales/client.pt_BR.yml @@ -979,6 +979,7 @@ pt_BR: attachment_too_large: "Desculpe, o arquivo que você está tentando enviar é muito grande (o tamanho máximo permitido é {{max_size_kb}}kb)." file_too_large: "Desculpe, o arquivo que você está tentando enviar é muito grande (o tamanho máximo permitido é {{max_size_kb}}kb)." too_many_uploads: "Desculpe, você pode enviar apenas um arquivos por vez." + too_many_dragged_and_dropped_files: "Desculpe, você pode arrastar & soltar apenas 10 arquivos por vez." upload_not_authorized: "Desculpe, o tipo de arquivo que você está tentando enviar não está autorizado (extensões autorizadas: {{authorized_extensions}})." image_upload_not_allowed_for_new_user: "Desculpe, novos usuário não podem enviar imagens." attachment_upload_not_allowed_for_new_user: "Desculpe, usuários novos não podem enviar anexos." @@ -1498,6 +1499,14 @@ pt_BR: info_html: "Sua chave de API permitirá a criação e edição de tópicos usando requests JSON." all_users: "Todos os Usuários" note_html: "Guarde esta chave secretamente, todos usuários que tiverem acesso a ela poderão criar posts arbritários no forum como qualquer usuário." + plugins: + title: "Plugins" + installed: "Plugins Instalados" + name: "Nome" + none_installed: "Você não tem quaisquer plugins instalados." + version: "Versão" + change_settings: "Mudar Configurações" + howto: "Como eu instalo plugins?" backups: title: "Backups" menu: @@ -1747,6 +1756,7 @@ pt_BR: label: "Novo:" ip_address: "Endereço IP" add: "Adicionar" + filter: "Pesquisar" roll_up: text: "Combinar" title: "Cria novas entradas de banimento por subnet caso existam no mínimo 'min_ban_entries_for_roll_up' entradas." diff --git a/config/locales/client.te.yml b/config/locales/client.te.yml index 9203a91399..e08247b68f 100644 --- a/config/locales/client.te.yml +++ b/config/locales/client.te.yml @@ -544,6 +544,10 @@ te: action: "నేను నా సంకేతపదాన్ని మర్చిపోయాను" invite: "మీ సభ్యనామం లేదా ఈమెయిల్ చిరునామా రాయండి, మేము మీ సంకేతపదం మార్చే విధం మీకు ఈమెయిల్ చేస్తాము." reset: "రీసెట్ సంకేతపదం" + 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: @@ -557,22 +561,32 @@ te: reset_password: 'రీసెట్ సంకేతపదం' logging_in: "ప్రవేశపెడ్తోన్నాం" or: "లేదా" - authenticating: "ద్రువీకరిస్తున్నామ్..." + authenticating: "ద్రువీకరిస్తున్నాము..." + awaiting_confirmation: "మీ ఖాతా చేతనం కోసం ఎదురుచూస్తుంది. సంకేతపదం మర్చిపోయా లంకెను వాడు మరో చేతన ఈమెయిల్ పొందండి." + awaiting_approval: "మీ ఖాతా ఇంకా సిబ్బంది ఒప్పుకొనలేదు. సిబ్బంది ఒప్పుకోగానే మీకు ఒక ఈమెయిల్ వస్తుంది." requires_invite: "క్షమించాలి. ఈ పోరమ్ ప్రవేశం కేవలం ఆహ్వానితులకు మాత్రమే." + not_activated: "మీరప్పుడే లాగిన్ అవ్వలేరు. గతంలో మేము మీకు చేతన ఈమెయల్ {{sentTo}} కు పంపాము. దయచేసి ఆ వేగులోని సూచనలు పాటించి మీ ఖాతాను చేతనం చేసుకోండి." not_allowed_from_ip_address: "ఆ ఐపీ చిరునామా నుండి మీరు లాగిన్ అవ్వలేరు." resend_activation_email: "చేతన ఈమెయిల్ మరలా పంపడానికి ఇక్కడ నొక్కండి." + sent_activation_email_again: "మీకు {{currentEmail}} మరో చేతన ఈమెయిల్ పంపాము. అది చేరుకోడానికి కొద్ది నిమిషాలు పట్టవచ్చు. ఇంకా స్పామ్ ఫోల్డరు చూడటం మర్చిపోకండి సుమా. " google: title: "గూగుల్ తో" + message: "గూగుల్ ద్వారా లాగిన్ (పాపప్ లు అనుమతించుట మర్చిపోకండి)" google_oauth2: title: "గూగుల్ తో" + message: "గూగుల్ ద్వారా లాగిన్ (పాపప్ లు అనుమతించుట మర్చిపోకండి)" twitter: title: "ట్విట్టరు తో" + message: "ట్విట్టరు ద్వారా లాగిన్ (పాపప్ లు అనుమతించుట మర్చిపోకండి)" facebook: title: "ఫేస్ బుక్ తో" + message: "ఫేస్ బుక్ ద్వారా లాగిన్ (పాపప్ లు అనుమతించుట మర్చిపోకండి)" yahoo: title: "యాహూ తో" + message: "యాహూ ద్వారా లాగిన్ (పాపప్ లు అనుమతించుట మర్చిపోకండి)" github: title: "గిట్ హబ్ తో" + message: "గిట్ హబ్ ద్వారా లాగిన్ (పాపప్ లు అనుమతించుట మర్చిపోకండి)" apple_international: "యాపిల్ , అంతర్జాతీయ" google: "గూగుల్" twitter: "ట్విట్టరు" @@ -593,7 +607,7 @@ te: title_missing: "శీర్షిక తప్పనిసరి" title_too_short: "శీర్షిక కనీసం {{min}} అక్షరాలు ఉండాలి" title_too_long: "శీర్షిక {{max}} అక్షరాలకు మించి ఉండకూడదు" - post_missing: "టపా ఖాలీగా ఉండకూడదు" + post_missing: "టపా ఖాళీగా ఉండకూడదు" post_length: "టపా కనీసం {{min}} అక్షరాలు కలిగి ఉండాలి" category_missing: "మీరు ఒక వర్గాన్ని ఎంచుకోవాలి" save_edit: "దాచి సవరించు" @@ -603,7 +617,7 @@ te: cancel: "రద్దు" create_topic: "కొత్త విషయం" create_pm: "ప్రైవేటు సందేశం" - title: "లేదా కంట్రోల్ ఎంటర్ నొక్కు" + title: "లేదా కంట్రోల్ + ఎంటర్ నొక్కు" users_placeholder: "ఒక సభ్యుడిని కలుపు" title_placeholder: "ఈ చర్చ దేనిగురించో ఒక లైనులో చెప్పండి?" edit_reason_placeholder: "మీరెందుకు సవరిస్తున్నారు?" @@ -725,6 +739,7 @@ te: top: "ఎట్టి అగ్ర విషయాలూ లేవు." educate: new: '

    మీ కొత్త విషయాలు ఇక్కడ వస్తాయి.

    అప్రమేయంగా 2 రోజులలోపు సృష్టించిన అన్ని విషయాలూ కొత్తగా భావించబడతాయి మరియు కొత్త ఇండికేటరు తో చూపబడతాయి.

    మీరు దీన్ని మీ అభీష్టాలులో మార్చుకోవచ్చు.

    ' + unread: '

    మీరు చదవని విషయాలు ఇక్కడ కనబడుతాయి.

    అప్రమేయంగా, విషయాలు చదవని వాటిగా పరిశీలించబడతాయి మరియు చదవని వాటి సంఖ్య మీకు చూపబడతాయి 1 మీరు:

    • విషయం సృష్టించినట్లయితే
    • విషయానికి సమాధానం ఇచ్చినట్లయితే
    • విషయం 4 నిమిషాల కంటే ఎక్కువ చదివినట్లయితే

    లేదా మీరు స్పష్టముగా విషయం అమర్చినట్లయితే ప్రతి విషయానికి క్రింది భాగంలో నియంత్రణ ప్రకటన ద్వారా గమనించబడుతుంది లేదా కనిపెడుతూ ఉంటుంది .

    మీరు ఇది మార్చగలరు మీ preferences లో.

    ' bottom: latest: "ఇంకా కొత్త విషయాలు లేవు." hot: "ఇంకా వేడివేడి విషయాలు లేవు." @@ -883,7 +898,10 @@ te: title: 'ఆహ్వానించు' action: 'ఈమెయిల్ ఆహ్వానం' help: 'స్నేహితులకు ఆహ్వానం పంపు, తద్వారా వారు ఈ విషయానికి ఒక క్లిక్కుతో జవాబివ్వవచ్చు.' + to_topic: "మేము మీ స్నేహితునికి ఒక ఈమెయిల్ పంపుతాము. అందులోని లంకె ద్వారా వారు లాగిన్ అవసరం లేకుండానే నేరుగా ఈ చర్చలో పాల్గొనవచ్చు, జవాబివ్వవచ్చు." + to_forum: "మేము మీ స్నేహితునికి ఒక ఈమెయిల్ పంపుతాము. అందులోని లంకె ద్వారా వారు లాగిన్ అవసరం లేకుండానే నేరుగా ఈ చర్చలో పాల్గొనవచ్చు, జవాబివ్వవచ్చు." email_placeholder: 'name@example.com' + success: "{{email}} కు మీ ఆహ్వానం పంపాము. ఆహ్వానం మన్నిచగానే మీకు ప్రకటిస్తాము. మీరు పంపిన ఆహ్వానాలు గమనించుటకు మీ సభ్యపుటలో ఆహ్వానం ట్యాబు పరికించండి. " error: "క్షమించాలి. ఆ వ్యక్తిని మేము ఆహ్వానిచలేము. బహుశా వారు ఈసరికే సభ్యులేమో?(invites are rate limited)" login_reply: 'జవాబివ్వడానికి లాగిన్ అవ్వండి' filters: @@ -896,6 +914,9 @@ te: action: "కొత్త విషయానికి జరుపు" topic_name: "కొత్త విషయపు పేరు" error: "టపాలను కొత్త విషయానికి జరిపేటప్పుడు దోషం తలెత్తింది" + instructions: + one: "మీరు కొత్త విషయం సృష్టించి దాన్ని మీరు ఈ టపాతో నింపబోతున్నారు." + other: "మీరు కొత్త విషయం సృష్టించి దాన్ని {{count}} టపాలతో నింపబోతున్నారు." merge_topic: title: "ఇప్పటికే ఉన్న విషయానికి జరుపు" action: "ఇప్పటికే ఉన్న విషయానికి జరుపు" @@ -909,6 +930,9 @@ te: error: "ఆ టపాల యజమానిని మార్చేప్పుడు దోషం జరిగింది." label: "టపాల కొత్త యజమాని" placeholder: "కొత్త యజమాని సభ్యనామం" + instructions: + one: "{{old_user}} యొక్క టపాకు కొత్త యజమానిని ఎంచుకోండి." + other: "{{old_user}} యొక్క {{count}} టపాల కొత్త యజమానిని ఎంచుకోండి." multi_select: select: 'ఎంచుకో' selected: 'ఎంచుకున్నవి ({{count}})' @@ -934,6 +958,9 @@ te: follow_quote: "కోటెడ్ టపాకు వెళ్లు" show_full: "పూర్తి టపా చూపు" show_hidden: 'దాగిన విషయం చూపు' + deleted_by_author: + one: " (టపా రచయిత ద్వారా తొలగింపబడింది , స్వతస్సిధ్దంగా తొలగింపబ[ది %{count} కాకపోతే సమయం కేతనించలేదు)" + other: "(టపా రచయిత ద్వారా ఉపసంహరించబడింది , స్వతసిధ్ధంగా తొలగించబడతాయి %{count} కాకపోతే సమయం కేతనించలేదు)" expand_collapse: "పెంచు/తుంచు" gap: one: "1 టపా దాగి ఉంది" @@ -950,6 +977,7 @@ te: attachment_too_large: "క్షమించాలి. మీరు ఎగుమతించ ప్రయత్నిస్తున్న దస్త్రం మరీ పెద్దది. (గరిష్ట పరిమాణ పరిమితి {{max_size_kb}}కేబీ)." file_too_large: "క్షమించాలి. మీరు ఎగుమతించ ప్రయత్నిస్తున్న దస్త్రం మరీ పెద్దది. (గరిష్ట పరిమాణ పరిమితి {{max_size_kb}}కేబీ)." too_many_uploads: "క్షమించాలి. మీరు ఒకసారి ఒక దస్త్రం మాత్రమే ఎగుమతించగలరు" + too_many_dragged_and_dropped_files: "క్షమించాలి. మీరు కేవలం 10 దస్త్రాల వరకు మాత్రమే ఒకేమారు లాగి వదలగలరు. " upload_not_authorized: "క్షమించాలి. మీరు ఎగుమతించాలనుకుంటున్న దస్త్రం అధీకృతమైనది కాదు. (అధీకృత పొడిగింతలు:{{authorized_extensions}})." image_upload_not_allowed_for_new_user: "క్షమించాలి. కొత్త సభ్యులు బొమ్మలు ఎగుమతి చేయలేరు." attachment_upload_not_allowed_for_new_user: "క్షమించాలి. కొత్త సభ్యులు జోడింపులు ఎగుమతి చేయలేరు." @@ -1102,6 +1130,9 @@ te: side_by_side: title: "పక్క పక్కన తేడాలు చూపుతూ మొత్తం చూపు" button: ' హెచ్ టీయంయల్' + side_by_side_markdown: + title: "ముడి మూల తేడాను పక్కపక్కన చూపు" + button: ' ముడి' details: edited_by: "సవరించిన వారు" category: @@ -1366,6 +1397,7 @@ te: agree_title: "ఈ కేతనం సరైనదిగా చెప్పండి" agree_flag_modal_title: "ఒప్పుకొను మరియు" agree_flag_hide_post: "ఒప్పుకొని (టపా దాచు మరియు ప్రైవేటు సందేశం పంపు)" + agree_flag_hide_post_title: "ఈ టపాను ఆటోమేటిగ్గా దాచిపెట్టి. సభ్యుడిని సవరించమని మనవిచేస్తూ ఒక ప్రైవేటు సందేశం పంపు. " agree_flag_restore_post: "ఒప్పుకొను (టపా పునస్తాపించు)" agree_flag_restore_post_title: "ఈ టపా పునస్తాపించు" agree_flag: "కేతనంతో ఒప్పుకో" @@ -1440,13 +1472,23 @@ te: custom: "అనురూప" automatic: "స్వీయంగా" api: + generate_master: "మాస్టరు ఏపీఐ కీ ఉత్తపత్తించు" + none: "ప్రస్తుతం చేతన ఏపీఐ కీలు లేవు." user: "సభ్యుడు" title: "ఏపీఐ" key: "ఏపీఐ కీ" generate: "ఉత్పత్తించు" regenerate: "పునరుత్పత్తించు" revoke: "రివోక్" + confirm_regen: "మీరు నిజంగా పాత ఏపీఐ కీని కొత్త దానితో రీప్లేస్ చెయ్యాలనుకుంటున్నారా?" + confirm_revoke: "మీరు నిజంగా ఆ కీని రివోకే చెయ్యాలనుకుంటున్నారా? " + info_html: "మీ ఏపీఐ కీ జేసన్ వాడి విషయాలు సృష్టించుట, ఉన్నతీకరించుటకు దోహదం చేస్తుంది." all_users: "అందరు సభ్యులు" + plugins: + name: "పేరు" + version: "సంచిక" + change_settings: "అమరికలు మార్చు" + howto: "పొడిగింతలు నేను ఎలా ప్రతిష్టించగలను?" backups: title: "బ్యాకప్పులు" menu: @@ -1500,25 +1542,44 @@ te: title: "డాటాబేసును గత పనిచేసే స్థితికి రోల్ బ్యాక్ చేయి" confirm: "మీరు నిజంగానే డాటాబేసును గత పనిచేసే స్థితికి రోల్ బ్యాక్ చేయాలనుకుంటున్నారా?" export_csv: + success: "ఎగుమతి మొదలైంది. పూర్తయ్యాక మీకు ప్రైవేటు సందేశం ద్వారా ప్రకటన వస్తుంది. " + failed: "ఎగుమతి విఫలమైంది. దయచేసి లాగులు చూడంది. " rate_limit_error: "టపాలు కేవలం రోజుకు ఒకసారి మాత్రమే దిగుమతించుకోగలరు. దయచేసి రేపు ప్రయత్నించండి." + button_text: "ఎగుమతి" + button_title: + user: "పూర్తి సభ్యుల జాబితా సీయస్వీ రూపులో ఎగుమతించండి" + staff_action: "పూర్తి సిబ్బంది చర్యా లాగు సీయస్వీ రూపులో ఎగుమతించండి." customize: + title: "కస్టమైజ్" + long_title: "సైట్ కస్టమైజేషనులు" + css: "సీయస్ యస్" header: "హెడర్" top: "అగ్ర" footer: "ఫుటరు" head_tag: text: "" + title: " కొస ముందు ఉంచే హెచ్ టీ యం యల్" body_tag: text: "" + title: " కొస ముందు ఉంచే హెచ్ టీ యం యల్" + override_default: "స్టాండర్డ్ సైల్ షీట్ ఉంచకు" enabled: "చేతమైందా?" preview: "మునుజూపు" undo_preview: "మునుజూపు తొలగించు" rescue_preview: "అప్రమేయ స్టైలు" + explain_undo_preview: "ప్రస్తుతం చేతనం చేసిఉన్న కస్టమ్ స్టైల్ షీటుకు మరలు" + explain_rescue_preview: "సైటును అప్రమేయ స్టైల్ షీటుతో చూడు" save: "భద్రపరుచు" new: "కొత్త" new_style: "కొత్త స్టైలు" delete: "తొలగించు" + delete_confirm: "ఈ కస్టమైజేషనులు తొలగించు? " color: "రంగు" + opacity: "అపారదర్శకత" copy: "నకలు" + css_html: + title: "సీయస్ యస్ / హెచ్ టీ యం యల్" + long_title: "సీ యస్ యస్ మరియు హెచ్ టీ యం యల్ కస్టమైజేషనులు" colors: title: "రంగులు" long_title: "రంగు స్కీములు" @@ -1527,25 +1588,32 @@ te: delete_confirm: "ఈ రంగు స్కీము తొలగించు?" undo: "రద్దు" revert: "తిద్దు" + revert_title: "డిస్కోర్సు అప్రమేయ రంగు స్కీముకు రంగులను రీసెట్ చేయి" primary: name: 'ప్రాథమిక' + description: 'పాఠ్యం, చిహ్నాలు మరియు సరిహద్దులు.' secondary: name: 'ద్వితీయ' + description: 'ప్రధాన వెనుతలం రంగు మరియు కొన్ని మీటల పాఠ్యం రంగు.' tertiary: name: 'తృతీయ' + description: 'లంకెలు, కొన్ని మీటలు, ప్రకటనలు, మరియు ఎసెంట్ రంగు.' quaternary: name: "చతుర్థీ" description: "నావిగేషను లంకెలు" header_background: name: "హెడరు వెనుతలం" + description: "సైటు హెడరు వెనుతలం రంగు." header_primary: name: "హెడరు ప్రాథమిక" + description: "సైటు హెడరు పాఠ్యం మరియు చిహ్నాలు" highlight: name: 'హైలైట్' danger: name: 'ప్రమాదం' success: name: 'విజయం' + description: 'ఒక చర్య విజయవంతమైందని చూపడానికి వాడబడేది' love: name: 'ప్రేమ' description: "ఇష్ఠ బటను రంగు." @@ -1569,7 +1637,10 @@ te: send_test: "పరీక్షా మెయిల్ పంపారు" sent_test: "పంపారు!" delivery_method: "డెలివరీ పద్దతి" + preview_digest: "డైజెస్టు మునుజూపు" refresh: "తాజాపరుచు" + format: "రూపు" + html: "హెచ్ టీయంయల్" text: "పాఠ్యం" last_seen_user: "చివరగా చూసిన సభ్యుడు:" reply_key: "జవాబు కీ" @@ -1580,6 +1651,7 @@ te: title: "జల్లెడ" user_placeholder: "సభ్యనామం" address_placeholder: "name@example.com" + type_placeholder: "డైజెస్ట్, సైనప్..." reply_key_placeholder: "జవాబు కీ" skipped_reason_placeholder: "కారణం" logs: @@ -1587,6 +1659,7 @@ te: action: "చర్య" created_at: "సృష్టించినది" last_match_at: "చివరగా జతైనది" + match_count: "సరిపోతుంది" ip_address: "ఐపీ" topic_id: "విషయపు ఐడీ" post_id: "టపా ఐడీ" @@ -1600,8 +1673,10 @@ te: title: "సిబ్బింది చర్యలు" clear_filters: "మొత్తం చూపు" staff_user: "సిబ్బంది సభ్యుడు" + target_user: "లక్షిత సభ్యుడు" subject: "సబ్జెక్టు" when: "ఎప్పుడు" + context: "సందర్భం" details: "వివరాలు" previous_value: "గత" new_value: "కొత్త" @@ -1615,6 +1690,8 @@ te: change_trust_level: "నమ్మకపు స్థాయి మార్చు" change_username: "సభ్యనామం మార్చు" change_site_setting: "సైటు అమరిక మార్చు" + change_site_customization: "సైట్ కస్టమైజేషను మార్చు" + delete_site_customization: "సైటు కస్టమైజేషను తొలగించు" suspend_user: "సభ్యుడిని సస్పెండు చేయి" unsuspend_user: "సస్పెండు కాని సభ్యుడు" grant_badge: "బ్యాడ్జ్ ఇవ్వు" @@ -1624,19 +1701,27 @@ te: delete_post: "విషయం తొలగించు" impersonate: "పరకాయప్రవేశించు" screened_emails: + title: "స్క్రీన్ చేసిన ఈమెయిల్లు" email: "ఈమెయిల్ చిరునామా" actions: allow: "అనుమతించు" screened_urls: + title: "స్క్రీన్ చేసిన యూఆర్ యల్ లు" url: "యూఆర్ యల్" + domain: "డొమైన్" screened_ips: + title: "స్క్రీన్ చేసిన ఐపీలు" + delete_confirm: "మీరు నిజంగా %{ip_address} కు ఈ నియమాన్ని తొలగించాలనుకుంటున్నారా? " + rolled_up_no_subnet: "రోల్ అప్ చేయుటకు ఏమీ లేదు." actions: + block: "ఖండం" do_nothing: "అనుమతించు" allow_admin: "అధికారిని అనుమతించు" form: label: "కొత్త:" ip_address: "ఐపీ చిరునామా" add: "కలుపు" + filter: "వెతుకు" roll_up: text: "రోల్ అప్" logster: @@ -1660,25 +1745,36 @@ te: blocked: 'నిలిపాడు' suspect: 'అనుమానించు' approved: "అంగీకరించు" + approved_selected: + one: "సభ్యుడిని అంగీకరించు" + other: "({{count}}) సభ్యులను అంగీకరించు" + reject_selected: + one: "సభ్యుడిని నిరాకరించు" + other: "({{count}}) సభ్యులను నిరాకరించు" titles: active: 'క్రియాశీల సభ్యులు' new: 'కొత్త సభ్యులు' pending: 'రివ్యూ పెండింగులో ఉన్న సభ్యులు' + newuser: 'నమ్మకం స్థాయి 0 సభ్యులు (కొత్త సభ్యుడు)' staff: "సిబ్బంది" admins: 'అధికారి సభ్యులు' moderators: 'నిర్వాహకులు' blocked: 'నిలిపిన సభ్యులు' suspended: 'సస్పెండయిన సభ్యులు' suspect: 'అనుమానిత సభ్యులు' + not_verified: "ద్రువీకరించలేదు" check_email: + title: "ఈ సభ్యుని ఈమెయిల్ చూపు" text: "చూపు" user: + suspend_failed: "ఈ సభ్యుడిని సస్పెండ్ చేసేప్పుడు ఏదో తేడా జరిగింది. {{error}}" suspend_duration_units: "(రోజులు)" suspend_reason: "కారణం" suspended_by: "సస్పెండు చేసినవారు" delete_all_posts: "అన్ని టపాలూ తొలగించు" suspend: "సస్పెండు" unsuspend: "సస్పెండు తొలగించు" + suspended: "సస్పెండయ్యాడా? " moderator: "నిర్వాహకుడు?" admin: "అధికారి?" blocked: "నిలిపిన?" @@ -1710,18 +1806,25 @@ te: delete_forbidden_because_staff: "అధికారులు మరియు నిర్వాహకులను తొలగించలేరు" delete_dont_block: "తొలగింపు మాత్రమే" deleted: "ఈ సభ్యుడు తొలగించబడ్డాడు" + send_activation_email: "చేతన ఈమెయిల్ పంపు" + activation_email_sent: "ఒక చేతన ఈమెయిల్ పంపాము." + send_activation_email_failed: "చేతన ఈమెయిల్ పంపుటలో దోషం %{error}" activate: "ఖాతా క్రియాశీలం చేయి" + activate_failed: "సభ్యుడిని చేతనం చేయుటలో దోషం" deactivate_account: "ఖాతా అక్రియాశీలం చేయి" suspend_modal_title: "సభ్యుడిని సస్పెండు చేయి" + trust_level_2_users: "నమ్మకం స్థాయి 2 సభ్యులు" tl3_requirements: table_title: "గత 100 రోజుల్లో:" value_heading: "విలువ" visits: "సందర్శనాలు" days: "రోజులు" posts_read: "చదివిన టపాలు" + flagged_posts: "కేతనించిన టపాలు" likes_given: "ఇచ్చిన ఇష్టాలు" likes_received: "అందుకున్న ఇష్టాలు" sso: + external_id: "బాహ్య ఐడీ" external_username: "సభ్యనామం" external_name: "పేరు" external_email: "ఈమెయిల్" @@ -1729,6 +1832,7 @@ te: user_fields: title: "సభ్య క్షేత్రాలు" create: "సభ్య క్షేత్రం సృష్టించు" + untitled: "పేరులేని" name: "క్షేత్రం పేరు" type: "క్షేత్రం టైపు" description: "క్షేత్రం వివరణ" @@ -1756,21 +1860,26 @@ te: reset: 'రీసెట్' none: 'ఏదీకాదు' no_results: "ఏ ఫలితాలూ కనిపించలేదు." + clear_filter: "శుభ్రపరుచు" categories: all_results: 'అన్నీ' required: 'కావాలి' basic: 'ప్రాథమిక సెటప్' users: 'సభ్యులు' + posting: 'రాస్తున్నారు' email: 'మెయిల్' files: 'దస్త్రాలు' trust: 'నమ్మకపు స్థాయిలు' security: 'సెక్యూరిటీ' + seo: 'యస్ ఈ ఓ' spam: 'స్పాము' + rate_limits: 'రోట్ హద్దులు' developer: 'డవలపరు' legal: "న్యాయ" uncategorized: 'ఇతర' backups: "బ్యాకప్పులు" login: "లాగిన్" + plugins: "చొప్పింతలు" badges: title: బ్యాడ్జీలు new_badge: కొత్త బ్యాడ్జీ @@ -1781,23 +1890,35 @@ te: description: వివరణ badge_type: బ్యాడ్జి టైపు badge_grouping: గుంపు + badge_groupings: + modal_title: బ్యాడ్జ్ గ్రూపులు granted_by: ఇచ్చిన వారు granted_at: ఇచ్చిన సమయం save: దాచు delete: తొలగించు + delete_confirm: మీరు నిజంగా ఈ బ్యాడ్జి తొలగించాలనుకుంటున్నారా? + revoke: రివోక్ + revoke_confirm: 'మీరు నిజంగా ఈ బ్యాడ్జిని రివోక్ చేయాలనుకుంటున్నారా? ' edit_badges: బ్యాడ్జీలు సవరించు grant_badge: బ్యాడ్జి ఇవ్వు + granted_badges: ఇచ్చిన బ్యాడ్జీలు grant: ఇవ్వు + none_selected: "ఆరంభించడానికి ఒక బ్యాడ్జీని ఎంచుకోండి." enabled: బ్యాడ్జి చేతనం చేయి icon: ఐకాన్ image: బొమ్మ + trigger: ట్రిగ్గరు trigger_type: none: "రోజు ఉన్నతీకరించు" preview: bad_count_warning: header: "హెచ్చరిక!" sample: "శాంపిలు:" + grant: + with_post_time: %{username} for post in %{link} at %{time} emoji: + title: "ఇమోజి" + add: "కొత్త ఇమోజి కలుపు" name: "పేరు" image: "బొమ్మ" lightbox: @@ -1808,12 +1929,21 @@ te: title: 'కీబోర్డు షార్ట్ కట్లు' jump_to: title: 'వెళ్లు' + navigation: + title: 'నావిగేషను' + jump: '# టపాకు వెళ్లు #' + back: 'u వెనుకకు' application: title: 'అనువర్తనం' + create: 'c కొత్త టపా సృష్టించు' search: '/ వెతుకు' actions: title: 'చర్యలు' badges: + title: బ్యాడ్జీలు + allow_title: "శీర్షికగా కూడా వాడవచ్చు" + multiple_grant: "పలుమార్లు బహూకరించవచ్చు" + none: "" badge_grouping: getting_started: name: మొదలుపెట్టడం @@ -1823,9 +1953,12 @@ te: name: నమ్మకపు స్థాయి other: name: ఇతర + posting: + name: రాస్తున్నారు badge: editor: name: ఎడిటరు + description: తొలి టపా సవరణ basic_user: name: ప్రాథమిక member: @@ -1851,25 +1984,30 @@ te: name: బహుమంచి విషయం nice_share: name: మంచి పంపకం + description: ఒక టపాను 25మంది సభ్యులతో పంచుకున్నారు good_share: name: చాలామంచి పంపకం + description: ఒక టపాను 300మంది సభ్యులతో పంచుకున్నారు great_share: name: బహుమంచి పంపకం + description: ఒక టపాను 1000 మంది సభ్యులతో పంచుకున్నారు first_like: name: తొలి ఇష్టం description: టపాను ఇష్టపడ్డారు first_flag: name: తొలి కేతనం - description: ఒక టపాను కొతనించారు + description: ఒక టపాను కేతనించారు first_share: name: తొలి పంపకం description: ఒక టపాను పంచారు first_link: name: తొలి లంకె + description: వేరొక విషయానికి అంతర్గతంగా లంకె కలిపారు first_quote: name: తొలి కోట్ description: ఒక సభ్యుడిని కోట్ చేసారు read_guidelines: name: మార్గదర్శకాలు చదువు + description: కమ్యునిటీ మార్గదర్శకాలు చదవండి reader: name: చదువరి diff --git a/config/locales/client.zh_CN.yml b/config/locales/client.zh_CN.yml index 406e92f91e..4dc90f60da 100644 --- a/config/locales/client.zh_CN.yml +++ b/config/locales/client.zh_CN.yml @@ -116,7 +116,7 @@ zh_CN: title: "推荐主题" about: simple_title: "关于" - title: "关于 %{title}" + title: "关于%{title}" stats: "站点统计" our_admins: "我们的管理员们" our_moderators: "我们的版主们" @@ -676,7 +676,7 @@ zh_CN: context: user: "搜索 @{{username}} 的帖子" category: "搜索“{{category}}”分类" - topic: "搜索本主题" + topic: "只搜索本主题" private_messages: "搜索私信" site_map: "去另一个主题列表或分类" go_back: '返回' @@ -937,6 +937,7 @@ zh_CN: attachment_too_large: "抱歉,你上传的附件太大了(最大不能超过 {{max_size_kb}}kb)。" file_too_large: "抱歉,你上传的附件太大了(最大限制 {{max_size_kb}}kb)。" too_many_uploads: "抱歉, 你只能一次上传一张图片。" + too_many_dragged_and_dropped_files: "抱歉,你一次只能拖放最多 10 个文件。" upload_not_authorized: "抱歉, 你不能上传此类型文件(可上传的文件类型有: {{authorized_extensions}})。" image_upload_not_allowed_for_new_user: "抱歉,新注册用户无法上传图片。" attachment_upload_not_allowed_for_new_user: "抱歉,新注册用户无法上传附件。" @@ -1127,7 +1128,7 @@ zh_CN: notifications: watching: title: "关注" - description: "你将会自动监视这些分类中的所有新主题。你会收到新帖子或新主题的同志,未读和新帖子数量将出现在每个主题后。" + description: "你将会自动监视这些分类中的所有新主题。你会收到新帖子或新主题的通知,未读和新帖数量将出现在每个主题后。" tracking: title: "追踪" description: "你将会自动追踪这些分类中的所有新主题。未读和新帖子数量将出现在每个主题后。" @@ -1244,11 +1245,11 @@ zh_CN: other: "{{count}} 条未读" new: lower_title_with_count: - one: "1 新" - other: "{{count}} 新" - lower_title: "新" + one: "1 个新主题" + other: "{{count}} 个新主题" + lower_title: "新主题" title: - zero: "新" + zero: "新主题" one: "新主题(1)" other: "新主题({{count}})" help: "最近几天创建的主题" @@ -1431,6 +1432,14 @@ zh_CN: info_html: "API 密钥可以用来通过 JSON 调用创建和更新主题。" all_users: "所有用户" note_html: "请安全地保管密钥,任何拥有该密钥的用户可以使用它以论坛任何用户的名义发帖。" + plugins: + title: "插件" + installed: "安装的插件" + name: "名字" + none_installed: "你没有安装任何插件。" + version: "版本" + change_settings: "更改设置" + howto: "如何安装插件?" backups: title: "备份" menu: @@ -1680,6 +1689,7 @@ zh_CN: label: "新:" ip_address: "IP地址" add: "添加" + filter: "搜索" roll_up: text: "折叠" title: "如果有至少 'min_ban_entries_for_roll_up' 个记录,创建一个子网封禁记录" diff --git a/config/locales/server.da.yml b/config/locales/server.da.yml index b9f2e4586d..fe072f75db 100644 --- a/config/locales/server.da.yml +++ b/config/locales/server.da.yml @@ -35,7 +35,6 @@ da: messages: too_long_validation: "er begrænset til %{max} tegn; du har brugt %{length}." invalid_boolean: "Ugyldig boolsk operator" - taken: "er allerede benyttet. (gruppe navne skelner ikke mellem store og små bogstaver)" accepted: skal accepteres blank: kan ikke være tom present: skal være tomt diff --git a/config/locales/server.de.yml b/config/locales/server.de.yml index 092915e9e0..23e55ab713 100644 --- a/config/locales/server.de.yml +++ b/config/locales/server.de.yml @@ -31,10 +31,28 @@ de: purge_reason: "Stillgelegtes, nicht aktives Konto wurde automatisch gelöscht." disable_remote_images_download_reason: "Da nicht mehr genug Plattenplatz vorhanden ist, wurde der Download von Bildern deaktiviert." errors: + format: '%{attribute} %{message}' messages: too_long_validation: "darf höchstens %{max} Zeichen lang sein; Du hast %{length} eingegeben." invalid_boolean: "Ungültiger Boolescher Wert" - taken: "wird bereits verwendet (Groß-/Kleinschreibung wird bei Gruppennamen nicht unterschieden)" + accepted: muss angenommen werden + blank: darf nicht leer sein + present: muss leer sein + confirmation: "passt nicht zu %{attribute}" + empty: kann nicht leer sein + equal_to: muss gleich %{count} sein + even: muss gerade sein + exclusion: ist reserviert + greater_than: muss größer als %{count} sein + greater_than_or_equal_to: muss größer oder gleich %{count} sein + inclusion: ist nicht in der Liste enthalten + invalid: ist gültig + less_than: muss weniger als %{count} sein + less_than_or_equal_to: muss weniger oder gleich %{count} sein + not_a_number: ist keine Zahl + not_an_integer: muss eine Ganzzahl sein + odd: muss ungerade sein + record_invalid: 'Validierung gescheitert: %{errors}' embed: load_from_remote: "Beim Laden des Beitrags ist ein Fehler aufgetreten." bulk_invite: diff --git a/config/locales/server.es.yml b/config/locales/server.es.yml index 8fb1441953..b39ce46393 100644 --- a/config/locales/server.es.yml +++ b/config/locales/server.es.yml @@ -35,7 +35,6 @@ es: messages: too_long_validation: "está limitado a %{max} caracteres; has introducido %{length}." invalid_boolean: "Booleano no válido." - taken: "ya ha sido escogido. (los nombres de grupos no distinguen mayúsculas o minúsculas)" accepted: debe ser aceptado blank: no puede dejarse en blanco present: debe dejarse en blanco @@ -70,7 +69,7 @@ es: template: body: 'Ha habido problemas con los siguientes campos:' header: - one: '1 error impidió guardar este %{model}' + one: 1 error impidió guardar este %{model} other: '%{count} errores impidieron guardar este %{model}' embed: load_from_remote: "Hubo un error al cargar ese post." @@ -1192,24 +1191,8 @@ es: Sin embargo, si el post es ocultado por la comunidad una segunda vez, este se mantendrá oculto hasta que sea atendido por el staff – y tal vez vez se tomen medidas, incluyendo la posible suspensión de tu cuenta. Para más información, por favor consulta nuestras [reglas de comunidad](%{base_url}/guidelines). - usage_tips: - text_body_template: "Este mensaje privado tiene unos cuantos consejos para ayudarte a empezar.\n\n## Sigue desplazándote\n\nNo hay botones de siguiente página o número de páginas - para leer más, **¡solo sigue desplazándote hacia abajo!**\n\nTan pronto como llegue nuevos posts, aparecerán automáticamente.\n\n## ¿Dónde estoy?\n\n- Para buscar, ver tu página de usuario, o el menú, usa el **los botones con el icono en la parte superior derecha**.\n\n- Cualquier título de un tema te llevara al siguiente post sin leer. Usa el tiempo de la última actividad y el contador de posts para ir al inicio o al final.\n\n- Mientras estés leyendo un tema, regresa al inicio ↑ seleccionando el título del tema. Selecciona la barra de proceso verde en la parte inferior derecha para mostrar todos los controles de navegación, o usa las teclas inicio y fin.\n\n\n\n## ¿Cómo respondo?\n\n- Para responder para el tema en general, usa el botón Responder al final de la página.\n\n- Para responder a un post especifico, usa el botón Responder en ese post.\n\n- Para llevar la conversación a una dirección diferente, pero manteniéndola enlazada, usa Responder como Tema enlazado a la derecha del post.\n\nPara citar a alguien en tu respuesta, selecciona el texto que desees citar, y presiona cualquier botón de Responder.\n\n\n\nPara mencionar a alguien en tu respuesta, menciona su nombre. Escribe `@` y el autocompletado aparecerá.\n\ - \n\n\nPara [Emoji estándares](http://www.emoji.codes/), solo empieza a teclear `:` o usa las caritas tradicionales `:)` :smile:\n\n## ¿Qué más puedo hacer?\n\nHay botones de acción al final de cada post.\n\n\n\n\tPara hacerle saber a alguien que has disfrutado de su post, usa el botón **me gusta**. Si ves algún problema con el post, privadamente hazle saber a nuestro staff, por medio del botón **reportar**.\n\nAdemás puedes **compartir** un link a un post, o **marcar** lo para futuras referencias en tu página de usuario.\n\n## ¿Quién me está hablando?\n\nCuando alguien responde a tu post, cita tu post, o menciona tu `@nombre_de_usuario`, un número aparecerá inmediatamente en la parte superior derecha de la página. Usalo para\ - \ acceder a tus **notificaciones**.\n\n\n\nNo te preocupes por perderte respuestas - un e-mail te será enviado cuando te respondan directamente (o te envíen mensajes privados) en caso que no te encuentres en línea.\n\n## ¿Cuando son las conversaciones nuevas?\n\nPor defecto todas las conversaciones que tengan menos de 2 días de ser publicadas son consideradas nuevas, y cualquier conversación en la que hayas participado (respondido, creado o leído por largo periodo de tiempo) será automáticamente rastreada.\n\nVeras un nuevo indicador en azul y con un número a lado de estos temas:\n\n\n\nPuedes cambiar el estado individual de la notificación a través del control en la parte inferior del tema (esto puede ser ajustado por cada categoría).\ - \ Para cambiar como mantienes un rastro de los temas, o de la definición de nuevo, mira [tus preferencias de usuario](/my/preferences).\n\n## ¿Por qué no puedo ver ciertas cosas?\n\nNuevos usuarios están de alguna manera limitados por razones de seguridad. Conforme participes aquí, ganaras la confianza de la comunidad, conviértete en un ciudadano completo, y esas limitaciones serán automáticamente removidas. A un [nivel de confianza](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) suficiente, ganaras aún más habilidades para ayudarnos a administrar juntos nuestra comunidad.\n" welcome_user: subject_template: "¡Bienvenido a %{site_name}!" - text_body_template: | - ¡Gracias por unirte a %{site_name}! ¡Bienvenido! - - %{new_user_tips} - - Creemos en una comunidad con un [comportamiento civilizado](%{base_url}/guidelines). - - (Si necesitas comunicarte por privado con [algún miembro del staff](/about) como nuevo usuario, simplemente puedes responder este mensaje privado.) - - ¡Disfruta de tu estancia! welcome_invite: subject_template: "¡Bienvenido a %{site_name}!" backup_succeeded: @@ -1484,23 +1467,6 @@ es: %{base_url}/users/authorize-email/%{email_token} signup_after_approval: subject_template: "Tú solicitud ha sido aprobada en %{site_name}!" - text_body_template: | - ¡Bienvenido a %{site_name}! - - Un miembro del staff aprobó tu cuenta en %{site_name}. - - Haz clic en el siguiente enlace para confirmar y activar tu nueva cuenta: - %{base_url}/users/activate-account/%{email_token} - - Si no puedes hacer clic en el enlace, intenta copiándolo y pegándolo en la barra de direcciones de tu navegador. - - %{new_user_tips} - - Creemos en una comunidad con un [comportamiento civilizado](%{base_url}/faq). - - (Si necesitas comunicarte por privado con [algún miembro del staff](/about) como nuevo usuario, simplemente puedes responder este mensaje privado.) - - ¡Disfruta de tu estancia! signup: subject_template: "[%{site_name}] Activa tu nueva cuenta" text_body_template: | @@ -1530,7 +1496,10 @@ es: unauthorized: "Lo sentimos, el archivo que estás intentando subir no está autorizado (extensiones autorizadas: %{authorized_extensions})." pasted_image_filename: "Imagen pegada" store_failure: "Falló el almacenamiento de la subida #%{upload_id} para el usuario #%{user_id}." + attachments: + too_large: "Lo sentimos, el archivo que estás intentando subir es demasiado grande (el tamaño máximo es %{max_size_kb}%KB)." images: + too_large: "Lo sentimos, la imagen que estás intentando subir es demasiado grande (el tamaño máximo es %{max_size_kb}%KB). Por favor, modifica sus dimensiones y prueba otra vez." fetch_failure: "Lo sentimos, hubo un error al recuperar la imagen." unknown_image_type: "Lo sentimos, pero el archivo que estás intentado subir no parece ser una imagen." size_not_found: "Lo sentimos, pero no hemos podido determinar el tamaño de la imagen. ¿Quizás el archivo está corrupto?" diff --git a/config/locales/server.fi.yml b/config/locales/server.fi.yml index ea4425bfeb..56f34bc633 100644 --- a/config/locales/server.fi.yml +++ b/config/locales/server.fi.yml @@ -31,10 +31,47 @@ fi: purge_reason: "Poistettu automaattisesti hylättynä, aktivoimattomana tilinä" disable_remote_images_download_reason: "Linkattujen kuvien lataaminen poistettiin käytöstä vähäisen tallennustilan vuoksi." errors: + format: '%{attribute} %{message}' messages: too_long_validation: "on rajoitettu %{max} merkkiin; sinä syötit %{length} merkkiä." invalid_boolean: "Totuusarvomuuttuja ei kelpaa" - taken: "on jo varattu. (ryhmien nimet eivät ole merkkikokoriippuvaisia)" + taken: "on jo varattu" + accepted: täytyy hyväksyä + blank: ei voi olla tyhjä + present: täytyy olla tyhjä + confirmation: "ei vastaa %{attribute}" + empty: ei voi olla tyhjä + equal_to: täytyy olla sama kuin %{count} + even: täytyy olla parillinen + exclusion: on varattu + greater_than: täytyy olla suurempi kuin %{count} + greater_than_or_equal_to: täytyy olla yhtä suuri, tai suurempi kuin %{count} + inclusion: ei ole listalla + invalid: ei kelpaa + less_than: täytyy olla vähemmän kuin %{count} + less_than_or_equal_to: täytyy olla yhtä suuri, tai vähemmän kuin %{count} + not_a_number: ei ole numero + not_an_integer: täytyy olla kokonaisluku + odd: täytyy olla pariton + record_invalid: 'Validointi epäonnistui: %{errors}' + restrict_dependent_destroy: + one: "Tietuetta ei voi poistaa, koska siitä riippuva tietue %{record} on olemassa" + many: "Tietueita ei voi poistaa, koska siitä riippuva tietue %{record} on olemassa." + too_long: + one: on liian pitkä (enintään 1 merkki) + other: on liian pitkä (enintään %{count} merkkiä) + too_short: + one: on liian lyhyt (vähintään 1 merkki) + other: on liian lyhyt (vähintään %{count} merkkiä) + wrong_length: + one: on väärän mittainen (pitäisi olla 1 merkki) + other: on väärän mittainen (pitäisi olla %{count} merkkiä) + other_than: "pitää olla muu kuin %{count}" + template: + body: 'Seuraavien kenttien kanssa oli ongelmia:' + header: + one: 1 virhe esti tallentamasta tätä %{model} + other: '%{count} virhettä esti tallentamasta tätä %{model}' embed: load_from_remote: "Viestin lataamisessa tapahtui virhe." bulk_invite: @@ -102,6 +139,7 @@ fi: latest: "Tuoreimmat viestiketjut" hot: "Kuumat ketjut" too_late_to_edit: "Tämä viesti luotiin liian kauan sitten. Sitä ei voi enää muokata tai poistaa." + excerpt_image: "kuva" groups: errors: can_not_modify_automatic: "Et voi muokata automaattista ryhmää" @@ -376,6 +414,8 @@ fi: title: 'Roskaposti' description: 'Tämä viesti on mainos. Se ei ole hyödyllinen tai relevantti tässä ketjussa, vaan luonteeltaan mainostamista.' long_form: 'liputti tämän roskapostiksi' + email_title: '"%{title}" liputettiin roskapostiksi' + email_body: "%{link}\n\n%{message}" inappropriate: title: 'Asiaton' description: 'Tämän viestin sisältö on loukkaava, herjaava tai ristiriidassa palstan sääntöjen kanssa.' @@ -517,6 +557,46 @@ fi: title: "Parhaat viitatut ketjut" xaxis: "Ketju" num_clicks: "Klikkausta" + page_view_anon_reqs: + title: "Anonyymejä" + xaxis: "Päivä" + yaxis: "Anonyymeien sivun katseluita" + page_view_logged_in_reqs: + title: "Kirjautuneita" + xaxis: "Päivä" + yaxis: "Kirjautuneiden sivunkatseluita" + page_view_crawler_reqs: + title: "Hakurobotteja" + xaxis: "Päivä" + yaxis: "Hakurobottien sivunkatseluita" + page_view_total_reqs: + title: "Yhteensä" + xaxis: "Päivä" + yaxis: "Katseluita yhteensä" + http_background_reqs: + title: "Taustajärjestelmä" + xaxis: "Päivä" + yaxis: "Pyyntöjä sivun päivittämiseen ja seuraamiseen" + http_2xx_reqs: + title: "Status 2xx (OK)" + xaxis: "Päivä" + yaxis: "Onnistuneita pyyntöjä (Status 2xx)" + http_3xx_reqs: + title: "HTTP 3xx (Uudelleenohjaus)" + xaxis: "Päivä" + yaxis: "Uudelleenohjauksia (Status 3xx)" + http_4xx_reqs: + title: "HTTP 4xx (Asiakasvirhe)" + xaxis: "Päivä" + yaxis: "Asiakasvirheitä (Status 4xx)" + http_5xx_reqs: + title: "HTTP 5xx (Palvelinvirhe)" + xaxis: "Päivä" + yaxis: "Palvelinvirheitä (Status 5xx)" + http_total_reqs: + title: "Yhteensä" + xaxis: "Päivä" + yaxis: "Pyyntöjä yhteensä" dashboard: rails_env_warning: "Palvelintasi ajetaan %{env} moodissa." ruby_version_warning: "Käytät Rubyn versiota 2.0.0 jonka kanssa on tunnettuja ongelmia. Päivitä patch level 247 tai uudempaan." @@ -536,6 +616,7 @@ fi: image_magick_warning: 'Palvelin on konfiguroitu luomaan esikatselukuvia suurista kuvista, mutta ImageMagickia ei ole asennettu. Asenna ImageMagick paketinhallinnasta tai lataamalla uusin versio.' failing_emails_warning: 'Sähköpostitehtävä on epäonnistunut %{num_failed_jobs} kertaa. Tarkista config/discourse.conf tiedostosta, että sähköpostiasetukset ovat kunnossa. Tarkastele epäonnistuneita tehtäviä Sidekiqissa.' default_logo_warning: "Aseta sivustolle logot. Päivitä logo_url, logo_small_url, ja favicon_url sivuston asetuksissa." + contact_email_missing: "Aseta yhteystietoihin sähköpostiosoite, josta sinut saa tavoitettua sivustoon liittyvissä kiireellisissä asioissa. Voit syöttää sen sivuston asetuksissa." contact_email_invalid: "Sivuston sähköpostiosoite ei kelpaa. Muokkaa sitä sivuston asetuksissa." title_nag: "Aseta keskustelupalstalle nimi. Voita muokata sitä sivuston asetuksissa." site_description_missing: "Aseta yhden lauseen mittainen kuvaus palstasta, joka näkyy hakutuloksissa. Muokkaa asetusta site_description sivuston asetuksissa." @@ -592,6 +673,7 @@ fi: educate_until_posts: "Näytä uuden käyttäjän ohje, kun käyttäjä alkaa kirjoittamaan ensimmäistä (n) viestiään viestikenttään." title: "Palstan nimi, käytetään title tagissa." site_description: "Kuvaile sivustoa yhdellä lauseella, jota käytetään meta description tagissa." + contact_email: "Sähköpostiosoite, josta sivuston henkilökunnan saa tavoitettua. Tänne lähetetään sivuston kriittiset ilmoitukset, kuten käsittelemättömät liput ja näytetään /about sivun yhteystietona." queue_jobs: "VAIN KEHITTÄJILLE! VAROITUS! Oletusarvona tehtävät asetetaan sidekiq jonoon. Jos poistetaan käytöstä, sivusto ei enää toimi." crawl_images: "Lataa linkatut kuvat kuvan dimensioiden määrittamiseksi." download_remote_images_to_local: "Muunna linkatut kuvat liitetiedostoiksi lataamalla ne; tämä estää kuvien rikkoontumisen vanhentuneiden linkkien vuoksi." @@ -654,6 +736,7 @@ fi: enable_noscript_support: "Ota käyttöön noscript-tagi hakukoneiden webcrawlereille" allow_moderators_to_create_categories: "Salli valvojien luoda uusia alueita" cors_origins: "Salli lähteet CORS-pyynnöille (cross-origin request). Jokaisen lähteen pitää sisältää http:// tai https://. DISCOURSE_ENABLE_CORS asetus pitää olla valittuna ottaaksesi CORSin käyttöön." + top_menu: "Mitkä painikkeet näytetään kotisivun navigointipalkissa, ja missä järjestyksessä. Esimerkiksi latest|new|unread|categories|top|read|posted|bookmarks" post_menu: "Mitkä painikkeet näytetään viestin valikossa, ja missä järjestyksessä. Esimerkiksi like|edit|flag|delete|share|bookmark|reply" post_menu_hidden_items: "Piilotettavat painikkeet viestin valikosta, kunnes '...' klikataan." share_links: "Mitkä painikkeet näytetään Jaa-valikossa ja missä järjestyksessä." @@ -676,6 +759,7 @@ fi: email_domains_blacklist: "Lista sähköposti-verkkotunnuksista, joista käyttäjät eivät voi luoda tiliä. Esimerkiksi mailinator.com trashmail.net" email_domains_whitelist: "Lista sähköposti-verkkotunnuksista, joista käyttäjien pitää luoda tilinsä. VAROITUS: Käyttäjiä, joiden sähköpostiosoite on muusta verkkotunnuksesta ei sallita!" forgot_password_strict: "Älä paljasta tilin olemassaoloa unohtuneen salasanan kyselyssä." + log_out_strict: "Kun kirjaudutaan ulos, kirjaa käyttäjä ulos kaikilta laitteilta" version_checks: "Pingaa Discourse Hubia päivityksistä ja näytä viesti /admin hallintapaneelissa kun uusi versio on saatavilla" new_version_emails: "Lähetä sähköposti contact_email osoitteeseen kun uusi versio Discoursesta on saatavilla." port: "VAIN KEHITTÄJILLE! VAROITUS! Käytä tätä HTTP porttia portin 80 sijaan. Jätä tyhjäksi jos haluat käyttää oletusporttia 80." @@ -691,6 +775,7 @@ fi: enable_sso: "Ota käyttöön single sign on ulkopuolisen sivuston kautta (HUOM: voi estää kaikkia kirjautumasta sisään, jos asetukset eivät ole kunnossa ja poistaa kutsut käytöstä)" enable_sso_provider: "Ota käyttöön Discourse SSO protokolla /session/sso_provider päätepisteessä, vaatii asetuksen sso_secret asettamista." sso_url: "single sign on endpointin URL" + sso_secret: "Salausavain, jolla todennetaan SSO tiedot, varmista että se on vähintään 10 merkkiä pitkä" sso_overrides_email: "Ohittaa paikallisen sähköpostiosoitteen SSO:n kautta saatavalla ulkopuolisella sähköpostillosoitteella (VAROITUS: eroavuuksia saattaa syntyä johtuen paikallisten sähköpostien normalisoinnista)" sso_overrides_username: "Ohittaa paikallisen käyttäjänimen SSO:n kautta saatavalla ulkopuolisella käyttäjänimellä (VAROITUS: eroavuuksia saattaa syntyä johtuen eroavuuksista nimien pituuksissa/vaatimuksissa)" sso_overrides_name: "Ohittaa paikallisen nimen SSO:n kautta saatavalla ulkopuolisella nimellä (VAROITUS: eroavuuksia saattaa syntyä johtuen paikallisten nimien normalisoinnista)" @@ -729,6 +814,7 @@ fi: max_edits_per_day: "Muokkausten päivittäinen maksimäärä per käyttäjä." max_topics_per_day: "Luotujen ketjujen päivittäinen maksimäärä per käyttäjä." max_private_messages_per_day: "Yksityisviestien päivittäinen maksimäärä per käyttäjä." + max_invites_per_day: "Maksimimäärä kutsuja, jonka käyttäjä voi lähettää päivässä." suggested_topics: "Suositeltujen ketjujen määrä ketjun alaosassa." limit_suggested_to_category: "Näytä suositeltuja ketjuja vain nykyiseltä alueelta." clean_up_uploads: "Poista orpoutuneet liitetiedostot, joita ei käytetä viesteissä, laittoman hostauksen estämiseksi. VAROITUS: kannattaa varmuuskopioida /uploads kansio ennen tämän asetuksen ottamista käyttöön." @@ -784,6 +870,7 @@ fi: min_title_similar_length: "Ketjun otsikon minimipituus, kunnes sitä verrataan muihin samankaltaisiin ketjuihin." min_body_similar_length: "Viestin minimipituus, kunnes sitä verratataan muihin samankaltaisiin ketjuihin." category_colors: "Lista alueiden sallituista väriarvoista, heksadesimaaleina." + category_style: "Aluemerkin tyyli." max_image_size_kb: "Liitetyn kuvan suurin sallittu koko kilotavuissa. Tämä pitää asettaa myös nginxin (client_max_body_size) / apachen tai proxyn asetuksista." max_attachment_size_kb: "Liitetyn tiedoston suurin sallittu koko kilotavuissa. Tämä pitää asettaa myös nginxin (client_max_body_size) / apachen tai proxyn asetuksista." authorized_extensions: "Liitetiedostojen sallitut tiedostopäätteet (käytä '*' salliaksesi kaikki tiedostotyypit)" @@ -844,6 +931,8 @@ fi: digest_topics: "Sähköpostitiivistelmässä näytettävien ketjujen maksimimäärä." digest_min_excerpt_length: "Viestin katkelman vähimmäispituus sähköpostitiivistelmässä, merkeissä" default_digest_email_frequency: "Kuinka usein käyttäjän saavat sähköpostitiivistelmän oletuksena. He voivat muuttaa asetusta omista asetuksistaan." + suppress_digest_email_after_days: "Supista tiivistelmäsähköpostit käyttäjltä, joita ei ole nähty (n) päivän aikana." + disable_digest_emails: "Ota tiivistelmäsähköpostit pois käytöstä kaikilta käyttäjiltä." default_external_links_in_new_tab: "Avaa ulkoiset linkit uudessa välilehdessä. Käyttäjät voivat muuttaa tämän asetuksistaan." detect_custom_avatars: "Tarkistetaanko, ovatko käyttäjät ladanneet oman avatarin." max_daily_gravatar_crawls: "Korkeintaan kuinka monta kertaa Discourse tarkistaa avatarit Gravatarista päivässä" @@ -855,6 +944,7 @@ fi: suppress_uncategorized_badge: "Älä näytä alueettomille ketjuille tunnusta ketjujen listauksissa." global_notice: "Näytä KIIREELLISESTÄ HÄTÄTAPAUKSESTA kertova banneri kaikilla sivuilla kaikille käyttäjille, vaihda tyhjäksi piilottaaksesi sen (HTML sallittu)." disable_edit_notifications: "Poista muokkausilmoitukset system-käyttäjältä, kun 'download_remote_images_to_local' on asetettu." + enable_names: "Näytä käyttäjän koko nimi profiilissa, käyttäjäkortissa ja sähköposteissa. Poista käytöstä piilottaaksesi koko nimen kaikkialla." display_name_on_posts: "Näytä käyttäjän pitkä nimi viesteissä @nimen lisäksi." invites_per_page: "Oletuksena montako kutsua näytetään käyttäjäsivulla." short_progress_text_threshold: "Kuinka monen viestin jälkeen ketjun edistyspalkissa näytetään vain nykyisen viestin numero. Jos muutat palkin leveyttä, voit joutua muuttamaan tätä arvoa." @@ -890,6 +980,7 @@ fi: invalid_string_min_max: "Merkkien lukumäärän täytyy olla välillä %{min} - %{max}." invalid_string_min: "Täytyy olla vähintään %{min} merkkiä." invalid_string_max: "Ei saa olla yli %{max} merkkiä." + invalid_reply_by_email_address: "Arvon täytyy sisältää '%{reply_key}' ja olla eri, kuin ilmoitusten sähköpostiosoite." notification_types: mentioned: "%{display_username} viittasi sinuun viestissä %{link}" liked: "%{display_username} tykkäsi viestistäsi %{link}" @@ -1039,6 +1130,45 @@ fi: %{base_url}/users/password-reset/%{email_token} test_mailer: subject_template: "[%{site_name}] Sähköpostin toimitettavuustesti" + text_body_template: | + Tämä on testisähköposti sivustolta + + [**%{base_url}**][0] + + Sähköpostin toimitus on monimutkaista. Tässä on muutama tärkeä asia, jotka kannattaa tarkistaa ensin: + + - *Varmista,* että `ilmoitusten sähköpostiosoitteen` from: kenttä on asetettu oikein sivuston asetuksissa. **Sähköpostin varmennus tapahtuu "from"-kentän sähköpostiosoitteen verkkotunnusta vastaan**. + + - Selvitä, miten sähköpostiohjelmassasi saa näkyville *sähköpostin raakadatan,* jotta voit tutkia viestin tunnistetiedot. Gmailissa tämä tapahtuu "näytä kokonaan" valinnalla viestin oikeassa yläkulmassa olevasta valikosta. + + - **TÄRKEÄÄ:** Onko palveluntarjoajasi syöttänyt reverse DNS kentän verkkotunnuksille ja IP osoitteille, joists lähetät sähköpostia? [Kokeile Reverse PTR tietuetta][2] täällä. Jos palveluntarjoajasi ei tarjoa kunnollista reverse DNS pointer tietuetta, on hyvin epätodennäköistä, että mikään sähköposti menee perille. + + - Onko verkkotunnuksesi [SPF record][8] oikein? [Kokeile SPF tietuetta][1] täällä. Huomaa, että TXT oikea tietuetyyppi SPF tietueelle. + + - Onko verkkotunnuksesi [DKIM tietue][3] oikein? Tämä vaikuttaa merkittävästi sähköpostin toimitettavuuteen. [Kokeile DKIM tietuetta][7] täällä. + + - Jos käytät omaa sähköpostipalvelinta, tarkista että palvelimen IP osoite [ei ole millään sähköpostin mustalla listalla][4]. + + - Tarkista myös, että se varmasti lähettää oikean muotoisen isäntänimen HELO viestissään, joka palauttaa oikean DNS tietueen. Jos näin ei ole, sähköposti hylätään monissa sähköpostipalveluissa. + + (Helpoin tapa on luoda ilmainen tili [Mandrilliin][md], [Mailguniin][mg] tai [Mailjetiin][mj], joide ilmaiset palvelut riittävät hyvin piemen palstan käyttöön. Muista silti asettaa SPF ja DKIM tietueet DNS:ään!) + + Toivottavasti tämä testisähköposti meni perille OK! + + Onnea matkaan, + + Ystäväsi [Discourselta](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]: http://dkimcore.org/tools/dkimrecordcheck.html + [8]: http://www.openspf.org/SPF_Record_Syntax + [md]: http://mandrill.com + [mg]: http://www.mailgun.com/ + [mj]: http://www.mailjet.com/pricing new_version_mailer: subject_template: "[%{site_name}] Uusi Discourse versio, päivitys saatavilla" text_body_template: |+ @@ -1175,7 +1305,7 @@ fi: - Voit vaihtaa yksittäisen viestiketjun ilmoitusasetuksia ketjun alalaidassa olevalla painikkeella (asetuksen voi muuttaa myös aluekohtaisesti). Vaihtaaksesi asetuksia siitä, kuinka seuraat ketjuja tai mitkä ketjut tulkitaan uusiksi, katso [käyttäjäasetukset](/my/preferences). + Voit vaihtaa yksittäisen viestiketjun ilmoitusasetuksia ketjun alalaidassa olevalla painikkeella (asetuksen voi muuttaa myös aluekohtaisesti). Vaihtaaksesi asetuksia siitä, kuinka seuraat ketjuja tai mitkä ketjut tulkitaan uusiksi, katso [käyttäjäasetukset](%{base_url}/my/preferences). ## Miksi en voi tehdä jotain? @@ -1189,11 +1319,31 @@ fi: Me uskomme [sivistyneeseen kanssakäymiseen](%{base_url}/guidelines). - (Jos haluat keskustella yksityisesti [henkilökunnan jäsenten](/about) kanssa, vastaa vain tähän viestiin) - Toivottavasti viihdyt! + + (Jos haluat keskustella yksityisesti [henkilökunnan jäsenten](%{base_url}/about) kanssa, vastaa vain tähän viestiin) welcome_invite: subject_template: "Tervetuloa sivustolle %{site_name}!" + text_body_template: | + Kiitos kutsun hyväksymisestä sivustolle %{site_name} -- tervetuloa! + + Olemme luoneet sinulle uuden käyttäjätunnuksen: **%{username}** ja olet nyt kirjautuneena sisään. Voit vaihtaa nimeäsi [käyttäjäprofiilistasi][prefs]. + + Kirjautuaksesi uudestaan sisään myöhemmin: + + 1. Käytä aina **samaa sähköpostiosoitetta, jonne vastaanotit alkuperäisen kutsun**. Muuten emme voi tietää, että olet sinä! + + 2. Luo salasana [käyttäjäprofiilissasi][prefs], ja käytä sitä kirjautumiseen. + + %{new_user_tips} + + Me uskomme [sivistyneeseen kanssakäymiseen](%{base_url}/guidelines). + + Toivottavasti viihdyt! + + (Jos haluat keskustella yksityisesti [henkilökunnan jäsenten](%{base_url}/about) kanssa, vastaa vain tähän viestiin) + + [prefs]: %{user_preferences_url} backup_succeeded: subject_template: "Varmuuskopiointi suoritettu onnistuneesti" text_body_template: "Varmuuskopiointi onnistui.\nVoit ladata varmuuskopioin avaamalla valikon [ylläpito > varmuuskopiot](/admin/backups)." @@ -1235,6 +1385,12 @@ fi: ``` csv_export_succeeded: subject_template: "Datan vieminen on tehty" + text_body_template: | + Datan vienti onnistui. + + %{file_name} (%{file_size}) + + Linkki tiedostoon on voimassa 48 tuntia. csv_export_failed: subject_template: "Datan vienti epäonnistui" text_body_template: "Pahoittelemme, mutta datan vientisi epäonnistui. Tarkasta lokit tai ota yhteyttä henkilökuntaan." @@ -1492,9 +1648,9 @@ fi: Me uskomme [sivistyneeseen kanssakäyntiin](%{base_url}/guidelines). - (Jos haluat keskustella yksityisesti [henkilökunnan jäsenten](/about) kanssa, vastaa vain tähän viestiin) - Toivottavasti viihdyt! + + (Jos haluat keskustella yksityisesti [henkilökunnan jäsenten](%{base_url}/about) kanssa, vastaa vain tähän viestiin) signup: subject_template: "[%{site_name}] Vahvista uusi tilisi" text_body_template: | @@ -1524,7 +1680,10 @@ fi: unauthorized: "Pahoittelut, tiedostomuoto ei ole sallittu (sallitut tiedostopäätteet: %{authorized_extensions})." pasted_image_filename: "Liitetty kuva" store_failure: "Latauksen #%{upload_id} käyttäjälle #%{user_id} tallentaminen epäonnistui." + attachments: + too_large: "Pahoittelut, tiedosto jonka latausta yritit on liian suuri ( suurin tiedostokoko on %{max_size_kb}KB)." images: + too_large: "Pahoittelut, kuva jonka yritit ladata on liian suuri (suurin sallittu kuvakoko on %{max_size_kb}KB), pienennä kuvaa ja yritä uudestaan." fetch_failure: "Pahoittelut, kuvan hakemisessa tapahtui virhe." unknown_image_type: "Pahoittelut, mutta tiedosto jota yrität ladata ei vaikuta olevan kuva." size_not_found: "Pahoittelut, mutta emme pystyneet selvittämään kuvan kokoa. Ehkä kuvatiedosto on vahingoittunut?" @@ -1561,3 +1720,26 @@ fi: title: "Käyttöehdot" privacy_topic: title: "Rekisteriseloste" + static: + search_help: | +

    Vinkkejä

    +

    +

      +
    • Otsikon vastaavuutta korostetaan, joten jos olet epävarma, etsi otsikkoa
    • +
    • Uniikit, harvinaiset sanat tuovat aina parhaan lopputuloksen
    • +
    • Rajoita hakusi tietylle alueelle, tiettyyn käyttäjään tai ketjuun aina kun mahdollista.
    • +
    +

    +

    Komennot:

    +

    +

    {{yesterdayCount}} {{sevenDaysAgoCount}} {{thirtyDaysAgoCount}}
    - {{i18n 'forgot_password.action'}} + {{i18n 'forgot_password.action'}}
    {{user-badge badge=this}}{{displayDescription}}{{{displayDescriptionHtml}}} {{i18n 'badges.granted' count=grant_count}} {{i18n 'badges.allow_title'}} {{{view.allowTitle}}}
    {{i18n 'badges.multiple_grant'}} {{{view.multipleGrant}}}
    + + + + + +
    order:viewsorder:latest
    status:openstatus:closedstatus:archivedstatus:norepliesstatus:singleuser
    category:foouser:foo
    in:likesin:postedin:watchingin:trackingin:private
    in:bookmarks
    +

    +

    + sateenkaari category:puistot status:open order:latest etsii ketjuja, joissa mainitaan sana "sateenkaari" alueella "puistot" joita ei ole suljettu tai arkistoitu, järjestettynä viimeisen viestin mukaan. +

    diff --git a/config/locales/server.fr.yml b/config/locales/server.fr.yml index 7ca63a227f..ad5b06b426 100644 --- a/config/locales/server.fr.yml +++ b/config/locales/server.fr.yml @@ -35,8 +35,8 @@ fr: messages: too_long_validation: "est limité à %{max} caractères maximum; il y en a %{length}." invalid_boolean: "Vrai/Faux invalide." - taken: "est déjà pris. (Les noms des groupes sont sensibles à la casse.)" - accepted: must be accepted + taken: "a déjà été pris" + accepted: doit être accepté blank: ne peut être vide present: doit être vide confirmation: "ne correspond pas %{attribute}" @@ -54,9 +54,24 @@ fr: not_an_integer: doit être un entier odd: doit être impair record_invalid: 'Validation échouée: %{errors}' + restrict_dependent_destroy: + one: "Impossible de supprimer l'enregistrement car certains %{record} existent et en dépendent" + many: "Impossible de supprimer l'enregistrement car un %{record} existe et en dépend" + too_long: + one: c'est trop long (le maximum est de 1 caractère) + other: c'est trop long (le maximum est de %{count} caractères) + too_short: + one: c'est trop court (le minimum est de 1 caractère) + other: c'est trop court (le minimum est de %{count} caractères) + wrong_length: + one: c'est la mauvaise longueur (devrait être de 1 caractère) + other: c'est la mauvaise longueur (devrait être de %{count} caractères) other_than: "doit être différent de %{count}" template: body: 'Des problèmes ont été rencontrés sur les champs suivants : ' + header: + one: Une erreur empêche ce %{model} d'être sauvegardé + other: '%{count} erreurs empêchent ce %{model} d''être sauvegardé' embed: load_from_remote: "Il y a eu une erreur lors du chargement de ce message." bulk_invite: @@ -395,6 +410,7 @@ fr: description: 'Ce message est une publicité. Elle n''est pas utile ou pertinente dans ce sujet, mais est uniquement de nature promotionnelle.' long_form: 'signalé comme spam' email_title: '"%{title}" a été signalé comme spam' + email_body: "%{link}\n\n%{message}" inappropriate: title: 'Inapproprié' description: 'Ce message contient du contenu qu''une personne raisonnable jugerait offensant, abusif ou en violation du règlement de notre communauté.' @@ -539,11 +555,15 @@ fr: page_view_anon_reqs: title: "Anonyme" xaxis: "Jour" + yaxis: "Pages vues par les utilisateurs non connectés" page_view_logged_in_reqs: title: "Connecté" xaxis: "Jour" + yaxis: "Pages vues par les utilisateurs connectés" page_view_crawler_reqs: + title: "Crawlers Web" xaxis: "Jour" + yaxis: "Pages vues par les Crawler Web" page_view_total_reqs: title: "Total" xaxis: "Jour" @@ -552,17 +572,25 @@ fr: title: "Arrière plan" xaxis: "Jour" http_2xx_reqs: + title: "Statut 2xx (OK)" xaxis: "Jour" + yaxis: "Requêtes traitées avec succès (Statut 2xx)" http_3xx_reqs: + title: "HTTP 3xx (Redirection)" xaxis: "Jour" + yaxis: "Requêtes de redirection (Statut 3xx)" http_4xx_reqs: + title: "HTTP 4xx (Erreur du client)" xaxis: "Jour" + yaxis: "Erreurs du client (Statut 4xx)" http_5xx_reqs: + title: "HTTP 5xx (Erreur du serveur)" xaxis: "Jour" - yaxis: "Erreurs du serveur (Status 5xx)" + yaxis: "Erreurs du serveur (Statut 5xx)" http_total_reqs: title: "Total" xaxis: "Jour" + yaxis: "Total des requêtes" dashboard: rails_env_warning: "Votre serveur fonctionne dans l'environnement de %{env}." ruby_version_warning: "Vous exécutez une version de Ruby 2.0.0 qui est connu pour avoir des problèmes. Migrez vers le patch 247 ou supérieur." @@ -946,6 +974,7 @@ fr: invalid_string_min_max: "Doit être compris(e) entre %{min} et %{max} caractères." invalid_string_min: "Doit être d'au moins %{count} caractères." invalid_string_max: "Ne doit pas être supérieur à %{max} caractères." + invalid_reply_by_email_address: "La valeur doit contenir '%{reply_key}' et être différente de la notification email." notification_types: mentioned: "%{display_username} vous a mentionné dans %{link}" liked: "%{display_username} a aimé votre message dans %{link}" @@ -1205,26 +1234,10 @@ fr: Cependant, si le message est signalé par la communauté une seconde fois, il restera marqué jusqu’à l'intervention d'un modérateur – et ils pourront prendre d'autres mesures y compris l'éventuelle suspension de votre compte. Pour plus d'informations, merci de vous en référer aux [règles de la communauté](%{base_url}/guidelines). - usage_tips: - text_body_template: "Ce message privé contient quelques astuces pour vous aider à démarrer rapidement.\n\n## Descendez toujours\n\nIl n'y a pas de bouton Page Suivante ni de numéro de page – pour en lire plus, **il vous suffit de descendre !**\n\nLorsque de nouvelles réponses arrivent, elles apparaissent automatiquement. \n\n## Où suis-je ?\n\n- Pour la recherche, votre page d'utilisateur, ou le menu, utiliser les **boutons icônes en haut à droite**.\n\n- Dans la liste des sujets, le titre vous emmènera toujours vers le prochain message non lu. Utiliser les colonnes Activité ou Messages pour allez au premier ou au dernier message. \n\n- Lorsque vous lisez un sujet, retournez en haut de celui ↑ en cliquant sur le titre. Cliquez sur la barre de progression en bas à droite pour avoir une navigation complète, ou utilisez les touches Home et Fin. \n\n \n\n## Comment je réponds ?\n\n- Pour répondre au sujet dans sa globalité, utilisez le bouton \"Répondre\" tout en bas de la page.\n\n- Pour répondre à un message spécifique, utilisez le bouton \"Répondre\" sur le message.\n\n - Si vous voulez continuer le sujet dans une section différente, mais garder le lien entre votre sujet et le message qui vous l'a inspiré, utilisez la fonction Répondre en créant un nouveau sujet à droite de chaque message.\n\nPour citer quelqu'un dans votre message, sélectionnez le texte que vous voulez citer et appuyez sur un des boutons Répondre.\n\n\n\nPour mentionner le pseudo d'un utilisateur, commencez à taper `@` et une liste d'auto-complétion apparaîtra.\n\n\n\nConcernant les [icones Emoji](http://www.emoji.codes/), commencez par écrire `:` ou le traditionnel smiley `:)` :smile: \n\n## Que puis-je faire d'autre ?\n\nÀ la fin de chaque message il y a un ensemble de boutons pour les différentes actions possibles.\n\n\n\nPour faire savoir à quelqu'un que vous avez apprécié son message, cliquez sur le bouton **j'aime** en bas du message. Si vous voyez un problème avec un message, n'hésitez pas à cliquer sur le bouton **signaler**\ - \ pour avertir en privé l'auteur ou les modérateurs du contenu de ce message.\n\nVous pouvez aussi **partager** un lien vers un message ou l'ajouter à vos **signets** pour le retrouver sur votre page d'utilisateur. \n\n## Qui me parle ?\n\nQuand quelqu'un répond à votre message, vous cite, ou mentionne votre `@pseudo`, un nombre apparaitra immédiatement en haut à droite de la page. Utilisez-le pour consulter vos **notifications**.\n\n\n\nNe soyez pas inquiêt de manquer des notifications – \nLes réponses directes (et les messages privés) vous seront envoyés par courriel si vous n'êtes pas présent sur le site lorsqu'ils sont envoyés. \n\n## Quand est-ce qu'une conversation est nouvelle ?\n\nPar défaut, toutes les conversations de moins de deux jours sont considérées comme nouvelles, et chaque sujet auxquels vous avez participé (répondu, créé ou lu pendant un long moment) sera automatiquements suivi. \n\nVous verrez le badge bleu de nouveauté et le nombre de nouveaux messages au côté de ces sujets:\n\n\n\nVous pouvez modifier l'état du suivi des notifications d'une discussion en utilisant les boutons en bas de la discussion (vous\ - \ pouvez également le modiifer au niveau des catégories).\nPour modifier la façon dont vous suivez les sujets, ou pour définir de nouveaux suivis, consultez [vos préférences utilisateurs](/my/preferences). \n\n## Quelles sont les choses que je ne peux pas faire ?\n\nLes nouveaux utilisateurs sont limités pour des raisons de sécurité. Plus vous participerez, plus vous gagnerez la confiance de la communauté et les restrictions disparaîtront. A plus haut [niveau de confiance](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924), vous gagnerez de nouvelles compétences pour nous aider à gérer la communauté. \n" welcome_user: subject_template: "Bienvenue sur %{site_name} !" - text_body_template: | - Merci d'avoir rejoint %{site_name}, et bienvenue ! - - %{new_user_tips} - - Nous croyons au [comportement communautaire civilisé](%{base_url}/guidelines) en tous temps. - - Si en tant que nouvel utilisateur vous avez besoin de communiquer de façon privée avec un [responsable](/about), répondez simplement à ce message privé. - - Amusez-vous bien ! welcome_invite: subject_template: "Bienvenue sur %{site_name} !" - text_body_template: "Merci d'avoir accepté notre invitation sur %{site_name}, et bienvenue !\n\nNous vous avons crée un pseudo : **%{username}**, mais vous pouvez le changer quand vous voulez en allant sur [votre profil][prefs].\n\nPour vous reconnecter :\n\n1. Utiliser **toujours la même adresse de courriel que celle de l'invitation** que vous avez reçue. Autrement, nous ne pourrons pas vous reconnaître.\n\n2. Créer un mot de passe unique sur votre [page de profil utilisateur][prefs], et vous connecter avec. \n\n%{new_user_tips}\n\nNous croyons au [comportement communautaire civilisé](%{base_url}/guidelines) en tous temps.\n\n(Si en tant que nouvel utilisateur vous avez besoin de communiquer de façon privée avec un [responsable](/about), répondez simplement à ce message privé).\n\nAmusez-vous bien !\n\n[prefs] : %{user_preferences_url}\n" backup_succeeded: subject_template: "Sauvegarde terminée avec succès" text_body_template: "La sauvegarde a été un succès.\nVisitez la section [Administration > sauvegardes](/admin/backups) pour télécharger votre dernière sauvegarde." @@ -1509,22 +1522,6 @@ fr: %{base_url}/users/authorize-email/%{email_token} signup_after_approval: subject_template: "Votre compte a été approuvé sur %{site_name} !" - text_body_template: | - Bienvenue sur %{site_name} ! - - Un responsable a approuvé votre compte sur %{site_name}. - - Cliquez sur le lien suivant pour confirmer et activer votre nouveau compte : %{base_url}/users/activate-account/%{email_token} - - Si le lien ci-dessus n'est pas cliquable, essayez de le copier et coller dans la barre d'adresse de votre navigateur web. - - %{new_user_tips} - - Nous croyons au [comportement communautaire civilisé](%{base_url}/guidelines) en tous temps. - - (Si en tant que nouveau membre vous voulez communiquer en privée avec [un responable](/about), répondez à ce message privé.) - - Amusez-vous bien ! signup: subject_template: "[%{site_name}] Activer votre nouveau compte" text_body_template: | diff --git a/config/locales/server.he.yml b/config/locales/server.he.yml index 9783ea5ca6..f9fb8deca4 100644 --- a/config/locales/server.he.yml +++ b/config/locales/server.he.yml @@ -31,10 +31,10 @@ he: purge_reason: "נמחק באופן אוטומטי כחשבון נטוש ולא פעיל" disable_remote_images_download_reason: "הורדת תמונות מרחוק נחסמה בשל היעדר מספיק שטח אכסון פנוי." errors: + format: '%{attribute} %{message}' messages: too_long_validation: "מוגבל לאורך של %{max} תוים: את/ה הקשת %{length}." invalid_boolean: "בוליאני לא חוקי." - taken: "כבר תפוס. (שמות קבוצות באנגלית אינן מבדילות בין אותיות גדולות וקטנות)" embed: load_from_remote: "ארעה שגיאה בטעינת ההודעה הזו." bulk_invite: @@ -1087,16 +1087,6 @@ he: להדרכה נוספת אנא פנו למסמך ה[קווים המנחים של הקהילה שלנו](%{base_url}/guidelines). welcome_user: subject_template: "ברוכים הבאים ל %{site_name}!" - text_body_template: | - תודה שהצטרפת אל %{site_name} וברוך/ברוכה הבא/ה! - - %{new_user_tips} - - אנו מאמינים ב[התנהגות קהילתית מתורבתת](%{base_url}/guidelines) בכל עת. - - (אם אתם זקוקים לתקשר באופן פרטי עם [חברי צוות](/about) כמשתמשים חדשים, פשוט השיבו למסר הפרטי הזה.) - - תכייפו! welcome_invite: subject_template: "Welcome to %{site_name}!" backup_succeeded: @@ -1381,23 +1371,6 @@ he: %{base_url}/users/authorize-email/%{email_token} signup_after_approval: subject_template: "You've been approved on %{site_name}!" - text_body_template: | - ברוכים הבאים אל %{site_name}! - - חבר/ה בצוות שלנו אישר את חשבונך ב%{site_name}. - - הקישו על הקישור הבא כדי לאשר ולהפעיל את חשבון המשתמש/ת החדש שלכם: - %{base_url}/users/activate-account/%{email_token} - - אם לא ניתן להקליק על הקישור, נסו להעתיק ולהדביר אותו אל שורת הכתובת בדפדפן שלכם. - - %{new_user_tips} - - אנחנו מאמינים ב[התנהגות קהילתית מתורבתת](%{base_url}/guidelines) בכל עת. - - (אם אתם צריכים לתקשר באופן פרטי עם [אנשי הצוות](/about) שלנו, כמשתמשים חדשים פשוט שלחו תגובה להודעה זו) - - תהנו! signup: subject_template: "[%{site_name}] Activate your new account" text_body_template: | diff --git a/config/locales/server.it.yml b/config/locales/server.it.yml index 9192ed90cd..c98a817785 100644 --- a/config/locales/server.it.yml +++ b/config/locales/server.it.yml @@ -35,7 +35,7 @@ it: messages: too_long_validation: "è limitato a %{max} caratteri; tu ne hai inseriti %{length}." invalid_boolean: "Booleano non valido." - taken: "è già stato usato (i nomi dei gruppi non distinguono le maiuscole)." + taken: "è già stato usato" accepted: deve essere accettato blank: non può essere vuoto present: deve essere vuoto @@ -70,7 +70,7 @@ it: template: body: 'Sono stati riscontrati problemi con i seguenti campi:' header: - one: '1 errore ha impedito il salvataggio di questo %{model}' + one: 1 errore ha impedito il salvataggio di questo %{model} other: '%{count} errori hanno impedito il salvataggio di questo %{model}' embed: load_from_remote: "Si è verificato un errore nel caricamento del messaggio." @@ -540,7 +540,7 @@ it: xaxis: "Giorno" yaxis: "Pagine Viste Totali" http_background_reqs: - title: "Sfondo" + title: "Background" xaxis: "Giorno" yaxis: "Richieste usate per l'aggiornamento diretto e per il tracking" http_2xx_reqs: @@ -739,10 +739,13 @@ it: min_password_length: "Minima lunghezza della password." block_common_passwords: "Non permettere password che sono nelle 10.000 password più comuni." enable_sso: "Attiva il signle sign.on tramite un sito esterno (ATTENZIONE: l'opzione mal configurata può impedire a chiunque di accedere; inoltre disabilita gli inviti)" + enable_sso_provider: "Implementa il protocollo SSO Discourse nell'endpoint /session/sso_provider, richiede che sia impostata l'opzione sso_secret " sso_url: "URL per l'endpoint del single sign on " + sso_secret: "Stringa segreta utilizzata per autenticare crittograficamente le informazioni SSO, assicurati che sia lunga almeno 10 caratteri" sso_overrides_email: "Sostituisce le email locali con quelle del sito esterno con cui ci si è connessi tramite SSO (ATTENZIONE: potrebbero avvenire discrepanze a causa delle direttive per le email locali)" sso_overrides_username: "Sovrascrive il nome utente locale con quello del sito esterno con cui ci si è connessi tramite SSO (ATTENZIONE: potrebbero verificarsi discrepanze a causa delle differenze tra lunghezza effettiva e richiesta del nome utente)" sso_overrides_name: "Sovrascrive il nome locale con quello del sito esterno con cui ci si è connessi tramite SSO (ATTENZIONE: potrebbero verificarsi discrepanze a causa della normalizzazione dei nomi locali)" + sso_overrides_avatar: "Sostituisce l'avatar dell'utente con un avatar su un sito esterno usando SSO. Se abilitato, si raccomanda di disabilitare allow_uploaded_avatars" enable_local_logins: "Abilita account basati su login con nome utente e password locali. (Nota: deve essere abilitato affinché funzionino gli inviti)" allow_new_registrations: "Abilita la registrazione di nuovi utenti. Se deselezionato, non sarà possibile creare nuovi account." enable_google_logins: "(obsoleto) Attiva l'autenticazione Google. Questo è il metodo di autenticazione OpenID che Google ha definito obsoleto. Le nuove installazioni NON funzioneranno con questa opzione. Utilizzare Google Oauth2. Le installazioni esistenti devono migrare a Google Oauth2 entro il 20 aprile 2015." @@ -762,6 +765,7 @@ it: allow_restore: "Abilita il ripristino, che sostituisce TUTTI i dati del sito! Lascia a falso a meno che non hai intenzione di ripristinare un backup." maximum_backups: "Il numero massimo di backup da mantenere sul disco. I backup più vecchi vengono automaticamente cancellati." backup_daily: "Crea automaticamente un backup del sito una volta al giorno." + enable_s3_backups: "Carica i backup su S3 quando completati. IMPORTANTE: richiede che siano inserite valide credenziali S3 nelle impostazioni File." s3_backup_bucket: "Il bucket remoto che contiene i backup. ATTENZIONE: assicurati che sia un bucket privato." active_user_rate_limit_secs: "Ogni quanti secondi viene aggiornato il campo 'last_seen_at'" verbose_localization: "Mostra suggerimenti per la traduzione nell'interfaccia utente" @@ -783,7 +787,12 @@ it: clean_orphan_uploads_grace_period_hours: "Dopo quante ore un caricamento orfano (senza riferimenti) viene rimosso." purge_deleted_uploads_grace_period_days: "Dopo quanti giorni un caricamento cancellato viene rimosso." purge_unactivated_users_grace_period_days: "Periodo di grazia (in giorni) prima che un utente che non abbia attivato il proprio account venga cancellato." - enable_flash_video_onebox: "Attiva l'inserimento di link swf e flv (Adobe Flash) in onebox. ATTENZIONE: comporta rischi per la sicurezza." + enable_s3_uploads: "Mette i caricamenti sullo spazio disco Amazon S3. IMPORTANTE: richiede che siano inserite valide credenziali S3 (sia l'access key id sia l'access key secret)." + s3_upload_bucket: "Il nome del bucket Amazon S3 sul quale verranno caricati i file. ATTENZIONE: deve essere tutto minuscolo, senza punti, senza trattini bassi." + s3_access_key_id: "La access key id Amazon S3 che verrà usata per caricare le immagini." + s3_secret_access_key: "La access key secret Amazon S3 che verrà usata per caricare le immagini." + s3_region: "La region name Amazon S3 che verrà usata per caricare le immagini." + enable_flash_video_onebox: "Attiva l'inserimento di collegamenti swf e flv (Adobe Flash) in onebox. ATTENZIONE: comporta rischi per la sicurezza." default_invitee_trust_level: "Livello di esperienza (0-4) assegnato di default agli utenti invitati." default_trust_level: "Livello di esperienza (0-4) assegnato di default ai nuovi utenti." tl1_requires_topics_entered: "Quanti argomenti deve inserire un utente per essere promosso a livello di esperienza 1." @@ -806,7 +815,7 @@ it: tl3_promotion_min_duration: "Per quanti giorni al minimo mantenere la promozione al livello di esperienza 3 prima che un utente venga degradato al livello di esperienza 2." tl3_requires_likes_given: "Il minimo numero di Mi piace che devono essere dati negli ultimi 100 giorni per essere promossi al livello di esperienza 3." tl3_requires_likes_received: "Il minimo numero di Mi piace che devono essere ricevuti negli ultimi 100 giorni per essere promossi al livello di esperienza 3." - tl3_links_no_follow: "Non cancellare rel=nofollow dai link pubblicati da utenti di livello 3" + tl3_links_no_follow: "Non rimuovere rel=nofollow dai collegamenti pubblicati da utenti con livello di esperienza 3." min_trust_to_create_topic: "Livello minimo richiesto per creare un nuovo argomento." min_trust_to_edit_wiki_post: "Livello minimo richiesto per modificare un argomento segnato come wiki." newuser_max_links: "Quanti collegamenti può aggiungere a un messaggio un nuovo utente ." @@ -815,9 +824,10 @@ it: newuser_max_mentions_per_post: "Massimo numero di menzioni ad un @nome che un utente può fare in un messaggio." newuser_max_replies_per_topic: "Numero massimo di risposte che un nuovo utente può inviare in un singolo argomento, prima che qualcuno risponda." max_mentions_per_post: "Numero massimo di menzioni ad un @nome che chiunque può fare in un messaggio." - create_thumbnails: "Crea anteprime e immagini lightbox anche se troppo grandi per essere contenute in un messaggio." + create_thumbnails: "Crea anteprime e lightbox delle immagini che sono troppo grandi per essere contenute in un messaggio." email_time_window_mins: "Aspetta (n) minuti prima di inviare email di notifica, per dare agli utenti la possibilità di modificare e completare i loro messaggi." - email_posts_context: "Quante risposte precedenti di contesto inserire in una email di notifica." + email_posts_context: "Quante risposte precedenti inserire come contesto nelle email di notifica." + flush_timings_secs: "Frequenza di svuotamento dei dati temporali verso il server, in secondi." max_word_length: "Numero massimo di caratteri che compongono il titolo di un argomento." title_min_entropy: "Minima entropia (caratteri unici) richiesti come titolo di un argomento." body_min_entropy: "Minima entropia (caratteri unici) richiesti come corpo di un messaggio." @@ -826,19 +836,28 @@ it: min_body_similar_length: "Lunghezza minima del corpo di un messaggio che attiva il controllo su argomenti simili." category_colors: "Un elenco di valori esadecimali di colori permessi per le categorie." category_style: "Stile grafico per le etichette di categoria." - authorized_extensions: "Una lista delle estensioni dei file che è permesso caricare sul sito (usa '*' per permettere tutti i tipi di file) " + authorized_extensions: "Una lista di estensioni dei file che è permesso caricare (usa '*' per permettere tutti i tipi di file) " max_similar_results: "Quanti argomenti simili mostrare sopra l'editor quando si scrive un nuovo argomento. Il paragone viene fatto sul titolo e sul corpo." title_prettify: "Evita refusi ed errori comuni nei titoli, incluso il testo tutto maiuscolo, il primo carattere minuscolo, troppi caratteri ! e ?, puntini aggiuntivi alla fine della parola ecc." - topic_views_heat_low: "Dopo questo numero di visualizzazioni, il campo visualizzazioni è leggermente in evidenza." - topic_views_heat_medium: "Dopo questo numero di visualizzazioni, il campo visualizzazioni è abbastanza in evidenza." - topic_views_heat_high: "Dopo questo numero di visualizzazioni, il campo visualizzazioni è molto in evidenza." + topic_views_heat_low: "Dopo tale numero di visualizzazioni, il campo visualizzazioni è evidenziato leggermente." + topic_views_heat_medium: "Dopo tale numero di visualizzazioni, il campo visualizzazioni è evidenziato mediamente." + topic_views_heat_high: "Dopo tale numero di visualizzazioni, il campo visualizzazioni è evidenziato fortemente." + cold_age_days_low: "Dopo tale numero di giorni di conversazione, la data di ultima attività viene evidenziata leggermente." + cold_age_days_medium: "Dopo tale numero di giorni di conversazione, la data di ultima attività viene evidenziata mediamente." + cold_age_days_high: "Dopo tale numero di giorni di conversazione, la data di ultima attività viene evidenziata fortemente." + history_hours_low: "Un messaggio modificato entro tale numero di ore ha l'indicatore di modifica evidenziato leggermente." + history_hours_medium: "Un messaggio modificato entro tale numero di ore ha l'indicatore di modifica evidenziato mediamente." + history_hours_high: "Un messaggio modificato entro tale numero di ore ha l'indicatore di modifica evidenziato fortemente." + topic_post_like_heat_low: "Dopo che il rapporto Mi piace:Messaggi supera tale valore, il campo con il contatore di messaggi è evidenziato leggermente." + topic_post_like_heat_medium: "Dopo che il rapporto Mi piace:Messaggi supera tale valore, il campo con il contatore di messaggi è evidenziato mediamente." + topic_post_like_heat_high: "Dopo che il rapporto Mi piace:Messaggi supera tale valore, il campo con il contatore di messaggi è evidenziato fortemente." faq_url: "Se vuoi usare un documento sulle FAQ ospitato da qualche altra parte, fornisci qui la sua URL completa." tos_url: "Se vuoi usare un documento dei Termini di Servizio ospitato da qualche altra parte, fornisci qui la sua URL completa." privacy_policy_url: "Se vuoi usare un documento sulle Politiche di Privacy ospitato da qualche altra parte, fornisci qui la sua URL completa." newuser_spam_host_threshold: "Quante volte un nuovo utente può inviare un collegamento verso lo stesso host compreso nei messaggi `newuser_spam_host_posts` prima che venga considerato spam." reply_by_email_enabled: "Abilita la possibilità di rispondere ai messaggi tramite email." reply_by_email_address: "Modello per rispondere via email, per esempio: %{reply_key}@risposta.esempio.com o risposte+%{reply_key}@esempio.com" - disable_emails: "Fai che Discourse non invii alcun tipo di email." + disable_emails: "Evita che Discourse invii qualunque tipo di email" pop3_polling_port: "La porta dell'account POP3." email_in: "Permetti agli utenti di pubblicare nuovi argomenti per email (richiede il pop3 polling). Configura gli indirizzi nella scheda \"Impostazioni\" di ciascuna categoria." email_in_min_trust: "Livello di esperienza minimo necessario affinché un utente possa pubblicare nuovi argomenti via email." @@ -1038,15 +1057,97 @@ it: Per ulteriori informazioni, puoi far riferimento alle nostre [community guidelines](%{base_url}/guidelines). usage_tips: - text_body_template: "Questo messaggio privato contiene qualche breve consiglio per permetterti di iniziare.\n\n## Continua a scorrere la pagina\n\nNon ci sono bottoni per cambiare pagina né numeri di pagina - per leggere più messaggi, semplicemente **continua a scorrere la pagina!**\n\nNon appena arrivano nuovi messaggi, questi appaiono automaticamente.\n\n## Dove mi trovo?\n\n- Per fare una ricerca, per la tua pagina utente o per il menu, **usa i pulsanti icona in alto a destra**.\n\n- Cliccando sul titolo di un argomento, verrai sempre portato al prossimo messaggio non ancora letto. Usa la data dell'ultima attività ed il numero del messaggio per saltare in cima o in fondo.\n\n- Mentre leggi un argomento, salta all'inizio ↑ cliccando sul titolo dell'argomento stesso. Clicca la barra di avanzamento verde che si trova in basso a destra per mostrare tutti i pulsanti di navigazione, oppure usa i tasti inizio e fine.\n\n\n\n## Come faccio a rispondere?\n\n- Per rispondere all'argomento base, usa il pulsante Rispondi in fondo alla pagina.\n\n- Per rispondere a un messaggio specifico, usa il pulsante Rispondi su quel messaggio.\n\n- Per deviare la conversazione - anziché andare fuori tema - e lasciare le due conversazioni collegate tra loro, usa Rispondi come Nuovo Argomento alla destra del messaggio.\n\nPer citare qualcuno nella risposta, seleziona il testo che vuoi citare, poi premi qualunque bottone Rispondi.\n\n\n\nPer mandare una notifica a qualcuno nella tua risposta, menziona il suo nome. Inizia digitando `@` e si aprirà un completamento automatico.\n\n\n\nPer [Emoji standard](http://www.emoji.codes/),\ - \ inizia a scrivere `:` oppure direttamente i normali smile `:)` :smile: \n\n## Che altro posso fare?\n\nIn fondo a ogni messaggio ci sono dei pulsanti attivi.\n\n\n\nPer far sapere a qualcuno che ti è piaciuto il suo messaggio, usa il bottone **Mi piace**. Se rilevi un problema con un messaggio, non esitare ad usare il bottone di segnalazione **bandiera** per inviare una notifica privata all'autore o ad un moderatore. \n\nPuoi anche **condividere** un collegamento ad un messaggio, o impostare un **segnalibro** ad un messaggio per riferimenti futuri. \n\n## Chi sta parlando con me?\n\nQuando qualcuno risponde ad un tuo messaggio o lo cita, oppure menziona il tuo `@utente`, appare un numero sul bottone della conversazione in alto a destra della pagina. Usalo per accedere alle tue **notifiche**.\n\n\n\nNon preoccuparti di perdere delle risposte – se non sei online quando arrivano, ti verranno inviate per email le risposte dirette (e i messaggi privati).\n\n## Quand'è che le conversazioni sono considerate nuove?\n\nDi norma sono considerate nuove tutte le conversazioni che hanno meno di due giorni, e sarà automaticamente seguita ogni conversazione alla quale hai partecipato (risposto, creato o letto per un periodo abbastanza lungo). \n\nVedrai accanto a tali argomenti un indicatore blu con dei numeri: \n\n\n\nPuoi modificare le impostazioni di notifica di ciascun argomento con il pannello in fondo all'argomento stesso (questa impostazione si può anche definire per ciascuna categoria). Per modificare il modo in cui segui gli argomenti, o la definizione di ciò che è nuovo, vedi le [tue preferenze](/my/preferences).\n\n## Perché non posso fare alcune cose?\n\nPer ragioni di sicurezza i nuovi utenti hanno alcune limitazioni. Man mano che partecipi, guadagni la fiducia della comunità, ne diverrai un cittadino a pieno titolo e tali limitazioni vengono\ - \ automaticamente rimosse. Quanto raggiungi un [livello di esperienza] (https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) sufficientemente alto, allora guadagnerai ulteriori capacità per aiutarci a gestire insieme questa comunità.\n" + text_body_template: | + Questo messaggio privato contiene alcune indicazioni per cominciare. + + ## Continua a scorrere la pagina + + Non ci sono pulsanti o numeri delle pagine successive - per leggere di più, **scorri semplicemente in giù la pagina** + + I nuovi post compariranno automaticamente man mano. + + ## Dove mi trovo? + + - Per fare una ricerca, per la tua pagina utente o per il menu, **usa i pulsanti icona in alto a destra**. + + - Il titolo di una discussione porta sempre al prossimo post non letto. Usa la data dell'ultima attività per saltare rapidamente al primo o ultimo post in una discussione. + + - Quando leggi una discussione, vai in cima ↑ selezionando il titolo della discussione. Seleziona la barra di avanzamento verde che si trova in basso a destra per mostrare tutti i controlli di navigazione, o usa i tasti inizio e fine della tastiera. + + + + ## Come faccio a rispondere? + + - Per rispondere alla discussione generale, usa il pulsante Rispondi in fondo alla pagina. + + - Per rispondere a un post specifico, usa il pulsante Rispondi su quel messaggio. + + - Per portare la conversazione in una nuova direzione, ma mantenendole collegate, usa Rispondi come nuovo argomento alla destra del messaggio. + + Per citare qualcuno nella tua risposta, seleziona il testo che desideri citare e fai clic su uno dei pulsanti Rispondi. + + + + Per mandare una notifica a qualcuno nella tua risposta, menziona il suo nome. Scrivere `@` ed apparirà un completatore automatico. + + + + For [standard Emoji](http://www.emoji.codes/), just start typing `:` or the traditional smileys `:)` :smile: + + ## Che altro posso fare? + + In fondo a ogni messaggio ci sono dei pulsanti attivi. + + + + Per dire a qualcuno che ti è piaciuto il suo messaggio, usa il bottone **Mi piace** in fondo al messaggio. Se trovi un messaggio con dei problemi, usa subito il bottone **Segnala** in fondo al post e fallo sapere privatamente all'autore o allo staff. + + Puoi anche **condividere** un link a un messaggio, o fare un **segnalibro** di un messaggio per usarlo più tardi sulla tua pagina utente. + + ## Chi sta parlando con me? + + Quando qualcuno risponde a un tuo post, lo cita o menziona il tuo `@nome`, comparirà un numero sul pulsante delle conversazioni in alto a destra nella pagina. Usalo accedere alle tue **notifiche**. + + + + Non preoccuparti di perdere delle risposte – se non sei online quando arrivano, ti verranno inviate per email le risposte dirette (e i messaggi privati) che arrivano. + + ## Quand'è che le conversazioni sono nuove? + + Di norma tutte le conversazioni più recenti di due giorni si considerano nuove, e verrà seguita automaticamente ogni conversazione a cui tu abbia partecipato (risposto, creato, o letto per un certo tempo). + + Vedrai gli indicatori blu "nuovo" e "numero" accanto a queste conversazioni: + + + + Puoi modificare le impostazioni di notifica di ciascuna discussione con i controlli in fondo al topic (questa impostazione si può anche definire per ciascuna categoria). Per modificare il modo in cui segui le discussioni, o la definizione di nuovo, vedi le [tue preferenze utente](%{baseurl}/my/preferences). + + ## Perché non posso fare certe cose? + + Per ragioni di sicurezza i nuovo utenti hanno alcune limitazioni. Man mano che parteciperai guadagnerai la fiducia della comunità, ne diverrai partecipante a pieno titolo e questi limiti verranno rimossi automaticamente. Ad un [livello di fiducia](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) sufficientemente alto guadagnerai ulteriori capacità per aiutarci a gestire insieme questa comunità. welcome_user: subject_template: "Benvenuto su %{site_name}!" - text_body_template: "Grazie per esserti unito a %{site_name}, e benvenuto!\n\n %{new_user_tips} \n\nNoi crediamo fermamente in un [comportamento comunitario civile](%{base_url}/guidelines). \n\nBuona permanenza!\n" + text_body_template: "Grazie per esserti unito a %{site_name}, e benvenuto!\n\n %{new_user_tips} \n\nNoi crediamo sempre in un [comportamento comunitario civile](%{base_url}/guidelines). \n\nBuona permanenza!\n\n(Se vuoi comunicare in privato con [i membri dello staff](%{base_url}/about) come nuovo utente, rispondi semplicemente a questo messaggio privato.)\n" welcome_invite: subject_template: "Benvenuto su %{site_name}!" - text_body_template: "Grazie per aver accettato l'invito su %{site_name} -- benvenuto/a! \n\nTi abbiamo creato un nuovo account: **%{username}**, e sei autenticato. Puoi cambiare il nome visitando [il tuo profilo][prefs]. \n\nPer autenticarti successivamente puoi: \n\n1. Usa **sempre lo stesso indirizzo email** sul quale hai ricevuto l'invito iniziale. Diversamente non riusciremmo a sapere che sei proprio tu! \n\n2. Creare una password univoca nel [tuo profilo][prefs], ed usarla per poi autenticarti. \n\n%{new_user_tips} \n\nNoi crediamo fermamente in un [comportamento comunitario civile](%{base_url}/guidelines). \n\nBuona permanenza! \n\n[prefs]: %{user_preferences_url}\n" + text_body_template: | + Grazie per aver accettato l'invito a %{site_name} -- benvenuto/a!! + + Ti abbiamo creato il nuovo account **%{username}** e sei autenticato sul sito. Puoi cambiare il tuo nome visitando [il tuo profilo utente][prefs]. + + Per fare login in futuro: + + 1. **Usa sempre lo stesso indirizzo email dell'invito originale** quando fai login. Altrimenti non capiremo che sei tu!! + + 2. Crea una password unica per [il tuo profilo utente][prefs], e usala per fare login. + + %{new_user_tips} + + Crediamo nei [comportamenti civili e costruttivi nella comunità](%{base_url}/guidelines), sempre. + + (Se vuoi comunicare privatamente con i [membri dello staff](%{base_url}/about) come nuovo utente, rispondi a questo messaggio privato.) + + [prefs]: %{user_preferences_url} backup_succeeded: subject_template: "Backup completato correttamente" backup_failed: @@ -1077,6 +1178,10 @@ it: text_body_template: "Il tuo file con l'invito di massa è stato processato, %{sent} inviti spediti." bulk_invite_failed: subject_template: "Invito di massa processato con errori" + csv_export_succeeded: + subject_template: "Esportazione dati completa" + csv_export_failed: + subject_template: "Esportazione dati fallita" email_reject_trust_level: subject_template: "Problema email -- Livello Esperienza insufficente" text_body_template: | @@ -1095,6 +1200,12 @@ it: subject_template: "Problema email -- Errore di invio" email_reject_topic_not_found: subject_template: "Problema relativo all'email -- Argomento Non Trovato" + email_reject_topic_closed: + subject_template: "Problema email: argomento chiuso" + text_body_template: | + Spiacenti, ma il tuo messaggio email a %{destination} (intitolato %{former_title}) non è andato a buon fine. + + L'argomento è chiuso. Se pensi che sia un errore, contatta un membro dello staff. too_many_spam_flags: subject_template: "Nuovo account bloccato" text_body_template: "Ciao, \n\nil presente è un messaggio automatico da %{site_name} per informarti che i tuoi messaggi sono stati automaticamente nascosti perché segnalati dalla comunità. \n\nCome misura precauzionale, il tuo nuovo account non può creare altre risposte o argomenti finché il tuo account non verrà revisionato da un membro dello staff. \n\nPer ulteriori informazioni, ti rimandiamo alle [Linee guida della comunità](%{base_url}/guidelines).\n" @@ -1238,7 +1349,6 @@ it: %{base_url}/users/authorize-email/%{email_token} signup_after_approval: subject_template: "Sei stato ammesso su %{site_name}!" - text_body_template: "Benvenuto su %{site_name}! \n\nUn membro dello staff ha approvato il tuo account su %{site_name}. \n\nClicca sul seguente collegamento per confermare e attivare il tuo nuovo account:\n%{base_url}/users/activate-account/%{email_token} \n\nSe il collegamento qui sopra non è cliccabile, prova a copiarlo e incollarlo nella barra degli indirizzi del tuo browser. \n\n%{new_user_tips}\n\nNoi crediamo fermamente in un [comportamento comunitario civile](%{base_url}/guidelines).\n\nSe hai bisogno di comunicare privatamente con i [membri dello staff](/about), rispondi semplicemente a questo messaggio privato.\n\nBuona permanenza!\n" signup: subject_template: "[%{site_name}] Attiva il tuo nuovo account" text_body_template: | diff --git a/config/locales/server.ja.yml b/config/locales/server.ja.yml index 1964da30da..2a5e934260 100644 --- a/config/locales/server.ja.yml +++ b/config/locales/server.ja.yml @@ -33,6 +33,7 @@ ja: messages: too_long_validation: "は、最大文字数(%{max}文字)を超えています。(入力したのは%{length}文字 ) " invalid_boolean: "無効なboolean." + empty: 本文が未入力です。. embed: load_from_remote: "投稿の読み込みに失敗しました。" bulk_invite: @@ -336,6 +337,8 @@ ja: title: "ブックマーク" xaxis: "日" yaxis: "新規ブックマーク数" + starred: + title: "お気に入り" users_by_trust_level: title: "トラストレベル毎のユーザ" xaxis: "トラストレベル" diff --git a/config/locales/server.ko.yml b/config/locales/server.ko.yml index 1891716db0..efdd8844a2 100644 --- a/config/locales/server.ko.yml +++ b/config/locales/server.ko.yml @@ -35,7 +35,6 @@ ko: messages: too_long_validation: "%{length}자를 입력하셨습니다. 최대 %{max}자까지 입력 가능합니다. " invalid_boolean: "잘못된 값" - taken: "이미 사용중입니다. (그룹 이름은 대소문자를 구분하지 않습니다.)" embed: load_from_remote: "글 로딩 중 오류가 발생하였습니다." bulk_invite: diff --git a/config/locales/server.pl_PL.yml b/config/locales/server.pl_PL.yml index 6fb66b08b9..66e32496ae 100644 --- a/config/locales/server.pl_PL.yml +++ b/config/locales/server.pl_PL.yml @@ -35,7 +35,6 @@ pl_PL: messages: too_long_validation: "ograniczono do %{max} znaków, podano %{length}." invalid_boolean: "Nieprawidłowy boolean." - taken: "jest już w użyciu. (nazwy grup nie są wrażliwe na małe i wielkie litery)" accepted: musi zostać zaakceptowane blank: nie może być puste present: musi być puste diff --git a/config/locales/server.pt.yml b/config/locales/server.pt.yml index 1388e0a8b4..9202a0a519 100644 --- a/config/locales/server.pt.yml +++ b/config/locales/server.pt.yml @@ -34,7 +34,6 @@ pt: messages: too_long_validation: "está limitado a %{max} caracteres; inseriu %{length}." invalid_boolean: "Valor lógico inválido." - taken: "já está a ser utilizado. (os nomes dos grupos são insensitivos)" embed: load_from_remote: "Ocorreu um erro no carregamento dessa mensagem." bulk_invite: @@ -1080,22 +1079,8 @@ pt: Contudo, se a mensagem for escondida pela comunidade uma segunda vez, irá manter-se escondida até ser tratada pelo pessoal – e poderão ainda ocorrer ações, incluindo uma possível suspensão da sua conta. Para orientação adicional, por favor consulte as [diretrizes da comunidade](%{base_url}/guidelines). - usage_tips: - text_body_template: "Esta mensagem privada tem algumas dicas para que possa começar.\n\n## Continue a arrastar para baixo\n\nNão há botões para páginas seguintes nem números de páginas – para ler mais, **simplesmente continue a arrastar para baixo!**\n\nÀ medida que novas mensagens vão surgindo, estas irão aparecer automaticamente.\n\n## Onde estou?\n\n- Para pesquisar a sua página de utilizador ou o menu, use o botão com o **icone no canto superior direito**.\n\n- Qualquer título de tópico irá levá-lo à próxima mensagem não lida. Utilize o tempo da última atividade e o contador de mensagens para ir para o início ou para o final.\n- Ao ler um tópico, salte para o topo ↑ ao selecionar o título do tópico. Selecione a barra de progresso verde no canto inferior direito para controlos de navegação completos, ou utilize página principal e chavesfinais.\n\n\n\n## Como posso responder?\n\n- Para responder ao tópico, utilize o botão de Resposta no final de cada página.\n\n- Para responder a uma mensagem específica, utilize o botão de Resposta nessa mensagem.\n\n-Para levar a conversa para um rumo diferente, mas mantê-las hiperligadas utilize Responder como Tópico hiperligado à direita desta mensagem.\n\nPara citar alguém na sua resposta, selecione o texto que pretende citar, e de seguida pressione qualquer um dos botões de Resposta.\n\n\n\nPara mencionar alguém na sua resposta, mencione os seus nomes. Escreva `@` e o preenchimento automático irá aparecer. \n\n\n\nPara [Emoji padrão](http://www.emoji.codes/), simplesmente comece a digitar `:` ou os tradicionais risonhos `:)` :smile:\n\n## O que posso fazer mais?\n\nHá botões de ação no final de cada publicação.\n\n\n\nPara deixar alguém saber que gostou da sua mensagem, utilize o botão **gosto**. Se vir um problema com a mensagem, avise em privado através do botão de **sinalização**.\n\nPode também **partilhar** uma hiperligação de uma publicação, ou **marcá-la** para mais tarde ter a referência na sua página de perfil. \n\nQuem está a falar comigo?\n\nQuando alguém responde à sua mensagem, cita a sua mensagem ou menciona o seu `@nome-de-utilizador`, um número irá aparecer imediatamente no canto superior direito na página. Utilize-o ao aceder às suas **notificações**.\n\n\n\nNão se preocupe em falhar uma resposta – irá receber emails com respostas diretas (e mensagens privadas) se não estiver online quando estas chegam.\n\n## Quando são as conversações consideradas novas?\n\nPor defeito, todas as conversações com menos de dois dias são consideradas novas, e qualquer conversação onde ainda não tenha participado (respondido, criado, ou lido por um extenso período) irão ser automaticamente acompanhadas. \n\nVerá o indicador numérico e o indicador azul (novo) junto desses tópicos:\n\n\n\nPode alterar o estado individual das notificações de um tópico através do controlo no final do tópico (também pode ser definido por categoria). Para mudar a maneira como os tópicos são acompanhados, ou a definição de novo, consulte [as suas preferências](/my/preferences).\n\n## Porque não posso fazer certas coisas?\n\nNovos utilizadores estão um pouco limitados por razões de segurança. À medida que for participando, irá ganhar confiança por parte da comunidade, tornar-se um cidadão completo e essas limitações serão automaticamente removidas. Com um [nível de confiança] suficientemente alto (https://meta.discourse.org/t/what-do-user-trust-levels-do/4924), irá ganhar ainda mais capacidades para ajudar-nos a gerir a comunidade em conjunto.\n" welcome_user: subject_template: "Bem-vindo a %{site_name}!" - text_body_template: | - Bem-vindo e obrigado por se juntar a %{site_name}! - - %{new_user_tips} - - Acreditamos num constante [comportamento comunitário civilizador](%{base_url}/guidelines). - - (Se necessitar de entrar em contacto privado com [os responsáveis do fórum](/about) na qualidade de novo utilizador, basta responder a esta mensagem privada.) - - Desfrute da sua estadia! welcome_invite: subject_template: "Bem-vindo a %{site_name}!" backup_succeeded: @@ -1381,23 +1366,6 @@ pt: %{base_url}/users/authorize-email/%{email_token} signup_after_approval: subject_template: "Foi aprovado no %{site_name}!" - text_body_template: | - Bem-vindo a %{nome_do_sítio}! - - Um elemento da equipa de gestão aprovou a sua conta em %{nome_do_sítio}. - - Clique na seguinte ligação para confirmar e ativar a sua nova conta: - %{url_base}/utilizadores/ativar_conta/%{mensagem_de_correio_eletrónico_de_símbolo} - - Se esta ligação não estiver disponível, experimente copiá-la e colá-la na barra de endereços do seu navegador da internet. - - %{dicas_para_novo_utilizador} - - Acreditamos no [comportamento_civilizado_da_comunidade](%{url_base}/indicações) em todas as circunstâncias. - - (Se necessitar de entrar em contacto em privado com [membros_da_equipa](/sobre) na qualidade de novo utilizador, basta que responda a esta mensagem privada.) - - Desfrute da sua estadia! signup: subject_template: "[%{site_name}] Ativar a sua nova conta" text_body_template: | diff --git a/config/locales/server.pt_BR.yml b/config/locales/server.pt_BR.yml index f3669070ed..63d3b9c1a3 100644 --- a/config/locales/server.pt_BR.yml +++ b/config/locales/server.pt_BR.yml @@ -35,7 +35,7 @@ pt_BR: messages: too_long_validation: "está limitado para %{max} caracteres; você entrou com %{length}." invalid_boolean: "Boleano inválido." - taken: "já foi escolhido. (nomes de grupo não diferenciam maiúsculas e minúsculas)" + taken: "já foi escolhido" accepted: tem que ser aceito blank: não pode estar em branco present: deve estar em branco @@ -70,7 +70,7 @@ pt_BR: template: body: 'Houve problemas com os seguintes campos:' header: - one: '1 erro impediu este %{model} de ser salvo' + one: 1 erro impediu este %{model} de ser salvo other: '%{count} erros impediram este %{model} de ser salvo' embed: load_from_remote: "Houve um erro ao carregar essa mensagem." @@ -655,6 +655,7 @@ pt_BR: educate_until_posts: "Quando o usuário começa a digitar suas primeiras (n) novos posts, mostrar o novo painel pop-up de educação do usuário no compositor." title: "O nome deste site, como usado na tag de título." site_description: "Descreva este site com uma frase, como usado na tag de meta description." + contact_email: "Endereço de email do responsável de contato chave para este site. Usado para notificações críticas tais como sinalizações não controladas, assim como também pela forma de contato em /about para assuntos urgentes." queue_jobs: "APENAS DESENVOLVEDORES! ATENÇÃO! Por padrão, enfileira tarefas no sidekiq. Se desativado, seu site ficará defeituoso." crawl_images: "Recupere imagens de URLs remotas para inserir as dimensões de largura e altura corretos." download_remote_images_to_local: "Converta imagens remotas para imagens locais, transferindo-as; isto evita imagens quebradas." @@ -673,6 +674,7 @@ pt_BR: exclude_rel_nofollow_domains: "Lista de domínios separados por barras verticais (|) onde o nofollow não é adicionado (tld.com irá automaticamente disponibilizar sub.tld.com também) " post_excerpt_maxlength: "Limite de caracteres para o resumo de um post." post_onebox_maxlength: "Tamanho máximo para um Post em caracteres" + onebox_domains_whitelist: "Uma lista de domínios para os quais permitir oneboxing; estes domínios devem suportar OpenGraph ou oEmbed. Teste-os em http://iframely.com/debug" logo_url: "A imagem de logo no topo esquerdo do seu site; se deixado em branco, o título do size será mostrado." digest_logo_url: "O logo alternativo usado no topo do resumo de e-mails do seu site. Se deixar em branco `logo_url` será usado. eg: http://example.com/logo.png" logo_small_url: "A pequena imagem de logo no topo à esquerda do seu site, vista quando rolando a página abaixo. Se deixado em branco, um símbolo de homepage será mostrado." @@ -839,6 +841,7 @@ pt_BR: max_mentions_per_post: "Número máximo de notificações @nome que quem quer que seja pode usar em um post." create_thumbnails: "Criar thumbnails e lightbox para imagens que são muito largas para caber em uma postagem." email_time_window_mins: "Aguardar (n) minutos antes de enviar quaisquer emails de notificação, para dar aos usuários uma chance de editarem e finalizarem seus posts." + email_posts_context: "Quantas respostas prévias incluir como contexto em emails de notificação." max_word_length: "O tamanho máximo permitido de uma palavra, em caracteres, num título de tópico." title_fancy_entities: "Converter caracteres ASCII comuns em entidades HTML nos títulos dos tópicos, ala SmartyPants http://daringfireball.net/projects/smartypants/" min_title_similar_length: "O tamanho mínimo de um título antes que ele seja checado por tópicos semelhantes." @@ -929,6 +932,7 @@ pt_BR: feed_polling_enabled: "Se um feed RSS / ATOM são importados como mensagens" feed_polling_url: "URL do feed RSS / ATOM para importar" embed_by_username: "Nome de usuário Discourse para o usuário que cria os tópicos" + embed_truncate: "Cortar os posts embutidos." embed_category: "Categoria dos posts embutidos." embed_post_limit: "Número máximo de respostas para embutir" embed_whitelist_selector: "Seletor CSS para os elementos que são permitidos em embeds." @@ -1102,6 +1106,8 @@ pt_BR: %{base_url}/users/password-reset/%{email_token} test_mailer: subject_template: "[%{site_name}] Teste de entrega de email" + text_body_template: "Este é um email de teste de\n\n[**%{base_url}**][0]\n\nEntregabilidade de email é complicada. Aqui estão algumas poucas coisas importantes que você deve verificar primeiro:\n\n- Esteja *certo* de definir o from: do `email de notificação` corretamente nas configurações do seu site. **O domínio especificado no endereço \"from\" dos emails que você envia é o domínio contra o qual o seu email será validado**.\n\n- Aprenda como ver o código cru de email no seu cliente de email, para que assim você possa examinar os cabeçalhos de email por pistas importantes. No Gmail, isso é a opção \"exibir original\" no menu drop-down no topo à direita de cada email.\n\n- **IMPORTANTE:** O seu provedor de acesso à internet possui um record de DNS reverso configurado para associar os nomes de domínio e endereços IP dos quais você envia email? [Teste seu record de PTR Reverso][2] aqui. Se o seu provedor de acesso à internet não configurar o record de DNS reverso apropriadamente, é muito pouco provável que qualquer do seu email será entregue.\n\n- O [record SPF][8] do seu domínio é correto? [Teste seu record SPF][1] aqui. Note que TXT \n é o tipo oficialmente correto de record para SPF.\n\n- O [record DKIM][3] do seu domínio é correto? Isso melhorará significativamente a entregabilidade de email. [Teste seu record DKIM][7] aqui.\n\n- Se você roda o seu próprio servidor de emails, verifique e certifique-se que os IPs do seu servidor de emails [não estão em quaisquer blacklists de emails][4]. Também verifique que ele esteja decisivamente enviando um fully-qualified hostname que se resolve em DNS em sua mensagem HELO. Caso contrário, isso fará com que seu email seja rejeitado por muitos serviços de email. \n\n(O modo *fácil* é criar uma conta grátis no [Mandrill][md] ou [Mailgun][mg] ou [Mailjet][mj], os quais têm generosos planos grátis de email e serão suficientes para pequenas comunidades. Você ainda precisará configurar os records SPF e DKIM no seu DNS, apesar disso!) \n\nNós esperamos que você tenha recebido este teste de entregabilidade de email OK!\n\nBoa sorte,\n\nSeus amigos do [Discourse](http://www.discourse.org)\n\n\ + [0]: %{base_url}\n[1]: http://www.kitterman.com/spf/validate.html\n[2]: http://mxtoolbox.com/ReverseLookup.aspx\n[3]: http://www.dkim.org/\n[4]: http://whatismyipaddress.com/blacklist-check\n[7]: http://dkimcore.org/tools/dkimrecordcheck.html\n[8]: http://www.openspf.org/SPF_Record_Syntax\n[md]: http://mandrill.com\n[mg]: http://www.mailgun.com/\n[mj]: http://www.mailjet.com/pricing\n" new_version_mailer: subject_template: "[%{site_name}] Nova versão do Discourse, atualização disponível" text_body_template: | @@ -1175,87 +1181,8 @@ pt_BR: No entanto, se o post é escondido pela comunidade uma segunda vez, ele permanecerá escondido até ser manipuladas pela staff - e pode haver outras medidas, incluindo a possibilidade de suspensão da sua conta. Para informações adicionais, por favor consulte a nossas [diretrizes da comunidade] (%{base_url}/guidelines). - usage_tips: - text_body_template: | - Esta mensagem privada tem algumas dicas para te ajudar a começar. - - ## Continue rodando - - Não existem botões de próxima página ou numerações de página – para ler mais, **simplesmente continue rodando para baixo!** - - Conforme novas mensagens chegam, elas irão aparecer automaticamente. - - ## Onde estou? - - - Para buscar, sua página de usuário, ou o menu, use os **botões do ícone no canto direito superior**. - - - Qualquer título de tópico irá te levar para a próxima mensagem não lida. Utilize o tempo de última atividade e contagem de mensagens para entrar no começo ou no final. - - - Enquanto lê um tópico, vá para o topo ↑ selecionando o título do tópico. Selecione a barra de progresso verde no canto direito inferior para todos controles de navegação, ou utilize as teclas home e end. - - - - ## Como respondo? - - - Para responder ao tópico geral, utilize o botão de Responder bem no final da página. - - - Para responder uma mensagem em específico, utilize o botão de Responder na respectiva mensagem. - - - Se quiser levar a conversa para outro sentido, mas manter elas relacionadas, utilize Responder como um Tópico linkado à direita da mensagem. - - Para citar alguém na sua resposta, selecione o texto que gostaria de citar, daí aperte qualquer botão de Responder. - - - - Para alertar alguém na sua resposta, mencione o nome deles. Tecle `@` e um auto copmpletador surgirá. - - - - Para [Emojis padrões](http://www.emoji.codes/), simplesmente comece digitando `:` ou os tradicionais smileys `:)` :smile: - - ## O que mais posso fazer? - - Em baixo de cada mensagem existem os botões de ações. - - - - Para deixar que saibam que você gostou a mensagem deles, utilize o botão **curtir**. Se você ver algum problema com uma mensagem, avise a pessoa pessoalmente, ou deixe nossa equipe saber a respeito com o botão **sinalizar**. - - Você também pode **compartilhar** um link para uma mensagem, ou **favoritar** para referência posterior na sua página de usuário. - - ## Quem está falando comigo? - - Quando alguém responde ou cita as suas mensagens, ou menciona o seu `@nomedeusuário`, um número imediatamente aparecerá no topo superior da página. Utilize-o para acessar suas **notificações**. - - - - Não se preocupe se não vir uma resposta – você receberá um email sobre respostas direcionadas (e mensagens privadas) caso você não esteja online quando elas chegarem. - - ## Quando as conversas são consideradas novas? - - Por padrão todas conversas com menos de dois dias são consideradas novas, e qualquer conversa da qual você participou (respondeu, criou ou leu por um período extendido) será automaticamente monitorada. - - Você verá um indicador azul, de "novo" ou números, próximos aos tópicos: - - - - Você pode mudar o estado de notificação individual de um tópico via o controle no final dele (isso também pode ser configurado por categorias). Para mudar como você monitora tópicos, ou a definição de "novo", veja [suas preferências de usuário](/my/preferences). - - ## Por que não posso fazer algumas coisas? - - Usuários novos possuem limitações por segurança. Conforme você participa, ganhará a confiança da comunidade, se tornará um cidadão, e todas essas limitações serão automaticamente removidas. Em [níveis de confiança](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) altos suficientes, você ganhará até mesmo novas abilidades para nos ajudar a cuidar da nossa comunidade juntos. welcome_user: subject_template: "Bem-vindo ao %{site_name}!" - text_body_template: | - Obrigado por participar de %{site_name}, e bem-vindo! - - %{new_user_tips} - - Nós acredtamos no [comportamento comunitário civilizado](%{base_url}/guidelines) em todos os momentos. - - (Se você precisa se comunicar em particular com os [membros da staff](/about) como um usuário novo, simplesmente responda à esta mensagem particular.) - - Aproveite a sua estadia! welcome_invite: subject_template: "Bem-vindo ao %{site_name}!" backup_succeeded: @@ -1588,6 +1515,9 @@ pt_BR: static_topic_first_reply: "Altere o primeiro post desse tópico para mudar seu conteúdo na página de %{page_name} \n" guidelines_topic: title: "Perguntas frequentes/Diretrizes" + body: "\n\n## [Este é um Lugar Civilizado para Discussão Pública](#civilized)\n\nPor gentileza trate este fórum de discussão com o mesmo respeito que você teria em um parque público. Nós, também, somos uma comunidade de recursos compartilhados — um local para compartilhar habilidades, conhecimento e interesses através da discussão em andamento.\n\nEstas não são regras duras e firmes, meramente suportes ao julgamento humano de nossa comunidade. Use estas diretrizes para manter um lugar claro, bem-iluminado de conversa pública civilizada.\n\n\n\n## [Melhore a Discussão](#improve)\n\nAjude-nos a fazer deste um grande lugar de discussão ao trabalhar sempre para melhorar a discussão de alguma forma, mesmo que pequena. Se você estiver incerto de que o seu post acrescenta à conversa, pense melhor no que você quer dizer e tente novamente depois.\n\nOs tópicos discutidos aqui importam para nós, e nós queremos que você aja como se eles importassem para você, também. Seja respeitoso com os tópicos e as pessoas que os discutem, ainda que você discorde com algo do que está sendo dito.\n\nUma forma de melhorar a discussão é por descobrir algumas que já estão acontecendo. Por favor passe algum tempo navegando nos tópicos aque antes de responder ou iniciar o seu próprio, e você terá uma chance de conhecer outros que compartilham dos seus interesses.\n\n\n\n## [Seja Agradável, Mesmo Quando Você Discorda](#agreeable)\n\nVocê pode querer responder à algo discordando. Tudo bem. Mas, lembre-se de _criticar idéias, não pessoas_. Por gentileza evite:\n\n* Xingamentos\n* Ataques ad hominem\n* Responder ao tom de um post ao invés do seu conteúdo efetivo.\n* Contradição impensada.\n\nAo invés disso, ministre contra-argumentos razoáveis que aprimorem a conversa.\n\n\n\n## [Sua Participação Conta](#participate)\n\nAs conversas que nós temos aqui colocam um ambiente para todos. Ajude-nos a influenciar o futuro desta comunidade escolhendo empenhar-se em discussões que façam deste fórum um lugar interessante para se estar — e evitando\ + \ aquelas que não façam.\n\nO Discourse fornece ferramentas que permitem a comunidade de identificar coletivamente as melhores (e piores) contribuições: favoritos, likes, sinalizações, respostas, edits, e assim em diante. Utilize estas ferramentas para aprimorar sua própria experiência, e também a de todos os outros.\n\nVamos tentar deixar nosso parque melhor do que nós o encontramos.\n\n\n\n## [Se Você Ver um Problema, Sinalize-o](#flag-problems)\n\nModeradores têm autoridade especial; eles são responsáveis por este fórum. Mas você também. Com a sua ajuda, moderadores podem ser facilitadores da comunidade, não zeladores ou polícia.\n\nQuando você vê um comportamento ruim, não responda. Isso encoraja o comportamento ruim por reconhecê-lo, consume a sua energia, e desperdiça o tempo de todos. _Apenas sinalize-o_. Se as sinalizações aumentam o suficiente, ação será tomada, seja automaticamente ou através de intervenção da moderação.\n\nDe modo a manter nossa comunidade, moderadores se reservam o direito de remover qualquer conteúdo e qualquer conta de usuário por qualquer motivo e quando quer que seja. Moderadores não prevêem novos posts de qualquer modo; os moderadores e operadores do site não têm qualquer responsabilidade por qualquer conteúdo postado pela comunidade.\n\n\n\n## [Sempre Seja Civilizado](#be-civil)\n\nNada sabota uma conversa saudável como a grosseria:\n\n* Seja civilizado. Não poste qualquer coisa que uma pessoa razoável consideraria ofensivo, abusivo, ou discurso de ódio.\n* Deixe-o limpo. Não poste qualquer coisa obscena ou sexualmente explícita.\n* Respeite aos demais. Não perturbe ou aflija, se passe por outras pessoas, ou exponha suas informações particulares.\n* Respeite nosso fórum. Não poste spam ou vandalize o fórum de algum outro modo.\n\nEstes não são termos concretos com definições precisas — evite mesmo a _aparência_ de qualquer destas coisas. Se você estiver incerto, pergunte-se como você se sentiria se sua postagem fosse veiculada na primeira página do New York Times.\n\nEste é um fórum público, e motores de busca indexam\ + \ estas discussões. Mantenha a linguagem, links, e imagens seguros para família e amigos.\n\n\n\n## [Mantenha-o Arrumado](#keep-tidy)\n\nFaça um esforço para colocar coisas no lugar certo, para que assim nós possamos passar mais tempo discutindo e menos limpando. Assim:\n\n* Não inicie um tópico na categoria incorreta.\n* Não faça postagens cruzadas da mesma coisa em múltiplos tópicos.\n* Não poste respostas sem conteúdo.\n* Não desvie um tópico mudando-no em meio à correnteza.\n* Não assine seus posts — cada postagem tem sua informação de perfil anexada à ela. \n\nAo invés de postar \"+1\" ou \"Concordo\", use o botão Like. Ao invés de levar um tópico existente numa direção radicalmente diferente, utilize Responder como um Tópico Linkado.\n\n\n\n## [Poste Apenas Suas Próprias Coisas](#stealing)\n\nVocê deve não postar o que quer que seja digital que pertence a outro sem permissão. Você deve não postar descrições de, links para, ou métodos para roubar a propriedade intelectual de outro (software, vídeo, áudio, imagens), ou para quebrar qualquer outra lei.\n\n\n\n## [Powered by Você](#power)\n\nEste site é operado pela suar [amigável staff local](/about) e *você*, a comunidade. Se você tiver quaisquer outras questões sobre como as coisas devem funcionar aqui, abra um novo tópico na [categoria meta](/c/meta) e vamos discutir! Se houver um assunto crítico ou urgente que não puder ser resolvido por um tópico meta ou sinalização, entre em contato conosco através da [página da staff](/about).\n\n\n\n## [Terms of Service](#tos)\n\nSim, juridiquês é chata, mas nós devemos nos proteger – e por extensão, você e seus dados – contra pessoas não-amigáveis. Nós temos um [Termos of Serviço](/tos) descrevendo a sua (e a nossa) conduta e direitos relacionados a conteúdo, privacidade e leis. Para usar este serviço, você deve concordar em permanecer por nossos [TOS](/tos).\n" tos_topic: title: "Termos de Serviço" body: "Os seguintes termos e condições regem todo o uso do site %{company_domain} e todo o conteúdo, serviços e produtos disponíveis no ou através do site, incluindo, mas não limitado a, o Software do Fórum do %{company_domain}, o Fóruns de Suporte do %{company_domain} e o serviço de hospedagem (\"hosting\") do %{company_domain}, (em conjunto, o site). O site é propriedade e operada por %{company_full_name} (\"%{company_name}\"). O Site é oferecido sujeito à sua aceitação, sem modificação de todos os termos e condições contidos neste documento e todas as outras regras operacionais, políticas (incluindo, sem limitação, a [Política de Privacidade](/privacy) e [Regras da Comunidade ](/faq)) e procedimentos do %{company_domain} que possam ser publicadas de tempos em tempos neste site por %{company_name} (coletivamente, o \"Contrato\").\n\nPor favor, leia este Contrato cuidadosamente antes de acessar ou utilizar o site. Ao acessar ou utilizar qualquer parte do web site, você concorda em ficar vinculado aos termos e condições deste acordo. Se você não concordar com todos os termos e condições deste contrato, então você não pode acessar o site ou utilizar qualquer serviço. Se estes termos e condições são consideradas uma oferta por %{company_name}, a aceitação é expressamente limitada a estes termos. O site está disponível apenas para indivíduos que são pelo menos 13 anos de idade.\n\n\n\n## [1. Sua conta %{company_domain}](#1)\n\nSe você criar uma conta no site, você é responsável por manter a segurança da sua conta e você é totalmente responsável por todas as atividades que ocorrem sob a conta. Você deve notificar imediatamente %{company_name} de qualquer uso não autorizado de sua conta ou qualquer outra violação de segurança. %{company_name} não será responsável por quaisquer atos ou omissões por você, incluindo quaisquer danos de qualquer tipo incorridos como resultado de tais atos ou omissões.\n\n\n\n## [2. Responsabilidade de Contribuintes](#2)\n\nSe você postar o material no site, postar links no site, ou de outra forma (ou permitir que terceiros o fazem) material disponível por meio do\ @@ -1604,3 +1534,26 @@ pt_BR: body: "\n\n## [Quais as informações que recolhemos?](#coleta)\n\nColetamos informações de você quando você se cadastra em nosso site e coletamos dados quando você participar do fórum, lendo, escrevendo, e avaliar o conteúdo compartilhado aqui. \n\nAo se cadastrar em nosso site, você pode ser solicitado a digitar seu nome e e-mail. Você pode, entretanto, visite nosso site, sem registrar. O seu endereço de e-mail será verificado por um e-mail contendo um link único. Se o link é visitado, sabemos que você controla o endereço de e-mail. \n\nQuando registrado e fazendo postagens, registramos o endereço IP que originou o post. Também podemos manter os logs do servidor, que incluem o endereço IP de todos os pedidos para o nosso servidor.\n\n\n\n## [Em que usamos as suas informações?](#uso)\n\nQualquer uma das informações que coletamos de você pode ser usado em uma das seguintes formas: \n\n* Para personalizar a sua experiência — sua informação nos ajuda a responder melhor às suas necessidades individuais. \n* Para melhorar o nosso site — nós nos esforçamos continuamente para melhorar as nossas ofertas de site com base nas informações e feedback que recebemos de você. \n* Para melhorar o serviço ao cliente — sua informação nos ajuda a responder mais eficazmente às suas solicitações de serviço ao cliente e as necessidades de apoio. \n* Para enviar periodicamente e-mails — O endereço de e-mail que você fornece pode ser usado para enviar-lhe informações, as notificações que você quando há mudanças tópicos que solicitou ou em resposta a seu nome de usuário, responder a perguntas, e/ou outras solicitações ou perguntas.\n\n\n\n## [Como vamos proteger a sua informação?](#protecao)\n\nImplementamos uma série de medidas de segurança para manter a segurança de suas informações pessoais quando você entra, envia ou acessa suas informações pessoais.\n\n\n\n## [Qual é a sua política de retenção de dados?](#retencao-dados)\n\nNós vamos fazer um esforço de boa fé para: \n\n* Manter registros do servidor contendo o endereço\ \ IP de todos os pedidos para este servidor não mais que 90 dias. \n* Manter os endereços de IP associados a usuários registrados e suas mensagens não mais que 5 anos.\n\n\n\n## [Nós usamos cookies?](#cookies)\n\nSim. Cookies são pequenos arquivos que um site ou seu fornecedor de serviços transfere para o disco rígido do seu computador através de seu navegador Web (se você permitir). Estes cookies permitem que o site reconhecer o seu browser e, se você tiver uma conta registrada, associá-lo com a sua conta registrada. \n\nNós usamos cookies para compreender e guardar as suas preferências para futuras visitas e compilar dados agregados sobre o tráfego ea interação no site, para que possamos oferecer um site melhor e ferramentas no futuro. Poderemos contratar prestadores de serviços de terceiros para nos ajudar a compreender melhor os nossos visitantes do site. Esses prestadores de serviços não estão autorizados a utilizar as informações coletadas em nosso nome, exceto para nos ajudar a conduzir e melhorar o nosso negócio.\n\n\n\n## [Podemos divulgar qualquer informação a terceiros?](#divulgar)\n\nNós não vendemos, trocamos, ou de outra forma transferrimos a terceiros as suas informações pessoalmente identificáveis. Isso não inclui terceiros de confiança que nos auxiliam no funcionamento do nosso site, conduzindo nosso negócio, ou serviço que a você, desde que as partes concordam em manter esta informação confidencial. Podemos também divulgar as suas informações quando acreditamos que é apropriado para cumprir a lei, fazer cumprir as nossas políticas do site, ou proteger nosso ou de outros direitos, propriedade ou segurança. No entanto, informações turísticas não pessoalmente identificáveis ​​podem ser fornecidas a terceiros para marketing, publicidade, ou outros usos.\n\n\n\n## [Links de terceiros](#terceiros)\n\nOcasionalmente, a nosso critério, podemos incluir ou oferecer produtos ou serviços de terceiros no nosso site. Estes sites de terceiros têm políticas de privacidade separadas e independentes. Portanto, não temos responsabilidade ou obrigações\ \ pelo conteúdo e atividades desses sites. No entanto, buscamos proteger a integridade do nosso site e agradecemos qualquer feedback sobre esses sites.\n\n\n\n## [Privacidade Online Infantil Protection Act Compliance](#coppa)\n\nNosso site, produtos e serviços são todos dirigidos a pessoas que tem pelo menos 13 anos de idade ou mais. Se o servidor for nos EUA, e você está sob a idade de 13, de acordo com as exigências da COPPA ([Lei de Proteção de Privacidade Online de Crianças] (http://en.wikipedia.org/wiki/Children)), não use este site.\n\n\n\n## [Somente Política de Privacidade Online](#online)\n\nEsta política de privacidade online se aplica somente às informações recolhidas pelo nosso site e não a informações coletadas offline.\n\n\n\n## [Seu Consentimento](#consentimento)\n\nAo utilizar nosso site, você concorda com a nossa política de privacidade web site.\n\n\n\n## [Alterações à nossa Política de Privacidade](#mudancas)\n\nSe nós decidirmos mudar nossa política de privacidade, colocaremos essas alterações nesta página. \n\nEste documento é CC-BY-SA. Ele foi atualizado pela última 31 de maio de 2013.\n" + static: + search_help: | +

    Dicas

    +

    +

      +
    • Resultados de título são priorizados, então quando em dúvida, pesquise pelos títulos
    • +
    • Palavras únicas, incomuns sempre produzirão os melhores resultados
    • +
    • Sempre que possível, pesquise com escopo em uma categoria, usuário ou tópico em particular.
    • +
    +

    +

    Opções

    +

    + + + + + + +
    order:viewsorder:latest
    status:openstatus:closedstatus:archivedstatus:norepliesstatus:singleuser
    category:foouser:foo
    in:likesin:postedin:watchingin:trackingin:private
    in:bookmarks
    +

    +

    + arco-íris category:parques status:open order:latest irá pesquisar por tópicos contendo a palavra "arco-íris" na categoria "parques" que não estiverem fechados ou arquivados, ordenados pela data do último post. +

    diff --git a/config/locales/server.ru.yml b/config/locales/server.ru.yml index e740e777ff..eb57bee74e 100644 --- a/config/locales/server.ru.yml +++ b/config/locales/server.ru.yml @@ -35,7 +35,6 @@ ru: messages: too_long_validation: "не может быть длиннее %{max} символов, а введено %{length}." invalid_boolean: "Неправильное булевое значение." - taken: "уже занято. (названия групп нечувствительны к регистру)" embed: load_from_remote: "Произошла ошибка при загрузке сообщения." bulk_invite: diff --git a/config/locales/server.sq.yml b/config/locales/server.sq.yml index 9b03566faa..308bf7c724 100644 --- a/config/locales/server.sq.yml +++ b/config/locales/server.sq.yml @@ -1066,75 +1066,6 @@ sq: However, if the post is hidden by the community a second time, it will remain hidden until handled by staff – and there may be further action, including the possible suspension of your account. For additional guidance, please refer to our [community guidelines](%{base_url}/guidelines). - usage_tips: - text_body_template: | - This private message has a few quick tips to get you started. - - ## Keep scrolling - - There are no next page buttons or page numbers – to read more, **just keep scrolling down!** - - As new posts come in, they will appear automatically. - - ## Where am I? - - - For search, your user page, or the menu, use the **icon buttons at the upper right**. - - - Any topic title will take you to the next unread post. Use the last activity time and post count to enter at the top or bottom. - - - While reading a topic, jump to the top ↑ by selecting the topic title. Select the green progress bar at the bottom right for full navigation controls, or use the home and end keys. - - - - ## How do I reply? - - - To reply to the overall topic, use the Reply button at the very bottom of the page. - - - To reply to a specific post, use the Reply button on that post. - - - To take the conversation in a different direction, but keep them linked together, use Reply as linked Topic to the right of the post. - - To quote someone in your reply, select the text you wish to quote, then press any Reply button. - - - - To ping someone in your reply, mention their name. Type `@` and an autocompleter will pop up. - - - - For [standard Emoji](http://www.emoji.codes/), just start typing `:` or the traditional smileys `:)` :smile: - - ## What else can I do? - - There are action buttons at the bottom of each post. - - - - To let someone know that you enjoyed their post, use the **like** button. If you see a problem with a post, privately let them, or our staff, know about it with the **flag** button. - - You can also **share** a link to a post, or **bookmark** it for later reference on your user page. - - ## Who is talking to me? - - When someone replies to your post, quotes your post, or mentions your `@username`, a number will immediately appear at the top right of the page. Use it access your **notifications**. - - - - Don't worry about missing a reply – you'll be emailed direct replies (and private messages) if you aren't online when they arrive. - - ## When are conversations new? - - By default all conversations less than two days old are considered new, and any conversation you've participated in (replied to, created, or read for an extended period) will automatically be tracked. - - You will see the blue new and number indicators next to these topics: - - - - You can change the individual notification state of a topic via the control at the bottom of the topic (this can also be set per category). To change how you track topics, or the definition of new, see [your user preferences](/my/preferences). - - ## Why can't I do certain things? - - New users are somewhat limited for safety reasons. As you participate here, you'll gain the trust of the community, become a full citizen, and those limitations will automatically be removed. At a high enough [trust level](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924), you'll gain even more abilities to help us manage our community together. welcome_user: subject_template: "Mirë se vini tek %{site_name}!" welcome_invite: diff --git a/config/locales/server.sv.yml b/config/locales/server.sv.yml index 14df7e0f26..fa90ac6bd0 100644 --- a/config/locales/server.sv.yml +++ b/config/locales/server.sv.yml @@ -23,6 +23,9 @@ sv: messages: too_long_validation: "är begränsad till %{max} karaktärer; du skrev in %{length}. " invalid_boolean: "Ogiltigt boolean." + taken: "används redan" + accepted: måste accepteras + blank: kan inte vara blankt present: måste vara tomt confirmation: "matchar inte %{attribute}" empty: kan inte vara tomt diff --git a/config/locales/server.te.yml b/config/locales/server.te.yml index e2135aa50c..71f81f8bd4 100644 --- a/config/locales/server.te.yml +++ b/config/locales/server.te.yml @@ -35,12 +35,12 @@ te: messages: too_long_validation: "%{max} అక్షరాలకే పరిమితము. మీరు %{length} అక్షరాలు రాసారు." invalid_boolean: "చెల్లని బూలియన్" - taken: "ఇప్పటికే ఈపేరు తీసుకోబడింది. (గుంపు పేర్లు కేస్ సెన్సిటివ్ కాదు)" + taken: "ఇప్పటికే తీసుకొన్నారు" accepted: తప్పనిసరి ఒప్పుకోవాలి - blank: ఖాలీ ఉండకూడదు - present: తప్పనిసరి ఖాలీ ఉండాలి + blank: ఖాళీగా ఉండకూడదు + present: తప్పనిసరిగా ఖాళీగా ఉండాలి confirmation: "%{attribute} కు జత అవ్వలేదు " - empty: ఖాలీ ఉండకూడదు + empty: ఖాళీ ఉండకూడదు equal_to: తప్పనిసరిగా %{count} కు సమానంగా ఉండాలి even: జతగా ఉండాలి exclusion: రక్షితము @@ -70,7 +70,7 @@ te: template: body: 'ఈ దిగువ క్షేత్రాలతో సమస్య ఉంది' header: - one: 'ఒక దోషం వల్ల ఈ %[model] భద్రపరుచుట వీలవలేదు' + one: ఒక దోషం వల్ల ఈ %[model] భద్రపరుచుట వీలవలేదు other: '%{count} దోషాల వల్ల %{model} భద్రపరుచుట వీలవలేదు' embed: load_from_remote: "ఈ టపా లోడింగులో దోషం" @@ -127,6 +127,7 @@ te: next_page: "తరువాతి పుట →" prev_page: "← గత పుట" page_num: "పుట %[num]" + topics_in_category: "'%{category}' వర్గంలోని విషయాలు" rss_posts_in_topic: "'%{topic}' యొక్క ఆర్ యస్ యస్ వడ్డన" author_wrote: "%{author} రాసారు:" num_posts: "టపాలు:" @@ -155,6 +156,27 @@ te: until_posts: one: "ఒక టపా" other: "%{count} టపాలు" + new-topic: "స్వాగతం %{site_name} — **కొత్త సంభాషణ మొదలు పెట్టినందుకు ధన్యవాదాలు!**\n\n\n- శీర్షిక ఖచ్చితంగా మీ విషయాన్ని వివరిస్తుందా? ఆసక్తికరంగా ఉందా? \n\n\n\n- ఏ విషయం గురించి ? అది ఆసక్తిగా ఉంటుందా ? ఈ విషయం ఎందుకు ? ఈ సముదాయం నుండి ఏ విధమైన స్పందనలు ఆశిస్తున్నారు ?\n\n\n\n- మీ అంశంలో ఇతరులు శోధించడానికి వీలుగా మంచిశోధన పదాలు కలపండి.మీఅంశాన్ని సంబంధిత\ + \ అంశాలకు జతపరచండి, వర్గాన్ని ఎంచుకోండి.\n\n\n\nమరింత సమాచారం కోసం ,[వర్గ మార్గదర్శకసూత్రాలను చూడండి](/guidelines).ఈ పట్టిక మొదట మీకే కనిపిస్తుంది \n%{education_posts_text}.\n\n\n" + new-reply: | + స్వాగతం %{site_name} — **పాల్గొన్నందుకు ధన్యవాదాలు!** + + - మీ సమాధానం సంభాషణను కొంత మెరుగు పరిచిందా ? + + - తోటి కమ్యూనిటి సభ్యులతో మర్యాదగా ఉండండి . + + - నిర్మాణాత్మక విమర్శలకు స్వాగతం, కానీ *ఆలోచన*లను విమర్శించండి,వ్యక్తులని కాదు. + + + మరింత సమాచారం కోసం ,[వర్గ మార్గదర్శక సూత్రాలను చూడండి](/guidelines).ఈ పట్టిక మొదట మీకే కనిపిస్తుంది%{education_posts_text}. + avatar: | + ###మీ ఖాతాకి ఒక కొత్త చిత్రం గురించి? + + మీరు కొన్ని విషయాలు మరియు ప్రత్యుత్తరాలను పోస్ట్ చేసారు, కానీ మీ అవతార్ మీలాగా ఏకైకం కాదు - ఇది అందరూ కొత్త వినియోగదారులు అదే అప్రమేయ అవతార్ అవుతుంది. + + మీరు ఆలోచించారా **[మీ వినియోగదారు ప్రొఫైల్ సందర్శించడం](%{profile_path})** మరియు మీరు ఎగుమతి చేసిన చిత్రం మిమ్మల్ని సూచిస్తుందా ? + + ప్రతి ఒక్కరూ ఒక ఏకైక అవతార్ కలిగిఉన్నప్పుడు సంఘ చర్చలు జరపడానికి మరియు సభ్యుల ఆసక్తికరమైన సంభాషణలు కనుగొనేందుకు ఇది చాలా సులభం ! activerecord: attributes: category: @@ -185,6 +207,8 @@ te: attributes: hex: invalid: "ఇది చెల్లని రంగు" + user_profile: + no_info_other: "
    %{పేరు} ఇంకా వారి ప్రొఫైల్ లో ఎబౌట్ మీ స్థానంలో ఏమీ చేర్చలేదు
    " vip_category_name: "అడ్డా" vip_category_description: "నమ్మకం స్థాయి మూడు లేదా ఆపై ఉన్న సభ్యులకు మాత్రమే పరిమితమైన వర్గం" meta_category_name: "మెటా" @@ -267,6 +291,9 @@ te: other: "%{count}సం" distance_in_words_verbose: half_a_minute: "ఇప్పుడే" + less_than_x_seconds: + one: "ఇప్పుడే" + other: "ఇప్పుడే" x_seconds: one: "1 సెకన్ వెనుక" other: "%{count} సెకన్ల వెనుక" @@ -328,6 +355,7 @@ te: description: 'ఈ టపా వాణిజ్య ప్రకటన. ప్రస్తుత విషయానికి ఉపయోగకరమైనది కాదు, సంబందించినదీ కాదు. కానీ మార్కెటింగు స్వభావితమైనది.' long_form: 'దీన్ని స్పాముగా కేతనించాము' email_title: '"%{title}" ప్పాముగా కేతనించాము' + email_body: "%{link}\n\n%{message}" inappropriate: title: 'అసమంజసమైనది' description: 'ఈ టపాలో విషయం కొంతమందికి అభ్యంతరకరమైనది, అగౌరవపరిచేది లేదా మా కమ్యునిటీ మార్గదర్శకాలకు లోబడినది కాదు.' @@ -337,11 +365,13 @@ te: description: 'ఈ టపా నేను సభ్యునితో వ్యక్తిగతంగా మాట్లాడాలనుకున్న విషయం కలిగి ఉంది. కేతనం అవ్వసరంలేదు.' long_form: 'సభ్యుడికి ప్రైవేటు సందేశం పంపాము' email_title: '"%{title}" లో మీ టపా' + email_body: "%{link}\n\n%{message}" notify_moderators: title: "వేరే ఏదో" description: 'ఇక్కడ ప్రదర్శిచని వేరే కారణంగా ఈ టపా నిర్వాహకుని దృష్టికి తీసుకెళ్లాలి' long_form: 'దీన్ని నిర్వాహకుని దృష్టికి కేతనించాము' email_title: '"%{title}" లోని ఒక టపా నిర్వాహకుని చర్య కోసం వేచిఉంది. ' + email_body: "%{link}\n\n%{message}" bookmark: title: 'పేజీక' description: 'ఈ టపాకు పేజీక ఉంచు' @@ -361,12 +391,16 @@ te: long_form: 'దీన్ని స్పాముగా కేతనించారు' inappropriate: title: 'అసమంజసం' + description: 'ఈ అంశంలో ఉన్న విషయం ద్వారా ఒక సహేతుకమైన వ్యక్తిని ప్రమాదకరమైన,అసంబధ్ధమైనవానిగా పరిగణిస్తారు,లేదా మన వర్గ మార్గదర్శకాల ఉల్లంఘన జరుగుతుంది.' long_form: 'దీన్ని అసమంజసమైనదిగా కేతనించారు' notify_moderators: title: "వేరే ఏదో" + description: 'మార్గదర్శకాల ఆధారంగా ఈ అంశానికి సాధారణ పరిశీలకుల శ్రధ్ధ అవసరం, TOS, లేదా పైన జాబితాలో పేర్కొనబడని మరొక కారణం కావచ్చు.' long_form: 'దీన్ని నిర్వాహకుల దృష్టికి తెచ్చారు' email_title: '"%{title}" విషయం నిర్వాహకుల దృష్టిలో ఉంది.' + email_body: "%{link}\n\n%{message}" flagging: + you_must_edit: '

    మీ టపా సమూహం ద్వారా కేతనం చెందింది. దయచేసి మీ ఆంతరంగిక సందేశాలు చూడండి.

    ' user_must_edit: '

    ఈ టపా కమ్యునిటీ కేతనించింది. తాత్కాలికంగా దాచబడింది

    ' archetypes: regular: @@ -507,18 +541,85 @@ te: rails_env_warning: "మీ సర్వరు %(env) రీతిలో నడుస్తోంది" ruby_version_warning: "మీరు రూబీ 2.0.0 వాడుతున్నారు. ఇది సమస్యలతో కూడినది. దయచేసి పేచీ స్థాయి 247 లేదా ఆపైకి ఉన్నతీకరించగలరు" host_names_warning: "మీ config/database.yml దస్త్రం అప్రమేయ లోకల్ హోస్ట్ వాడుతున్నది. దాన్ని మీ సైటు పేరుకు మార్చగలరు. " + queue_size_warning: "వరుసలో ఉన్న ఉద్యోగాల సంఖ్య %{queue_size}, ఏది ఆధిక్యత.ఈ సైడ్‌కిక్ ప్రక్రియ(లు) ఒక సమస్య సూచిస్తుంది , లేదా \nమీకు మరింతమంది సైడ్‌కిక్ కార్మికులు అవసరం కావచ్చు." memory_warning: 'మీ సర్వరు ఒక జీబీ కన్నా తక్కువ మెమరీతో నడుస్తున్నది. కనీసం ఒక జీబీ అయినా ఉండుట మంచిది. ' + contact_email_missing: "మీరు మీ సైట్ యొక్క సంప్రదింపు ఈ-మెయిల్ నమోదు చేయండి దాని ద్వారా సైట్‌కు సంబంధించిన అత్యవసర విషయాలు అందుకొంటారు. సైట్ సెట్టింగ్స్‌ లో అప్‌డేట్ చేయండి." + contact_email_invalid: "సైట్ సంప్రదింపు ఈ-మెయిల్ చెల్లదు.సైట్ సెట్టింగ్స్‌ లో అప్‌డేట్ చేయండి." + title_nag: "సైట్ పేరు నమోదు చేయండి.శీర్షికను సైట్ సెట్టింగ్స్‌ లో అప్‌డేట్ చేయండి" + site_description_missing: "శోధన ఫలితాల్లో కనిపించడానికి మీ సైట్ యొక్క ఏకవాక్య వివరణ నమోదు చేయండి.సైట్ వివరణను సైట్ సెట్టింగ్స్‌ లో అప్‌డేట్ చేయండి." + site_contact_username_warning: "ముఖ్యమైన స్వయంసిధ్ధ సందేశాలు పంపడానికి ఒక స్నేహపూర్వక సిబ్బంది వాడుకదారు పేరును Update site_contact_username లో ప్రవేశపెట్టండి సైట్ సెట్టింగ్స్." + notification_email_warning: "ఈ-మెయిల్ ప్రకటనలు మీ డొమైన్ లో ఒక చెల్లుబాటు అయ్యే ఈ-మెయిల్ చిరునామా నుండి పంపలేదు :ఈ-మెయిల్ బట్వాడా అనిశ్చిత మరియు నమ్మలేనిదిగా ఉంటుంది.దయచేసి ప్రకటనను ఉంచండి_ఒక చెల్లుబాటు అయ్యే స్థానిక ఈమెయిల్ చిరునామాకు ఈ-మెయిల్ చేయండిసైట్ సెట్టింగ్స్ లో." content_types: + education_new_reply: + title: "కొత్త వాడుకరి విద్య: మొదటి ప్రత్యుత్తరాలు" + description: "వినియోగదారులు వారి మొదటి రెండు కొత్త ప్రత్యుత్తరాలు టైప్ చేయడం ప్రారంభించిన సమయంలో పాప్‌అప్ మార్గదర్శకత్వం స్వయంచాలకంగా కంపోజర్ పైన కనిపిస్తుంది. " + education_new_topic: + title: "కొత్త వాడుకరి విద్య: మొదటి విషయాలు" + description: "వినియోగదారులు వారి మొదటి రెండు కొత్త విషయాలు టైప్ చేయడం ప్రారంభించిన సమయంలో పాప్‌అప్ మార్గదర్శకత్వం స్వయంచాలకంగా కంపోజర్ పైన కనిపిస్తుంది. " + usage_tips: + title: "కొత్త వాడుకరి మార్గదర్శకత్వం" + description: "కొత్త వాడుకరుల కోసం మార్గదర్శకత్వం మరియు అవసరమైన సమాచారం" welcome_user: title: "సుస్వాగతం: కొత్త సభ్యుడు" + description: "కొత్త వినియోగదారులు సైన్ అప్ చేసినప్పుడు , ఒక ఆంతరంగిక సందేశం స్వయంచాలకంగా పంపుతుంది." + welcome_invite: + title: "స్వాగతం : ఆహ్వానించబడిన వాడుకరి" + description: "చర్చలో పాల్గొనేందుకు ఒక వినియోగదారుని నుండి ఆహ్వానం అంగీకరించినప్పుడు ఒక ప్రైవేట్ సందేశం స్వయంచాలకంగా కొత్తగా ఆహ్వానించిన వినియోగదారులందరికీ అందుతుంది." + login_required_welcome_message: + title: "లాగిన్ అవసరం: స్వాగత సందేశం" + description: "'లాగిన్ అవసరం' సెట్టింగ్ ప్రారంభించబడి ఉన్నప్పుడు లాగ్ అవుట్ వినియోగదారులకు స్వాగతసందేశం ప్రదర్శించబడుతుంది." + login_required: + title: "లాగిన్ అవసరం: హోమ్‌పేజ్" + head: + description: "ట్యాగ్‌ల లోపల HTML ప్రవేశపెట్టబడింది." + top: + title: "పుటల యొక్క పై భాగంలో" bottom: title: "పుటల అడుగు భాగం" + description: "ట్యాగ్ చెయ్యక ముందే HTML ను కలుపుతారు." + site_settings: + min_post_length: "టపా అనుమతించే అక్షరాల కనిష్ఠ పొడవు" + min_private_message_post_length: "ప్రైవేట్ సందేశాలకు కనిష్ఠంగా ఎన్ని అక్షరాలకు అనుమతి" + max_post_length: "టపా అనుమతించే అక్షరాల గరిష్ఠ పొడవు" + min_topic_title_length: "శీర్షిక కు అనుమతించే అక్షరాల కనిష్ఠ పొడవు" + max_topic_title_length: "శీర్షిక కు అనుమతించే అక్షరాల గరిష్ఠ పొడవు" + min_private_message_title_length: "ఒక శీర్షికకు కనిష్ఠంగా ఎన్ని అక్షరాలకు అనుమతి" + min_search_term_length: "శోధనకు అవసరమయ్యే అక్షరాల కనీస పొడవు" + allow_uncategorized_topics: "అనుమతించే విషయాలు వర్గం లేకుండా సృష్టించబడుతున్నాయి." + title: "ఈ సైట్ యొక్క పేరు ,టైటిల్ ట్యాగ్ లో ఉపయోగించారు." + max_topics_in_first_day: "ఈ సైట్ లో వినియోగదారు మొదటి రోజున గరిష్ఠంగా ఎన్ని విషయాలకి అనుమతి ఉంది " + max_replies_in_first_day: "ఈ సైట్ లో వినియోగదారు మొదటి రోజున గరిష్ఠంగా ఎన్ని జవాబులకు అనుమతి ఉంది " + invite_expiry_days: "వాడుకరుల ఆహ్వాన కీ ఎన్ని రోజులు చెల్లుతుంది" + min_password_length: "సంకేతపదపు కనీస పొడవు." + max_likes_per_day: "వినియోగదారులు గరిష్ఠంగా రోజుకు చేయగలిగే లైక్‌ల సంఖ్య" + max_flags_per_day: "వినియోగదారులు గరిష్ఠంగా రోజుకు చేయగలిగే కేతనాల సంఖ్య" + max_bookmarks_per_day: "వినియోగదారులు గరిష్ఠంగా రోజుకు చేయగలిగే బుక్‌మార్క్‌ల సంఖ్య" + max_edits_per_day: "వినియోగదారులు గరిష్ఠంగా రోజుకు చేయగలిగే సవరణల సంఖ్య" + max_topics_per_day: "వినియోగదారులు గరిష్ఠంగా రోజుకు సృష్టించగలిగే విషయాలు" + max_private_messages_per_day: "వినియోగదారులు గరిష్ఠంగా రోజుకు సృష్టించగలిగే ప్రైవేటు సందేశాలు" + max_invites_per_day: "వినియోగదారు గరిష్ఠంగా రోజుకు ఎన్ని ఆహ్వానాలు పంపవచ్చు." + suggested_topics: "విషయం దిగువన చూపే సూచనల సంఖ్య" + newuser_max_links: "కొత్త వాడుకరి టపా కి ఎన్ని లంకెలు జోడించవచ్చు." + newuser_max_images: "కొత్త వాడుకరి టపా కి ఎన్ని చిత్రాలు జోడించవచ్చు." + newuser_max_attachments: "కొత్త వాడుకరి టపా కి ఎన్నిఅనుబంధాలు జోడించవచ్చు" + errors: + invalid_email: "చెల్లని ఈమెయిలు చిరునామా." + invalid_username: "ఆ పేరుతో ఏ వాడురకీ లేరు." + invalid_integer: "విలువ తప్పనిసరిగా సంఖ్య మాత్రమే." + invalid_string: "చెల్లుబాటు కాని విలువ" + invalid_string_min: "కనీసం %{min} అక్షరాలు ఉండాలి." + invalid_string_max: "%{max} కంటే ఎక్కువ అక్షరాలు ఉండకూడదు." search: types: category: 'వర్గాలు' topic: 'ఫలితాలు' user: 'సభ్యులు' original_poster: "మూల టపా రచయిత" + most_posts: "అధిక టపాలు" + most_recent_poster: "ఇటీవలి పోస్టర్" + frequent_poster: "తరచూ వచ్చే పోస్టర్" + topic_statuses: + autoclosed_disabled_lastpost: "ఈ విషయం ఇప్పుడు తెరవబడింది.కొత్త జవాబులకు అనుమతి." login: incorrect_username_email_or_password: "తప్పు సభ్యుని పేరు లేదా ఈమెయిల్ లేదా సంకేతపదం" active: "మీ ఖాతా చేతనమైంది మరియు వాడటానికి సిద్దంగా ఉంది." @@ -527,6 +628,7 @@ te: suspended_with_reason: "మీరు %{date} వరకు లాగిన్ అవ్వలేరు. మీరు సస్పెండైన కారణం: %{reason}" errors: "%{errors}" not_available: "అందుబాటులో లేదు. %{suggestion} ప్రయత్నించండి?" + new_registrations_disabled: "కొత్త ఖాతా నమోదులను ప్రస్తుతం అనుమతించడం లేదు." password_too_long: "సంకేతపదాలు 200 అక్షరాలకు పరిమితం" missing_user_field: "మీరు అన్ని సభ్య క్షేత్రాలూ నింపలేదు" close_window: "ద్రువీకరణ ముగిసింది. ఈ విండోను మూసి కొనసాగండి" @@ -545,13 +647,107 @@ te: ip_address: blocked: "నిలపబడింది" flags_reminder: + please_review: "దయచేసి వాటిని సమీక్షించండి." post_number: "టపా" system_messages: welcome_user: subject_template: "%{site_name} కు సుస్వాగతం!" welcome_invite: subject_template: "%{site_name} కు సుస్వాగతం!" + email_reject_no_account: + subject_template: "ఈ-మెయిల్ విషయం -- తెలియని ఖాతా" + email_reject_topic_not_found: + subject_template: "ఈ-మెయిల్ విషయం -- అంశం కనుగొనలేదు" + too_many_spam_flags: + subject_template: "కొత్త ఖాతా బ్లాక్ చేశారు" + user_notifications: + previous_discussion: "గత జవాబులు" + user_replied: + subject_template: "[%{site_name}] %{topic_title}" + digest: + new_activity: "మీ విషయాలు మరియు టపాల మీద కొత్త కార్యక్రమం మొదలైంది:" + top_topics: "ప్రముఖ టపాలు" + other_new_topics: "ప్రముఖ విషయాలు" + click_here: "ఇక్కడ క్లిక్ చేయండి" + read_more: "ఇంకా చదువు" + more_topics_category: "మరిన్ని కొత్త విషయాలు:" + posts: + one: "1 టపా" + other: "%{count} టపాలు" + account_created: + subject_template: "[%{site_name}] మీ కొత్త ఖాతా" + page_not_found: + popular_topics: "ప్రముఖ" + recent_topics: "తాజా" + see_more: "ఇంకా" + search_title: "ఈ సైట్ వెదుకు" + search_google: "గూగుల్" + terms_of_service: + title: "సేవా నియమాలు" + signup_form_message: 'నేను సేవా నియమాలను చదివాను, వాటికి అంగీకరిస్తున్నాను.' + deleted: 'తొలగించారు' + upload: + images: + fetch_failure: "క్షమించండి, చిత్రం తెచ్చుటలో తప్పిదము ఉంది." + unknown_image_type: "క్షమించండి, మీరు ఎగుమతి చేయడానికి ప్రయత్నించిన ఫైల్ చిత్రం వలె కనిపించడం లేదు." + size_not_found: "క్షమించండి, కానీ మేము చిత్రం యొక్క పరిమాణం నిర్ణయించలేదు. బహుశా మీ చిత్రం పాడై ఉండవచ్చు?" + email_log: + seen_recently: "వినియోగదారు కొత్తగా చూశారు" + notification_already_read: "ఈ ఈమెయిల్ గురించి ప్రకటన ఇప్పటికే చదివబడింది" + post_deleted: "టపా రచయితచే తొలగింపబడింది" + user_suspended: "వినియోగదారు నిలిపివేయబడ్డారు" + already_read: "వినియోగదారు ఇప్పటికే ఈ టపా చదివారు" + body_blank: "ముఖ్యభాగం ఖాళీగా ఉంది" + color_schemes: + base_theme_name: "ఆధారం" + guidelines: "మార్గదర్శకాలు" + edit_this_page: "ఈ పేజిని సవరించు" + csv_export: + boolean_yes: "అవును" + boolean_no: "లేదు" + guidelines_topic: + title: "తఅప్ర/మార్గదర్శకాలు" + body: "\n\n## [బహిరంగ చర్చకు ఇది ఒక నాగరిక స్థానం](#నాగరికత )\n\nదయచేసి ఈ చర్చావేదికను ఒక పబ్లిక్ పార్క్ తో సమానంగా పరిగణించండి.మనకి చాలా ఉపయుక్తమైన భాగస్వామ్య సమాజ పంపిణీ వనరు — కొనసాగుతున్న సంభాషణ ద్వారా నైపుణ్యాలు, జ్ఞానం మరియు ఆసక్తులు పంచుకోవడానికి ఒక చోటు.\n\nఇవి కఠినమైన మరియు ధృడమైన నియమాలు కావు, కేవలం మన సంఘంలో మానవతీర్పుకు\ + \ ఉపకరణాలు.\nనాగరిక ప్రజా సంభాషణ కోసం స్వచ్ఛమైన,మరింత ఆహ్లాదకరమైన స్థానంగా ఉంచడానికి ఈ మార్గదర్శకాలను ఉపయోగించండి.\n\n\n\n## [చర్చను మెరుగుపరచండి](#మెరుగుపరచు)\n\nదీనిని గొప్ప చర్చావేదిక గా తయారుచేయడానికి మీరు ఎల్లప్పుడూ చర్చను మెరుగుపరచడానికి ఏదో విధంగా, చిన్న సహాయమైనా చేయండి. మీరు మీ టపాకి సంభాషణని జత చేసింది లేనిది ఖచ్చితంగా తెలియకపోతే\ + \ , మీరు ఏమి చెప్పదలుచుకున్నారో ఆలోచించండి మరియు మరలా ప్రయత్నించండి.\n\nఇక్కడ చర్చించబడిన విషయాలు మనకు సంబంధించినవి, మరియు మీ విషయంగా భావించండి.విషయం గురించి చర్చించే వ్యక్తుల పట్ల , ఎవరైనా చెప్పినదాని పట్ల విభేధించినా మర్యాదతో వ్యవహరించండి.\n\nచర్చ మెరుగుదలకు ఇప్పటికే ఒక మార్గం కనుగొనడం జరిగింది.మీరు ఏ విషయానికైనా బదులివ్వడానికి లేదా కొత్తగా మొదలు పెట్టడానికి\ + \ ముందు బ్రౌజింగ్ కోసం కొంత సమయం వెచ్చించండి,మరియు మీ అభిరుచులను పంచుకోవడానికి ఒక మంచి సమావేశానికి అవకాశం కల్పిస్తాము.\n\n\n\n## [మీరు విభేధించినప్పటికీ ,సమ్మతంగా వ్యవహరించండి](#సమ్మతి)\n\nమీరు ఏ విషయంతోనైనా విభేధించాలి అనుకొంటే , అది బాగుంది కానీ , గుర్తుంచుకోండి_ఆలోచనలను విమర్శించండి, వ్యక్తులను కాదు_దయచేసి నివారించండి.\n\n*పేరు\ + \ పిలవండి.\n*మానవ దాడులు.\n*అసలు విషయం బదులుగా టపా యొక్క ధ్వనితో సమాధానం ఇస్తుంది.\n*స్వల్ప వైరుధ్యాలు.\n\nబదులుగా, సంభాషణను మెరుగుపర్చడానికి హేతుబధ్దమైన ప్రతివాదనకు అవకాశం కల్పించండి.\n\n\n\n## [మీరు పాల్గొన్న సంఖ్య](#పాల్గొను)\n\nఇక్కడ ఉన్న సంభాషణలన్నింటికీ మేము ఒక ధ్వని ఏర్పాటు చేశాము.ఈ చర్చాస్థలాన్ని మరింత ఆసక్తికరంగా తయారుచేయుటకు\ + \ ఈ వర్గం యొక్క భవిష్యత్‌ను ప్రభావితం చేసే చర్చల్లో పాల్గొని మాకు సహాయం చేయండి — మరియు చేయలేనివి వదిలేయండి.\n\nడిస్కోర్స్ మీకు సమిష్టిగా ఉత్తమ (మరియు చెత్త) రచనలు గుర్తించడానికి సాధ్యమయ్యే వర్గ ఉపకరణాలు అందిస్తుంది.ఇష్టాలు, బుక్‌మార్క్‌లు, జెండాలు, ప్రత్యుత్తరాలు, సవరణలు, మరియు మొదలగునవి.చాలా, మీరు మరియు ప్రతి ఒక్కరూ సొంత అనుభవాన్ని చాలా మెరుగుపరచడానికి\ + \ ఈ సాధనాలను ఉపయోగించండి.\n\nదీని కంటే ఒక మెరుగైన వేదిక దొరికితే , దీనిని వదలడానికి ప్రయత్నించండి.\n\n\n\n## [మీరు ఒక సమస్యని గుర్తించినట్లయితే, కేతనం చెయ్యండి](#సమస్య-కేతనం)\n\nపరిశీలకులు ప్రత్యేక అధికారం కలిగియున్నారు;ఈ చర్చాస్థలంనకు వారే భాధ్యులు.కానీ మీరు కూడా, మీ సహాయంతో పరిశీలకులు వర్గ దోహదకారులుగా ఉంటారు,కాపలాదారులు లేదా\ + \ రక్షకభటులుగా కాదు.\n\nమీరు చెడు ప్రవర్తన చూసినప్పుడు, సమాధానం ఇవ్వకండి. ఇది గుర్తించడం ద్వారా చెడు ప్రవర్తనను ప్రోత్సహిస్తున్నట్లే , మీ శక్తి ఖర్చవుతుంది, మరియు ప్రతి ఒక్కరి సమయం వృధా అవుతుంది. _కేవలం కేతనించండి_.తగినన్ని కేతనాలు వచ్చి ఉంటే ,స్వయంచాలకంగా గాని లేదా పరిశీలకుని జోక్యంతో గాని చర్య తీసుకోబడుతుంది. \n\nమన వర్గం నిర్వహించే క్రమంలో , పరిశీలకులు\ + \ ఏ సమయంలోనైనా మరియు ఏ కారణం చేతనైనా, ఏ విషయాన్నైనా, ఏ వినియోగదారుని ఖాతానైనా తొలగించే హక్కు కలిగియుంటారు.పరిశీలకులు కొత్త టపాలను ఏ విధంగానూ ముందుగా చూడరు; పరిశీలకులు మరియు సైట్ నిర్వాహకులు ఈ వర్గంలోని టపాల లోని విషయం పట్ల ఏ భాధ్యత తీసుకోరు.\n\n\n\n## [ఎల్లప్పుడూ మర్యాదగా వ్యవహరించు](#మర్యాద)\n\nఆరోగ్యకరమైన సంభాషణ చెడిపోయేలా,అమర్యాదగా\ + \ వ్యవహరించకండి.\n\n*మర్యాదతో మెలగండి.ఒక సహేతుకమైన వ్యక్తిని గురించి హానికర, అసంబద్ధ టపాలు లేదా ద్వేషపూరిత ప్రసంగాన్ని చేయవద్దు.\n*స్వఛ్చంగా ఉంచండి. ఎటువంటి అశ్లీలమైన లేదా ప్రత్యక్ష లైంగిక పరమైన టపాలు చేయవద్దు.\n*పరస్పరం గౌరవించుకోండి. వేధించడం లేదా భాధ కలిగించడం,వ్యక్తులను అనుకరించడం,వారి ఆంతరంగిక విషయాలు బహిర్గతపరచడం చేయకండి.\n*మన చర్చావేదికను గౌరవించండి.ఎటువంటి\ + \ స్పామ్ సందేశాలు లేదా హాని కలిగించే టపాలు చేయకండి.\n\nఇవి మిశ్రమ నిబంధనలు,ఖచ్చితమైన నిర్వచనాలు లేవు — ఈ పనుల యొక్క రూపాన్ని కూడా తొలగించండి.మీకు తెలియకుంటే, మీ టపా న్యూ యార్క్ టైమ్స్ ముందు పేజీలో ప్రత్యేక వ్యాసంగా వేయబడితే అని మీరు ఎలాంటి భావన పొందుతారో మిమ్మల్ని మీరే ప్రశ్నించుకోండి.\n\nఇది బహిరంగ చర్చావేదిక, మరియు సెర్చ్ ఇంజన్స్ ఈ చర్చలను సూచిస్తాయి.భాష,\ + \ లంకెలు మరియు చిత్రాలను కుటుంబం మరియు స్నేహితులు కొరకు సురక్షితంగా ఉంచండి.\n\n\n\n## [చక్కగా ఉంచండి](#చక్కగా ఉంచండి)\n\nసంగతులు సరైన స్థానంలో పెట్టడానికి కృషిచేయండి.ఎందుకంటే మేము ఎక్కువ సమయం చర్చలమీద మరియు తక్కువ శుభ్రత మీద పెట్టదలచుకొన్నాం.\n\n*ఒక తప్పు వర్గంలో విషయాన్ని మొదలుపెట్టకండి.\n*ఒకే విషయాన్ని బహుళవిషయాలకు వైరుధ్యమైన\ + \ టపాలు చేయవద్దు.\n *ప్రత్యుత్తరంగా విషయం లేని టపాలు చేయవద్దు.\n*విషయాన్ని మధ్యలో దారి మళ్ళించకండి.\n*మీ టపాలకు సంతకం చేయకండి — ప్రతి టపా మీ వ్యక్తిగత వివరాల సమాచారాన్ని కలిగిఉంటుంది.\n\nమీ టపాలు \"+1\" లేదా \"అంగీకారం\" కంటే ఎక్కువ అయితే , లైక్ బటన్ ని ఉపయోగించండి. అయితే మౌలికంగా విభిన్న దిశలో ఇప్పటికే తీసుకొని ఉన్నదాని కంటే ఎక్కువగా ఉంటే, అనుబంధ విషయాన్ని\ + \ సమాధానంగా ఉపయోగించండి.\n\n\n\n## [మీ సొంత విషయాన్ని మాత్రమే టపా చేయండి](#దొంగతనము)\n\nమీరు ఎవరికో చెందిన విషయాన్ని వారి అనుమతి లేకుండా టపా చేయకూడదు.మీరు, ఏ ఇతర చట్టాన్ని అతిక్రమించి వర్ణనలు, లింకులు, లేదా పద్ధతులు ఒకరి మేధో సంపత్తి నుండి దొంగిలించిన \n(సాఫ్ట్వేర్, వీడియో, ఆడియో, చిత్రాలు) టపా చెయ్యకూడదు.\n\n\n\ + \n## [మీరే ఆధారం](#శక్తి)\n\nఈ సైట్ మీ [స్నేహపూర్వక స్థానిక సిబ్బంది] ద్వారా నిర్వహించబడుతుంది. మీకు ఇంకా ఇక్కడ విషయాలు ఎలా పని చేస్తాయి అని ఏవైనా ప్రశ్నలు ఉంటే ,ఒక కొత్త విషయాన్ని తెరచి [మెటా వర్గం](/c/మెటా) చర్చించండి! ఒక మెటా అంశం లేదా కేతనం ఒక క్లిష్టమైన లేదా తక్షణ సమస్యగా ఉండి ఉంటే , మమ్మల్ని [సిబ్బంది పేజ్](/గురించి) ద్వారా సంప్రదించండి.\n\n\n\n## [సేవా నిబంధనలు](#నిబంధనలు)\n\nఅవును, చట్టం విసుగు ప్రక్రియ,– మరియు పొడగింపు ద్వారా, మీరు మరియు మీ సమాచారం – ప్రతికూలమైన చర్యలకు వ్యతిరేకంగా కానీ మనల్ని మనంరక్షించుకోవాలి.మనం [సేవా నిబంధనలు]ను విషయానికి సంబంధించిన మీ (మరియు మా) ప్రవర్తన మరియు హక్కులను వివరిస్తూ గోప్యతా మరియు చట్టాలు ఉన్నాయి.ఈ సేవలను ఉపయోగించుకోవడానికి, మనం కట్టుబడి\ + \ ఉండాలి.[నిబంధనలు](/నిబంధనలు).\n" tos_topic: title: "సేవా నిబంధనలు" privacy_topic: title: "ప్రైవసీ పోలసీ" + static: + search_help: | +

    సూచనలు

    +

    +

      +
    • టైటిల్ వెతుకులాటలో, ఏదైనా సందేహం ఉన్నప్పుడు, ప్రాధాన్యతాక్రమంను బట్టి సరిపోలుతుంది
    • +
    • ప్రత్యేక, అసాధారణ పదాలు ఎల్లప్పుడూ ఉత్తమ ఫలితాలను ఇస్తాయి
    • +
    • వీలైనప్పుడల్లా, మీరు ఒక నిర్దిష్ట వర్గం, వినియోగదారు, లేదా అంశం శోధించడానికి అవకాశం ఉంటుంది
    • +
    +

    +

    ఆప్షన్‌లు

    +

    + <పట్టిక> + క్రమము:చూపులుక్రమము:తాజా + స్థాయి:తెరచివుంచుస్థాయి:మూసిఉంచుస్థాయి:భద్రపరచుస్థాయి:సమాధానంలేనిస్థాయి:ఒకేవినియోగదారు + వర్గం:ఫోవినియోగదారు:ఫో + ఇష్టాలలోటపాలలోవీక్షణాలలోట్రాకింగ్‌లోవ్యక్తిగతాలలో + బుక్‌మార్క్‌లలో + +

    +

    + ఇంధ్రధనస్సు వర్గం:నిలుపు స్థాయి:తెరుచు స్థాయి:తాజా ఏదేని విషయంలో "రెయిన్‌బో" అన్న పదo ఉంటే "నిలుపు" వర్గం లోని మూసివేసిన లేదా భద్రపరచిన దానిలో,ఆఖరి టపా తేదిని బట్టి వెదకండి. +

    diff --git a/config/locales/server.tr_TR.yml b/config/locales/server.tr_TR.yml index d2ca47700e..e0212d6c33 100644 --- a/config/locales/server.tr_TR.yml +++ b/config/locales/server.tr_TR.yml @@ -35,7 +35,6 @@ tr_TR: messages: too_long_validation: "%{max} karakter ile limitli; siz %{length} karakter girdiniz." invalid_boolean: "Geçersiz boolean değeri." - taken: "daha önce alındı. (grup isimleri büyük/küçük harfe duyarlıdır)" accepted: onaylanmalı blank: boş bırakılamaz present: boş bırakılmalı @@ -1118,109 +1117,10 @@ tr_TR: post_hidden: subject_template: "Topluluk tarafından bayraklandığı için gönderiniz gizlendi" text_body_template: "Merhaba,\n\nBu, gönderinizin gizlendiğini haber vermek için %{site_name} sitesinden gönderilmiş otomatik bir mesajdır.\n\n%{base_url}%{url}\n\n%{flag_reason}\n\nGönderiniz gizlenmeden önce birden fazla kullanıcı tarafından bayraklandı. Lütfen, bu geri bildirimler doğrultusunda gönderinizi nasıl düzelteceğinizi düşünün. **Gönderinizi %{edit_delay} dakika sonra düzenleyebilirsiniz, otomatik olarak tekrar yayına alınacaktır.** Bu sistemdeki güven seviyenizi yükseltecektir. \n\nAncak, eğer gönderiniz kullanıcılar tarafından ikinci kere gizlenirse, görevliler tarafından incelenene kadar gizli kalacaktır - ve hesabınızın askıya alınması dahil olmak üzere farklı önlemler alınabilir.\n\nDaha fazla bilgi için, lütfen [topluluk yönergelerine bakın](%{base_url}/guidelines).\n\n" - usage_tips: - text_body_template: | - Bu özel mesaj, hemen harekete geçebilmeniz için bir kaç pratik tavsiye içerir. - - ## Sayfayı aşağı kaydırmaya devam edin - - Farkettiğiniz gibi sonraki herhangi bir sayfa butonu ya da sayfa sayısı yok - daha fazla okumak için, **sayfayı aşağı kaydırmanız yeterli!** - - Yeni gönderiler geldikçe, otomatik olarak görünürler. - - ## Neredeyim? - - - Arma, kullanıcı sayfanız, veya menü için **sağ üstteki ikonlu butona** tıklayın. - - - Herhangi bir konu başlığı sizi bir sonraki okunmamış gönderiye götürür. En üst veya en alta gitmek için son aktivite zamanı ve gönderi sayısını kullanın. - - - Bir konuyu okurken, konu başlığına tıklayarak en üste ↑ zıpla. Tüm navigasyonla ilgili kontroller için sağ alttaki yeşil ilerleme barını seç, veya home and end tuşlarını kullan. - - - - ## Nasıl cevaplarım? - - - Genel olarak konuya cevap vermek için, sayfanın en altındaki Cevapla butonunu kullanın. - - - Belirli bir gönderiye cevap vermek için, o gönderinin altında bulunan Cevapla butonunu kullanın. - - - Sohbeti bölmeden başka bir yöne çekmek için, bgönderinin sağındaki Bağlantılı Konu Oluştururarak Cevapla'ya tıklayın. - - Cevabınızda birinden alıntı yapmak için, alıntı yapmak istediğiniz metni seçin ve sonrasında herhangi bir Cevapla butonuma tıklayın. - - - - Cevabınızda birine ping atmak istiyorsanız, o kişinin isminden bahsedin. `@` yazdığınız an otomatik tamamlayıcı pop-up'ı belirecektir. - - - - [Standart Emoji](http://www.emoji.codes/) için, `:` yazın ya da gülücük `:)` atın :smile: - - ## Başka neler yapabilirim? - - Her gönderinin altında aksiyon butonları var. - - - - Birine gönderisini beğendiğinizi belirtmek istiyorsanız, **beğen** butonunu kullanın. Gönderiyle ilgili bir sorun görüyorsanız, görevlilere durumu bildirmek için **bayrakla** butonunu kullanın. - - **Paylaş** butonu aracılığıyla gönderiye bir bağlantı paylaşabilir, veya **işaretle** butonu ile gönderiyi işaretleyip sonrasında kullanıcı sayfanızdan kolayca ulaşabilirsiniz. - - ## Kim benimle konuşuyor? - - Biri gönderinize cevap verir, gönderinizi alıntılar, ya da `@kullanıcıadı` nızdan bahsederse, sayfanızın en sağ üstünde bir sayı hemen beliriverir. Bu sayıya tıklayarak **bildiriler**inize ulaşabilirsiniz. - - - - Bir cevabı kaçıracaksınız diye kaygılanmayın – çevrimiçi değilseniz direk cevaplar (ve özel mesajlar) geldikçe tarafınıza bilgilendirme emaili atılır. - - ## Hangi durumda sohbetler yeni sayılır? - - Varsayılan olarak, üzerinden henüz iki gün geçmemiş tüm sohbetler yeni sayılır. Katıldığınız (cevapladığınız, oluşturduğunuz, veya uzun bir süre okuduğunuz) tüm sohbetler otomatik olarak takip edilir. - - Bu konuların yanında mavi yeni ve sayı işaretlerini göreceksiniz. - - - - Herhangi bir konunun bildiri durumunu o konunun altın bulunan kontrol aracılığıyla değiştirebilirsiniz. (Bu ayar kategori bazında da yapılabilir.) Konuları nasıl takip ettiğinizi ya da yeninin tanımını değiştirmek için, [kullanıcı ayarlarınıza](/my/preferences) göz atın. - - ## Bazı şeyleri niye yapamıyorum? - - Güvenlik sebeplerin ötürü yeni kullanıcılar bazı kısıtlamalara tabidir. Burada sohbetlere katıldıkça, topluluğun güvenini kazanırsınız, onun tam bir parçası haline gelirsiniz ve bu limitler de otomatik olarak kalkar. En yüksek [güvenlik seviyelerinde](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) ise topluluğumuzu birlikte yönetmemize yardımcı olabilmenizi sağlayacak yetkiler kazanırsınız. welcome_user: subject_template: "%{site_name} sitesine hoşgeldiniz!" - text_body_template: | - %{site_name} sitesine 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. - - (Eğer yeni bir kullanıcı olarak [görevlilerle](/about) iletişim kurmak isterseniz, bu özel mesajı cevaplamanız yeterli.) - - Ziyaretinizin keyfini çıkarın! welcome_invite: subject_template: "%{site_name} sitesine hoşgeldiniz!" - text_body_template: | - %{site_name} davetiyenizi onayladığınız için teşekkürler -- hoşgeldiniz! - - Sizin için yeni bir hesap oluşturduk: **%{username}**, ve sisteme girişiniz yapıldı. [Kullanıcı profilinizi][prefs] ziyaret ederek kullanıcı adınızı değiştirebilirsiniz. - - Daha sonra tekrar giriş yapmak için: - - 1. Giriş yaparken her zaman **ilk davetiyenizdekiyle aynı email adresini kullanın**. Yoksa sizin olduğunuzu anlayamayız. - - 2. [Kullanıcı profiliniz][prefs] için yeni bir şifre oluşturun ve o şifre ile giriş yapın. - - %{new_user_tips} - - Biz her zaman [medeni topluluk davranışına](%{base_url}/guidelines) inanıyoruz. - - (Eğer yeni bir kullanıcı olarak [görevlilerle](/about) iletişim kurmak isterseniz, bu özel mesajı cevaplamanız yeterli.) - - Ziyaretinizin keyfini çıkarın! - - [prefs]: %{user_preferences_url} backup_succeeded: subject_template: "Yedekleme başarıyla tamamlandı" text_body_template: "Yedekleme başarıyla tamamlandı.\n\n[admin > backup section](/admin/backups) bölümünden yeni yedeği indirebilirsiniz." @@ -1505,7 +1405,6 @@ tr_TR: %{base_url}/users/authorize-email/%{email_token} signup_after_approval: subject_template: "%{site_name} sitesinde hesabınız onaylandı!" - text_body_template: "%{site_name} sitesine hoşgeldiniz! \n\n%{site_name} sitesindeki hesabınız bir görevli tarafından onaylandı. \n\nAşağıdaki linke tıklayın ve yeni hesabınızı aktive edin: \n%{base_url}/users/activate-account/%{email_token} \n\nEğer link tıklanabilir değilse, linki kopyalayıp tarayıcınızın adres çubuğuna yapıştırmayı deneyebilirsiniz. \n\n%{new_user_tips}\n\nBiz her zaman [medeni topluluk davranışına](%{base_url}/guidelines) inanıyoruz.\n\n(Eğer yeni bir kullanıcı olarak [görevlilerle](/about) iletişim kurmak isterseniz, bu özel mesajı cevaplamanız yeterli.)\n\nZiyaretinizin keyfini çıkarın!\n" signup: subject_template: "[%{site_name}] Yeni hesabınızı etkinleştirin" text_body_template: | diff --git a/config/locales/server.zh_CN.yml b/config/locales/server.zh_CN.yml index 907f60177a..f61ca6fbfd 100644 --- a/config/locales/server.zh_CN.yml +++ b/config/locales/server.zh_CN.yml @@ -35,7 +35,7 @@ zh_CN: messages: too_long_validation: "最多只能有 %{max} 个字符;你已经输入了 %{length} 个字符。" invalid_boolean: "无效布尔值。" - taken: "已经被使用。(群组名大小写敏感)" + taken: "已经被使用" accepted: 必须被接受 blank: 不能为空 present: 必须为空 @@ -67,7 +67,7 @@ zh_CN: template: body: '下列栏目有问题:' header: - other: '有 %{count} 错误使得 %{model} 无法被保存' + other: 有 %{count} 错误使得 %{model} 无法被保存 embed: load_from_remote: "载入帖子时遇到错误。" bulk_invite: @@ -119,7 +119,7 @@ zh_CN: is_invalid: "无效;请描述得更清楚一点" next_page: "下一页 →" prev_page: "← 上一页" - page_num: "#{num} 页" + page_num: "%{num} 页" topics_in_category: "'%{category}'分类中的主题" rss_posts_in_topic: "'%{topic}' 的 RSS 内容聚合" rss_topics_in_category: "分类 '%{category}' 中主题的 RSS 内容聚合" @@ -1199,35 +1199,33 @@ zh_CN: 需要了解更多,请查看我们的[社群指引](%{base_url}/guidelines)。 usage_tips: text_body_template: | - 这条私信包含了一些可以让你快速开始的技巧提示: + 这条私信包含了一些可以让您快速开始的技巧提示: ## 保持滚动 - 没有下一页按钮或者页码——要阅读更多, **只需要继续向下滚动页面!** + 没有下一页按钮或者页码——要阅读更多,**只需要继续向下滚动页面!** 当新的帖子加载后,它们会自动显示。 ## 我在哪儿? - - 要搜索,访问你的用户页面或者菜单,使用**右上角的图标按钮**。 + - 要搜索,访问您的用户页面或者菜单,使用**右上角的图标按钮**。 - - 任何主题标题点击后都将引导你至下一个未读的帖子。使用最后一次活动时间和帖子数量跳至主题顶部或底部。 + - 任何主题标题点击后都将引导您至下一个未读的帖子。使用最后一次活动时间和帖子数量跳至主题顶部或底部。 - 当在阅读主题时,通过点击帖子标题回到顶部 ↑。点击右下角的绿色进度条使用完整导航控制,或使用键盘上的 homeend键。 - - ## 我怎么回复? - 要回复整个主题,使用页面最底下的回复按钮 。 - 要回复特定的帖子,使用那个帖子的回复按钮 。 - - 如果你想把讨论导向另一个方向,但是保持讨论之间的联系,请使用帖子右侧的“回复为联结主题”。 + - 如果您想把讨论导向另一个方向,但是保持讨论之间的联系,请使用帖子右侧的“回复为联结主题”。 - 若想在你的回复中引用什么,选择想要引用的文字,然后点击任何回复按钮。 + 若想在您的回复中引用什么,选择想要引用的文字,然后点击任何回复按钮。 每一个帖子最下方有功能按钮。 @@ -1235,7 +1233,7 @@ zh_CN: (要引用整个帖子,使用编辑器工具栏的导入引用按钮。) - 要在你的回复中提到某人,键入 `@`,自动完成将会弹出。 + 要在您的回复中提到某人,键入 `@`,自动完成将会弹出。 @@ -1245,47 +1243,46 @@ zh_CN: - 要让别人知道你喜欢他们的帖子,使用**赞**按钮。如果你觉得一个帖子有问题,请使用**标记**按钮以私下地让它们或者我们的职员了解情况。 - - 你可以分享一个帖子的链接,或者是收藏一个帖子以在用户也中引用他们。 + 要让别人知道您喜欢他们的帖子,使用**赞**按钮。如果您觉得一个帖子有问题,请使用**标记**按钮以私下地让它们或者我们的职员了解情况。 + 您可以分享一个帖子的链接,或者是收藏一个帖子以在用户也中引用他们。 ## 谁在跟我交谈? - 当有人回复你的帖子,引用你的帖子或者使用`@用户名`提及到你的时候,一个数字将会立即出现在页面右上角。使用它查看**通知**。 + 当有人回复您的帖子,引用您的帖子或者使用`@用户名`提及到您的时候,一个数字将会立即出现在页面右上角。使用它查看**通知**。 - 不用担心错过他人的回复 —— 当别人回复你的帖子(和私信)时你不在站点上,你将会收到邮件提醒。 + 不用担心错过他人的回复 —— 当别人回复您的帖子(和私信)时您不在站点上,您将会收到邮件提醒。 ## 哪一个是新讨论? - 默认情况,所有小于两天的对话被认为是心的,并且所有你参与的讨论(回复过的、创建的或阅读了很长一段时间的)将自动被追踪。 + 默认情况,所有小于两天的对话被认为是心的,并且所有您参与的讨论(回复过的、创建的或阅读了很长一段时间的)将自动被追踪。 - 你将会在主题名字附近见到蓝色的新以及数字指示: + 您将会在主题名字附近见到蓝色的新合数字指示: - 你可以通过帖子下方的控制选项改变每一个主题的通知状态(也可以设置每一个分类的状态)。要改变你跟踪帖子的方式,或新的定义,详见[你的用户设置](/my/preferences)。 + 您可以通过帖子下方的控制选项改变每一个主题的通知状态(也可以设置每一个分类的状态)。要改变您跟踪帖子的方式,或新的定义,详见[您的用户设置](%{base_url}/my/preferences)。 ## 为什么我不能做某些事? - 新用户因为某些安全原因被限制。只要你参与了讨论,你将会得到社群的信任,成为一个真正的成员,并且这些限制将自动被移除。当达到了一个足够的[信任等级](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924),你将会得到足够的权力来参与帮助社群管理。 + 新用户因为某些安全原因被限制。只要您参与了讨论,您将会得到社群的信任,成为一个真正的成员,并且这些限制将自动被移除。当达到了一个足够的[信任等级](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924),您将会得到足够的权力来参与帮助社群管理。 welcome_user: subject_template: "欢迎来到 %{site_name}!" text_body_template: | - 感谢加入 %{site_name},并且欢迎! + 感谢驻足%{site_name},欢迎! %{new_user_tips} 我们始终相信[讨论应该文明](%{base_url}/guidelines)。 - (如果您在新用户级别需要和[职员](/about)私下沟通的话,请回复这一私信。) - 好好享受你在论坛的时光吧! + + (如果您在新用户级别需要和[职员](%{base_url}/about)私下沟通的话,直接回复这封私信。) welcome_invite: subject_template: "欢迎来到 %{site_name}!" - text_body_template: "感谢你接受邀请加入 %{site_name} —— 欢迎!\n\n我们为你创建了账号:**%{username}**,同时你已经登录了。你可以在任何时候访问[你的用户设置][prefs]来修改它。\n\n要再次登入,或者:\n\n1. 永远 **使用收到邀请的邮箱地址**登录,。否则我们就无法分辨是不是你本人!\n\n2. 在 %{site_name} 的[用户设置][prefs]页面创建一个密码,然后使用该密码来登入。 \n\n%{new_user_tips}\n\n我们始终相信[讨论应该文明](%{base_url}/guidelines)。\n\n(如果您在新用户级别需要和[职员](/about)私下沟通的话,请回复这一私信。)\n\n好好享受您在论坛的时光吧!\n\n[prefs]: %{user_preferences_url}\n" + text_body_template: "感谢你接受邀请加入%{site_name} —— 欢迎!\n\n我们为你创建了账号:**%{username}**,同时你已经登录了。你可以在任何时候访问[你的用户设置][prefs]来修改它。\n\n要再次登入,或者:\n\n1. 永远 **使用收到邀请的邮箱地址**登录,。否则我们就无法分辨是不是你本人!\n\n2. 在 %{site_name} 的[用户设置][prefs]页面创建一个密码,然后使用该密码来登入。 \n\n%{new_user_tips}\n\n我们始终相信[讨论应该文明](%{base_url}/guidelines)。\n\n好好享受您在论坛的时光吧!\n\n(如果您在新用户级别需要和[职员](%{base_url}/about)私下沟通的话,直接回复这封私信。)\n\n[prefs]: %{user_preferences_url}\n" backup_succeeded: subject_template: "备份成功完成" text_body_template: "备份成功。\n访问[管理 > 备份](/admin/backups)下载你的新备份文件。" @@ -1575,9 +1572,9 @@ zh_CN: signup_after_approval: subject_template: "你已经被 %{site_name} 论坛批准加入了!" text_body_template: | - 欢迎加入 %{site_name}! + 欢迎加入%{site_name}! - 一个职员批准了您在 %{site_name} 的账户。 + 一个职员批准了您在%{site_name}的账户。 点击下面的链接来确认并激活您在 %{site_name} 上的新账号: %{base_url}/users/activate-account/%{email_token} @@ -1588,9 +1585,9 @@ zh_CN: 我们始终相信[讨论应该文明](%{base_url}/guidelines)。 - (如果您在新用户级别需要和[职员](/about)私下沟通的话,请回复这一私信。) - 好好享受您在论坛的时光吧! + + (如果您在新用户级别需要和[职员](%{base_url/about)私下沟通的话,直接回复这封私信。) signup: subject_template: "[%{site_name}] 激活你的新帐号" text_body_template: | @@ -1656,7 +1653,7 @@ zh_CN: 编辑本主题的第一帖以改变 %{page_name} 页面的内容。 guidelines_topic: title: "FAQ/指引" - body: "\n\n## [文明讨论的地方](#civilized)\n\n请您在论坛表现得像在公共公园。我们也同样分享着一个公共社群资源 — 一个通过不断进行的讨论分享我们技能、知识和兴趣的地方。\n\n这些都不是硬性规定,只是一些帮助社群的人们来判断的规定。试用这些指引来保持干净和充满灵感的公开论坛。\n\n\n\n## [改善讨论](#improve)\n\n帮助我们做一些帮助改善讨论的事,这样能帮助我们让这个地方变成一个参与讨论的好地方。\n\n这里被讨论的主题对我们很重要,并且如果他们对您也很重要,请和我们一样严肃对待他们。即使您不同意别人的话,但是也要尊重正在讨论这些主题的人们。\n\n改进讨论的一个方式是探索已经发生过的事。请在回复或者开始您自己的主题前花一些时间浏览,这样您更有机会遇见和您有共同爱好的人。\n\n\n\n## [尊重,当您不同意时](#agreeable)\n\n您可能想表达您的不同意。这没问题。但是,记住_批评观点,而不是人_。请避免:\n\n* 指名道姓。\n* 人生攻击。\n* 回应帖子的语气而不是它的真正内容。\n* 下意识的反驳。\n\n相反,提供合理的观点改善讨论。\n\n\n\n## [您的参与有价值](#participate)\n\n我们在这儿的讨论为大家树立了榜样。通过选择参与那些让论坛变成一个有意思的地方,来帮助我们改善社群的未来 — 并且避免那些没有帮助的行为。\n\nDiscourse 提供了让社群共同鉴别最棒(或最差)的贡献的工具:收藏、书签、赞、标记、回复、编辑或者其他。使用这些工具改善您自己的体验,和其他人的体验。\n\n让我们留下一个比发现它之前更好的社群。\n\n\n\n## [如果您看见了一个问题,标记它](#flag-problems)\n\n版主有特别的权力;他们对论坛负责。但是您也是。通过您的帮助,版主能促进社群的发展,而不是守卫或者警察。\n\n当您见到不合适的行为,不要回应它。这种承认变相鼓励了这种不合适的行为,浪费了您的经历,并且浪费了每一个人的时间。_是要标记它。_如果收到了足够的标记,会有相应的处理,无论是自动地或版主的介入。\n\n为了维护我们的社群,版主保留了任何情况下删除任何内容和其他用户的权力。版主不能预览任何新帖子;版主和站点维护人员对社群里发表的任何言论均不负责任。\n\n\n\n## [永远文明](#be-civil)\n\n粗鲁这样的行为会破坏健康的讨论:\n\n* 文明。不要发表任何理智的人会认为会冒犯、滥用或招致怨恨的言论。\n* 保持干净。不要发表任何淫秽或性暗示的东西。\n* 尊重其他人。不要骚扰或者让别人难过,检视别人,或暴露他们的个人信息。\n* 尊重我们的论坛。不要发表广告或者其他垃圾信息。\n\n这些条款没有准确的定义 — 避免任何_可能_的这些事。如果您不确定,问问自己这些是否能出现在纽约时报的头版头条上。\n\n这是一个公共论坛,并且搜索引擎会索引这些讨论。注意语言、链接和家庭和朋友的图片的安全。\n\n\n\n## [保持整洁](#keep-tidy)\n\n花一点时间让东西出现在正确的位置,这样我们能花更多的时间在讨论上而非清理格式。所以:\n\n* 不要在错误的分类开始一个新主题。\n* 不要在多个主题中回复同样的内容。\n* 不要发布没有内容的回复。\n* 不要在中途改变主题。\n* 不要在您的帖子中签名 — 每一贴都附有您的个人信息。\n\n比起发表“+1”或者“同意”,使用赞按钮。比起将帖子带向一个决然不同的方向,使用“回复为关联主题”。\n\n\n\n## [发表您自己的东西](#stealing)\n\n您不能在没有他人授权的情况下发表任何属于他人的数字信息。您可能不能发表关于窃据他人知识产权(软件、视频、音频和图像)的任何简介、链接或方法,或其他任何不符合其他法律的事。\n\n\n\n## [有你参与](#power) \n\n这个站点由[一群友善的职员](/about)、你和社群一起运营。如果你对这里的事情仍有疑问,在[站务](/c/meta)分类新建一个主题并且开始讨论!如果遇到了重要或紧急的事情,并且不能用站务分类的主题或标记解决,通过[职员页面](/about)联系我们。\n\n\n\n## [文明讨论的地方](#civilized)\n\n在论坛上请表现得像在公共公园一样得体。我们一群人共享着一个公共社群资源 — 一个通过不断进行讨论以分享我们技能、知识和兴趣的地方。\n\n这些都不是硬性规定,只是一些帮助社群的人们来判断的规定。试用这些指引来保持干净和充满灵感的公开论坛。\n\n\n\n## [改善讨论](#improve)\n\n帮助我们做一些帮助改善讨论的事,这样能帮助我们让这个地方变成一个参与讨论的好地方。\n\n这里被讨论的主题对我们很重要,并且如果他们对您也很重要,请和我们一样严肃对待他们。即使您不同意别人的话,但是也要尊重正在讨论这些主题的人们。\n\n改进讨论的一个方式是探索已经发生过的事。请在回复或者开始您自己的主题前花一些时间浏览,这样您更有机会遇见和您有共同爱好的人。\n\n\n\n## [尊重,当您不同意时](#agreeable)\n\n您可能想表达您的不同意。这没问题。但是,记住_批评观点,而不是人_。请避免:\n\n* 指名道姓。\n* 人生攻击。\n* 回应帖子的语气而不是它的真正内容。\n* 下意识的反驳。\n\n相反,提供合理的观点改善讨论。\n\n\n\n## [您的参与有价值](#participate)\n\n我们在这儿的讨论为大家树立了榜样。通过选择参与那些让论坛变成一个有意思的地方,来帮助我们改善社群的未来 — 并且避免那些没有帮助的行为。\n\nDiscourse 提供了让社群共同鉴别最棒(或最差)的贡献的工具:收藏、书签、赞、标记、回复、编辑或者其他。使用这些工具改善您自己的体验,和其他人的体验。\n\n让我们留下一个比发现它之前更好的社群。\n\n\n\n## [如果您看见了一个问题,标记它](#flag-problems)\n\n版主有特别的权力;他们对论坛负责。但是您也是。通过您的帮助,版主能促进社群的发展,而不是守卫或者警察。\n\n当您见到不合适的行为,不要回应它。这种承认变相鼓励了这种不合适的行为,浪费了您的经历,并且浪费了每一个人的时间。_是要标记它。_如果收到了足够的标记,会有相应的处理,无论是自动地或版主的介入。\n\n为了维护我们的社群,版主保留了任何情况下删除任何内容和其他用户的权力。版主不能预览任何新帖子;版主和站点维护人员对社群里发表的任何言论均不负责任。\n\n\n\n## [永远文明](#be-civil)\n\n粗鲁这样的行为会破坏健康的讨论:\n\n* 文明。不要发表任何理智的人会认为会冒犯、滥用或招致怨恨的言论。\n* 保持干净。不要发表任何淫秽或性暗示的东西。\n* 尊重其他人。不要骚扰或者让别人难过,检视别人,或暴露他们的个人信息。\n* 尊重我们的论坛。不要发表广告或者其他垃圾信息。\n\n这些条款没有准确的定义 — 避免任何_可能_的这些事。如果您不确定,问问自己这些是否能出现在纽约时报的头版头条上。\n\n这是一个公共论坛,并且搜索引擎会索引这些讨论。注意语言、链接和家庭和朋友的图片的安全。\n\n\n\n## [保持整洁](#keep-tidy)\n\n花一点时间让东西出现在正确的位置,这样我们能花更多的时间在讨论上而非清理格式。所以:\n\n* 不要在错误的分类开始一个新主题。\n* 不要在多个主题中回复同样的内容。\n* 不要发布没有内容的回复。\n* 不要在中途改变主题。\n* 不要在您的帖子中签名 — 每一贴都附有您的个人信息。\n\n比起发表“+1”或者“同意”,使用赞按钮。比起将帖子带向一个决然不同的方向,使用“回复为关联主题”。\n\n\n\n## [发表您自己的东西](#stealing)\n\n您不能在没有他人授权的情况下发表任何属于他人的数字信息。您可能不能发表关于窃据他人知识产权(软件、视频、音频和图像)的任何简介、链接或方法,或其他任何不符合其他法律的事。\n\n\n\n## [有你参与](#power) \n\n这个站点由[一群友善的职员](/about)、你和社群一起运营。如果你对这里的事情仍有疑问,在[站务](/c/meta)分类新建一个主题并且开始讨论!如果遇到了重要或紧急的事情,并且不能用站务分类的主题或标记解决,通过[职员页面](/about)联系我们。\n\n\n\n## [使用条款](#tos)\n\n是的,法律很无聊,但是我们必须保护我们自己 – 引申开来,您和您的数据 – 用于针对不友好的家伙们。我们有一个[使用条款](/tos)描述您的(或者我们)关于内容、隐私和法律的行为和权力。要使用我们的服务,您必须同意遵守[使用条款](/tos)。\n" tos_topic: title: "服务条款" diff --git a/plugins/poll/config/locales/client.te.yml b/plugins/poll/config/locales/client.te.yml index e0cc706d86..bc2b7210ed 100644 --- a/plugins/poll/config/locales/client.te.yml +++ b/plugins/poll/config/locales/client.te.yml @@ -12,7 +12,7 @@ te: one: "ఒక ఓటు" other: "%{count} ఓట్లు" results: - show: ఫలితాలు చూపు + show: ఫలితాలు చూపించు hide: ఫలితాలు దాయు close_poll: "ఓటు ముగించు" open_poll: "ఓటు తెరువు" diff --git a/public/403.te.html b/public/403.te.html index 64e691a09e..80659a1515 100644 --- a/public/403.te.html +++ b/public/403.te.html @@ -20,7 +20,7 @@

    403

    ఆ రీసోర్సు ఇప్పుడు చూడలేరు

    -

    ఇది డోస్కోర్సు స్వంత 403తో రీప్లేసవుతుంది.

    +

    ఇది అభిమత డిస్కోర్సు 403 పేజీతో రీప్లేసవుతుంది.

    diff --git a/public/500.te.html b/public/500.te.html index bd7dff7909..bdd4b2ba1a 100644 --- a/public/500.te.html +++ b/public/500.te.html @@ -5,8 +5,8 @@

    అయ్యో

    -

    ఈ చర్చను శక్తివంతం చేస్తున్న సాఫ్ వేరు ఒక అనూహ్యమైన సమస్యకు లోనైంది. అసౌకర్యానికి మా క్షమాపనలు.

    -

    ఈ దోషం గురించి సంపూర్ణ వివరణలు రికార్డు చెయ్యబడ్డాయి. ఒక ఆటోమేటిక్ ప్రకటన తయారైంది. మేము పరిశీలిస్తాము.

    +

    ఈ చర్చావేదికను శక్తివంతం చేస్తున్న సాఫ్ట్‌వేర్ ఒక అనూహ్యమైన సమస్యకు లోనైంది. అసౌకర్యానికి చింతిస్తున్నాం.

    +

    ఈ దోషం గురించి పూర్తి సమాచారం నమోదుచేయబడింది. ఒక ఆటోమేటిక్ గమనింపు తయారైంది. మేము దాన్ని పరిశీలిస్తాము.

    ఇంకెటువంటి చర్య అవసరంలేదు. కానీ ఈ దోషం మరలా మరలా వస్తూంటే మీరు ఇక్కడ మెటా వర్గం లో చర్చ మొదలుపెట్టి ఇంకాస్త సమాచారం ఇవ్వవచ్చు.

    From e74b9ee5da8cc7c436b0f0bc6798bbfd93cf9091 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Thu, 19 Feb 2015 18:11:07 +0100 Subject: [PATCH 44/49] FIX: should not count disagreed flags --- app/models/user.rb | 65 ++++++++++++++++++++-------------------- spec/models/user_spec.rb | 23 ++++++++++++++ 2 files changed, 56 insertions(+), 32 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index 17d1d88359..8308ad5efb 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -683,6 +683,39 @@ class User < ActiveRecord::Base end end + def number_of_deleted_posts + Post.with_deleted + .where(user_id: self.id) + .where(user_deleted: false) + .where.not(deleted_by_id: self.id) + .where.not(deleted_at: nil) + .count + end + + def number_of_flagged_posts + Post.with_deleted + .where(user_id: self.id) + .where(id: PostAction.where(post_action_type_id: PostActionType.notify_flag_type_ids) + .where(disagreed_at: nil) + .select(:post_id)) + .count + end + + def number_of_flags_given + PostAction.where(user_id: self.id) + .where(disagreed_at: nil) + .where(post_action_type_id: PostActionType.notify_flag_type_ids) + .count + end + + def number_of_warnings + self.warnings.count + end + + def number_of_suspensions + UserHistory.for(self, :suspend_user).count + end + protected def badge_grant @@ -818,38 +851,6 @@ class User < ActiveRecord::Base end end - def number_of_deleted_posts - Post.with_deleted - .where(user_id: self.id) - .where(user_deleted: false) - .where.not(deleted_by_id: self.id) - .where.not(deleted_at: nil) - .count - end - - def number_of_flagged_posts - Post.with_deleted - .where(user_id: self.id) - .where(id: PostAction.where(post_action_type_id: PostActionType.notify_flag_type_ids) - .where(disagreed_at: nil) - .select(:post_id)) - .count - end - - def number_of_flags_given - PostAction.where(user_id: self.id) - .where(post_action_type_id: PostActionType.notify_flag_type_ids) - .count - end - - def number_of_warnings - self.warnings.count - end - - def number_of_suspensions - UserHistory.for(self, :suspend_user).count - end - private def previous_visit_at_update_required?(timestamp) diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 8ecb4c55e9..71858f1092 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -1219,4 +1219,27 @@ describe User do end + describe "number_of_flags_given" do + + let(:user) { Fabricate(:user) } + let(:moderator) { Fabricate(:moderator) } + + it "doesn't count disagreed flags" do + post_agreed = Fabricate(:post) + PostAction.act(user, post_agreed, PostActionType.types[:off_topic]) + PostAction.agree_flags!(post_agreed, moderator) + + post_deferred = Fabricate(:post) + PostAction.act(user, post_deferred, PostActionType.types[:inappropriate]) + PostAction.defer_flags!(post_deferred, moderator) + + post_disagreed = Fabricate(:post) + PostAction.act(user, post_disagreed, PostActionType.types[:spam]) + PostAction.clear_flags!(post_disagreed, moderator) + + expect(user.number_of_flags_given).to eq(2) + end + + end + end From 8fd69fd3cf0c20e9f5e16662ce838c42e1a734cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Thu, 19 Feb 2015 20:26:18 +0100 Subject: [PATCH 45/49] FIX: group member pages only showing first 50 members alphabetically --- .../controllers/group/members.js.es6 | 26 ++++++++ .../models/{group.js => group.js.es6} | 65 +++++++++---------- .../discourse/routes/group-members.js.es6 | 4 +- .../discourse/views/group-members.js.es6 | 5 ++ 4 files changed, 62 insertions(+), 38 deletions(-) create mode 100644 app/assets/javascripts/discourse/controllers/group/members.js.es6 rename app/assets/javascripts/discourse/models/{group.js => group.js.es6} (68%) create mode 100644 app/assets/javascripts/discourse/views/group-members.js.es6 diff --git a/app/assets/javascripts/discourse/controllers/group/members.js.es6 b/app/assets/javascripts/discourse/controllers/group/members.js.es6 new file mode 100644 index 0000000000..bff5ee7a28 --- /dev/null +++ b/app/assets/javascripts/discourse/controllers/group/members.js.es6 @@ -0,0 +1,26 @@ +export default Ember.ObjectController.extend({ + loading: false, + + actions: { + loadMore() { + if (this.get("loading")) { return; } + // we've reached the end + if (this.get("members.length") >= this.get("user_count")) { return; } + + this.set("loading", true); + + const self = this; + + Discourse.Group.loadMembers(this.get("name"), this.get("members.length"), this.get("limit")).then(function (result) { + self.get("members").addObjects(result.members.map(member => Discourse.User.create(member))); + self.setProperties({ + loading: false, + user_count: result.meta.total, + limit: result.meta.limit, + offset: Math.min(result.meta.offset + result.meta.limit, result.meta.total) + }); + }); + } + } +}); + diff --git a/app/assets/javascripts/discourse/models/group.js b/app/assets/javascripts/discourse/models/group.js.es6 similarity index 68% rename from app/assets/javascripts/discourse/models/group.js rename to app/assets/javascripts/discourse/models/group.js.es6 index 5d7ff91c2b..eaa58e8e0c 100644 --- a/app/assets/javascripts/discourse/models/group.js +++ b/app/assets/javascripts/discourse/models/group.js.es6 @@ -1,12 +1,4 @@ -/** - The data model for a Group - - @class Group - @extends Discourse.Model - @namespace Discourse - @module Discourse -**/ -Discourse.Group = Discourse.Model.extend({ +const Group = Discourse.Model.extend({ limit: 50, offset: 0, user_count: 0, @@ -26,28 +18,22 @@ Discourse.Group = Discourse.Model.extend({ if (c > 0) { return c; } }.property('user_count'), - findMembers: function() { + findMembers() { if (Em.isEmpty(this.get('name'))) { return ; } - var self = this, - offset = Math.min(this.get("user_count"), Math.max(this.get("offset"), 0)); + const self = this, offset = Math.min(this.get("user_count"), Math.max(this.get("offset"), 0)); - return Discourse.ajax('/groups/' + this.get('name') + '/members.json', { - data: { - limit: this.get("limit"), - offset: offset - } - }).then(function(result) { + return Discourse.Group.loadMembers(this.get("name"), offset, this.get("limit")).then(function (result) { self.setProperties({ user_count: result.meta.total, limit: result.meta.limit, offset: result.meta.offset, - members: result.members.map(function(member) { return Discourse.User.create(member); }) + members: result.members.map(member => Discourse.User.create(member)) }); }); }, - removeMember: function(member) { + removeMember(member) { var self = this; return Discourse.ajax('/admin/groups/' + this.get('id') + '/members.json', { type: "DELETE", @@ -58,7 +44,7 @@ Discourse.Group = Discourse.Model.extend({ }); }, - addMembers: function(usernames) { + addMembers(usernames) { var self = this; return Discourse.ajax('/admin/groups/' + this.get('id') + '/members.json', { type: "PUT", @@ -69,7 +55,7 @@ Discourse.Group = Discourse.Model.extend({ }); }, - asJSON: function() { + asJSON() { return { name: this.get('name'), alias_level: this.get('alias_level'), @@ -79,23 +65,23 @@ Discourse.Group = Discourse.Model.extend({ }; }, - create: function(){ + create() { var self = this; return Discourse.ajax("/admin/groups", { type: "POST", data: this.asJSON() }).then(function(resp) { self.set('id', resp.basic_group.id); }); }, - save: function(){ + save() { return Discourse.ajax("/admin/groups/" + this.get('id'), { type: "PUT", data: this.asJSON() }); }, - destroy: function(){ + destroy() { if (!this.get('id')) { return; } return Discourse.ajax("/admin/groups/" + this.get('id'), { type: "DELETE" }); }, - findPosts: function(opts) { + findPosts(opts) { opts = opts || {}; var data = {}; @@ -110,22 +96,29 @@ Discourse.Group = Discourse.Model.extend({ } }); -Discourse.Group.reopenClass({ - findAll: function(opts){ +Group.reopenClass({ + findAll(opts) { return Discourse.ajax("/admin/groups.json", { data: opts }).then(function (groups){ - return groups.map(function(g) { return Discourse.Group.create(g); }); + return groups.map(g => Discourse.Group.create(g)); }); }, - findGroupCounts: function(name) { - return Discourse.ajax("/groups/" + name + "/counts.json").then(function (result) { - return Em.Object.create(result.counts); - }); + findGroupCounts(name) { + return Discourse.ajax("/groups/" + name + "/counts.json").then(result => Em.Object.create(result.counts)); }, - find: function(name) { - return Discourse.ajax("/groups/" + name + ".json").then(function (result) { - return Discourse.Group.create(result.basic_group); + find(name) { + return Discourse.ajax("/groups/" + name + ".json").then(result => Discourse.Group.create(result.basic_group)); + }, + + loadMembers(name, offset, limit) { + return Discourse.ajax('/groups/' + name + '/members.json', { + data: { + limit: limit || 50, + offset: offset || 0 + } }); } }); + +export default Group; diff --git a/app/assets/javascripts/discourse/routes/group-members.js.es6 b/app/assets/javascripts/discourse/routes/group-members.js.es6 index e6b207fc43..4713495d8f 100644 --- a/app/assets/javascripts/discourse/routes/group-members.js.es6 +++ b/app/assets/javascripts/discourse/routes/group-members.js.es6 @@ -1,11 +1,11 @@ import ShowFooter from "discourse/mixins/show-footer"; export default Discourse.Route.extend(ShowFooter, { - model: function() { + model() { return this.modelFor('group'); }, - setupController: function(controller, model) { + setupController(controller, model) { this.controllerFor('group').set('showing', 'members'); controller.set("model", model); model.findMembers(); diff --git a/app/assets/javascripts/discourse/views/group-members.js.es6 b/app/assets/javascripts/discourse/views/group-members.js.es6 new file mode 100644 index 0000000000..9dbfd112a7 --- /dev/null +++ b/app/assets/javascripts/discourse/views/group-members.js.es6 @@ -0,0 +1,5 @@ +import LoadMore from "discourse/mixins/load-more"; + +export default Discourse.View.extend(Discourse.ScrollTop, LoadMore, { + eyelineSelector: '.group-members tr', +}); From e503c3859a05a592ed566b2fb868e3bc36cf9837 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Thu, 19 Feb 2015 14:55:44 -0500 Subject: [PATCH 46/49] Allow plugins to change the header to show two rows This allows the discourse-tagging plugin to correctly use two rows in the header if it needs to display tags, or one row if there are no tags. This works in tandem with the same logic for when there is a category badge to display or not. --- .../components/header-extra-info.js.es6 | 47 +++++++++++++++++++ .../discourse/controllers/header.js.es6 | 16 ------- .../components/header-extra-info.hbs | 21 +++++++++ .../discourse/templates/header.hbs | 27 +---------- .../stylesheets/desktop/topic-post.scss | 2 +- 5 files changed, 70 insertions(+), 43 deletions(-) create mode 100644 app/assets/javascripts/discourse/components/header-extra-info.js.es6 create mode 100644 app/assets/javascripts/discourse/templates/components/header-extra-info.hbs diff --git a/app/assets/javascripts/discourse/components/header-extra-info.js.es6 b/app/assets/javascripts/discourse/components/header-extra-info.js.es6 new file mode 100644 index 0000000000..a323d50df5 --- /dev/null +++ b/app/assets/javascripts/discourse/components/header-extra-info.js.es6 @@ -0,0 +1,47 @@ +const TopicCategoryComponent = Ember.Component.extend({ + needsSecondRow: Ember.computed.gt('secondRowItems.length', 0), + secondRowItems: function() { return []; }.property(), + + showPrivateMessageGlyph: function() { + return !this.get('topic.is_warning') && this.get('topic.isPrivateMessage'); + }.property('topic.is_warning', 'topic.isPrivateMessage'), + + actions: { + jumpToTopPost: function () { + var topic = this.get('topic'); + if (topic) { + Discourse.URL.routeTo(topic.get('firstPostUrl')); + } + } + } + +}); + +let id = 0; + +// Allow us (and plugins) to register themselves as needing a second +// row in the header. If there is at least one thing in the second row +// the style changes to accomodate it. +function needsSecondRowIf(prop, cb) { + const rowId = "_second_row_" + (id++), + methodHash = {}; + + methodHash[id] = function() { + const secondRowItems = this.get('secondRowItems'), + propVal = this.get(prop); + if (cb.call(this, propVal)) { + secondRowItems.addObject(rowId); + } else { + secondRowItems.removeObject(rowId); + } + }.observes(prop).on('init'); + + TopicCategoryComponent.reopen(methodHash); +} + +needsSecondRowIf('topic.category', function(cat) { + return cat && (!cat.get('isUncategorizedCategory') || !this.siteSettings.suppress_uncategorized_badge); +}); + +export default TopicCategoryComponent; +export { needsSecondRowIf }; diff --git a/app/assets/javascripts/discourse/controllers/header.js.es6 b/app/assets/javascripts/discourse/controllers/header.js.es6 index 2511aa5008..b40ac3efda 100644 --- a/app/assets/javascripts/discourse/controllers/header.js.es6 +++ b/app/assets/javascripts/discourse/controllers/header.js.es6 @@ -10,15 +10,6 @@ export default DiscourseController.extend({ loginRequired: Em.computed.alias('controllers.application.loginRequired'), canSignUp: Em.computed.alias('controllers.application.canSignUp'), - hasCategory: function() { - var cat = this.get('topic.category'); - return cat && (!cat.get('isUncategorizedCategory') || !this.siteSettings.suppress_uncategorized_badge); - }.property('topic.category'), - - showPrivateMessageGlyph: function() { - return !this.get('topic.is_warning') && this.get('topic.isPrivateMessage'); - }.property('topic.is_warning', 'topic.isPrivateMessage'), - showSignUpButton: function() { return this.get('canSignUp') && !this.get('showExtraInfo'); }.property('canSignUp', 'showExtraInfo'), @@ -78,13 +69,6 @@ export default DiscourseController.extend({ self.refreshNotifications(); } headerView.showDropdownBySelector("#user-notifications"); - }, - - jumpToTopPost: function () { - var topic = this.get('topic'); - if (topic) { - Discourse.URL.routeTo(topic.get('firstPostUrl')); - } } } diff --git a/app/assets/javascripts/discourse/templates/components/header-extra-info.hbs b/app/assets/javascripts/discourse/templates/components/header-extra-info.hbs new file mode 100644 index 0000000000..c6326286ee --- /dev/null +++ b/app/assets/javascripts/discourse/templates/components/header-extra-info.hbs @@ -0,0 +1,21 @@ +
    +
    +
    +

    + {{#if showPrivateMessageGlyph}} + {{fa-icon "envelope"}} + {{/if}} + + {{#if topic.details.loaded}} + {{topic-status topic=topic}} + {{{topic.fancy_title}}} + {{else}} + {{#if topic.errorLoading}} + {{topic.errorTitle}} + {{/if}} + {{/if}} +

    + {{topic-category topic=topic}} +
    +
    +
    diff --git a/app/assets/javascripts/discourse/templates/header.hbs b/app/assets/javascripts/discourse/templates/header.hbs index 7eec139b08..0299c69e93 100644 --- a/app/assets/javascripts/discourse/templates/header.hbs +++ b/app/assets/javascripts/discourse/templates/header.hbs @@ -77,9 +77,7 @@
{{#if view.renderDropdowns}} - {{render "search"}} - {{render "notifications" notifications}} {{#if view.renderSiteMap}} @@ -87,34 +85,11 @@ {{/if}} {{render "user-dropdown"}} - {{/if}} - {{#if showExtraInfo}} -
-
-
-

- {{#if showPrivateMessageGlyph}} - {{fa-icon "envelope"}} - {{/if}} - - {{#if topic.details.loaded}} - {{topic-status topic=topic}} - {{{topic.fancy_title}}} - {{else}} - {{#if topic.errorLoading}} - {{topic.errorTitle}} - {{/if}} - {{/if}} -

- {{topic-category topic=topic}} -
-
-
+ {{header-extra-info topic=topic}} {{/if}} - diff --git a/app/assets/stylesheets/desktop/topic-post.scss b/app/assets/stylesheets/desktop/topic-post.scss index f547ad00f8..6451a4e9b2 100644 --- a/app/assets/stylesheets/desktop/topic-post.scss +++ b/app/assets/stylesheets/desktop/topic-post.scss @@ -577,7 +577,7 @@ video { } /* override docked header CSS for topics with categories */ -.extra-info.has-category { +.extra-info.two-rows { h1 { line-height: 1.1em; margin: 0; From f85f38a8875d6a591a086c649a39cab752e7f17f Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Thu, 19 Feb 2015 14:58:02 -0500 Subject: [PATCH 47/49] Update the header action to be ES6 --- .../javascripts/discourse/components/header-extra-info.js.es6 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/discourse/components/header-extra-info.js.es6 b/app/assets/javascripts/discourse/components/header-extra-info.js.es6 index a323d50df5..8948e24c95 100644 --- a/app/assets/javascripts/discourse/components/header-extra-info.js.es6 +++ b/app/assets/javascripts/discourse/components/header-extra-info.js.es6 @@ -7,8 +7,8 @@ const TopicCategoryComponent = Ember.Component.extend({ }.property('topic.is_warning', 'topic.isPrivateMessage'), actions: { - jumpToTopPost: function () { - var topic = this.get('topic'); + jumpToTopPost() { + const topic = this.get('topic'); if (topic) { Discourse.URL.routeTo(topic.get('firstPostUrl')); } From aef7bf8b31040b77a19d53fd0d87cccc82805a9d Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Thu, 19 Feb 2015 15:39:49 -0500 Subject: [PATCH 48/49] FIX: It should be `BadgeType::Silver` --- db/fixtures/006_badges.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/fixtures/006_badges.rb b/db/fixtures/006_badges.rb index 32f23d0ab1..93d11a65f4 100644 --- a/db/fixtures/006_badges.rb +++ b/db/fixtures/006_badges.rb @@ -242,7 +242,7 @@ Badge.seed do |b| b.id = Badge::OneYearAnniversary b.default_name = "Anniversary" b.default_icon = "fa-clock-o" - b.badge_type_id = BadgeType::Bronze + b.badge_type_id = BadgeType::Silver b.query = Badge::Queries::OneYearAnniversary b.default_badge_grouping_id = BadgeGrouping::Community b.trigger = Badge::Trigger::None From 61bd9c77c392e79bdf247a71911bd69c12293524 Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Thu, 19 Feb 2015 16:27:43 -0500 Subject: [PATCH 49/49] Version bump to v1.3.0.beta1 --- lib/version.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/version.rb b/lib/version.rb index 0ba9285277..79fe4f5baa 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 = 2 + MINOR = 3 TINY = 0 - PRE = 'beta9' + PRE = 'beta1' STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.') end