diff --git a/.travis.yml b/.travis.yml
index 62961abc4a..6fdc835355 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -6,7 +6,6 @@ env:
- RUBY_GC_MALLOC_LIMIT=50000000
matrix:
- "RAILS_MASTER=0"
- - "RAILS42=1"
- "RAILS_MASTER=1"
addons:
@@ -21,7 +20,6 @@ addons:
matrix:
allow_failures:
- env: "RAILS_MASTER=1"
- - env: "RAILS42=1"
- rvm: rbx-2
fast_finish: true
@@ -51,7 +49,6 @@ before_script:
- bundle exec rake db:create db:migrate
install:
- - bash -c "if [ '$RAILS42' == '1' ]; then bundle update --retry=3 --jobs=3 rails rails-observers; fi"
- bash -c "if [ '$RAILS_MASTER' == '1' ]; then bundle update --retry=3 --jobs=3 arel rails rails-observers seed-fu; fi"
- bash -c "if [ '$RAILS_MASTER' == '0' ]; then bundle install --without development --deployment --retry=3 --jobs=3; fi"
diff --git a/Gemfile b/Gemfile
index 2332689189..be623dde76 100644
--- a/Gemfile
+++ b/Gemfile
@@ -6,30 +6,19 @@ def rails_master?
ENV["RAILS_MASTER"] == '1'
end
-def rails_42?
- ENV["RAILS42"] == '1'
-end
-
if rails_master?
gem 'arel', git: 'https://github.com/rails/arel.git'
gem 'rails', git: 'https://github.com/rails/rails.git'
gem 'rails-observers', git: 'https://github.com/rails/rails-observers.git'
gem 'seed-fu', git: 'https://github.com/SamSaffron/seed-fu.git', branch: 'discourse'
-elsif rails_42?
- gem 'rails', '~> 4.2.1'
- gem 'rails-observers', git: 'https://github.com/rails/rails-observers.git'
- gem 'seed-fu', '~> 2.3.5'
else
- gem 'rails', '~> 4.1.10'
+ gem 'rails', '~> 4.2'
gem 'rails-observers'
- gem 'seed-fu', '~> 2.3.3'
+ gem 'seed-fu', '~> 2.3.5'
end
-# Rails 4.1.6+ will relax the mail gem version requirement to `~> 2.5, >= 2.5.4`.
-# However, mail gem 2.6.x currently does not work with discourse because of the
-# reference to `Mail::RFC2822Parser` in `lib/email.rb`. This ensure discourse
-# would continue to work with Rails 4.1.6+ when it is released.
-gem 'mail', '~> 2.5.4'
+gem 'mail'
+gem 'mime-types', require: 'mime/types/columnar'
#gem 'redis-rails'
gem 'hiredis'
@@ -48,7 +37,6 @@ gem 'babel-transpiler'
gem 'message_bus'
gem 'rails_multisite', path: 'vendor/gems/rails_multisite'
-gem 'redcarpet', require: false
gem 'fast_xs'
gem 'fast_xor'
diff --git a/Gemfile.lock b/Gemfile.lock
index 46f0d552f3..d96defd9c0 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -6,46 +6,53 @@ PATH
GEM
remote: https://rubygems.org/
specs:
- actionmailer (4.1.10)
- actionpack (= 4.1.10)
- actionview (= 4.1.10)
+ actionmailer (4.2.4)
+ actionpack (= 4.2.4)
+ actionview (= 4.2.4)
+ activejob (= 4.2.4)
mail (~> 2.5, >= 2.5.4)
- actionpack (4.1.10)
- actionview (= 4.1.10)
- activesupport (= 4.1.10)
- rack (~> 1.5.2)
+ rails-dom-testing (~> 1.0, >= 1.0.5)
+ actionpack (4.2.4)
+ actionview (= 4.2.4)
+ activesupport (= 4.2.4)
+ rack (~> 1.6)
rack-test (~> 0.6.2)
- actionview (4.1.10)
- activesupport (= 4.1.10)
+ rails-dom-testing (~> 1.0, >= 1.0.5)
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
+ actionview (4.2.4)
+ activesupport (= 4.2.4)
builder (~> 3.1)
erubis (~> 2.7.0)
+ rails-dom-testing (~> 1.0, >= 1.0.5)
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
active_model_serializers (0.8.3)
activemodel (>= 3.0)
- activemodel (4.1.10)
- activesupport (= 4.1.10)
+ activejob (4.2.4)
+ activesupport (= 4.2.4)
+ globalid (>= 0.3.0)
+ activemodel (4.2.4)
+ activesupport (= 4.2.4)
builder (~> 3.1)
- activerecord (4.1.10)
- activemodel (= 4.1.10)
- activesupport (= 4.1.10)
- arel (~> 5.0.0)
- activesupport (4.1.10)
- i18n (~> 0.6, >= 0.6.9)
+ activerecord (4.2.4)
+ activemodel (= 4.2.4)
+ activesupport (= 4.2.4)
+ arel (~> 6.0)
+ activesupport (4.2.4)
+ i18n (~> 0.7)
json (~> 1.7, >= 1.7.7)
minitest (~> 5.1)
- thread_safe (~> 0.1)
+ thread_safe (~> 0.3, >= 0.3.4)
tzinfo (~> 1.1)
- annotate (2.6.6)
- activerecord (>= 2.3.0)
- rake (~> 10.4.2, >= 10.4.2)
- arel (5.0.1.20140414130214)
- aws-sdk (2.0.45)
- aws-sdk-resources (= 2.0.45)
- aws-sdk-core (2.0.45)
- builder (~> 3.0)
+ annotate (2.6.10)
+ activerecord (>= 3.2, <= 4.3)
+ rake (~> 10.4)
+ arel (6.0.3)
+ aws-sdk (2.1.23)
+ aws-sdk-resources (= 2.1.23)
+ aws-sdk-core (2.1.23)
jmespath (~> 1.0)
- multi_json (~> 1.0)
- aws-sdk-resources (2.0.45)
- aws-sdk-core (= 2.0.45)
+ aws-sdk-resources (2.1.23)
+ aws-sdk-core (= 2.1.23)
babel-source (5.8.19)
babel-transpiler (0.7.0)
babel-source (>= 4.0, < 6)
@@ -60,22 +67,59 @@ GEM
binding_of_caller (0.7.2)
debug_inspector (>= 0.0.1)
builder (3.2.2)
- byebug (5.0.0)
- columnize (= 0.9.0)
- celluloid (0.16.0)
- timers (~> 4.0.0)
+ byebug (6.0.2)
+ celluloid (0.17.1.2)
+ bundler
+ celluloid-essentials
+ celluloid-extras
+ celluloid-fsm
+ celluloid-pool
+ celluloid-supervision
+ dotenv
+ nenv
+ rspec-logsplit (>= 0.1.2)
+ timers (>= 4.1.1)
+ celluloid-essentials (0.20.2.1)
+ bundler
+ dotenv
+ nenv
+ rspec-logsplit (>= 0.1.2)
+ timers (>= 4.1.1)
+ celluloid-extras (0.20.1)
+ bundler
+ dotenv
+ nenv
+ rspec-logsplit (>= 0.1.2)
+ timers (>= 4.1.1)
+ celluloid-fsm (0.20.1)
+ bundler
+ dotenv
+ nenv
+ rspec-logsplit (>= 0.1.2)
+ timers (>= 4.1.1)
+ celluloid-pool (0.20.1)
+ bundler
+ dotenv
+ nenv
+ rspec-logsplit (>= 0.1.2)
+ timers (>= 4.1.1)
+ celluloid-supervision (0.20.1.1)
+ bundler
+ dotenv
+ nenv
+ rspec-logsplit (>= 0.1.2)
+ timers (>= 4.1.1)
certified (1.0.0)
coderay (1.1.0)
- columnize (0.9.0)
connection_pool (2.2.0)
- crass (1.0.1)
- daemons (1.2.2)
+ crass (1.0.2)
+ daemons (1.2.3)
debug_inspector (0.0.2)
diff-lcs (1.2.5)
discourse-qunit-rails (0.0.8)
railties
docile (1.1.5)
- dotenv (1.0.2)
+ dotenv (2.0.2)
email_reply_parser (0.5.8)
ember-data-source (1.0.0.beta.16.1)
ember-source (~> 1.8)
@@ -91,15 +135,15 @@ GEM
railties (>= 3.1)
ember-source (1.12.1)
erubis (2.7.0)
- eventmachine (1.0.7)
- excon (0.45.3)
- execjs (2.5.2)
- exifr (1.2.2)
+ eventmachine (1.0.8)
+ excon (0.45.4)
+ execjs (2.6.0)
+ exifr (1.2.3.1)
fabrication (2.9.8)
fakeweb (1.3.0)
faraday (0.9.1)
multipart-post (>= 1.2, < 3)
- fast_blank (0.0.2)
+ fast_blank (1.0.0)
fast_stack (0.1.0)
rake
rake-compiler
@@ -108,24 +152,25 @@ GEM
rake-compiler
fast_xs (0.8.0)
fastimage_discourse (1.6.6)
- ffi (1.9.6)
+ ffi (1.9.10)
flamegraph (0.1.0)
fast_stack
- foreman (0.77.0)
- dotenv (~> 1.0.2)
+ foreman (0.78.0)
thor (~> 0.19.1)
fspath (2.1.1)
gctools (0.2.3)
given_core (3.5.4)
sorcerer (>= 0.3.7)
+ globalid (0.3.6)
+ activesupport (>= 4.1.0)
guess_html_encoding (0.0.11)
handlebars-source (2.0.0)
- hashie (3.4.0)
- highline (1.7.1)
+ hashie (3.4.2)
+ highline (1.7.7)
hike (1.2.3)
hiredis (0.6.0)
- hitimes (1.2.2)
- htmlentities (4.3.3)
+ hitimes (1.2.3)
+ htmlentities (4.3.4)
i18n (0.7.0)
image_optim (0.20.2)
exifr (~> 1.1, >= 1.1.3)
@@ -135,46 +180,47 @@ GEM
progress (~> 3.0, >= 3.0.1)
image_size (1.4.1)
in_threads (1.3.1)
- jmespath (1.0.2)
- multi_json (~> 1.0)
+ jmespath (1.1.3)
jquery-rails (3.1.2)
railties (>= 3.0, < 5.0)
thor (>= 0.14, < 2.0)
json (1.8.3)
- jwt (1.3.0)
- kgio (2.9.3)
+ jwt (1.5.1)
+ kgio (2.10.0)
librarian (0.1.2)
highline
thor (~> 0.15)
- libv8 (3.16.14.7)
+ libv8 (3.16.14.11)
listen (0.7.3)
logster (1.0.0.3.pre)
+ loofah (2.0.3)
+ nokogiri (>= 1.5.9)
lru_redux (1.1.0)
- mail (2.5.4)
- mime-types (~> 1.16)
- treetop (~> 1.4.8)
- memory_profiler (0.9.3)
+ mail (2.6.3)
+ mime-types (>= 1.16, < 3)
+ memory_profiler (0.9.4)
message_bus (1.0.16)
rack (>= 1.1.3)
redis
metaclass (0.0.4)
method_source (0.8.2)
- mime-types (1.25.1)
+ mime-types (2.6.2)
mini_portile (0.6.2)
- minitest (5.6.1)
+ minitest (5.8.0)
mocha (1.1.0)
metaclass (~> 0.0.1)
- mock_redis (0.14.0)
+ mock_redis (0.15.2)
moneta (0.8.0)
- msgpack (0.5.11)
+ msgpack (0.6.2)
multi_json (1.11.2)
multi_xml (0.5.5)
multipart-post (2.0.0)
mustache (1.0.2)
+ nenv (0.2.0)
netrc (0.10.3)
nokogiri (1.6.6.2)
mini_portile (~> 0.6.0)
- nokogumbo (1.2.0)
+ nokogumbo (1.4.1)
nokogiri
oauth (0.4.7)
oauth2 (1.0.0)
@@ -183,11 +229,11 @@ GEM
multi_json (~> 1.3)
multi_xml (~> 0.5)
rack (~> 1.2)
- oj (2.12.9)
+ oj (2.12.14)
omniauth (1.2.2)
hashie (>= 1.2, < 4)
rack (~> 1.0)
- omniauth-facebook (2.0.0)
+ omniauth-facebook (2.0.1)
omniauth-oauth2 (~> 1.2)
omniauth-github-discourse (1.1.2)
omniauth (~> 1.0)
@@ -195,20 +241,18 @@ GEM
omniauth-google-oauth2 (0.2.5)
omniauth (> 1.0)
omniauth-oauth2 (~> 1.1)
- omniauth-oauth (1.0.1)
+ omniauth-oauth (1.1.0)
oauth
omniauth (~> 1.0)
- omniauth-oauth2 (1.2.0)
- faraday (>= 0.8, < 0.10)
- multi_json (~> 1.3)
+ omniauth-oauth2 (1.3.1)
oauth2 (~> 1.0)
omniauth (~> 1.2)
omniauth-openid (1.0.1)
omniauth (~> 1.0)
rack-openid (~> 1.3.1)
- omniauth-twitter (1.0.1)
- multi_json (~> 1.3)
- omniauth-oauth (~> 1.0)
+ omniauth-twitter (1.2.1)
+ json (~> 1.3)
+ omniauth-oauth (~> 1.1)
onebox (1.5.26)
moneta (~> 0.8)
multi_json (~> 1.11)
@@ -217,8 +261,7 @@ GEM
openid-redis-store (0.0.2)
redis
ruby-openid
- pg (0.18.1)
- polyglot (0.3.5)
+ pg (0.18.3)
progress (3.1.0)
pry (0.10.1)
coderay (~> 1.1.0)
@@ -226,13 +269,12 @@ GEM
slop (~> 3.4)
pry-nav (0.2.4)
pry (>= 0.9.10, < 0.11.0)
- pry-rails (0.3.3)
+ pry-rails (0.3.4)
pry (>= 0.9.10)
- puma (2.11.1)
- rack (>= 1.1, < 2.0)
+ puma (2.14.0)
r2 (0.2.5)
- rack (1.5.5)
- rack-mini-profiler (0.9.6)
+ rack (1.6.4)
+ rack-mini-profiler (0.9.7)
rack (>= 1.1.3)
rack-openid (1.3.1)
rack (>= 1.1.0)
@@ -241,39 +283,47 @@ GEM
rack
rack-test (0.6.3)
rack (>= 1.0)
- rails (4.1.10)
- actionmailer (= 4.1.10)
- actionpack (= 4.1.10)
- actionview (= 4.1.10)
- activemodel (= 4.1.10)
- activerecord (= 4.1.10)
- activesupport (= 4.1.10)
+ rails (4.2.4)
+ actionmailer (= 4.2.4)
+ actionpack (= 4.2.4)
+ actionview (= 4.2.4)
+ activejob (= 4.2.4)
+ activemodel (= 4.2.4)
+ activerecord (= 4.2.4)
+ activesupport (= 4.2.4)
bundler (>= 1.3.0, < 2.0)
- railties (= 4.1.10)
- sprockets-rails (~> 2.0)
+ railties (= 4.2.4)
+ sprockets-rails
+ rails-deprecated_sanitizer (1.0.3)
+ activesupport (>= 4.2.0.alpha)
+ rails-dom-testing (1.0.7)
+ activesupport (>= 4.2.0.beta, < 5.0)
+ nokogiri (~> 1.6.0)
+ rails-deprecated_sanitizer (>= 1.0.1)
+ rails-html-sanitizer (1.0.2)
+ loofah (~> 2.0)
rails-observers (0.1.2)
activemodel (~> 4.0)
- railties (4.1.10)
- actionpack (= 4.1.10)
- activesupport (= 4.1.10)
+ railties (4.2.4)
+ actionpack (= 4.2.4)
+ activesupport (= 4.2.4)
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
- raindrops (0.13.0)
+ raindrops (0.15.0)
rake (10.4.2)
- rake-compiler (0.9.4)
+ rake-compiler (0.9.5)
rake
- rb-fsevent (0.9.4)
+ rb-fsevent (0.9.6)
rb-inotify (0.9.5)
ffi (>= 0.5.0)
rbtrace (0.4.7)
ffi (>= 1.0.6)
msgpack (>= 0.4.3)
trollop (>= 1.16.2)
- redcarpet (3.2.2)
redis (3.2.1)
redis-namespace (1.5.2)
redis (~> 3.0, >= 3.0.4)
- ref (1.0.5)
+ ref (2.0.0)
rest-client (1.7.2)
mime-types (>= 1.16, < 3.0)
netrc (~> 0.7)
@@ -291,6 +341,7 @@ GEM
rspec-given (3.5.4)
given_core (= 3.5.4)
rspec (>= 2.12)
+ rspec-logsplit (0.1.3)
rspec-mocks (3.2.1)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.2.0)
@@ -304,14 +355,14 @@ GEM
rspec-support (~> 3.2.0)
rspec-support (3.2.2)
rtlit (0.0.5)
- ruby-openid (2.5.0)
+ ruby-openid (2.7.0)
ruby-readability (0.7.0)
guess_html_encoding (>= 0.0.4)
nokogiri (>= 1.6.0)
- sanitize (3.1.2)
- crass (~> 1.0.1)
+ sanitize (4.0.0)
+ crass (~> 1.0.2)
nokogiri (>= 1.4.4)
- nokogumbo (= 1.2.0)
+ nokogumbo (= 1.4.1)
sass (3.2.19)
sass-rails (4.0.5)
railties (>= 4.0.0, < 5.0)
@@ -327,8 +378,8 @@ GEM
shoulda-context (1.2.1)
shoulda-matchers (2.7.0)
activesupport (>= 3.0.0)
- sidekiq (3.4.2)
- celluloid (~> 0.16.0)
+ sidekiq (3.5.0)
+ celluloid (~> 0.17.0)
connection_pool (~> 2.2, >= 2.2.0)
json (~> 1.0)
redis (~> 3.2, >= 3.2.1)
@@ -336,15 +387,15 @@ GEM
sidekiq-statistic (1.1.0)
sidekiq (~> 3.3, >= 3.3.4)
simple-rss (1.3.1)
- simplecov (0.9.1)
+ simplecov (0.10.0)
docile (~> 1.1.0)
- multi_json (~> 1.0)
- simplecov-html (~> 0.8.0)
- simplecov-html (0.8.0)
- sinatra (1.4.5)
+ json (~> 1.8)
+ simplecov-html (~> 0.10.0)
+ simplecov-html (0.10.0)
+ sinatra (1.4.6)
rack (~> 1.4)
rack-protection (~> 1.4)
- tilt (~> 1.3, >= 1.3.4)
+ tilt (>= 1.3, < 3)
slop (3.6.0)
sorcerer (1.0.2)
spork (1.0.0rc4)
@@ -364,29 +415,26 @@ GEM
therubyracer (0.12.2)
libv8 (~> 3.16.14.0)
ref
- thin (1.6.3)
+ thin (1.6.4)
daemons (~> 1.0, >= 1.0.9)
- eventmachine (~> 1.0)
+ eventmachine (~> 1.0, >= 1.0.4)
rack (~> 1.0)
thor (0.19.1)
thread_safe (0.3.5)
tilt (1.4.1)
- timecop (0.7.3)
- timers (4.0.1)
+ timecop (0.8.0)
+ timers (4.1.1)
hitimes
- treetop (1.4.15)
- polyglot
- polyglot (>= 0.3.1)
trollop (2.1.1)
tzinfo (1.2.2)
thread_safe (~> 0.1)
- uglifier (2.7.1)
+ uglifier (2.7.2)
execjs (>= 0.3.0)
json (>= 1.8.0)
unf (0.1.4)
unf_ext
unf_ext (0.0.6)
- unicorn (4.8.3)
+ unicorn (4.9.0)
kgio (~> 2.6)
rack
raindrops (~> 0.7)
@@ -427,9 +475,10 @@ DEPENDENCIES
listen (= 0.7.3)
logster
lru_redux
- mail (~> 2.5.4)
+ mail
memory_profiler
message_bus
+ mime-types
minitest
mocha
mock_redis
@@ -453,14 +502,13 @@ DEPENDENCIES
r2 (~> 0.2.5)
rack-mini-profiler
rack-protection
- rails (~> 4.1.10)
+ rails (~> 4.2)
rails-observers
rails_multisite!
rake
rb-fsevent
rb-inotify (~> 0.9)
rbtrace
- redcarpet
redis
rest-client
rinku
@@ -473,7 +521,7 @@ DEPENDENCIES
sanitize
sass
sass-rails (~> 4.0.5)
- seed-fu (~> 2.3.3)
+ seed-fu (~> 2.3.5)
shoulda
sidekiq
sidekiq-statistic
diff --git a/app/assets/javascripts/admin/components/embedding-setting.js.es6 b/app/assets/javascripts/admin/components/embedding-setting.js.es6
index 904afacfee..039e5d5dc3 100644
--- a/app/assets/javascripts/admin/components/embedding-setting.js.es6
+++ b/app/assets/javascripts/admin/components/embedding-setting.js.es6
@@ -6,6 +6,11 @@ export default Ember.Component.extend({
@computed('field')
inputId(field) { return field.dasherize(); },
+ @computed('placeholder')
+ placeholderValue(placeholder) {
+ return placeholder ? I18n.t(placeholder) : null;
+ },
+
@computed('field')
translationKey(field) { return `admin.embedding.${field}`; },
diff --git a/app/assets/javascripts/admin/components/screened_ip_address_form_component.js b/app/assets/javascripts/admin/components/screened_ip_address_form_component.js
index 69c517f00b..1bf90b0227 100644
--- a/app/assets/javascripts/admin/components/screened_ip_address_form_component.js
+++ b/app/assets/javascripts/admin/components/screened_ip_address_form_component.js
@@ -18,14 +18,25 @@ Discourse.ScreenedIpAddressFormComponent = Ember.Component.extend({
formSubmitted: false,
actionName: 'block',
- actionNames: function() {
- return [
- {id: 'block', name: I18n.t('admin.logs.screened_ips.actions.block')},
- {id: 'do_nothing', name: I18n.t('admin.logs.screened_ips.actions.do_nothing')},
- {id: 'allow_admin', name: I18n.t('admin.logs.screened_ips.actions.allow_admin')}
- ];
+ adminWhitelistEnabled: function() {
+ return Discourse.SiteSettings.use_admin_ip_whitelist;
}.property(),
+ actionNames: function() {
+ if (this.get('adminWhitelistEnabled')) {
+ return [
+ {id: 'block', name: I18n.t('admin.logs.screened_ips.actions.block')},
+ {id: 'do_nothing', name: I18n.t('admin.logs.screened_ips.actions.do_nothing')},
+ {id: 'allow_admin', name: I18n.t('admin.logs.screened_ips.actions.allow_admin')}
+ ];
+ } else {
+ return [
+ {id: 'block', name: I18n.t('admin.logs.screened_ips.actions.block')},
+ {id: 'do_nothing', name: I18n.t('admin.logs.screened_ips.actions.do_nothing')}
+ ];
+ }
+ }.property('adminWhitelistEnabled'),
+
actions: {
submit: function() {
if (!this.get('formSubmitted')) {
diff --git a/app/assets/javascripts/admin/controllers/admin-site-settings.js.es6 b/app/assets/javascripts/admin/controllers/admin-site-settings.js.es6
index 97b1c9ace9..b7c4302e87 100644
--- a/app/assets/javascripts/admin/controllers/admin-site-settings.js.es6
+++ b/app/assets/javascripts/admin/controllers/admin-site-settings.js.es6
@@ -5,7 +5,7 @@ export default Ember.ArrayController.extend({
onlyOverridden: false,
filtered: Ember.computed.notEmpty('filter'),
- filterContentNow: function(category) {
+ filterContentNow(category) {
// If we have no content, don't bother filtering anything
if (!!Ember.isEmpty(this.get('allSiteSettings'))) return;
@@ -20,12 +20,13 @@ export default Ember.ArrayController.extend({
return;
}
- const self = this,
- matchesGroupedByCategory = [{nameKey: 'all_results', name: I18n.t('admin.site_settings.categories.all_results'), siteSettings: []}];
+ const all = {nameKey: 'all_results', name: I18n.t('admin.site_settings.categories.all_results'), siteSettings: []};
+ const matchesGroupedByCategory = [all];
- this.get('allSiteSettings').forEach(function(settingsCategory) {
- const matches = settingsCategory.siteSettings.filter(function(item) {
- if (self.get('onlyOverridden') && !item.get('overridden')) return false;
+ const matches = [];
+ this.get('allSiteSettings').forEach(settingsCategory => {
+ const siteSettings = settingsCategory.siteSettings.filter(item => {
+ if (this.get('onlyOverridden') && !item.get('overridden')) return false;
if (filter) {
if (item.get('setting').toLowerCase().indexOf(filter) > -1) return true;
if (item.get('setting').toLowerCase().replace(/_/g, ' ').indexOf(filter) > -1) return true;
@@ -36,16 +37,20 @@ export default Ember.ArrayController.extend({
return true;
}
});
- if (matches.length > 0) {
- matchesGroupedByCategory[0].siteSettings.pushObjects(matches);
+ if (siteSettings.length > 0) {
+ matches.pushObjects(siteSettings);
matchesGroupedByCategory.pushObject({
nameKey: settingsCategory.nameKey,
name: I18n.t('admin.site_settings.categories.' + settingsCategory.nameKey),
- siteSettings: matches
+ siteSettings,
+ count: siteSettings.length
});
}
});
+ all.siteSettings.pushObjects(matches.slice(0, 30));
+ all.count = matches.length;
+
this.set('model', matchesGroupedByCategory);
this.transitionToRoute("adminSiteSettingsCategory", category || "all_results");
},
@@ -60,10 +65,7 @@ export default Ember.ArrayController.extend({
actions: {
clearFilter() {
- this.setProperties({
- filter: '',
- onlyOverridden: false
- });
+ this.setProperties({ filter: '', onlyOverridden: false });
},
toggleMenu() {
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 b85fbaf069..de9b3cc982 100644
--- a/app/assets/javascripts/admin/controllers/admin-user-badges.js.es6
+++ b/app/assets/javascripts/admin/controllers/admin-user-badges.js.es6
@@ -56,12 +56,12 @@ export default Ember.ArrayController.extend({
var badges = [];
this.get('badges').forEach(function(badge) {
- if (badge.get('multiple_grant') || !granted[badge.get('id')]) {
+ if (badge.get('enabled') && (badge.get('multiple_grant') || !granted[badge.get('id')])) {
badges.push(badge);
}
});
- return _.sortBy(badges, "name");
+ return _.sortBy(badges, badge => badge.get('displayName'));
}.property('badges.@each', 'model.@each'),
/**
diff --git a/app/assets/javascripts/admin/models/admin-user.js.es6 b/app/assets/javascripts/admin/models/admin-user.js.es6
index 7cda05c820..e8db973a88 100644
--- a/app/assets/javascripts/admin/models/admin-user.js.es6
+++ b/app/assets/javascripts/admin/models/admin-user.js.es6
@@ -387,16 +387,16 @@ const AdminUser = Discourse.User.extend({
const buttons = [{
"label": I18n.t("composer.cancel"),
- "class": "cancel",
- "link": true
- }, {
- "label": I18n.t('admin.user.delete_dont_block'),
"class": "btn",
- "callback": function(){ performDestroy(false); }
+ "link": true
}, {
"label": '' + I18n.t('admin.user.delete_and_block'),
"class": "btn btn-danger",
"callback": function(){ performDestroy(true); }
+ }, {
+ "label": I18n.t('admin.user.delete_dont_block'),
+ "class": "btn btn-primary",
+ "callback": function(){ performDestroy(false); }
}];
bootbox.dialog(message, buttons, { "classes": "delete-user-modal" });
diff --git a/app/assets/javascripts/admin/models/staff_action_log.js b/app/assets/javascripts/admin/models/staff_action_log.js
index dc52a7b170..0dde773661 100644
--- a/app/assets/javascripts/admin/models/staff_action_log.js
+++ b/app/assets/javascripts/admin/models/staff_action_log.js
@@ -11,6 +11,7 @@ Discourse.StaffActionLog = Discourse.Model.extend({
formatted += this.format('admin.logs.ip_address', 'ip_address');
formatted += this.format('admin.logs.topic_id', 'topic_id');
formatted += this.format('admin.logs.post_id', 'post_id');
+ formatted += this.format('admin.logs.category_id', 'category_id');
if (!this.get('useCustomModalForDetails')) {
formatted += this.format('admin.logs.staff_actions.new_value', 'new_value');
formatted += this.format('admin.logs.staff_actions.previous_value', 'previous_value');
@@ -19,7 +20,7 @@ Discourse.StaffActionLog = Discourse.Model.extend({
if (this.get('details')) formatted += Handlebars.Utils.escapeExpression(this.get('details')) + '
';
}
return formatted;
- }.property('ip_address', 'email', 'topic_id', 'post_id'),
+ }.property('ip_address', 'email', 'topic_id', 'post_id', 'category_id'),
format: function(label, propertyName) {
if (this.get(propertyName)) {
diff --git a/app/assets/javascripts/admin/templates/admin.hbs b/app/assets/javascripts/admin/templates/admin.hbs
index c7746a6d4a..6c3008dd28 100644
--- a/app/assets/javascripts/admin/templates/admin.hbs
+++ b/app/assets/javascripts/admin/templates/admin.hbs
@@ -13,8 +13,8 @@
{{/if}}
{{#if currentUser.admin}}
{{nav-item route='adminGroups' label='admin.groups.title'}}
+ {{nav-item route='adminEmail' label='admin.email.title'}}
{{/if}}
- {{nav-item route='adminEmail' label='admin.email.title'}}
{{nav-item route='adminFlags' label='admin.flags.title'}}
{{nav-item route='adminLogs' label='admin.logs.title'}}
{{#if currentUser.admin}}
diff --git a/app/assets/javascripts/admin/templates/components/embedding-setting.hbs b/app/assets/javascripts/admin/templates/components/embedding-setting.hbs
index 36dbb88692..e3a99c3202 100644
--- a/app/assets/javascripts/admin/templates/components/embedding-setting.hbs
+++ b/app/assets/javascripts/admin/templates/components/embedding-setting.hbs
@@ -5,7 +5,7 @@
{{else}}
- {{input value=value id=inputId}}
+ {{input value=value id=inputId placeholder=placeholderValue}}
{{/if}}
{{i18n "admin.embedding.crawling_description"}}
- {{embedding-setting field="embed_whitelist_selector" value=embedding.embed_whitelist_selector}} - {{embedding-setting field="embed_blacklist_selector" value=embedding.embed_blacklist_selector}} + {{embedding-setting field="embed_whitelist_selector" + value=embedding.embed_whitelist_selector + placeholder="admin.embedding.whitelist_example"}} + + {{embedding-setting field="embed_blacklist_selector" + value=embedding.embed_blacklist_selector + placeholder="admin.embedding.blacklist_example"}}Invitationslink genereret!
Invitationslinket er kun gyldigt for denne email-adresse: %{invitedEmail}
' bulk_invite: none: "Du har ikke inviteret nogen her endnu. Du kan sende individuelle invitationer eller invitere en masse mennesker på én gang ved at uploade en samlet liste over invitationer." text: "Masse invitering fra en fil" @@ -591,11 +617,13 @@ da: server: "Server fejl" forbidden: "Adgang nægtet" unknown: "Fejl" + not_found: "Side ikke fundet" desc: network: "Tjek din internetforbindelse." network_fixed: "Det ser ud som om den er tilbage." server: "Fejlkode: {{status}}" forbidden: "Du har ikke tilladelser til at se det" + not_found: "Ups, programmet forsøgte at indlæse en URL der ikke eksisterer." unknown: "Noget gik galt." buttons: back: "Gå tilbage" @@ -608,6 +636,9 @@ da: read_only_mode: enabled: "Skrivebeskyttet tilstand er aktiv. Du kan fortsætte med at læse indlæg, men du kan ikke ændre noget." login_disabled: "Log in er deaktiveret midlertidigt, da forummet er i \"kun læsnings\" tilstand." + too_few_topics_and_posts_notice: "Lad os få startet denne diskussion! Der er i øjeblikket %{currentTopics} / %{requiredTopics} emner og %{currentPosts} / %{requiredPosts} indlæg. Nye besøgende har brug for samtaler at læse og svare på." + too_few_topics_notice: "Lad os få startet denne diskussion ! Der er i øjeblikket %{currentTopics} / %{requiredTopics} emner. Nye besøgende har brug for samtaler at læse og svare på." + too_few_posts_notice: "Lad os få startet denne diskussion ! Der er i øjeblikket %{currentPosts} / %{requiredPosts} indlæg. Nye besøgende har brug for samtaler at læse og svare på." learn_more: "Læs mere…" year: 'år' year_desc: 'Indlæg oprettet i de seneste 365 dage' @@ -624,6 +655,21 @@ da: replies_lowercase: one: svar other: svar + signup_cta: + sign_up: "Tilmeld dig" + hide_session: "Mind mig om det i morgen" + hide_forever: "nej tak" + hidden_for_session: "OK, jeg spørger dig i morgen. Du kan også altid bruge \"Log på\" til at oprette en konto." + intro: "Hejsa! :heart_eyes: Det ser ud til, at du følger godt med i samtalerne, men du har endnu ikke oprettet en konto." + value_prop: "Når du opretter en konto, så kan vi huske hvad du har læst, så du altid kan fortsætte, hvor du er kommet til. Du får også notifikationer - her og på email - når nye interessante indlæg postes. Og du kan like indlæg og dele begejstringen. :heartbeat:" + methods: + sso: "Det er let at tilmelde sig: du har kun brug for en konto til hovedsitet." + only_email: "Det er nemt at tilmelde sig: du har kun brug for en email og en adgangskode." + only_other: "Brug din %{provider}-konto til at tilmelde dig." + one_and_email: "Brug din %{provider}-konto, eller email og password, til at tilmelde dig." + multiple_no_email: "Det er let at tilmelde sig: brug en af dine %{count} sociale konti" + multiple: "Det er nemt at tilmelde sig: brug en af dine %{count} sociale konti, eller en email og adgangskode." + unknown: "fejl under hentning af understøttede loginmetoder" summary: enabled_description: "Du ser et sammendrag af dette emne: kun de mest interessante indlæg som andre finder interresante." description: "Der er {{count}} svar." @@ -705,7 +751,10 @@ da: emoji_one: "Emoji One" composer: emoji: "Emoji :smile:" + options: "Indstillinger" + whisper: "hvisken" add_warning: "Dette er en officiel advarsel." + toggle_whisper: "Slå hvisken til/fra" posting_not_on_topic: "Hvilket emne vil du svare på?" saving_draft_tip: "gemmer..." saved_draft_tip: "gemt" @@ -732,6 +781,7 @@ da: title_placeholder: "Hvad handler diskussionen om i korte træk?" edit_reason_placeholder: "hvorfor redigerer du?" show_edit_reason: "(tilføj en begrundelse for ændringen)" + reply_placeholder: "Skriv her. Brug Markdown, BBCode eller HTML til at formattere. Træk eller indsæt billeder." view_new_post: "Se dit nye indlæg." saving: "Gemmer…" saved: "Gemt!" @@ -775,7 +825,7 @@ da: units: "(# timer)" examples: 'Indtast antal timer (24).' notifications: - title: "notifikation ved @navns nævnelse, svar til dine indlæg og emner, beskeder, mv." + title: "notifikationer ved @navns nævnelse, svar på dine indlæg og emner, beskeder, mv." none: "Ikke i stand til at indlæse notifikationer for tiden." more: "se ældre notifikationer" total_flagged: "total markerede indlæg" @@ -792,6 +842,20 @@ da: moved_post: "{{username}} moved {{description}}
" linked: "{{username}} {{description}}
" granted_badge: "Du blev tildelt '{{description}}'
" + alt: + mentioned: "Nævnt af" + quoted: "Citeret af" + replied: "Svaret" + posted: "Indlæg af" + edited: "Rediger dit indlæg af" + liked: "Likede dit indlæg" + private_message: "Privat besked fra" + invited_to_private_message: "Inviteret til en privat besked fra" + invited_to_topic: "Inviteret til et indlæg fra" + invitee_accepted: "Invitation accepteret af" + moved_post: "Dit indlæg blev flyttet af" + linked: "Link til dit indlæg" + granted_badge: "Badge tildelt" popup: mentioned: '{{username}} nævnte dig i "{{topic}}" - {{site_title}}' quoted: '{{username}} citerede dig i "{{topic}}" - {{site_title}}' @@ -809,10 +873,21 @@ da: local_tip: "vælg billeder fra din enhed" local_tip_with_attachments: "vælg billeder eller filer fra din enhed ({{authorized_extensions}})" hint: "(du kan også trække og slippe ind i editoren for at uploade dem)" + hint_for_supported_browsers: "du kan også bruge træk-og-slip eller indsætte billeder i editoren" uploading: "Uploader billede" select_file: "Vælg fil" image_link: "link som dit billede vil pege på" search: + sort_by: "Sorter efter" + relevance: "Relevans" + latest_post: "Seneste indlæg" + most_viewed: "Mest sete" + most_liked: "Mest likede" + select_all: "Vælg alle" + clear_all: "Ryd alle" + result_count: + one: "1 resultat for \"{{term}}\"" + other: "{{count}} reultater for \"{{term}}\"" title: "søg efter emner, indlæg, brugere eller kategorier" no_results: "Ingen resultater fundet." no_more_results: "Ikke flere resultater." @@ -825,6 +900,7 @@ da: topic: "Søg i dette emne" private_messages: "Søg i beskeder" hamburger_menu: "gå til en anden emneliste eller kategori" + new_item: "ny" go_back: 'gå tilbage' not_logged_in_user: 'bruger side, med oversigt over aktivitet og indstillinger' current_user: 'gå til brugerside' @@ -873,6 +949,9 @@ da: bookmarks: "Der er ikke flere bogmærkede emner." search: "Der er ikke flere søgeresultater." topic: + unsubscribe: + stop_notifications: "Du vil nu modtage færre notifikationer for {{title}}" + change_notification_state: "Din nuværende notifikationstilstand er" filter_to: "Vis {{post_count}} indlæg i emnet" create: 'Nyt emne' create_long: 'Opret et nyt emne i debatten' @@ -1012,15 +1091,20 @@ da: success_message: 'Du har nu rapporteret dette emne til administrator.' feature_topic: title: "Fremhæv dette emne" + pin: "Fastgør dette emne til toppen af kategorien {{categoryLink}} indtil" confirm_pin: "Du har allerede {{count}} fastgjorte emner. Fastgjorte emner kan være irriterende for nye og anonyme brugere. Er du sikker på du vil fastgøre et nyt emne i denne kategori?" unpin: "Fjern dette emne fra starten af listen i {{categoryLink}} kategorien." + unpin_until: "Fjern dette emne fra toppen af kategorien {{categoryLink}} eller vent til %{until}." pin_note: "Brugere kan unpinne emnet individuelt." + pin_validation: "Der skal angives en dato for at fastgøre dette emne" already_pinned: zero: "Der er ingen fastgjorte emner i {{categoryLink}}." one: "Emner fastgjorte i {{categoryLink}}: 1." other: "Fastgjorte emner i {{categoryLink}}: {{count}}." + pin_globally: "Fastgør dette emne til toppen af alle emnelister indtil" confirm_pin_globally: "Du har allerede {{count}} globalt fastgjorte emner. For mange fastgjorte emner kan være irriterende for nye og anonyme brugere. Er du sikker på du vil fastgøre et emne mere globalt?" unpin_globally: "Fjern dette emne fra toppen af alle emne lister." + unpin_globally_until: "Fjern dette emne fra toppen af alle emnelister eller vent til %{until}." global_pin_note: "Brugere kan unpinne emnet individuelt." already_pinned_globally: zero: "Der er ingen globalt fastgjorte emner." @@ -1089,6 +1173,12 @@ da: one: "Vælg den nye ejer af indlægget, oprindeligt skrevet af {{old_user}}." other: "Vælg den nye ejer af {{count}} indlæg, oprindeligt skrevet af {{old_user}}." instructions_warn: "Bemærk at tidligere notifikationer på dette emne vil ikke blive overført til den nye bruger.\n+
+ diff --git a/config/locales/client.de.yml b/config/locales/client.de.yml index 5a57b22969..9bc5570f35 100644 --- a/config/locales/client.de.yml +++ b/config/locales/client.de.yml @@ -546,7 +546,7 @@ de: after_5_minutes: "nach 5 Minuten" after_10_minutes: "nach 10 Minuten" invited: - search: "schreib zum Suchen nach Einladungen..." + search: "zum Suchen nach Einladungen hier eingeben..." title: "Einladungen" user: "Eingeladener Benutzer" sent: "Gesendet" @@ -644,7 +644,7 @@ de: signup_cta: sign_up: "Registrieren" hide_session: "Erinnere mich morgen" - hide_forever: "Nein danke!" + hide_forever: "Nein danke" hidden_for_session: "In Ordnung, ich frag dich morgen wieder. Du kannst dir auch jederzeit mit „Anmelden“ ein Benutzerkonto erstellen." intro: "Hallo! :heart_eyes: Es sieht so aus, als würde dir die Diskussion gefallen. Du hast aber noch kein Benutzerkonto." value_prop: "Wenn du ein Benutzerkonto anlegst, merken wir uns, was du gelesen hast, damit du immer dort fortsetzten kannst, wo du aufgehört hast. Du kannst auch Benachrichtigungen – hier oder per E-Mail – erhalten, wenn neue Beiträge verfasst werden. Beiträge, die dir gefallen, kannst du mit einem Like versehen und diese Freude mit allen teilen. :heartbeat:" @@ -767,7 +767,7 @@ de: title_placeholder: "Um was geht es in dieser Diskussion? Schreib einen kurzen Satz." edit_reason_placeholder: "Warum bearbeitest du?" show_edit_reason: "(Bearbeitungsgrund hinzufügen)" - reply_placeholder: "Schreibe hier. Verwende Markdown, BBCode oder HTML zur Formatierung. Füge Bilder ein oder ziehe sie herein." + reply_placeholder: "Schreib hier. Verwende Markdown, BBCode oder HTML zur Formatierung. Füge Bilder ein oder ziehe sie herein." view_new_post: "Sieh deinen neuen Beitrag an." saving: "Speichere..." saved: "Gespeichert!" @@ -1424,16 +1424,13 @@ de: notifications: watching: title: "Beobachten" - description: "Du wirst automatisch alle neuen Themen in dieser Kategorie beobachten und über alle neuen Beiträge und Themen benachrichtigt werden. Die Anzahl der neuen Antworten wird bei den betroffenen Themen angezeigt." tracking: title: "Verfolgen" - description: "Du wirst automatisch allen neuen Themen in dieser Kategorie folgen. Die Anzahl der neuen Antworten wird bei den betroffenen Themen angezeigt." regular: title: "Normal" description: "Du wirst benachrichtigt, wenn jemand deinen @Namen erwähnt oder dir antwortet." muted: title: "Stummgeschaltet" - description: "Du erhältst keine Benachrichtigungen über neue Themen in dieser Kategorie und die Themen werden nicht in deiner Liste ungelesener Themen aufscheinen." flagging: title: 'Danke für deine Mithilfe!' private_reminder: 'Meldungen sind vertraulich und nur für Mitarbeiter sichtbar' diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 4dd0b0cf5c..1b1daeed99 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -619,7 +619,9 @@ en: user: "Invited User" sent: "Sent" none: "There are no pending invites to display." - truncated: "Showing the first {{count}} invites." + truncated: + one: "Showing the first invite." + other: "Showing the first {{count}} invites." redeemed: "Redeemed Invites" redeemed_tab: "Redeemed" redeemed_tab_with_count: "Redeemed ({{count}})" @@ -831,6 +833,7 @@ en: composer: emoji: "Emoji :smile:" + more_emoji: "more..." options: "Options" whisper: "whisper" @@ -2173,6 +2176,7 @@ en: ip_address: "IP" topic_id: "Topic ID" post_id: "Post ID" + category_id: "Category ID" delete: 'Delete' edit: 'Edit' save: 'Save' @@ -2213,6 +2217,9 @@ en: impersonate: "impersonate" anonymize_user: "anonymize user" roll_up: "roll up IP blocks" + change_category_settings: "change category settings" + delete_category: "delete category" + create_category: "create category" screened_emails: title: "Screened Emails" description: "When someone tries to create a new account, the following email addresses will be checked and the registration will be blocked, or some other action performed." @@ -2588,7 +2595,9 @@ en: embed_username_key_from_feed: "Key to pull discourse username from feed" embed_truncate: "Truncate the embedded posts" embed_whitelist_selector: "CSS selector for elements that are allowed in embeds" + whitelist_example: "article, #story, .post" embed_blacklist_selector: "CSS selector for elements that are removed from embeds" + blacklist_example: ".ad-unit, header" feed_polling_enabled: "Import posts via RSS/ATOM" feed_polling_url: "URL of RSS/ATOM feed to crawl" save: "Save Embedding Settings" diff --git a/config/locales/client.es.yml b/config/locales/client.es.yml index 4b1f09b9f3..b56b946bdb 100644 --- a/config/locales/client.es.yml +++ b/config/locales/client.es.yml @@ -617,11 +617,13 @@ es: server: "Error del Servidor" forbidden: "Acceso Denegado" unknown: "Error" + not_found: "Página no encontrada" desc: network: "Por favor revisa tu conexión." network_fixed: "Parece que ha vuelto." server: "Código de error: {{status}}" forbidden: "No estás permitido para ver eso." + not_found: "¡Ups! la aplicación intentó cargar una URL inexistente." unknown: "Algo salió mal." buttons: back: "Volver Atrás" @@ -656,10 +658,10 @@ es: signup_cta: sign_up: "Registrarse" hide_session: "Recordar mañana" - hide_forever: "No gracias" + hide_forever: "no, gracias" hidden_for_session: "Vale, te preguntaremos mañana. Recuerda que también puedes usar el botón 'Iniciar sesión' para crear una cuenta en cualquier momento." intro: "¡Hola! :heart_eyes: Parece que estás interesado en las cosas que nuestros usuarios publican, pero no tienes una cuenta registrada." - value_prop: "Si estás registrado, podemos saber exactamente lo que has leído, para que siempre puedas retomar la lectura donde la dejaste. También puedes recibir notificaciones, por aquí o por email, cuando se publiquen nuevos mensajes. Ah, ¡y puedes darle a Me gusta a los mensajes! :heartbeat:" + value_prop: "Cuando te registras, recordamos lo que has leído, para que puedas volver justo donde estabas leyendo. También recibes notificaciones, por aquí y por email, cuando se publican nuevos mensajes. ¡También puedes darle a Me gusta a los mensajes! :heartbeat:" methods: sso: "Registrarse es gratis: sólo necesitas una cuenta de la web principal." only_email: "Registrarse es fácil: sólo necesitas un email y una contraseña." @@ -1445,16 +1447,16 @@ es: notifications: watching: title: "Vigilar" - description: "Seguirás automáticamente todos los nuevos temas en estas categorías. Se te notificará de cada nuevo post y tema, y además, se añadirá un contador de posts nuevos y sin leer al lado del tema." + description: "Vigilarás automáticamente todos los nuevos temas en estas categorías. Serás notificado por cada nuevo mensaje en cada tema, y verás una cuenta de las nuevas respuestas." tracking: title: "Seguir" - description: "Seguirás automáticamente todos los nuevos temas en estas categorías. Se añadirá un contador de posts nuevos y sin leer al lado del tema." + description: "Seguirás automáticamente todos los nuevos temas en estas categorías. Serás notificado si alguien menciona tu @nombre o te responde, y verás una cuenta de las nuevas respuestas." regular: title: "Normal" description: "Se te notificará solo si alguien menciona tu @nombre o te responde a un post." muted: title: "Silenciadas" - description: "No se te notificará de nuevos temas en estas categorías y no aparecerán en la pestaña de no leídos." + description: "Nunca serás notificado sobre nuevos temas en estas categorías, y no aparecerán en tu pestaña de no leído." flagging: title: '¡Gracias por ayudar a mantener una comunidad civilizada!' private_reminder: 'los reportes son privados, son visibles únicamente por los administradores' @@ -1986,6 +1988,7 @@ es: ip_address: "IP" topic_id: "ID del Tema" post_id: "ID del Post" + category_id: "ID de la categoría" delete: 'Eliminar' edit: 'Editar' save: 'Guardar' @@ -2026,6 +2029,9 @@ es: impersonate: "impersonar" anonymize_user: "anonimizar usuario" roll_up: "agrupar bloqueos de IP" + change_category_settings: "cambiar opciones de categoría" + delete_category: "eliminar categoría" + create_category: "crear categoría" screened_emails: title: "Correos bloqueados" description: "Cuando alguien trata de crear una cuenta nueva, los siguientes correos serán revisados y el registro será bloqueado, o alguna otra acción será realizada." @@ -2390,7 +2396,9 @@ es: embed_username_key_from_feed: "Clave para extraer usuario de discourse del feed" embed_truncate: "Truncar los posts insertados" embed_whitelist_selector: "Selector CSS para permitir elementos a embeber" + whitelist_example: "article, #story, .post" embed_blacklist_selector: "Selector CSS para restringir elementos a embeber" + blacklist_example: ".ad-unit, header" feed_polling_enabled: "Importar posts usando RSS/ATOM" feed_polling_url: "URL del feed RSS/ATOM del que extraer datos" save: "Guardar ajustes de Insertado" diff --git a/config/locales/client.fa_IR.yml b/config/locales/client.fa_IR.yml index 337852a60e..53bd89678e 100644 --- a/config/locales/client.fa_IR.yml +++ b/config/locales/client.fa_IR.yml @@ -1240,16 +1240,12 @@ fa_IR: notifications: watching: title: "در حال تماشا" - description: "شما به صورت خودکار تمام عناوین این دستهها را مشاهده خواهید کرد. به شما تمام عناوین و نوشتههای جدید اطلاع رسانی خواهد شد، و تعداد نوشتههای جدید هر عنوان در کنار آن نمایش داده میشود." tracking: title: "پیگیری" - description: "شما به صورت خودکار تمام عناوین جدید در این دستهها را پیگیری خواهید کرد. تعداد نوشته های جدید در کنار عنواین نمایش داده میشود." regular: - title: "منظم" description: "در صورتی که فردی با @name به شما اشاره کند یا به شما پاسخی دهد به شما اطلاع داده خواهد شد." muted: title: "بی صدا شد" - description: "به شما همه چیز در رابطه با این دسته بندی اطلاع داده خواهد شد ، و آن ها در تب خوانده نشده پدیدار نمی شوند" flagging: title: 'تشکر برای کمک به نگه داشتن جامعه ما بصورت مدنی !' private_reminder: 'پرچم های خصوصی, فقط قابل مشاهده برای مدیران' diff --git a/config/locales/client.fi.yml b/config/locales/client.fi.yml index cb44381653..068a927619 100644 --- a/config/locales/client.fi.yml +++ b/config/locales/client.fi.yml @@ -109,6 +109,7 @@ fi: google+: 'jaa tämä linkki Google+:ssa' email: 'lähetä tämä linkki sähköpostissa' action_codes: + split_topic: "pilkkoi tämän ketjun %{when}" autoclosed: enabled: 'sulki %{when}' disabled: 'avasi %{when}' @@ -227,6 +228,7 @@ fi: revert: "Palauta" failed: "Epäonnistui" switch_to_anon: "Anonyymi tila" + switch_from_anon: "Poistu anonyymitilasta" banner: close: "Sulje tämä banneri." edit: "Muokkaa tätä banneria >>" @@ -615,11 +617,13 @@ fi: server: "Palvelinvirhe" forbidden: "Pääsy estetty" unknown: "Virhe" + not_found: "Sivua ei löytynyt" desc: network: "Tarkasta internetyhteytesi." network_fixed: "Näyttäisi palanneen takaisin." server: "Virhekoodi: {{status}}" forbidden: "Sinulla ei ole oikeutta katsoa tätä." + not_found: "Hups, ohjelma yritti ladata osoitteen, jota ei ole olemassa" unknown: "Jotain meni pieleen." buttons: back: "Mene takaisin" @@ -632,6 +636,9 @@ fi: read_only_mode: enabled: "Olet Vain luku -tilassa. Voit jatkaa selaamista, muttet välttämättä pysty vaikuttamaan sisältöön." login_disabled: "Kirjautuminen ei ole käytössä sivuston ollessa vain luku -tilassa." + too_few_topics_and_posts_notice: "Laitetaanpa keskustelu alulle! Tällä hetkellä palstalla on %{currentTopics} / %{requiredTopics} ketjua ja %{currentPosts} / %{requiredPosts} viestiä. Uudet kävijät tarvitsevat keskusteluita, joita lukea ja joihin vastata." + too_few_topics_notice: "Laitetaanpa keskustelu alulle! Tällä hetkellä palstalla on %{currentTopics} / %{requiredTopics} ketjua. Uudet kävijät tarvitsevat keskusteluita, joita lukea ja joihin vastata." + too_few_posts_notice: "Laitetaanpa keskustelu alulle! Tällä hetkellä palstalla on %{currentPosts} / %{requiredPosts} viestiä. Uudet kävijät tarvitsevat keskusteluita, joita lukea ja joihin vastata." learn_more: "opi lisää..." year: 'vuosi' year_desc: 'viimeisen 365 päivän aikana luodut ketjut' @@ -648,6 +655,21 @@ fi: replies_lowercase: one: vastaus other: vastauksia + signup_cta: + sign_up: "Luo tili" + hide_session: "Muistuta huomenna" + hide_forever: "ei kiitos" + hidden_for_session: "OK, kysyn huomenna uudestaan. Voit aina myös käyttää 'Kirjaudu sisään' -linkkiä luodaksesi tilin." + intro: "Hei siellä! :heart_eyes: Vaikuttaa siltä, että olet pitänyt keskusteluista, mutta et ole luonut omaa tiliä." + value_prop: "Kun luot tilin, muistamme mitä olet lukenut, jotta voit aina palata keskusteluissa takaisin oikeaan kohtaan. Saat myös ilmoituksia, täällä tai sähköpostilla, kun uusia viestejä kirjoitetaan. Voit myös tykätä viesteistä. :heartbeat:" + methods: + sso: "Tilin luominen on helppoa: tarvitset vain tunnuksen pääsivustolle." + only_email: "Tilin luominen on helppoa: tarvitset vain sähköpostiosoitteen ja salasanan." + only_other: "Käytä %{provider} -tiliäsi luodaksesi tunnuksen." + one_and_email: "Käytä %{provider} -tiliäsi, tai sähköpostia ja salasanaa luodaksesi tilin." + multiple_no_email: "Tilin luominen on helppoa: käytä mitä vain %{count} sosiaalisesta kirjautumisesta." + multiple: "Tilin luominen on helppoa: käytä mitä vain %{count} sosiaalisesta kirjautumisesta, tai sähköpostiosoitetta ja salasanaa." + unknown: "virhe haettaessa tuettuja kirjautumistapoja" summary: enabled_description: "Tarkastelet tiivistelmää tästä ketjusta, sen mielenkiintoisimpia viestejä käyttäjien toiminnan perusteella." description: "Tässä kejussa on {{count}} viestiä." @@ -729,7 +751,10 @@ fi: emoji_one: "Emoji One" composer: emoji: "Emoji :smile:" + options: "Asetukset" + whisper: "kuiskaus" add_warning: "Tämä on virallinen varoitus." + toggle_whisper: "Vaihda kuiskaus" posting_not_on_topic: "Mihin ketjuun haluat vastata?" saving_draft_tip: "tallennetaan..." saved_draft_tip: "tallennettu" @@ -853,6 +878,16 @@ fi: select_file: "Valitse tiedosto" image_link: "linkki, johon kuvasi osoittaa" search: + sort_by: "Järjestä" + relevance: "Osuvuus" + latest_post: "Uusin viesti" + most_viewed: "Katselluin" + most_liked: "Tykätyin" + select_all: "Valitse kaikki" + clear_all: "Tyhjennä kaikki" + result_count: + one: "1 tulos haulle \"{{term}}\"" + other: "{{count}} tulosta haulle \"{{term}}\"" title: "etsi ketjuja, viestejä, käyttäjiä tai alueita" no_results: "Ei tuloksia." no_more_results: "Enempää tuloksia ei löytynyt." @@ -864,6 +899,8 @@ fi: category: "Etsi alueelta \"{{category}}\"" topic: "Etsi tästä ketjusta" private_messages: "Etsi viesteistä" + hamburger_menu: "siirry toiseen ketjuun tai alueelle" + new_item: "uusi" go_back: 'mene takaisin' not_logged_in_user: 'käyttäjäsivu, jossa on tiivistelmä käyttäjän viimeaikaisesta toiminnasta sekä käyttäjäasetukset' current_user: 'siirry omalle käyttäjäsivullesi' @@ -1059,6 +1096,7 @@ fi: unpin: "Älä enää pidä tätä ketjua {{categoryLink}}-aluen ylimmäisenä." unpin_until: "Poista nyt tämän ketjun kiinnitys alueen {{categoryLink}} ylimmäisenä, tai odota kunnes %{until}." pin_note: "Käyttäjät voivat poistaa ketjun kiinnityksen itseltään." + pin_validation: "Päivämäärä vaaditaan kiinnittämään tämä ketju" already_pinned: zero: "Alueella {{categoryLink}} ei ole kiinnitettyjä ketjuja." one: "Kiinnitettyjä ketjuja alueella {{categoryLink}}: 1." @@ -1135,6 +1173,12 @@ fi: one: "Valitse uusi omistaja viestille käyttäjältä {{old_user}}." other: "Valitse uusi omistaja {{count}} viestille käyttäjältä {{old_user}}." instructions_warn: "Huomaa, että viestin ilmoitukset eivät siirry uudelle käyttäjälle automaattisesti.+
+ diff --git a/config/locales/client.fr.yml b/config/locales/client.fr.yml index f6b80ec36e..84e11b5aea 100644 --- a/config/locales/client.fr.yml +++ b/config/locales/client.fr.yml @@ -109,6 +109,7 @@ fr: google+: 'partager ce lien sur Google+' email: 'envoyer ce lien dans un courriel' action_codes: + split_topic: "Ce sujet a été découpé %{when}" autoclosed: enabled: 'fermé %{when}' disabled: 'ouvert %{when}' @@ -227,6 +228,7 @@ fr: revert: "Rétablir" failed: "Echec" switch_to_anon: "Mode anonyme" + switch_from_anon: "Quitter le mode anonyme" banner: close: "Ignorer cette bannière." edit: "Éditer cette bannière >>" @@ -330,6 +332,7 @@ fr: reorder: title: "Réordonner les catégories" title_long: "Réorganiser la liste des catégories" + fix_order: "Corriger les positions" fix_order_tooltip: "Toutes les catégories n'ont pas une position unique. Cela peut provoquer des résultats non souhaités." save: "Enregistrer l'ordre" apply_all: "Appliquer" @@ -614,11 +617,13 @@ fr: server: "Erreur serveur" forbidden: "Accès refusé" unknown: "Erreur" + not_found: "Page introuvable" desc: network: "Veuillez vérifier votre connexion." network_fixed: "On dirait que c'est revenu." server: "Code d'erreur: {{status}}" forbidden: "Vous n'êtes pas autorisé à voir cela." + not_found: "Oups, l'application a essayé de charger une URL qui n'existe pas." unknown: "Une erreur est survenue." buttons: back: "Retour" @@ -631,6 +636,9 @@ fr: read_only_mode: enabled: "Le mode lecture seule est activé. Vous pouvez continuer à naviguer sur le site, mais ne pouvez pas prendre part aux discussions." login_disabled: "Impossible de se connecté quand le site est en mode lecture seule." + too_few_topics_and_posts_notice: "Démarrons cette discussion! Il y a actuellement %{currentTopics} / %{requiredTopics} sujets et %{currentPosts} / %{requiredPosts} messages. Les nouveaux visiteurs ont besoin de quelques conversations pour lire et répondre." + too_few_topics_notice: "Démarrons cette discussion ! Il y a actuellement %{currentTopics} / %{requiredTopics} sujets. Les nouveaux visiteurs ont besoin de quelques conversations à lire et répondre." + too_few_posts_notice: "Démarrons cette discussion ! Il y a actuellement %{currentPosts} / %{requiredPosts} messages. Les nouveaux visiteurs ont besoin de quelques conversations à lire et répondre." learn_more: "en savoir plus…" year: 'an' year_desc: 'sujets créés durant les 365 derniers jours' @@ -647,6 +655,21 @@ fr: replies_lowercase: one: réponse other: réponses + signup_cta: + sign_up: "S'inscrire" + hide_session: "Me le rappeler demain." + hide_forever: "non merci" + hidden_for_session: "Très bien, je vous proposerai demain. Vous pouvez toujours cliquer sur 'Se connecter' pour créer un compte." + intro: "Bonjour! :heart_eyes: Vous semblez apprécier la discussion, mais n'avez pas encore créé de compte." + value_prop: "Quand vous créez votre compte, nous stockons ce que vous avez lu pour vous positionner systématiquement sur le bon emplacement à votre retour. Vous avez également des notifications, ici et par courriel, quand de nouveaux messages sont postés. Et vous pouvez aimer les messages pour partager vos coups de cœurs. :heartbeat:" + methods: + sso: "S'inscrire est facile: vous avez juste besoin d'un compte sur le site principal." + only_email: "S'inscrire est facile: vous avez juste besoin d'une adresse mail et d'un mot de passe." + only_other: "Utilisez votre compte %{provider} pour vous inscrire." + one_and_email: "Utilisez votre compte %{provider}, ou un courriel et un mot de passe, pour vous inscrire." + multiple_no_email: "S'inscrire est facile : utilisez l'un de nos %{count} connecteurs sociaux." + multiple: "S'inscrire est facile : utilisez l'un de nos %{count} connecteurs sociaux, ou un courriel et un mot de passe." + unknown: "erreur lors du chargement des méthodes de connexion supportées" summary: enabled_description: "Vous visualisez un résumé de ce sujet : les messages importants choisis par la communauté." description: "Il y a {{count}} réponses." @@ -728,6 +751,8 @@ fr: emoji_one: "Emoji One" composer: emoji: "Emoji :smile:" + options: "Options" + whisper: "murmure" add_warning: "Ceci est un avertissement officiel." posting_not_on_topic: "À quel sujet voulez-vous répondre ?" saving_draft_tip: "sauvegarde en cours..." @@ -852,8 +877,16 @@ fr: select_file: "Sélectionner Fichier" image_link: "lien vers lequel pointe l'image" search: + sort_by: "Tri par" + relevance: "Pertinence" + latest_post: "Dernier Message" + most_viewed: "Plus Vu" + most_liked: "Plus Aimé" select_all: "Tout sélectionner" clear_all: "Tout supprimer" + result_count: + one: "1 résultat pour \"{{term}}\"" + other: "{{count}} résultats pour \"{{term}}\"" title: "Rechercher les sujets, messages, utilisateurs ou catégories" no_results: "Aucun résultat." no_more_results: "Pas davantage de résultats." @@ -1212,6 +1245,7 @@ fr: no_value: "Non, le conserver" yes_value: "Oui, abandonner" via_email: "message depuis un courriel" + whisper: "ce message est un murmure privé pour les modérateurs" wiki: about: "ce message est en mode wiki; les utilisateurs de base peuvent le modifier" archetypes: @@ -1395,6 +1429,7 @@ fr: change_in_category_topic: "Éditer la description" already_used: 'Cette couleur est déjà utilisée par une autre catégorie' security: "Sécurité" + special_warning: "Avertissement : cette catégorie est une catégorie pré-remplie et les réglages de sécurité ne peuvent pas être modifiés. Si vous ne souhaitez pas utiliser cette catégorie, supprimez-là au lieu de détourner sa fonction." images: "Images" auto_close_label: "Fermer automatiquement après :" auto_close_units: "heures" @@ -1415,16 +1450,16 @@ fr: notifications: watching: title: "S'abonner" - description: "Vous surveillerez automatiquement les nouveaux sujets dans ces catégories. Vous serez notifié de tous les nouveaux messages et sujets, et le nombre de nouvelles réponses apparaîtra pour ces sujets." + description: "Vous surveillerez automatiquement tous les nouveaux sujets dans ces catégories. Vous serez averti pour tout nouveau message dans chaque sujet, et le nombre de nouvelles réponses sera affiché." tracking: title: "Suivi" - description: "Vous suivrez automatiquement tous les nouveaux sujets dans ces catégories. Le nombre de nouvelles réponses apparaîtra pour ces sujets." + description: "Vous surveillerez automatiquement tous les nouveaux sujets dans ces catégories. Vous serez averti si quelqu'un mentionne votre @nom ou vous répond, et le nombre de nouvelles réponses sera affiché." regular: title: "Normal" description: "Vous serez notifié si quelqu'un mentionne votre @pseudo ou vous répond." muted: title: "Silencieux" - description: "Vous ne recevrez aucune notification sur les sujets de ces catégories, et ils n'apparaîtront pas dans votre onglet \"non-lus\"." + description: "Vous ne serez jamais notifié concernant les nouveaux sujets dans ces catégories, et ils n'apparaîtront pas dans votre onglet non-lus." flagging: title: 'Merci de nous aider à garder notre communauté aimable !' private_reminder: 'les signalements sont privés, seulement visible aux modérateurs' @@ -1956,6 +1991,7 @@ fr: ip_address: "IP" topic_id: "Identifiant du sujet" post_id: "Identifiant du message" + category_id: "ID catégorie" delete: 'Supprimer' edit: 'Éditer' save: 'Sauvegarder' @@ -1996,6 +2032,9 @@ fr: impersonate: "incarner" anonymize_user: "rendre l'utilisateur anonyme" roll_up: "consolider des blocs d'IP" + change_category_settings: "modifier les paramètres de la catégorie" + delete_category: "supprimer catégorie" + create_category: "créer catégorie" screened_emails: title: "Courriels affichés" description: "Lorsque quelqu'un essaye de créé un nouveau compte, les adresses de courriel suivantes seront vérifiées et l'inscription sera bloquée, ou une autre action sera réalisée." diff --git a/config/locales/client.he.yml b/config/locales/client.he.yml index 3f931cf4d0..f6c5b7accd 100644 --- a/config/locales/client.he.yml +++ b/config/locales/client.he.yml @@ -1414,16 +1414,12 @@ he: notifications: watching: title: "עוקב" - description: "תעקבו באופן אוטומטי אחרי כל הנושאים החדשים בקטגוריות אלה. תקבלו התראה על כל פרסום ונושא חדש." tracking: title: "רגיל+" - description: "בקטגוריות אלה סך הפרסומים החדשים שלא נקראו יופיע לצד שם הנושא." regular: - title: "רגיל" description: "תקבלו התראה אם מישהו יזכיר את @שם_המשתמש/ת שלך או ישיב לפרסום שלך." muted: title: "מושתק" - description: "לא תקבל התראות בנוגע לנושאים חדשים בקטגוריות האלה, והם לא יופיעו בלשונית ה\"לא נקראו\" שלך." flagging: title: 'תודה על עזרתך לשמירה על תרבות הקהילה שלנו!' private_reminder: 'דגלים הם פרטיים וניתנים לצפייה ע"י הצוות בלבד' diff --git a/config/locales/client.it.yml b/config/locales/client.it.yml index 0ddad6637a..3d047a5e18 100644 --- a/config/locales/client.it.yml +++ b/config/locales/client.it.yml @@ -825,8 +825,8 @@ it: edited: "Modifica il tuo messaggio da" liked: "Ha assegnato un \"Mi piace\" al tuo messaggio" private_message: "Messaggio privato da" - invited_to_private_message: "Invitato ad una conversazione privata da" - invited_to_topic: "Invitato ad un argomento da" + invited_to_private_message: "Invitato a un messaggio privato da" + invited_to_topic: "Invitato a un argomento da" invitee_accepted: "Invito accettato da" moved_post: "Il tuo messaggio è stato spostato da" linked: "Collegamento al tuo messaggio" @@ -916,7 +916,7 @@ it: search: "Non ci sono altri risultati di ricerca." topic: unsubscribe: - stop_notifications: "Da ora riceverai meno notifiche su {{title}}" + stop_notifications: "Da ora riceverai meno notifiche per {{title}}" change_notification_state: "Lo stato delle tue notifiche è" filter_to: "{{post_count}} suoi messaggi" create: 'Nuovo Argomento' @@ -1057,20 +1057,20 @@ it: success_message: 'Hai segnalato questo argomento con successo.' feature_topic: title: "Poni argomento in primo piano" - pin: "Metti questo argomento in cima alla categoria \"{{categoryLink}}\" fino al" + pin: "Poni questo argomento in cima alla categoria {{categoryLink}} fino a" confirm_pin: "Hai già {{count}} argomenti puntati. Troppi argomenti puntati potrebbero essere un peso per gli utenti nuovi o anonimi. Sicuro di voler puntare un altro argomento in questa categoria?" unpin: "Rimuovi questo argomento dalla cima della categoria {{categoryLink}}." - unpin_until: "Rimuovi questo argomento dalla cima della categoria {{categoryLink}} o attendi fino al %{until}." + unpin_until: "Rimuovi questo argomento dalla cima della categoria {{categoryLink}} o attendi fino a %{until}." pin_note: "Gli utenti possono spuntare gli argomenti individualmente per loro stessi." - pin_validation: "È richiesta una data per appuntare questo argomento" + pin_validation: "È richiesta una data per appuntare questo argomento." already_pinned: zero: "Non ci sono argomenti puntati in {{categoryLink}}." one: "Argomenti attualmente puntati in {{categoryLink}}: 1." other: "Argomenti attualmente puntati in {{categoryLink}}: {{count}}." - pin_globally: "Metti questo argomento in cima a tutte le liste di messaggi fino al" + pin_globally: "Poni questo argomento in cima a tutte le liste di argomenti fino a" confirm_pin_globally: "Hai già {{count}} argomenti puntati globalmente. Troppi argomenti puntati potrebbero essere un peso per gli utenti nuovi o anonimi. Sicuro di voler puntare un altro argomento globalmente?" unpin_globally: "Togli questo argomento dalla cima degli altri argomenti." - unpin_globally_until: "Rimuovi questo argomento dalla cima di tutte le liste di argomenti o attenti fino al %{until}." + unpin_globally_until: "Rimuovi questo argomento dalla cima di tutte le liste di argomenti o attendi fino a %{until}." global_pin_note: "Gli utenti possono spuntare gli argomenti autonomamente per loro stessi." already_pinned_globally: zero: "Non ci sono argomenti puntati globalmente." @@ -1097,7 +1097,7 @@ it: title: 'Invita' username_placeholder: "nome utente" action: 'Invia Invito' - help: 'invita altri su questo argomento via email o notifiche' + help: 'invita altri su questo argomento via email o tramite notifiche' to_forum: "Invieremo una breve email che permetterà al tuo amico di entrare subito cliccando un collegamento, senza bisogno di effettuare il collegamento." sso_enabled: "Inserisci il nome utente della persona che vorresti invitare su questo argomento." to_topic_blank: "Inserisci il nome utente o l'indirizzo email della persona che vorresti invitare su questo argomento." @@ -1412,16 +1412,12 @@ it: notifications: watching: title: "In osservazione" - description: "Osserverai automaticamente tutti i nuovi argomenti in queste categorie. Riceverai notifiche su tutti i nuovi messaggi e argomenti e per tali argomenti apparirà il conteggio delle nuove risposte." tracking: title: "Seguendo" - description: "Seguirai automaticamente tutti i nuovi argomenti in queste categorie. Per tali argomenti apparirà un conteggio delle nuove risposte." regular: - title: "Normale" description: "Riceverai una notifica se qualcuno menziona il tuo @nome o ti risponde." muted: title: "Silenziato" - description: "Non ti verrà notificato nulla sui nuovi argomenti di queste categorie, e non compariranno nella tua tab dei non letti." flagging: title: 'Grazie per aiutarci a mantenere la nostra comunità civile!' private_reminder: 'le segnalazioni sono private, visibili soltanto allo staff ' diff --git a/config/locales/client.ja.yml b/config/locales/client.ja.yml index f4ed722ac7..92b0db524b 100644 --- a/config/locales/client.ja.yml +++ b/config/locales/client.ja.yml @@ -1261,16 +1261,12 @@ ja: notifications: watching: title: "カテゴリ参加中" - description: "これらのカテゴリに新しく投稿されたトピックを自動的に参加します。これらのカテゴリに対して新しい投稿があった場合、登録されたメールアドレスと、コミュニティ内の通知ボックスに通知が届き、トピック一覧に新しい回答数がつきます。" tracking: title: "トラック中" - description: "これらのカテゴリの新規トピックを自動的にトラックします。トピックに対して新しい投稿があった場合、トピック一覧に新しい回答数がつきます。" regular: - title: "通常" description: "他ユーザからタグ付けをされた場合、またはあなたの投稿に回答が付いた場合に通知されます。" muted: title: "ミュート中" - description: "このカテゴリに投稿されたトピックについての通知を受け取りません。また、未読タブにも通知されません。" flagging: title: '私達のコミュニティの維持を助けてくれてありがとうごうざいます' private_reminder: 'フラグはプライベートです。スタッフのみが参照できます' diff --git a/config/locales/client.ko.yml b/config/locales/client.ko.yml index 4d631210af..d68af672a4 100644 --- a/config/locales/client.ko.yml +++ b/config/locales/client.ko.yml @@ -1301,16 +1301,12 @@ ko: notifications: watching: title: "주시 중" - description: "이 카테고리 내의 새로운 글타래들을 지켜보도록 자동으로 설정됩니다. 새로운 글이나 글타래에 대하여 알림을 받게되며 글타래 옆에 읽지 않은 글의 수가 표시됩니다." tracking: title: "새 글 표시 중" - description: "이 카테고리 내의 새로운 글타래들을 추적하도록 자동으로 설정됩니다. 글타래 옆에 읽지 않은 글의 수가 표시됩니다." regular: - title: "알림: 일반" description: "누군가 내 @아아디 으로 멘션했거나 당신의 글에 답글이 달릴 때 알림을 받게 됩니다." muted: title: "알림 꺼짐" - description: "이 카테고리의 새로운 글타래에 대한 알림을 받지 않고 읽지 않\x1C은 탭에도 표시하지 않습니다." flagging: title: '우리 커뮤니티에 기여해 주셔서 감사합니다.' private_reminder: '신고는 오직 관리자만 볼 수 있습니다.' diff --git a/config/locales/client.nb_NO.yml b/config/locales/client.nb_NO.yml index bc95f1c0eb..c5ff73ac69 100644 --- a/config/locales/client.nb_NO.yml +++ b/config/locales/client.nb_NO.yml @@ -609,6 +609,13 @@ nb_NO: replies_lowercase: one: svar other: svar + signup_cta: + sign_up: "Registrer deg" + hide_session: "Spør meg igjen i morgen" + hide_forever: "nei takk" + hidden_for_session: "OK, jeg spør igjen i morgen. Du kan også registrere en konto når du vil!" + intro: "Hei du! :heart_eyes: Det ser ut som du følger diskusjonen, men ikke har registrert deg enda." + value_prop: "Når du registrerer deg husker vi hvor langt du har lest, så du starter på riktig sted neste gang du åpner en tråd. Du får også varsler, her og på e-post når det skjer ting i diskusjonene du vil følge. I tillegg kan du like innlegg :heartbeat:" summary: enabled_description: "Du ser for øyeblikket en oppsummering av dette emnet: de mest interessante innleggene i følge nettsamfunnet." description: "Det er {{count}} svar." @@ -1335,16 +1342,12 @@ nb_NO: notifications: watching: title: "Følger" - description: "Du vil automatisk følge alle nye emner i disse kategoriene. Du vil bli varslet om alle nye innlegg og emner. Antallet uleste og nye emner vil også vises." tracking: title: "Sporing" - description: "Du vil automatisk spore alle nye emner i disse kategoriene. Antallet nye svar vises for disse." regular: - title: "Vanlig" description: "Du vil bli varslet om noen nevner ditt @navn eller svarer deg." muted: title: "Dempet" - description: "Du vil ikke bli varslet om noe vedrørende disse emnene i disse kategoriene og de vil ikke vises i din ulest-liste." flagging: title: 'Takk for at du hjelper å holde forumet ryddig!' private_reminder: 'flagg er private, bare synlige for staben' diff --git a/config/locales/client.nl.yml b/config/locales/client.nl.yml index 7474d3ec9d..c73fc17449 100644 --- a/config/locales/client.nl.yml +++ b/config/locales/client.nl.yml @@ -333,6 +333,7 @@ nl: title: "Categorieën Herschikken " title_long: "Reorganiseer de categorielijst" fix_order: "Posities fixen" + fix_order_tooltip: "Niet alle categorien hebben een unieke nummer, dit resulteert soms in onverwachte resultaten." save: "Volgorde Opslaan" apply_all: "Toepassen" position: "Positie" @@ -616,11 +617,13 @@ nl: server: "Serverfout" forbidden: "Toegang geweigerd" unknown: "Fout" + not_found: "Pagina niet gevonden" desc: network: "Controleer je verbinding." network_fixed: "Het lijkt er op dat het terug is" server: "Fout code: {{status}}" forbidden: "Je hebt geen toestemming om dit te bekijken." + not_found: "Oeps, de applicatie heeft geprobeerd een URL te laden die niet bestaat." unknown: "Er is iets mis gegaan" buttons: back: "Ga terug" @@ -655,8 +658,18 @@ nl: signup_cta: sign_up: "Aanmelden" hide_session: "Herrinner me morgen" - hide_forever: "Nee bedankt" + hide_forever: "nee dankje" hidden_for_session: "Ok, ik vraag het je morgen. Je kunt altijd 'Log in' gebruiken om in te loggen." + intro: "Hey! :heart_eyes: Praat mee in deze discussie, meld je aan met een account" + value_prop: "Wanneer je een account aangemaakt hebt, herinneren deze wat je gelezen hebt, zodat je direct door kan lezen vanaf waar je gestopt bent. Je krijgt ook notificaties, hier en via email, wanneer nieuwe posts gemaakt zijn. En je kan ook nog posts liken :heartbeat:" + methods: + sso: "Aanmelden gaat eenvoudig: alles wat je nodig hebt is een account op de hoofdsite." + only_email: "Aanmelden gaat eenvoudig: alles wat je nodig hebt is een email en wachtwoord." + only_other: "Gebruik je %{provider} account om aan te melden." + one_and_email: "Gebruik je %{provider} account of email en wachtwoord om aan te melden." + multiple_no_email: "Aanmelden gaat eenvoudig: gebruik een van de %{count} social logins." + multiple: "Aanmelden gaat eenvoudig: gebruik een van de %{count} social logins. of een email en wachtwoord." + unknown: "Fout bij ondersteunende login methoden" summary: enabled_description: "Je leest een samenvatting van dit topic: alleen de meeste interessante berichten zoals bepaald door de community. " description: "Er zijn {{count}} reacties." @@ -738,7 +751,10 @@ nl: emoji_one: "Emoji One" composer: emoji: "Emoji :smile:" + options: "Opties" + whisper: "Fluister" add_warning: "Dit is een officiële waarschuwing." + toggle_whisper: "Schakel Fluistermode" posting_not_on_topic: "In welke topic wil je je antwoord plaatsen?" saving_draft_tip: "opslaan..." saved_draft_tip: "opgeslagen" @@ -765,6 +781,7 @@ nl: title_placeholder: "Waar gaat de discussie over in één korte zin?" edit_reason_placeholder: "vanwaar de wijziging?" show_edit_reason: "(geef een reden)" + reply_placeholder: "Typ hier. Gebruik Markdown, BBCode, of HTML om op te maken. Sleep of plak afbeeldingen." view_new_post: "Bekijk je nieuwe bericht." saving: "Opslaan..." saved: "Opgeslagen!" @@ -856,6 +873,7 @@ nl: local_tip: "selecteer afbeeldingen van uw apparaat" local_tip_with_attachments: "Selecteer afbeeldingen of bestanden van je apparaat ({{authorized_extensions}})" hint: "(je kan afbeeldingen ook slepen in de editor om deze te uploaden)" + hint_for_supported_browsers: "je kunt ook afbeeldingen slepen of plakken in de editor" uploading: "Uploaden" select_file: "Selecteer een bestand" image_link: "de link waar je afbeelding naar verwijst" @@ -867,6 +885,9 @@ nl: most_liked: "Meest geliked" select_all: "Selecteer Alles" clear_all: "Wis Alles" + result_count: + one: "1 resultaat voor \"{{term}}\"" + other: "{{count}} resultaat voor \"{{term}}\"" title: "zoek naar topics, berichten, gebruikers of categorieën" no_results: "Geen resultaten gevonden." no_more_results: "Geen resultaten meer gevonden." @@ -1221,6 +1242,7 @@ nl: no_value: "Nee, behouden" yes_value: "Ja, verwijderen" via_email: "dit bericht kwam binnen via e-mail" + whisper: "deze posts zijn alleen toegankelijk voor moderators" wiki: about: "deze discussie is een wiki; normale gebruikers kunnen hem aanpassen" archetypes: @@ -1404,6 +1426,7 @@ nl: change_in_category_topic: "Wijzig omschrijving" already_used: 'Deze kleur is al in gebruik door een andere categorie' security: "Beveiliging" + special_warning: "Waarschuwing: Dee catogorie is een vooringestelde categorie en de beveiligingsinstellingen kunnen hierdoor niet bewerkt worden. Als u deze categorie niet wenst te gebruiken, verwijder deze of herbestem deze." images: "Afbeeldingen" auto_close_label: "Sluit topics automatisch na:" auto_close_units: "uren" @@ -1424,12 +1447,12 @@ nl: notifications: watching: title: "In de gaten houden" - description: "Je ziet automatisch alle nieuwe topics in deze categorieën. Je ontvangt notificaties bij nieuwe berichten en topics, het aantal nieuwe reacties wordt voor deze topics weergegeven." + description: "Je krijgt automatisch alle nieuwe topics in deze categorie te zien. Je ontvangt notificaties bij nieuwe berichten en topics, naast het topic wordt het aantal nieuwe berichten weergegeven. " tracking: title: "Volgen" - description: "Je volgt automatisch alle topics in deze categorieën. Het aantal nieuwe reacties wordt voor deze topics weergegeven." + description: "Je ziet automatisch alle nieuwe topics in deze categorieën. Je ontvangt notificaties wanneer iemand je @name noemt of reageert op jou." regular: - title: "Regulier" + title: "Normaal" description: "Je krijgt een notificatie als iemand je @naam noemt of reageert op een bericht van jou." muted: title: "Genegeerd" @@ -1965,6 +1988,7 @@ nl: ip_address: "IP" topic_id: "Topic ID" post_id: "Bericht ID" + category_id: "Categorie ID" delete: 'Verwijder' edit: 'Wijzig' save: 'Opslaan' @@ -2005,6 +2029,9 @@ nl: impersonate: "Log in als gebruiker" anonymize_user: "maak gebruiker anoniem" roll_up: "groepeer verbannen IP-adressen" + change_category_settings: "verander categorie instellingen" + delete_category: "categorie verwijderen" + create_category: "categorie creeren" screened_emails: title: "Gescreende e-mails" description: "Nieuwe accounts met een van deze mailadressen worden geblokkeerd of een andere actie wordt ondernomen." @@ -2369,7 +2396,9 @@ nl: embed_username_key_from_feed: "Key voor de Discourse gebruikersnaam in de feed." embed_truncate: "Embedde berichten inkorten" embed_whitelist_selector: "CSS selector voor elementen die worden toegestaan bij embedding" + whitelist_example: "artikel #verhaal, .post" embed_blacklist_selector: "CSS selector voor elementen die worden verwijderd bij embedding" + blacklist_example: ".ad-unit, header" feed_polling_enabled: "Importeer berichten via RSS/ATOM" feed_polling_url: "URL van RSS/ATOM feed voor crawling" save: "Embedding Instellingen Opslaan " diff --git a/config/locales/client.pl_PL.yml b/config/locales/client.pl_PL.yml index e25fbb600b..987532e012 100644 --- a/config/locales/client.pl_PL.yml +++ b/config/locales/client.pl_PL.yml @@ -128,6 +128,7 @@ pl_PL: google+: 'udostępnij ten odnośnik na Google+' email: 'wyślij ten odnośnik przez email' action_codes: + split_topic: "podziel ten temat %{when}" autoclosed: enabled: 'zamknięcie %{when}' disabled: 'otworzenie %{when}' @@ -251,6 +252,7 @@ pl_PL: revert: "Przywróć" failed: "Niepowodzenie" switch_to_anon: "Tryb anonimowy" + switch_from_anon: "Zakończ tryb anonimowy" banner: close: "Zamknij ten baner." edit: "Edytuj ten baner >>" @@ -645,11 +647,13 @@ pl_PL: server: "błąd serwera" forbidden: "Brak dostępu" unknown: "Błąd" + not_found: "Nie znaleziono strony" desc: network: "Sprawdź swoje połączenie." network_fixed: "Chyba już w porządku." server: "Kod błędu: {{status}}" forbidden: "Nie możesz obejrzeć tego zasobu." + not_found: "Ups, aplikacja próbowała otworzyć URL który nie istnieje." unknown: "Coś poszło nie tak." buttons: back: "Cofnij" @@ -662,6 +666,9 @@ pl_PL: read_only_mode: enabled: "Aktywowani tryb tylko-do-odczytu. Możesz nadal przeglądać serwis, ale operacje zmieniające stan i treść mogą nie działać." login_disabled: "Logowanie jest zablokowane, gdy strona jest w trybie tylko do odczytu." + too_few_topics_and_posts_notice: "Pora rozruszać dyskusję! Aktualnie istnieje %{currentTopics} / %{requiredTopics} tematów i %{currentPosts} / %{requiredPosts} wpisów. Odwiedzający potrzebują więcej tematów i konwersacji do czytania i pisania na ich temat." + too_few_topics_notice: "Pora rozruszać dyskusję! Aktualnie istnieje %{currentTopics} / %{requiredTopics} tematów. Odwiedzający potrzebują więcej tematów i konwersacji do czytania i pisania na ich temat." + too_few_posts_notice: "Pora rozruszać dyskusję! Aktualnie istnieje %{currentPosts} / %{requiredPosts} wpisów. Odwiedzający potrzebują więcej tematów i konwersacji do czytania i pisania na ich temat." learn_more: "dowiedz się więcej…" year: 'rok' year_desc: 'tematy dodane w ciągu ostatnich 365 dni' @@ -679,6 +686,21 @@ pl_PL: one: odpowiedź few: odpowiedzi other: odpowiedzi + signup_cta: + sign_up: "Rejestracja" + hide_session: "Przypomnij mi jutro" + hide_forever: "nie, dziękuję" + hidden_for_session: "Ok, zapytamy jutro. Pamiętaj, że konto możesz w każdej chwili założyć klikając na 'Logowanie'." + intro: "Hej! :heart_eyes: Wygląda na to, że zainteresowała Cię dyskusja, ale nie posiadasz jeszcze konta." + value_prop: "Jeśli stworzysz konto, zapamiętamy przeczytane przez Ciebie wpisy i tematy, dzięki czemu zawsze powrócisz do odpowiedniego miejsca. Otrzymasz też powiadomienia o nowych wpisach. Dodatkowo możliwe będzie polubienie ciekawych wpisów :heartbeat:" + methods: + sso: "Rejestracja jest łatwa: wystarczy posiadać konto w naszym serwisie." + only_email: "Rejestracja jest łatwa: wystarczy podać e-mail oraz hasło." + only_other: "Użyj swojego konta %{provider} podczas rejestracji." + one_and_email: "Aby się zarejestrować, użyj swojego konta %{provider} lub adresu e-mail i hasła." + multiple_no_email: "Rejestracja jest łatwa: użyj jednego z %{count} serwisów społecznościowych." + multiple: "Rejestracja jest łatwa: użyj jednego z %{count} serwisów społecznościowych lub adresu e-mail i hasła." + unknown: "błąd podczas pobierania metod logowania" summary: enabled_description: "Przeglądasz podsumowanie tego tematu: widoczne są jedynie najbardziej wartościowe wpisy zdaniem uczestników. " description: "Istnieją {{count}} odpowiedzi." @@ -760,7 +782,10 @@ pl_PL: emoji_one: "Emoji One" composer: emoji: "Emoji :smile:" + options: "Opcje" + whisper: "szept" add_warning: "To jest oficjalne ostrzeżenie." + toggle_whisper: "Przełącz szept" posting_not_on_topic: "W którym temacie chcesz odpowiedzieć?" saving_draft_tip: "zapisuję..." saved_draft_tip: "zapisano" @@ -884,8 +909,17 @@ pl_PL: select_file: "Wybierz plik" image_link: "odnośnik do którego Twój obraz będzie kierował" search: + sort_by: "Sortuj po" + relevance: "Trafność" + latest_post: "Aktualne wpisy" + most_viewed: "Popularne" + most_liked: "Lubiane" select_all: "Zaznacz wszystkie" clear_all: "Wyczyść wszystkie" + result_count: + one: "1 wynik dla \"{{term}}\"" + few: "{{count}} wyniki dla \"{{term}}\"" + other: "{{count}} wyników dla \"{{term}}\"" title: "szukaj tematów, wpisów, użytkowników lub kategorii" no_results: "Brak wyników wyszukiwania" no_more_results: "Nie znaleziono więcej wyników." @@ -1258,7 +1292,7 @@ pl_PL: no_value: "Nie, pozostaw" yes_value: "Tak, porzuć" via_email: "ten wpis został dodany emailem" - whisper: "ten wpis jest prywatną notatką dla moderatorów" + whisper: "ten wpis jest prywatnym szeptem do moderatorów" wiki: about: "to wpis typu Wiki: zwykli użytkownicy mogą go edytować" archetypes: @@ -1482,16 +1516,16 @@ pl_PL: notifications: watching: title: "Obserwuj wszystko" - description: "Będziesz automatycznie śledzić wszystkie nowe tematy w tych kategoriach. Dostaniesz powiadomienie o każdym nowym wpisie i temacie. Liczba nowych odpowiedzi będzie wyświetlana na liście tematów." + description: "Będziesz automatycznie śledzić wszystkie nowe tematy w tych kategoriach. Otrzymasz powiadomienie o każdym nowym wpisie i temacie. Wyświetlimy liczbę nowych odpowiedzi na liście tematów." tracking: title: "Śledzona" - description: "Będziesz automatycznie śledzić wszystkie tematy w tych kategoriach. Llicznik nowych odpowiedzi pojawi się obok ich tytułów." + description: "Będziesz automatycznie śledzić wszystkie tematy w tych kategoriach. Otrzymasz powiadomienie jeśli ktoś wspomni twój @login lub odpowie na twój wpis. Licznik nowych odpowiedzi pojawi się na liście tematów." regular: title: "Normalny" description: "Dostaniesz powiadomienie jedynie, gdy ktoś wspomni twoją @nazwę lub odpowie na twój wpis." muted: title: "Wyciszone" - description: "Nie będziesz powiadamiany o nowych tematach w tych kategoriach i nie będą się one pojawiać w karcie Nieprzeczytane." + description: "Nie otrzymasz powiadomień o tematach w tych kategoriach i nie będą się one pojawiać na karcie Nieprzeczytane." flagging: title: 'Dziękujemy za pomoc w utrzymaniu porządku w naszej społeczności!' private_reminder: 'oflagowania są poufne i widoczne jedynie dla obsługi serwisu' @@ -2026,6 +2060,7 @@ pl_PL: ip_address: "IP" topic_id: "ID tematu" post_id: "ID wpisu" + category_id: "ID kategorii" delete: 'Usuń' edit: 'Edytuj' save: 'Zapisz' @@ -2066,6 +2101,9 @@ pl_PL: impersonate: "udawanie użytkownika" anonymize_user: "anonimizuj użytkownika" roll_up: "zwiń bloki IP" + change_category_settings: "zmiana ustawień kategorii" + delete_category: "Usuń kategorię" + create_category: "Dodaj nową kategorię" screened_emails: title: "Ekranowane emaile" description: "Kiedy ktoś próbuje założyć nowe konto, jego adres email zostaje sprawdzony i rejestracja zostaje zablokowana, lub inna akcja jest podejmowana." @@ -2437,7 +2475,9 @@ pl_PL: embed_username_key_from_feed: "Klucz używany do pobrania nazwy użytkownika z kanału" embed_truncate: "Skracaj treść osadzanych wpisów" embed_whitelist_selector: "Selektor CSS elementów jakie mogą być osadzane" + whitelist_example: "article, #tresc, .wpis" embed_blacklist_selector: "Selektor CSS elementów jakie są usuwane podczas osadzania" + blacklist_example: ".reklama, header" feed_polling_enabled: "Importowanie wpisów via RSS/ATOM" feed_polling_url: "URL kanału RSS/ATOM" save: "Zapisz" diff --git a/config/locales/client.pt.yml b/config/locales/client.pt.yml index 593e8db406..d72fabb321 100644 --- a/config/locales/client.pt.yml +++ b/config/locales/client.pt.yml @@ -617,11 +617,13 @@ pt: server: "Erro de Servidor" forbidden: "Acesso Negado" unknown: "Erro" + not_found: "Página Não Encontrada" desc: network: "Por favor verifique a sua ligação." network_fixed: "Parece que está de volta." server: "Código de Erro: {{status}}" forbidden: "Não tem permissão para visualizar isso." + not_found: "Oops, a aplicação tentou carregar um URL que não existe." unknown: "Algo correu mal." buttons: back: "Voltar Atrás" @@ -656,10 +658,10 @@ pt: signup_cta: sign_up: "Inscrever-se" hide_session: "Lembrar-me amanhã" - hide_forever: "Não obrigado" + hide_forever: "não obrigado" hidden_for_session: "OK, Irei perguntar-lhe amanhã. Pode sempre usar 'Iniciar Sessão' para criar uma conta, também." intro: "Olá! :heart_eyes: Parece que está a gostar da discussão, mas não está inscrito para uma conta." - value_prop: "Quando cria uma conta, pode acompanhar exatamente o que leu, por isso volta sempre ao sítio onde ficou. Pode também obter notificações, aqui e por email, sempre que novas mensagens são feitas. E pode gostar de mensagens para partilhar o amor. :heartbeat:" + value_prop: "Quando cria uma conta, nós lembramo-nos exatamente do que leu, por isso volta sempre ao sítio onde ficou. Também recebe notificações, aqui ou por email, sempre que novas mensagens são feitas. E pode gostar de mensagens para partilhar o amor. :heartbeat:" methods: sso: "Inscrever-se é fácil: tudo o que precisa é uma conta no sítio principal." only_email: "Inscrever-se é fácil: tudo o que precisa é um email e uma palavra-passe." @@ -1445,16 +1447,16 @@ pt: notifications: watching: title: "A vigiar" - description: "Irá vigiar automaticamente todos os novos tópicos nestas categorias. Será notificado de todas as novas mensagens e tópicos, e uma contagem de novas respostas irá aparecer para estes tópicos." + description: "Irá vigiar automaticamente todos os novos tópicos nestas categorias. Irá ser notificado de cada nova mensagem em cada tópico, e uma contagem de novas respostas será exibida." tracking: title: "Acompanhar" - description: "Irá acompanhar automaticamente todos os novos tópicos nestas categorias. Uma contagem de novas respostas irá aparecer para estes tópicos." + description: "Irá acompanhar automaticamente todos os novos tópicos nestas categorias. Irá ser notificado se alguém mencionar o seu @nome ou lhe responder, e uma contagem de novas respostas será exibida." regular: - title: "Habitual" + title: "Normal" description: "Será notificado se alguém mencionar o seu @nome ou responder-lhe." muted: title: "Silenciado" - description: "Não será notificado relativamente acerca de novos tópicos nestas categorias, e não aparecerão no seu separador de não lidos." + description: "Nunca será notificado de nada acerca de novos tópicos nestas categorias, e estes não irão aparecer no seu separador de não lidos." flagging: title: 'Obrigado por ajudar a manter a nossa comunidade cívica!' private_reminder: 'as sinalizações são privadas, visíveis apenas para o pessoal' @@ -1986,6 +1988,7 @@ pt: ip_address: "IP" topic_id: "ID do Tópico" post_id: "ID da Mensagem" + category_id: "ID da Categoria" delete: 'Eliminar' edit: 'Editar' save: 'Guardar' @@ -2026,6 +2029,9 @@ pt: impersonate: "personificar" anonymize_user: "tornar utilizador anónimo" roll_up: "agregar blocos IP" + change_category_settings: "alterar configurações de categoria" + delete_category: "eliminar categoria" + create_category: "criar categoria" screened_emails: title: "Emails Filtrados" description: "Quando alguém tenta criar uma nova conta, os seguintes endereços de email serão verificados e o registo será bloqueado, ou outra ação será executada." @@ -2390,7 +2396,9 @@ pt: embed_username_key_from_feed: "Chave para puxar o nome de utilizador discouse do feed" embed_truncate: "Truncar as mensagens incorporadas" embed_whitelist_selector: "Seletor CSS para elementos que são permitidos nas incorporações" + whitelist_example: "artigo, #história, .mensagem" embed_blacklist_selector: "Seletor CSS para elementos que são removidos das incorporações" + blacklist_example: ".unidade-anuncio, cabeçalho" feed_polling_enabled: "Importar mensagens através de RSS/ATOM" feed_polling_url: "URL do feed RSS/ATOM para rastreio" save: "Guardar Configurações de Incorporação" diff --git a/config/locales/client.pt_BR.yml b/config/locales/client.pt_BR.yml index d9e7b21341..ea03f64e3e 100644 --- a/config/locales/client.pt_BR.yml +++ b/config/locales/client.pt_BR.yml @@ -123,6 +123,7 @@ pt_BR: admin_title: "Admin" flags_title: "Sinalizações" show_more: "mostrar mais" + show_help: "opções" links: "Links" links_lowercase: one: "link" @@ -558,6 +559,7 @@ pt_BR: server: "Erro de Servidor" forbidden: "Acesso Negado" unknown: "Erro" + not_found: "Página não encontrada" desc: network: "Por favor verifique sua conexão." network_fixed: "Parece que voltou." @@ -591,6 +593,9 @@ pt_BR: replies_lowercase: one: resposta other: respostas + signup_cta: + hide_session: "Lembre-me amanhã" + hide_forever: "não obrigado" summary: enabled_description: "Você está vendo um sumário deste tópico: os posts mais interessantes conforme determinados pela comunidade." description: "Há {{count}} respostas." @@ -672,6 +677,7 @@ pt_BR: emoji_one: "Emoji One" composer: emoji: "Emoji :smile:" + options: "Opções" add_warning: "Este é um aviso oficial." posting_not_on_topic: "Qual tópico você gostaria de responder?" saving_draft_tip: "gravando..." @@ -759,6 +765,8 @@ pt_BR: moved_post: "{{username}} moved {{description}}
" linked: "{{username}} {{description}}
" granted_badge: "Adquirido '{{description}}'
" + alt: + mentioned: "Mencionado por" popup: mentioned: '{{username}} mencionou você em "{{topic}}" - {{site_title}}' quoted: '{{username}} citou você em "{{topic}}" - {{site_title}}' @@ -1312,16 +1320,12 @@ pt_BR: notifications: watching: title: "Observar" - description: "Você vai acompanhar automaticamente todos os novos tópicos dessas categorias. Você será notificado de todas as novas mensagens e tópicos. Além disso, a contagem de mensagens não lidas e novas também aparecerá ao lado do tópico." tracking: title: "Monitorar" - description: "Automaticamente monitora todos novos tópicos nestas categorias. Uma contagem de posts não lidos e novos aparecerá próximo ao tópico." regular: - title: "Normal" description: "Você será notificado se alguém mencionar o seu @nome ou responder à sua mensagem." muted: title: "Silenciar" - description: "Você não será notificado sobre novos tópicos dessas categorias e eles não vão aparecer na guia de mensagens não lidas." flagging: title: 'Obrigado por ajudar a manter a civilidade da nossa comunidade!' private_reminder: 'sinalizações são privadas, apenas ficam visíveis a moderação' diff --git a/config/locales/client.ro.yml b/config/locales/client.ro.yml index 7e3e9f054a..7b8c92dee4 100644 --- a/config/locales/client.ro.yml +++ b/config/locales/client.ro.yml @@ -1305,11 +1305,8 @@ ro: title: "Vizualizare" tracking: title: "Urmărire" - regular: - title: "Normal" muted: title: "Silențios" - description: "Nu veți fi niotificat de discuțiile noi din aceste categorii, ele nu vor apărea în tabul necitite." flagging: title: 'De ce marcați această postare ca fiind privată?' private_reminder: 'steagurile sunt private, vizibile numai b> personalului' diff --git a/config/locales/client.ru.yml b/config/locales/client.ru.yml index 902f5de2b2..519387d17a 100644 --- a/config/locales/client.ru.yml +++ b/config/locales/client.ru.yml @@ -146,6 +146,26 @@ ru: facebook: 'Поделиться ссылкой через Facebook' google+: 'Поделиться ссылкой через Google+' email: 'Поделиться ссылкой по электронной почте' + action_codes: + split_topic: "Разделил эту тему %{when}" + autoclosed: + enabled: 'Закрыл тему %{when}' + disabled: 'Открыл тему %{when}' + closed: + enabled: 'Закрыл тему %{when}' + disabled: 'Открыл тему %{when}' + archived: + enabled: 'Заархивировал тему %{when}' + disabled: 'Разархивировал тему %{when}' + pinned: + enabled: 'Закрепил тему %{when}' + disabled: 'Открепил тему %{when}' + pinned_globally: + enabled: 'Закрепил тему глобально %{when}' + disabled: 'Открепил тему глобально %{when}' + visible: + enabled: 'Включил в списки %{when}' + disabled: 'Исключил из списков %{when}' topic_admin_menu: "действия администратора над темой" emails_are_disabled: "Все исходящие письма были глобально отключены администратором. Уведомления любого вида не будут отправляться на почту." edit: 'отредактировать название и раздел темы' @@ -161,6 +181,7 @@ ru: admin_title: "Админка" flags_title: "Жалобы" show_more: "показать дальше" + show_help: "Cправка" links: "Ссылки" links_lowercase: one: "ссылка" @@ -246,6 +267,7 @@ ru: saved: "Сохранено!" upload: "Загрузить" uploading: "Загрузка..." + uploading_filename: "Загрузка файла {{filename}}..." uploaded: "Загружено!" enable: "Включить" disable: "Отключить" @@ -253,6 +275,7 @@ ru: revert: "Вернуть" failed: "Проблема" switch_to_anon: "Анонимный режим" + switch_from_anon: "Выйти из анонимного режима" banner: close: "Больше не показывать это объявление." edit: "Редактировать это объявление >>" @@ -358,6 +381,14 @@ ru: all_subcategories: "Все подкатегории" no_subcategory: "Вне подкатегорий" category: "Раздел" + reorder: + title: "Упорядочивание разделов" + title_long: "Реорганизация списка разделов" + fix_order: "Зафиксировать порядковые номера" + fix_order_tooltip: "Не всем разделам назначен уникальный порядковый номер. Это может привести к непредсказуемому порядку разделов." + save: "Сохранить порядок" + apply_all: "Применить" + position: "Порядковый номер" posts: "Сообщения" topics: "Темы" latest: "Последние" @@ -404,9 +435,20 @@ ru: preferences: "Настройки" bookmarks: "Закладки" bio: "Обо мне" - invited_by: "Приглашен пользователем" - trust_level: "Уровень доверия" + invited_by: "Пригласил" + trust_level: "Уровень" notifications: "Уведомления" + desktop_notifications: + label: "Оповещения" + not_supported: "К сожалению, оповещения не поддерживаются этим браузером." + perm_default: "Включить оповещения" + perm_denied_btn: "Отказано в разрешении" + perm_denied_expl: "Вы запретили оповещения в вашем браузере. Вначале возобновите разрешение, а затем попробуйте еще раз." + disable: "Отключить оповещения" + currently_enabled: "(сейчас включены)" + enable: "Включить оповещения" + currently_disabled: "(сейчас отключены)" + each_browser_note: "Примечание: эта настройка устанавливается в каждом браузере индивидуально." dismiss_notifications: "Пометить все прочитанными" dismiss_notifications_tooltip: "Пометить все непрочитанные уведомления прочитанными" disable_jump_reply: "Не переходить к вашему новому сообщению после ответа" @@ -419,6 +461,7 @@ ru: admin: "{{user}} - админ" moderator_tooltip: "{{user}} - модератор" admin_tooltip: "{{user}} - админ" + blocked_tooltip: "Этот пользователь заблокирован" suspended_notice: "Пользователь заморожен до {{date}}." suspended_reason: "Причина:" github_profile: "Github" @@ -549,29 +592,35 @@ ru: never: "никогда" immediately: "немедленно" invited: - search: "введите текст для поиска приглашений..." + search: "Введите текст для поиска по приглашениям..." title: "Приглашения" - user: "Приглашенный пользователь" - truncated: "Отображаются первые {{count}} приглашений." + user: "Кто приглашен" + sent: "Когда" + none: "Приглашения, ожидающие одобрения, отсутствуют." + truncated: "Показаны первые {{count}} приглашений." redeemed: "Принятые приглашения" - redeemed_tab: "Принято" + redeemed_tab: "Принятые" + redeemed_tab_with_count: "Принятые ({{count}})" redeemed_at: "Принято" pending: "Еще не принятые приглашения" - pending_tab: "Ожидает одобрения" - topics_entered: "Просмотрено тем" - posts_read_count: "Прочитано сообщений" - expired: "Это истёкшее приглашение." - rescind: "Отменить приглашение" + pending_tab: "Ожидающие" + pending_tab_with_count: "Ожидающие ({{count}})" + topics_entered: "Просмотрел тем" + posts_read_count: "Прочитал сообщений" + expired: "Это приглашение истекло." + rescind: "Отозвать" rescinded: "Приглашение отозвано" reinvite: "Повторить приглашение" reinvited: "Приглашение выслано повторно" - time_read: "Время чтения" - days_visited: "Дней посещения" + time_read: "Времени читал" + days_visited: "Дней посещал" account_age_days: "Дней с момента регистрации" create: "Отправить приглашение" + generate_link: "Скопировать ссылку для приглашений" + generated_link_message: 'Пригласительная ссылка сгенерирована!
Эта ссылка действует только для следующего e-mail:%{invitedEmail}
' bulk_invite: - none: "Вы еще никого не приглашали сюда. Вы можете отправить индивидуальные приглашения или пригласить группу людей сразу загрузив групповой файл приглашений." - text: "Групповое приглашение из файла" + none: "Вы еще никого не приглашали на этот форум. Можно отправить индивидуальные приглашения по одному, или же пригласить сразу несколько людей из файла." + text: "Пригласить всех из файла" uploading: "Загрузка..." success: "Файл успешно загружен, вы получите сообщение, когда процесс будет завершен." error: "В процессе загрузки файла '{{filename}}' произошла ошибка: {{message}}" @@ -608,11 +657,13 @@ ru: server: "Ошибка сервера" forbidden: "Доступ закрыт" unknown: "Ошибка" + not_found: "Страница не найдена" desc: network: "Пожалуйста, проверьте ваше соединение." network_fixed: "Похоже, сеть появилась." server: "Ошибка: {{status}}" forbidden: "У вас нет доступа для просмотра этого." + not_found: "Упс, произошла попытка загрузить несуществующую ссылку" unknown: "Что-то пошло не так." buttons: back: "Вернуться" @@ -642,6 +693,21 @@ ru: one: ответ few: ответа other: ответов + signup_cta: + sign_up: "Зарегистрироваться" + hide_session: "Напомнить мне завтра" + hide_forever: "Нет, спасибо" + hidden_for_session: "Хорошо, напомню завтра. Кстати, зарегистрироваться можно также и с помощью кнопки \"Войти\"." + intro: "Привет! :heart_eyes: Кажется, форум пришелся вам по душе, но вы все еще не зарегистрировались." + value_prop: "После регистрации мы сможем запоминать, где вы закончили чтение, а когда вы заглянете в ту или иную тему снова, мы откроем ее там, где вы остановились в прошлый раз. Мы также сможем уведомлять вас о новых ответах в любимых темах в вашем личном кабинете или по электронной почте. А самое приятное - после регистрации можно ставить сердечки, тем самым выражая свою симпатию автору. :heartbeat:" + methods: + sso: "Регистрация очень простая: все, что вам нужно - это учетная запись на главном сайте." + only_email: "Регистрация очень простая: все, что вам нужно - это email и придумать пароль." + only_other: "Используйте вашу учетную запись в %{provider}, чтобы зарегистрироваться на форуме." + one_and_email: "Используйте вашу учетную запись в %{provider} или email и пароль, чтобы зарегистрироваться на форуме." + multiple_no_email: "Регистрация очень простая: используйте вход через любую из %{count} соцсетей." + multiple: "Регистрация очень простая: используйте вход через любую из %{count} социальных сетей, или email и пароль." + unknown: "Ошибка при получении списка поддерживаемых способов входа." summary: enabled_description: "Вы просматриваете выдержку из темы - только самые интересные сообщения по мнению сообщества." description: "Есть {{count}} ответ(ов)." @@ -663,7 +729,7 @@ ru: created: 'Создан' created_lowercase: 'создано' trust_level: 'Уровень доверия' - search_hint: 'псевдоним, e-mail или IP адрес' + search_hint: 'Псевдоним, e-mail или IP адрес' create_account: title: "Зарегистрироваться" failed: "Произошла ошибка. Возможно, этот Email уже используется. Попробуйте восстановить пароль" @@ -723,7 +789,10 @@ ru: emoji_one: "Emoji One" composer: emoji: "Emoji :smile:" + options: "Опции" + whisper: "внутреннее сообщение" add_warning: "Это официальное предупреждение." + toggle_whisper: "Внутреннее сообщение" posting_not_on_topic: "В какой теме вы хотите ответить?" saving_draft_tip: "Сохранение..." saved_draft_tip: "сохранено" @@ -829,15 +898,29 @@ ru: select_file: "Выбрать файл" image_link: "ссылка, на которую будет указывать ваше изображение" search: - title: "поиск по темам, сообщениям, пользователям или разделам" + sort_by: "Сортировка" + relevance: "По смыслу" + latest_post: "С недавними сообщениями" + most_viewed: "Самые просматриваемые" + most_liked: "Больше всего симпатий" + select_all: "Выбрать все" + clear_all: "Сбросить все" + result_count: + one: "Найдено 1: \"{{term}}\"" + few: "Найдено {{count}}: \"{{term}}\"" + many: "Найдено {{count}}: \"{{term}}\"" + other: "Найдено {{count}}: \"{{term}}\"" + title: "Поиск по темам, сообщениям, псевдонимам и разделам" no_results: "Ничего не найдено." + no_more_results: "Больше ничего не найдено." + search_help: Справка по поиску searching: "Поиск ..." post_format: "#{{post_number}} от {{username}}" context: user: "Искать сообщения от @{{username}}" category: "Искать в разделе \"{{category}}\"" topic: "Искать в этой теме" - private_messages: "Поиск в сообщениях" + private_messages: "Искать в личных сообщениях" go_back: 'вернуться' not_logged_in_user: 'страница пользователя с историей его последней активности и настроек' current_user: 'перейти на вашу страницу пользователя' @@ -1195,6 +1278,7 @@ ru: no_value: "Нет, оставить" yes_value: "Да, отказаться" via_email: "это сообщение пришло с почты" + whisper: "Это внутреннее сообщение, т.е. оно видно только модераторам" wiki: about: "это вики-сообщение - любой пользователь может отредактировать его, чтобы улучшить, дополнить или исправить ошибки" archetypes: @@ -1432,16 +1516,12 @@ ru: notifications: watching: title: "Наблюдать" - description: "Автоматически наблюдать за всеми новыми темами в этих разделах и уведомлять меня о новых сообщениях в них. Счетчик новых сообщений будет появляться рядом с названием темы." tracking: title: "Следить" - description: "Автоматически следить за всеми новыми темами в этих разделах. Счетчик новых сообщений будет появляться рядом с названием темы." regular: - title: "Уведомлять" description: "Уведомлять, если кто-нибудь упомянет мой @псевдоним или ответит на мое сообщение." muted: title: "Без уведомлений" - description: "Не уведомлять меня о новых темах в этих разделах и не показывать новые темы на странице «Непрочитанные»." flagging: title: 'Спасибо за вашу помощь в поддержании порядка!' private_reminder: 'жалобы анонимны и видны только персоналу' @@ -1989,11 +2069,11 @@ ru: do_nothing: "ничего не делать" staff_actions: title: "Действия персонала" - instructions: "Кликните по имени пользователя и действиям для фильтрации списка. Кликните по аватару для перехода на страницу пользователя." + instructions: "Кликните по псевдониму или действиям для фильтрации списка. Кликните по аватару для перехода на страницу пользователя." clear_filters: "Показать все" staff_user: "Персонал" target_user: "Целевой пользователь" - subject: "Тема" + subject: "Субъект" when: "Когда" context: "Контекст" details: "Подробности" @@ -2007,7 +2087,7 @@ ru: actions: delete_user: "удаление пользователя" change_trust_level: "изменение уровня доверия" - change_username: "изменить имя пользователя" + change_username: "изменение псевдонима" change_site_setting: "изменение настройки сайта" change_site_customization: "изменение настройки сайта" delete_site_customization: "удаление настроек сайта" @@ -2018,9 +2098,12 @@ ru: check_email: "открыть e-mail" delete_topic: "удаление темы" delete_post: "удаление сообщения" - impersonate: "выдать себя за" - anonymize_user: "анонимизировать пользователя" - roll_up: "Сгруппировать IP адреса в подсети" + impersonate: "выдавание себя за" + anonymize_user: "анонимизация пользователя" + roll_up: "группирование IP адресов в подсети" + change_category_settings: "изменение настроек раздела" + delete_category: "удаление раздела" + create_category: "создание раздела" screened_emails: title: "Почтовые адреса" description: "Когда кто-то создает новую учетную запись, проверяется данный почтовый адрес и регистрация блокируется или производятся другие дополнительные действия." @@ -2256,21 +2339,23 @@ ru: delete: "Удалить" cancel: "Отмена" delete_confirm: "Вы уверены, что хотите удалить это поле?" + options: "Опции" required: title: "Обязательное во время регистрации?" - enabled: "обязательное" - disabled: "необязательное" + enabled: "Обязательное" + disabled: "Необязательное" editable: title: "Редактируемое после регистрации?" - enabled: "редактируемое" - disabled: "нередактируемое" + enabled: "Редактируемое" + disabled: "Нередактируемое" show_on_profile: - title: "Показать в публичном профиле?" - enabled: "показывается в профиле" - disabled: "не показывается в профиле" + title: "Показывать в публичном профиле?" + enabled: "Показывать в профиле" + disabled: "Не показывать в профиле" field_types: text: 'Текстовое поле' confirm: 'Подтверждение' + dropdown: "Выпадающий список" site_text: none: "Выберите секцию для редактирования." title: 'Текстовое содержание' @@ -2548,3 +2633,15 @@ ru: hot_link: name: Горячая ссылка description: Оставил внешнюю ссылку с более чем 300 кликов + famous_link: + name: Легендарная ссылка + description: Использовал внешнюю ссылку, которую открыли более 1000 раз + google_search: | ++
+ diff --git a/config/locales/client.sq.yml b/config/locales/client.sq.yml index caed2c2f49..4078b644dd 100644 --- a/config/locales/client.sq.yml +++ b/config/locales/client.sq.yml @@ -1328,16 +1328,12 @@ sq: notifications: watching: title: "Watching" - description: "You will automatically watch all new topics in these categories. You will be notified of all new posts and topics, and a count of new replies will appear for these topics." tracking: title: "Tracking" - description: "You will automatically track all new topics in these categories. A count of new replies will appear for these topics." regular: - title: "Regular" description: "You will be notified if someone mentions your @name or replies to you." muted: title: "Muted" - description: "You will not be notified of anything about new topics in these categories, and they will not appear on your unread tab." flagging: title: 'Faleminderit për ndihmën që i jepni këtij komuniteti!' private_reminder: 'flags are private, only visible to staff' diff --git a/config/locales/client.sv.yml b/config/locales/client.sv.yml index b2608010ce..4660add837 100644 --- a/config/locales/client.sv.yml +++ b/config/locales/client.sv.yml @@ -1311,16 +1311,12 @@ sv: notifications: watching: title: "Bevakar" - description: "Du kommer automatiskt bevaka alla nya ämnen i dessa kategorier. Du notifieras om alla nya inlägg och ämnen, och en räknare över antalet nya svar visas för dessa ämnen." tracking: title: "Följer" - description: "Du kommer automatiskt att följa alla nya ämnen i dessa kategorier. Antalet olästa inlägg kommer att synas för dessa ämnen." regular: - title: "Vanlig" description: "Du notifieras om någon nämner ditt @namn eller svarar på ditt inlägg." muted: title: "Tystad" - description: "Du kommer inte att notifieras om något som rör nya ämnen i de här kategorierna, och de kommer inte att dyka upp i din olästa tabb." flagging: title: 'Tack för att du hjälper till att hålla vår gemenskap civiliserad!' private_reminder: 'flaggor är privata, endast synliga för funktionärer' diff --git a/config/locales/client.te.yml b/config/locales/client.te.yml index e9726bc6b3..179e09813f 100644 --- a/config/locales/client.te.yml +++ b/config/locales/client.te.yml @@ -1110,11 +1110,8 @@ te: title: "కన్నేసారు" tracking: title: "గమనిస్తున్నారు" - regular: - title: "రెగ్యులర్" muted: title: "నిశ్శబ్దం" - description: "ఈ వర్గాల్లో కొత్త విషయాల గురించి మీకు ప్రకటన రాదు. ఇంకా చదవి సంఖ్యలు కనిపించవు." flagging: title: 'మా కమ్యునిటీని నాగరికంగా ఉంచుటలో సహాయానికి ధన్యవాదములు' private_reminder: 'కేతనాలు ప్రైవేటు. కేవలం సిబ్బందికి మాత్రమే కనిపిస్తాయి' diff --git a/config/locales/client.tr_TR.yml b/config/locales/client.tr_TR.yml index 7089f54029..3ce73d578c 100644 --- a/config/locales/client.tr_TR.yml +++ b/config/locales/client.tr_TR.yml @@ -1347,16 +1347,12 @@ tr_TR: notifications: watching: title: "Gözleniyor" - description: "Bu kategorilerdeki tüm yeni konuları otomatik olarak gözleyeceksiniz. Tüm yeni gönderi ve konularla ilgili bildiri alacaksınız, ayrıca okunmamış ve yeni gönderilerin sayısı ilgili konunun yanında belirecek." tracking: title: "Takip Ediliyor" - description: "Bu kategorilerdeki tüm yeni konuları otomatik olarak takip edeceksiniz. Okunmamış ve yeni gönderilerin sayısı ilgili konunun yanında belirecek." regular: - title: "Standart" description: "Birisi @isim şeklinde sizden bahsederse ya da gönderinize cevap verirse bildirim alacaksınız." muted: title: "Susturuldu" - description: "Bu kategorilerdeki yeni konular hakkında herhangi bir bildiri almayacaksınız ve okunmamışlar sekmenizde belirmeyecek. " flagging: title: 'Topluluğumuzun medeni kalmasına yardımcı olduğunuz için teşekkürler!' private_reminder: 'bayraklar özeldir, sadece görevlilere gözükür' diff --git a/config/locales/client.uk.yml b/config/locales/client.uk.yml index 1c30b78273..4bdeeae9f0 100644 --- a/config/locales/client.uk.yml +++ b/config/locales/client.uk.yml @@ -889,8 +889,6 @@ uk: title: "Слідкувати" tracking: title: "Стежити" - regular: - title: "Звичайний" muted: title: "Ігноровані" flagging: diff --git a/config/locales/client.zh_CN.yml b/config/locales/client.zh_CN.yml index 540d6654c5..328c6d9358 100644 --- a/config/locales/client.zh_CN.yml +++ b/config/locales/client.zh_CN.yml @@ -587,11 +587,13 @@ zh_CN: server: "服务器错误" forbidden: "访问被阻止" unknown: "错误" + not_found: "没有找到网页" desc: network: "请检查你的网络连接。" network_fixed: "似乎恢复正常了。" server: "错误代码:{{status}}" forbidden: "你没有权限读这个。" + not_found: "噢!程式要加载的URL并不存在。" unknown: "出错了。" buttons: back: "返回" @@ -625,10 +627,10 @@ zh_CN: signup_cta: sign_up: "注册" hide_session: "明天提醒我" - hide_forever: "不,谢谢" + hide_forever: "不了" hidden_for_session: "好的,我会在明天提醒你。不过你任何时候都可以使用“登录”来创建账户。" intro: "你好!:heart_eyes: 看起来你挺喜欢这个讨论,但是你还没有注册账户。" - value_prop: "当你创建了账户,我们能准确地追踪你的阅读进度,所以你能够在下一次访问时知道你读过了什么。你也可以收到网页和邮件通知,特别是有新帖子的时候。并且你可以赞任何帖子来分享你的感谢。:heartbeat:" + value_prop: "当你创建了账户,我们能准确地追踪你的阅读进度,所以你能够在下一次访问时回到你上次阅读到的地方。你也可以在有新帖子的时候收到网页和邮件通知。并且你可以赞任何帖子来分享你的感谢。:heartbeat:" methods: sso: "注册很容易:你只要在主站点建立一个账户。" only_email: "注册很容易:只需要一个邮箱和密码。" @@ -1377,16 +1379,16 @@ zh_CN: notifications: watching: title: "关注" - description: "你将会自动监视这些分类中的所有新主题。你将会收到新帖子和新主题发布的通知,并且新帖数量也将在这些主题后显示。" + description: "你将会自动监视这些分类中的所有新主题。你会收到每个主题中的新帖子通知,并且新帖数量也将在每个主题后显示。" tracking: title: "追踪" - description: "你将会自动追踪这些分类中的所有新主题。新帖数量将在这些主题后显示。" + description: "你将会自动追踪这些分类中的所有新主题。你会在别人@你或回复你的帖子时才会收到通知,并且新帖数量也将在这些主题后显示。" regular: title: "常规" description: "如果某人@你或者回复你,你将收到通知。" muted: title: "免打扰" - description: "你不会收到这些分类中的任何新主题通知,并且他们将不会出现在你的未读列表中。" + description: "你不会收到这些分类的新主题的任何通知,他们也不会出现在你的未读标签中。" flagging: title: '感谢帮助社群远离邪恶!' private_reminder: '标记是不公开的,只有职员才可以见到' @@ -1909,6 +1911,7 @@ zh_CN: ip_address: "IP" topic_id: "主题 ID" post_id: "帖子 ID" + category_id: "分类 ID" delete: '删除' edit: '编辑' save: '保存' @@ -1949,6 +1952,9 @@ zh_CN: impersonate: "检视" anonymize_user: "匿名用户" roll_up: "回退 IP 封禁" + change_category_settings: "更改分类设置" + delete_category: "删除分类" + create_category: "创建分类" screened_emails: title: "被屏蔽的邮件地址" description: "当有人试图用以下邮件地址注册时,将受到阻止或其它系统操作。" @@ -2306,7 +2312,9 @@ zh_CN: embed_username_key_from_feed: "从流中拉取 Discourse 用户名的 Key " embed_truncate: "截断嵌入的帖子" embed_whitelist_selector: "使用 CSS 选择器选择允许的嵌入元素" + whitelist_example: "article, #story, .post" embed_blacklist_selector: "使用 CSS 选择器移除嵌入元素" + blacklist_example: ".ad-unit, header" feed_polling_enabled: "通过RSS/ATOM导入帖子" feed_polling_url: "用于抓取的 RSS/ATOM 流的 URL" save: "保存嵌入设置" diff --git a/config/locales/client.zh_TW.yml b/config/locales/client.zh_TW.yml index 092068234b..2256308bc7 100644 --- a/config/locales/client.zh_TW.yml +++ b/config/locales/client.zh_TW.yml @@ -639,7 +639,9 @@ zh_TW: emoji_one: "Emoji One" composer: emoji: "Emoji :smile:" + whisper: "密談" add_warning: "這是正式警告。" + toggle_whisper: "切換密談" posting_not_on_topic: "你想要回覆哪個討論話題?" saving_draft_tip: "正在儲存..." saved_draft_tip: "儲存完畢" @@ -1020,6 +1022,7 @@ zh_TW: no_value: "否" yes_value: "是" via_email: "本文章透過電子郵件送達" + whisper: "這文章是版主私人密談" wiki: about: "這篇文章設定為 wiki,一般用戶可以編輯它" archetypes: @@ -1205,11 +1208,8 @@ zh_TW: title: "關注" tracking: title: "追蹤" - regular: - title: "一般" muted: title: "靜音" - description: "你將不會收到這些分類中的新討論話題通知,它們也不會出現在你的未讀欄內。" flagging: title: '感謝幫助社群遠離邪惡!' private_reminder: '標記是不公開的,只有 工作人員才可看到' diff --git a/config/locales/server.ar.yml b/config/locales/server.ar.yml index 74f2f6b726..149c268cbe 100644 --- a/config/locales/server.ar.yml +++ b/config/locales/server.ar.yml @@ -342,8 +342,18 @@ ar: title: "قائد" change_failed_explanation: "حاولت تخفيض رتبة %{user_name} إلى '%{new_trust_level}'. أيضا مستوى الثقة لهم حاليا '%{current_trust_level}'. %{user_name} سيبقى في '%{current_trust_level}' - إذا رغبت في تخفيض رتبة عضو أنظر لمستوى الثقة أولاً." rate_limiter: - slow_down: "لقد أنجزت هذا العمل مرات كثيرة، حاول مجددا." + slow_down: "لقد أنجزت هذا العمل في مرات كثيرة، عاود المحاولة لاحقا." too_many_requests: "لدينا حد يومي لعدد المرات التي يمكن للعمل أن ينجز بها. رجاءا انتظر %{time_left} قبل المحاولة مجدداً." + by_type: + first_day_replies_per_day: "لقد وصلت للعدد الأقصى للردود التي يمكن للعضو الجديد إنشائها في يومهم الأول. رجاء انتظر %{time_left} قبل المحاولة مجددا." + first_day_topics_per_day: "لقد وصلت للعدد الأقصى للمواضيع التي يمكن للعضو الجديد إنشائها في يومهم الأول. رجاء انتظر %{time_left} قبل المحاولة مجددا." + create_topic: "أنت تنشأ مواضيع بسرعة عالية. رجاء انتظر %{time_left} قبل المحاولة مجددا." + create_post: "أنت ترد بسرعة عالية. رجاء انتظر %{time_left} قبل المحاولة مجددا." + topics_per_day: "لقد وصلت للعدد الأقصى للمواضيع الجديدة اليوم. رجاء انتظر %{time_left} قبل المحاولة مجددا." + pms_per_day: "لقد وصلت للعدد الأقصى للرسائل اليوم. رجاء انتظر %{time_left} قبل المحاولة مجددا." + create_like: "لقد وصلت للعدد الأقصى للإعجابات اليوم. رجاء انتظر %{time_left} قبل المحاولة مجددا." + create_bookmark: "لقد وصلت للعدد الأقصى للتفضيلات اليوم. رجاء انتظر %{time_left} قبل المحاولة مجددا." + edit_post: "لقد وصلت للعدد الأقصى للتعديلات اليوم. رجاء انتظر %{time_left} قبل المحاولة مجددا." hours: zero: "1 ساعة" one: "1 ساعة" @@ -632,6 +642,10 @@ ar: title: "الأعضاء جدد" xaxis: "يوم" yaxis: "عدد الأعضاء الجدد" + profile_views: + title: "مشاهدات ملف تعريف العضو" + xaxis: "يوم" + yaxis: "عدد مشاهدات ملف تعريف العضو" topics: title: "المواضيع" xaxis: "اليوم" @@ -901,6 +915,7 @@ ar: enable_noscript_support: "فعل دعم محرك بحث webcrawler عبر علامة غير نصية." allow_moderators_to_create_categories: "السماح للمشرفين إنشاء قسم جديد" cors_origins: "اسمح بالأصول للطلبات عبر المنشأ (CORS). كل أصل يجب أن يتضمن http:// أو https://. متغير env لـ DISCOURSE_ENABLE_CORS يجب أن يعين إلى true ليعمل CORS." + use_admin_ip_whitelist: "المدير فقط يمكنه تسجيل الدخول إذا كانت عناوين IP لهم معرفة في قائمة IP المحجوبة. (المدير > السجلات > IP المحجوبة)" top_menu: "حدد الأدوات التي تظهر في ملاحة الصفحة الرئيسية، وما ترتيبها. مثال الأخير|الجديد|غير مقروء|فئات|أعلى|مقروء|مشارك|مفضلات" post_menu: "تحديد العناصر التي تظهر في القائمة آخر، وبأي ترتيب. مثال مثل | تحرير | العلم | حذف | سهم | المرجعية | الرد" post_menu_hidden_items: "عناصر القائمة لإخفاء افتراضيا في القائمة آخر ما لم يتم النقر على القطع التوسع جرا." @@ -920,7 +935,7 @@ ar: email_token_valid_hours: "نسيت كلمه السر/ تنشيط رموز الحساب صالحه ل(n) ساعات" email_token_grace_period_hours: "نسيت كلمه السر/ تنشيط رموز الحساب لا تزال صالحة لفترة سماح بالـ(n) ساعات بعد استبدالها." enable_badges: "تفعيل نظام الشارات." - enable_whispers: "اسمح لمستخدمين باجراء محادثه سريه مع الطاقم " + enable_whispers: "السماح للموظفين الخصوصين التواصل ضمن موضوع.(تجريبي)" allow_index_in_robots_txt: "تحديد في ملف robots.txt أن يسمح هذا الموقع ليتم فهرستها من قبل محركات البحث على شبكة الإنترنت." email_domains_blacklist: "قائمة pipe-delimited المجالات البريد الإلكتروني الذي لا يسمح للمستخدمين تسجيل حسابات مع. مثال: mailinator.com | trashmail.net" email_domains_whitelist: "قائمة pipe-delimited من مجالات البريد الإلكتروني التي يجب على المستخدمين تسجيل حسابات مع. تحذير: لن يسمح للمستخدمين مع مجالات البريد الإلكتروني الأخرى غير المذكورة هنا!" @@ -1069,6 +1084,7 @@ ar: white_listed_spam_host_domains: "قائمة النطاقات المستثناة من اختبار مضيف البريد المزعج. لن يتم تقييد المستخدمين الجدد من إنشاء المشاركات مع الروابط إلى هذه النطاقات." staff_like_weight: "كم عدد مرات الترجيح الاضافيه لمنح اعجابات الطاقم " topic_view_duration_hours: "احسب عدد المواضيع التي تمت مشاهدتها مره واحده عبر ip/مستخدم كل N ساعات" + user_profile_view_duration_hours: "احسب عدد ملفات التعريف للعضو التي تمت مشاهدتها مرة لكل IP/عضو في N ساعات." levenshtein_distance_spammer_emails: "عند ربط رسائل البريد الإلكتروني spammer، الأرقام والحروف تختلف التي ستبقى تسمح بربط غامض." max_new_accounts_per_registration_ip: "اذا كان هناك بالفعل (N) مستوي ثقه الحسابات 0 من هذا IP ( و لم يكن عضو في الطاقم او TL2 او اعلى), توقف عن قبول تسجيلات الدخول الجديده من هذا IP" min_ban_entries_for_roll_up: "When clicking the Roll up button, will create a new subnet ban entry if there are at least (N) entries." diff --git a/config/locales/server.da.yml b/config/locales/server.da.yml index 042e41c36f..85c97a5060 100644 --- a/config/locales/server.da.yml +++ b/config/locales/server.da.yml @@ -60,8 +60,18 @@ da: other_than: "skal være andet end %{count}" template: body: 'Der var problemer med følgende felter:' + header: + one: Een fejl forhindrede denne %{model} for at gemme. + other: '%{count} fejl forhindrede denne %{model} i at gemme.' embed: load_from_remote: "Der opstod en fejl ved indlæsningen af dette indlæg." + site_settings: + min_username_length_exists: "Du kan ikke sætte minimumslængden for brugernavne over det korteste eksisterende brugernavn." + min_username_length_range: "Du kan ikke sætte minimum til mere end maksimum." + max_username_length_exists: "Du kan ikke sætte maksimumlængden for brugernavne under det længste eksisterende brugernavn." + max_username_length_range: "Du kan ikke sætte maksimum til mindre end minimum." + default_categories_already_selected: "Du kan ikke vælge en kategori der er brugt i en anden liste." + s3_upload_bucket_is_required: "Du kan ikke oploade til S3 med mindre du har angivet 's3_upload_bucket'." bulk_invite: file_should_be_csv: "Den uploadede fil skal være i .csv eller .txt format." backup: @@ -133,6 +143,8 @@ da: posts: "Seneste indlæg" too_late_to_edit: "Dette indlæg er gammelt og kan ikke længere redigeres eller slettes." excerpt_image: "billede" + queue: + delete_reason: "Slettet via køen til moderation af indlæg." groups: errors: can_not_modify_automatic: "Du kan ikke modificere en automatisk gruppe" @@ -163,6 +175,14 @@ da: - Det er godt med kritik, men husk at kritisere *ideer*, ikke personer. For flere tips, [se vores retningslinier](/guidelines). Denne boks dukker kun op for dine første %{education_posts_text}. + avatar: | + ### Hvad med et billede til din konto? + + Du har oprettet et par emner og svar, men dit avatar er ikke så unik som du er -- det er bare et bogstav. + + Har du overvejet at **[gå til din brugerprofil](%{profile_path})** og uploade et billede, der repræsenterer dig? + + Det er lettere at følge diskussioner og finde interessant mennesker i samtaler, hvor alle har en unik avatar! dominating_topic: | ### Lad andre deltage i samtalen @@ -218,6 +238,7 @@ da: no_info_other: "Dit indlæg er blevet markeret af fællesskabet. Se dine beskeder.
' + user_must_edit: 'Dette indlæg er blevet markert af fællesskabet, og er midlertidigt skjult.
' archetypes: regular: title: "Almindeligt emne" banner: + title: "Banneremne" message: make: "Dette emne er nu et banner-emne. Det optræder i toppen af alle sider indtil brugeren fjerner det." remove: "Dette emne er ikke mere et banner-emne. Det optræder ikke længere i toppen af alle sider." @@ -424,6 +463,10 @@ da: title: "Nye brugere" xaxis: "Dag" yaxis: "Antal nye brugere" + profile_views: + title: "Bruger Profil Visninger" + xaxis: "Dag" + yaxis: "Antag sete brugerprofiler" topics: title: "Emner" xaxis: "Dag" @@ -494,10 +537,12 @@ da: page_view_anon_reqs: title: "Anonym" xaxis: "Dag" + yaxis: "Anonym API Forespørgsler" page_view_logged_in_reqs: title: "Logget ind" xaxis: "Dag" page_view_crawler_reqs: + title: "Web Crawlers" xaxis: "Dag" page_view_total_reqs: title: "Total" @@ -527,7 +572,9 @@ da: xaxis: "Dag" yaxis: "Total" mobile_visits: + title: "Brugerbesøg" xaxis: "Dag" + yaxis: "Antal besøg" dashboard: rails_env_warning: "Din server kører i %{env}-tilstand." ruby_version_warning: "Du kører en version af Ruby 2.0.0 som har kendte problemer. Opgradér til patch-level 247 eller senere." @@ -608,11 +655,18 @@ da: github_client_secret: "Client secret til Github-login, oprettes på at https://github.com/settings/applications." active_user_rate_limit_secs: "Hvor ofte vi opdaterer feltet 'last_seen_at', i sekunder." previous_visit_timeout_hours: "Hvor lang tid et besøg varer før vi regner det med i det 'forrige' besøg, i timer." + max_likes_per_day: "Maksimalt antal likes per bruger per dag." clean_orphan_uploads_grace_period_hours: "Grace-periode (i timer) før et forældreløst upload bliver fjernet." purge_deleted_uploads_grace_period_days: "Grace-periode (i dage) før et slettet upload bliver fjernet." + tl2_requires_likes_received: "Hvor mange likes en bruger skal modtage inden forfremmelse til tillidsniveau 2." + tl2_requires_likes_given: "Hvor mange likes en bruger skal give inden forfremmelse til tillidsniveau 2." + tl3_requires_likes_given: "Det antal likes en bruger skal have givet i de seneste 100 dage for at kvalificere sig til forfremmelse til tillidsniveau 3." + tl3_requires_likes_received: "Det antal likes en bruger skal have modtaget i de seneste 100 dage for at kvalificere sig til forfremmelse til tillidsniveau 3." min_trust_to_create_topic: "Det mindste tillidsniveau der skal til for at oprette et nyt emne." title_fancy_entities: "Omdan almindelige ASCII-tegn i emnetitler til fancy HTML-entities, i stil med SmartyPants http://daringfireball.net/projects/smartypants/" title_prettify: "Undgå hyppige tastefejl i titlen, inklusive overforbrug af store bogstaver, første bogstav med småt, gentagne ! og ?, ekstra . i slutningen, etc." + topic_post_like_heat_low: "Når forholdet likes:indlæg overstiger dette tal, bliver antal indlæg let fremhævet." + topic_post_like_heat_medium: "Når forholdet likes:indlæg overstiger dette tal, bliver antal indlæg moderat fremhævet." faq_url: "Hvis du hoster en FAQ et andet sted kan du indtaste den fulde URL her." tos_url: "Hvis du hoster dine forretningsbetingelser et andet sted kan du indtaste den fulde URL her." privacy_policy_url: "Hvis du hoster din privatlivspolitik et andet sted kan du indtaste den fulde URL her." @@ -705,6 +759,10 @@ da: Der er nye brugere, som afventer godkendelse (eller afvisning) før de kan tilgå dette forum. [Gennemgå dem venligst på administrationssiden](%{base_url}/admin/users/list/pending). + download_remote_images_disabled: + subject_template: "Download af eksterne billeder er slået fra" + text_body_template: "Indstillingen `download_remote_images_to_local` blev slået fra fordi grænsen for bug af diskplads i `download_remote_images_threshold` blev nået." + subject_re: "Re:" user_notifications: previous_discussion: "Forrige svar" unsubscribe: @@ -760,6 +818,7 @@ da: %{respond_instructions} digest: why: "Et kort resume af %{site_link} siden dit sidste besøg %{last_seen_at}" + subject_template: "Sammenfatning af [%{site_name}]" new_activity: "Ny aktivitet på dine emner og indlæg:" top_topics: "Populære emner" other_new_topics: "Populære emner" @@ -767,6 +826,7 @@ da: click_here: "klik her" from: "%{site_name} opsummering" read_more: "Læs mere" + more_topics_category: "Flere nye emner: " forgot_password: subject_template: "[%{site_name}] Nulstil kodeord" text_body_template: | @@ -786,6 +846,8 @@ da: Klik på følgende for at vælge et kodeord.: %{base_url}/users/password-reset/%{email_token} + account_created: + subject_template: "[%{site_name}] Din nye konto" authorize_email: subject_template: "[%{site_name}] Bekræft din nye e-mail-adresse" text_body_template: | @@ -795,6 +857,7 @@ da: signup_after_approval: subject_template: "Du er blevet godkendt på %{site_name}!" signup: + subject_template: "[%{site_name}] Bekræft din nye konto" text_body_template: | Velkommen til %{site_name}! @@ -809,17 +872,33 @@ da: see_more: "Flere" search_title: "Søg på denne side" search_google: "Google" + terms_of_service: + title: "Vilkår" + signup_form_message: 'Jeg har læst og accepterer vilkårene.' deleted: 'slettet' upload: unauthorized: "Beklager, filen, som du forsøger at uploade er ikke autoriseret (autoriserede filendelser: %{authorized_extensions})." pasted_image_filename: "Indsat billede" + file_missing: "Du skal angive en fil til overførsel." + attachments: + too_large: "Beklager, men den fil du prøver at overføre er for stor (maksimumstørelsen er %{max_size_kb}KB)" images: + too_large: "Beklager, men billedet som du forsøger at uploade er for stort (den maksimale størrelse er %{max_size_kb}KB). Gør det venligst mindre og prøv igen." size_not_found: "Beklager, men vi kunne ikke fastslå billedets størrelse. Måske er dit billede ødelagt?" flag_reason: sockpuppet: "En ny bruger oprettede et emne, og en anden ny bruger med den samme IP-adresse svarede på det. Se indstillingen af flag_sockpuppets." email_log: anonymous_user: "Brugeren er anonym" seen_recently: "Bruger har været logget på for nyligt" + post_not_found: "Kan ikke finde et indlæg med id %{post_id}" + notification_already_read: "Den notifikation som denne email handler om er allerede læst" + post_deleted: "indlægget er blevet slettet af forfatteren" + user_suspended: "brugeren blev suspenderet" + already_read: "brugeren har allerede læst dette indlæg" + message_blank: "beskeden er tom" + message_to_blank: "message.to er tom" + text_part_body_blank: "text_part.body er tom" + body_blank: "brødtekst er tom" about: "Om" guidelines: "Retningslinjer" privacy: "Privatliv" @@ -827,8 +906,12 @@ da: csv_export: boolean_yes: "Ja" boolean_no: "Nej" + static_topic_first_reply: | + Rediger det første indlæg i dette emne for at ændre indholdet af siden %{page_name} guidelines_topic: title: "FAQ/Retningslinjer" + tos_topic: + title: "Vilkår" admin_login: success: "Email sendt" error: "Fejl!" diff --git a/config/locales/server.de.yml b/config/locales/server.de.yml index bbd860d349..982966a2bc 100644 --- a/config/locales/server.de.yml +++ b/config/locales/server.de.yml @@ -69,6 +69,8 @@ de: min_username_length_exists: "Die minimale Länge für den Benutzernamen kann nicht höher sein als der kürzeste Benutzername." min_username_length_range: "Du kannst das Minimum nicht höher setzen als das Maximum." max_username_length_exists: "Die maximale Länge für den Benutzernamen kann nicht kürzer sein als der längste Benutzername." + max_username_length_range: "Das Maximum darf nicht kleiner sein als das Minimum." + s3_upload_bucket_is_required: "Uploads auf Amazon S3 können nicht aktiviert werden, bevor der 's3_upload_bucket' eingetragen wurde." bulk_invite: file_should_be_csv: "Die hochgeladene Datei sollte im CSV oder TXT Format vorliegen." backup: @@ -180,6 +182,14 @@ de: - Kritik ist in Ordnung, aber bitte kritisiere nur *Ideen*, nicht Menschen. Beachte bitte auch [unsere Richtlinien](/guidelines). Dieser Hilfetext wird nur bei deinen ersten %{education_posts_text} Beiträgen angezeigt. + avatar: | + ### Wie wäre es mit einem Bild für Deinen Account? + + Du hast schon einige Themen und Antworten geschrieben, aber Dein Profilbild ist nicht so einzigartig, wie Du es bist -- es ist nur ein Buchstabe. + + Vielleicht schaust Du mal in **[Dein Benutzerprofil](%{profile_path})** und lädst dort ein Bild hoch, das etwas über Dich aussagt? + + Es ist einfacher, Diskussionen zu folgen und interessante Leute zu finden, wenn jeder ein eindeutiges Profilbild hat! sequential_replies: | ### Bitte antworte mehreren Beiträge gleichzeitig @@ -1140,6 +1150,20 @@ de: system_messages: post_hidden: subject_template: "Beitrag wegen Meldungen aus der Community versteckt" + text_body_template: | + Hallo, + + dies ist eine automatische Nachricht von %{site_name}, um Dich darüber zu informieren, dass Dein Beitrag verborgen worden ist. + + %{base_url}%{url} + + %{flag_reason} + + Mehrere Mitglieder der Gemeinschaft haben Deinen Beitrag gemeldet, bevor er verborgen wurde. Du solltest also Deinen Beitrag gemäß deren Rückmeldungen überarbeiten. **Du kannst Deinen Beitrag nach %{edit_delay} Minuten ändern; danach wird er automatisch wieder erscheinen.** + + Falls Dein Beitrag jedoch ein weiteres Mal von der Gemeinschaft gemeldet und verborgen wird, wird der Beitrag verborgen bleiben, bis ein Mitglied des Teams dies ändert – in diesem Fall können auch weitere Konsequenzen folgen, bis hin zu einer möglichen Sperrung Deines Accounts. + + Für weitereOrientierungshilfen wirf bitte einen Blick in unsere [Community-Richtlinien](%{base_url}/guidelines). welcome_user: subject_template: "Willkommen bei %{site_name}!" text_body_template: | diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 140c2ba0a1..5e4114522a 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -375,8 +375,19 @@ en: rate_limiter: - slow_down: "You have performed this action too many times, try again later" + slow_down: "You have performed this action too many times, try again later." too_many_requests: "We have a daily limit on how many times that action can be taken. Please wait %{time_left} before trying again." + by_type: + first_day_replies_per_day: "You've reached the maximum number of replies a new user can create on their first day. Please wait %{time_left} before trying again." + first_day_topics_per_day: "You've reached the maximum number of topics a new user can create on their first day. Please wait %{time_left} before trying again." + create_topic: "You're creating topics too quickly. Please wait %{time_left} before trying again." + create_post: "You're replying too quickly. Please wait %{time_left} before trying again." + topics_per_day: "You've reached the maximum number of new topics today. Please wait %{time_left} before trying again." + pms_per_day: "You've reached the maximum number of messages today. Please wait %{time_left} before trying again." + create_like: "You've reached the maximum number of likes today. Please wait %{time_left} before trying again." + create_bookmark: "You've reached the maximum number of bookmarks today. Please wait %{time_left} before trying again." + edit_post: "You've reached the maximun number of edits today. Please wait %{time_left} before trying again." + hours: one: "1 hour" other: "%{count} hours" @@ -576,6 +587,10 @@ en: title: "New Users" xaxis: "Day" yaxis: "Number of new users" + profile_views: + title: "User Profile Views" + xaxis: "Day" + yaxis: "Number of user profiles viewed" topics: title: "Topics" xaxis: "Day" @@ -858,6 +873,7 @@ en: enable_noscript_support: "Enable standard webcrawler search engine support via the noscript tag" allow_moderators_to_create_categories: "Allow moderators to create new categories" cors_origins: "Allowed origins for cross-origin requests (CORS). Each origin must include http:// or https://. The DISCOURSE_ENABLE_CORS env variable must be set to true to enable CORS." + use_admin_ip_whitelist: "Admins can only log in if they are at an IP address defined in the Screened IPs list (Admin > Logs > Screened Ips)." top_menu: "Determine which items appear in the homepage navigation, and in what order. Example latest|new|unread|categories|top|read|posted|bookmarks" post_menu: "Determine which items appear on the post menu, and in what order. Example like|edit|flag|delete|share|bookmark|reply" post_menu_hidden_items: "The menu items to hide by default in the post menu unless an expansion ellipsis is clicked on." @@ -1074,6 +1090,7 @@ en: white_listed_spam_host_domains: "A list of domains excluded from spam host testing. New users will never be restricted from creating posts with links to these domains." staff_like_weight: "How much extra weighting factor to give staff likes." topic_view_duration_hours: "Count a new topic view once per IP/User every N hours" + user_profile_view_duration_hours: "Count a new user profile view once per IP/User every N hours" levenshtein_distance_spammer_emails: "When matching spammer emails, number of characters difference that will still allow a fuzzy match." max_new_accounts_per_registration_ip: "If there are already (n) trust level 0 accounts from this IP (and none is a staff member or at TL2 or higher), stop accepting new signups from that IP." @@ -1183,8 +1200,6 @@ en: delete_drafts_older_than_n_days: Delete drafts older than (n) days. - show_logout_in_header: "Show log out in user dropdown in header" - vacuum_db_days: "Run VACUUM FULL ANALYZE to reclaim DB space after migrations (set to 0 to disable)" prevent_anons_from_downloading_files: "Prevent anonymous users from downloading attachments. WARNING: this will prevent any non-image site assets posted as attachments from working." diff --git a/config/locales/server.es.yml b/config/locales/server.es.yml index 385334271f..49c2a6f555 100644 --- a/config/locales/server.es.yml +++ b/config/locales/server.es.yml @@ -203,11 +203,11 @@ es: En vez de añadir otra respuesta, por favor, considera editar tus respuestas previas o visitar otros temas. reviving_old_topic: | - ### ¿Resucitar este tema? + ### ¿Revivir este tema? La última respuesta a este tema fue hace %{days} días. Tu post reactivará el tema subiéndolo a las primeras posiciones de la lista y notificará a aquellos involucrados en la conversación previa. - ¿Estás seguro de que quieres continuar esta antigua conversación? + ¿Estás seguro de que quieres continuar esta conversación antigua? activerecord: attributes: category: @@ -492,6 +492,10 @@ es: title: "Nuevos usuarios" xaxis: "Día" yaxis: "Número de usuarios nuevos" + profile_views: + title: "Visitas a perfil de usuario" + xaxis: "Día" + yaxis: "Número de perfiles de usuario vistos" topics: title: "Temas nuevos" xaxis: "Día" @@ -761,6 +765,7 @@ es: enable_noscript_support: "Habilitar el soporte de motor de búsqueda estándar webcrawler mediante la etiqueta noscript" allow_moderators_to_create_categories: "Permitir a los moderadores crear nuevas categorías" cors_origins: "Orígenes permitidos para las cross-origin requests (CORS). Cada origen debe incluir http:// or https://. La variable env DISCOURSE_ENABLE_CORS debe establecerse a verdadero para activar CORS." + use_admin_ip_whitelist: "Los admins solo pueden iniciar sesión si están en una dirección IP definida en la lista de Screened IPs (Admin > Logs > Screened Ips)." top_menu: "Determinar que items aparecen en la navegación de la home y en qué orden. Ejemplo latest|new|unread|categories|top|read|posted|bookmarks" post_menu: "Determina qué elementos aparecen en el menú de un post y en qué orden. Ejemplo: like|edit|flag|delete|share|bookmark|reply" post_menu_hidden_items: "Los elementos del menú a ocultar por defecto en el menú de cada post a menos que se haga clic en el botón para expandir las opciones." @@ -929,6 +934,7 @@ es: white_listed_spam_host_domains: "Una lista de dominios a excluir de las pruebas de spam. A los nuevos usuarios no se les restringirá la posibilidad de crear posts con enlaces a estos dominios." staff_like_weight: "Qué ponderación extra otorgan los me gusta provenientes de los miembros del Staff." topic_view_duration_hours: "Contar una visita a un nuevo tema por IP/Usuario cada N horas" + user_profile_view_duration_hours: "Contar una nueva visita de perfil por IP/Usuario cada N horas" levenshtein_distance_spammer_emails: "Al revisar coincidencias por correos electrónicos de spammers, qué número de caracteres permiten una coincidencia parcial." max_new_accounts_per_registration_ip: "Si ya hay (n) cuentas con nivel de confianza 0 desde esta IP (y ninguna es de un miembro del staff o de nivel de confianza 2 o más), prohibir nuevos registros desde esa IP." min_ban_entries_for_roll_up: "Al hacer clic en el botón Agrupar, se crea un nuevo rango de entradas para banear si hay al menos (N) entradas." @@ -997,7 +1003,7 @@ es: invites_per_page: "Número de invitaciones por defecto mostradas en la página de perfil del usuario." short_progress_text_threshold: "Después de que un número de posts en un tema alcance esta cifra, la barra de progreso sólo mostrará el número del post actual. Si cambias el ancho de la barra de progreso, deberías revisar este valor." default_code_lang: "Lenguaje de programación por defecto para aplicar el resaltado de la sintaxis en los bloques de código de GitHub (lang-auto, ruby, python etc.)" - warn_reviving_old_topic_age: "Cuando alguien publica en un tema cuya última respuesta fue hace este número de días o más, se le mostrará un aviso para desalentar el hecho de resucitar una antigua discusión. Deshabilita esta opción introduciendo el valor 0." + warn_reviving_old_topic_age: "Cuando alguien publica en un tema cuya última respuesta fue hace este número de días o más, se le mostrará un aviso para desalentar el hecho de revivir una antigua discusión. Deshabilita esta opción introduciendo el valor 0." autohighlight_all_code: "Forzar el resaltado de código a los bloques de código preformateado cuando no se especifique el lenguaje del código." highlighted_languages: "Incluye reglas resaltadas de sintaxis. (Advertencia: incluyendo demasiadas lenguages puede afectar al rendimiento) ver: https://highlightjs.org/static/demo/ para una demostración" feed_polling_enabled: "SOLO PARA EMBEBER: embeber feeds RSS/ATOM como posts." @@ -1012,7 +1018,6 @@ es: enable_cdn_js_debugging: "Permitir /logs mostrar los errores correctamente, añadiendo permisos crossorigin en todas las inclusiones de js" show_create_topics_notice: "Si el sitio tiene menos de 5 temas abiertos al público, mostrar un aviso pidiendo a los administradores crear más temas." delete_drafts_older_than_n_days: Eliminar borradores de más de (n) días de antigüedad. - show_logout_in_header: "Mostrar el botón para cerrar sesión en el desplegable de la cabecera" vacuum_db_days: "Correr VACUUM FULL ANALYZE para reclamar espacio en la base de datos después de las migraciones. (Poner en 0 para inhabilitar)" prevent_anons_from_downloading_files: "Impedir que los usuarios anónimos descarguen archivos. ADVERTENCIA: Esto impedirá que funcione cualquier recurso del sitio publicado como adjunto." slug_generation_method: "Elegir un método de generación de slug. 'encoded' generará cadenas con código porciento. 'none' hara que no se genere slug." @@ -1772,6 +1777,105 @@ es: Edita el primer post de este tema para cambiar el contenido de la página %{page_name}. guidelines_topic: title: "Preguntas Frecuentes / Directrices" + body: | + + + ## [Este es un lugar público para conversaciones civilizadas](#civilized) + + Por favor, trata este foro de debate con el mismo respeto con el que tratarías un parque. Este es un lugar donde compartir habilidades, conocimiento e intereses a través de debates y conversaciones. + + Estas no son unas normas estrictas y cerradas, sino una ayuda para el correcto desarrollo de la comunidad. Usa estas pautas para mantener este sitio como un lugar limpio y adecuado para poder debatir y conversar correctamente. + + + + ## [Aporta](#improve) + + Ayúdanos a mantener este foro como un buen lugar esforzándote para mejorar el debate de alguna manera, aunque sea mínima. Si no estás seguro de lo que tu mensaje aporta a la conversación, piensa sobre lo que quieres decir e intenta contestar después. + + El contenido de este foro nos importa, y queremos que actúes como si te importara a ti también. Sé respetuoso con los temas debatidos y con la gente que los debate, aunque no estés de acuerdo con algo de lo que digan. + + Una buena manera de de mejorar el foro es investigando un poco lo que está pasando o ya ha pasado. Por favor, echa un vistazo a los temas ya existentes antes de responder a uno o crearlo y así podrás ver quién opina lo mismo o tiene intereses parecidos a los tuyos. + + + + ## [Sé aceptable incluso cuando no estés de acuerdo](#agreeable) + + Cuando vayas a responder a algo con lo que no estás de acuerdo acuérdate de __criticar las ideas y no las personas__. Por favor, evita: + + + * Ridiculizar a los demás. + * Faltar al respeto e insultar. + * Responder al tono del mensaje en vez de a su contenido. + * Hacer comparaciones y contradicciones exageradas y/o fuera de lugar. + + En lugar de eso, da argumentos que aporten algo al tema, por favor. + + + + ## [Tu participación cuenta](#participate) + + Eres parte de la comunidad, y queremos que todo el mundo participe en ella. Crea o responde a los temas aportando algo y harás de este foro un lugar más interesante y agradable. + + Este foro ofrece herramientas que permiten a la comunidad identificar entre todas las mejores (y peores) contribuciones: "Me gusta", marcadores, reportes, distintivos, respuestas, ediciones, y demás. Usa todo esto para mejorar tu experiencia y la de los demás. + + Intentemos dejar esto mejor de lo que nos lo encontramos. + + + + ## [Si ves un problema, repórtalo](#flag-problems) + + Los moderadores tienen una autoridad especial: son los responsables de este foro. Pero tú lo eres también. Con tu ayuda, los moderadores pueden ser personas que faciliten el desarrollo de la comunidad en lugar de la policía del foro o el servicio de limpieza. + + Cuando veas un comportamiento inadecuado, no respondas. Eso hace que, al reconocer públicamente el contenido inadecuado, se siga publicando contenido de esa clase. Además, lo único que harás será perder energía y el tiempo de todos. En su lugar, repórtalo. Si un post es reportado lo suficiente, se tomarán medidas automáticamente o mediante la intervención de un moderador. + + Para el correcto funcionamiento de esta comunidad, los moderadores se reservan el derecho de eliminar cualquier contenido y cualquier cuenta, por cualquier razón en cualquier momento. Los moderadores no ven los temas antes de que sean publicados por lo que ellos y los operadores del foro no son responsables del contenido publicado por la comunidad. + + + + ## [Sé educado](#be-civil) + + Nada estropea más una conversación que la mala educación. + + * Sé educado. No publoques nada que una persona razonable consideraría ofensivo o abusivo. + * Mantén limpio el foro. No publiques nada obsceno o sexualmente explícito. + * Respeta. No molestes ni acoses a los demás usuarios, tampoco publiques su información privada y/o personal. + * Respeta el foro. No publiques spam ni nos estropees el foro. + + Como puedes ver, estos no son términos exactos con definiciones exactas. Evita siquiera la aparición de cualquiera de estas cosas en el foro. Si no estás seguro, piensa en cómo te sentirías si tu post apareciera en la portada de algún periódico importante. + + Este es un foro público y por tanto el contenido puede aparecer en los motores de búsqueda. El foro es para todos los públicos, así que debes tener cuidado con el vocabulario y el contenido. + + + + ## [Mantén limpio y organizado el foro](#keep-tidy) + + Esfuérzate para poner las cosas en su lugar correspondiente para que podamos estar más tiempo participando en la comunidad y menos tiempo limpiando y organizando. + + * No empieces un nuevo tema en la categoría equivocada. + * No publiques lo mismo en varios temas diferentes. + * No respondas con un mensaje sin contenido. + * No desvíes un tema en mitad de la discusión. + * No firmes tus mensajes — tu información y perfil están claramente visibles junto al post. + + En vez de responder “+1” or “Estoy de acuerdo”, usa el botón de Me gusta. En lugar de cambiar radicalmente la dirección de un tema, responde como nuevo tema. + + + + ## [Publica sólo lo que es tuyo](#stealing) + + No publiques nada que pertenezca a otra persona sin permiso. No debes facilitar enlaces, descipciones o métodos de robar la propiedad intelectual de los demás. (software, vídeo, audio, imágenes, etc.), o formas de violar las leyes. + + + + ## [Funcionamos gracias a gente como tú](#power) + + Este foro es operado por nuestro [equipo](/about) y *vosotros*, la comunidad. Si tienes alguna pregunta sobre cómo deberían funcionar las cosas aquí, abre un nuevo tema en la [categoría de Sugerencias](/c/site-feedback). Si pasa algo urgente que no puede ser resuelto con un tema o un reporte, contáctanos a través de [esta página](/about). + + + + ## [Términos del Servicio](#tos) + + Sí, estos temas aburren, pero debemos protegernos – y, por extensión, a ti y a tus datos – frente a gente poco amigable. Tenemos unos [Términos del Servicio](/tos) que describen nuestra forma de actuar (y la tuya), y los derechos con relación al contenido, la privacidad y las leyes, Para usar nuestros servicios, debes aceptar nuestros [Términos y Condiciones](/tos). tos_topic: title: "Términos de Servicio" privacy_topic: diff --git a/config/locales/server.fi.yml b/config/locales/server.fi.yml index 8dd89d08fe..7d38303e4e 100644 --- a/config/locales/server.fi.yml +++ b/config/locales/server.fi.yml @@ -65,6 +65,13 @@ fi: other: '%{count} virhettä esti tallentamasta tätä %{model}' embed: load_from_remote: "Viestin lataamisessa tapahtui virhe." + site_settings: + min_username_length_exists: "Et voi asettaa käyttäjänimen minimipituutta lyhyemmäksi, kuin lyhyin käyttäjänimi" + min_username_length_range: "Et voi asettaa minimi korkeammaksi kuin maksimi" + max_username_length_exists: "Et voi asettaa käyttäjänimen enimmäispituutta alle pisimmän käyttäjänimen." + max_username_length_range: "Et voi asettaa maksimia minimin alle." + default_categories_already_selected: "Et voi valita aluetta, joka on käytössä toisella listalla" + s3_upload_bucket_is_required: "Et voi ottaa s3 latausta käyttöön, jos et ole määrittänyt 's3_upload_bucket'." bulk_invite: file_should_be_csv: "Ladattavan tiedoston pitäisi olla csv- tai txt-muodossa." backup: @@ -401,6 +408,7 @@ fi: please_continue: "Jatka sivustolle %{site_name}" error: "Sähköpostiosoitteen vaihdossa tapahtui virhe. Ehkäpä tämä sähköpostiosoite on jo käytössä?" activation: + action: "Klikkaa tähän aktivoidaksesi tilisi" already_done: "Pahoittelut, tämän tilin varmennuslinkki ei ole enää voimassa. Ehkäpä tili on jo varmennettu?" please_continue: "Tilisi on nyt varmennettu; sivu ohjautuu palstan etusivulle." continue_button: "Jatka sivustolle %{site_name}" @@ -493,6 +501,10 @@ fi: title: "Uudet käyttäjät" xaxis: "Päivä" yaxis: "Uusien käyttäjien määrä" + profile_views: + title: "Käyttäjäprofiilin katselut" + xaxis: "Päivä" + yaxis: "Katseltujen käyttäjäprofiilien määrä" topics: title: "Ketjut" xaxis: "Päivä" @@ -635,6 +647,7 @@ fi: s3_config_warning: 'Palvelin on konfiguroitu tallentamaan tiedostot s3:een, mutta vähintään yksi arvoista s3_access_key_id, s3_secret_access_key tai s3_upload_bucket ei ole asetettu. Päivitä arvot sivuston asetuksissa.Voit lukea lisätietoja oppaasta "How to set up image uploads to S3?".' s3_backup_config_warning: 'Palvelin on konfiguroitu lataamaan varmuuskopiot s3:een, mutta vähintään yksi arvoista s3_access_key_id, s3_secret_access_key tai s3_backup_bucket ei ole asetettu. Päivitä arvot sivuston asetuksissa.Voit lukea lisätietoja oppaasta "How to set up image uploads to S3?".' 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: 'Epäonnistuneiden sähköpostitehtävien määrä on %{num_failed_jobs}. Tarkista app.yml ja varmista, että palvelimen asetukset ovat kunnossa. Katsele 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." @@ -719,6 +732,7 @@ fi: logo_url: "Logo sivustosi vasemmassa yläkulmassa. Sen pitäisi olla leveä suorakulmio muodoltaan. Jos jätetään tyhjäksi, näytetään sivuston otsikkoteksti." digest_logo_url: "Vaihtoehtoinen logo, jota käytetään sivustolta lähtevissä sähköpostitiivistelmissä. Sen pitäisi olle leveä suorakulmio muodoltaan. Jos jätetään tyhjäksi, sen tilalla käytetään 'logo_url'." logo_small_url: "Pieni logo sivuston vasemmassa reunassa, joka näytettään rullattaessa alaspäin. Sen pitäisi olla neliö muodoltaan. Jos jätetään tyhjäksi, näytetään sen tilalla koti-merkki." + favicon_url: "Palstan favicon, katso http://fi.wikipedia.org/wiki/Favicon, täytyy olla png toimiakseen CDN:n kanssa" mobile_logo_url: "Logo mobiilisivun vasemmassa ylälaidassa. Sen pitäisi olla neliön muotoinen. Jos jätetään tyhjäksi, 'logo_url' käytetään sen tilalla. Esim: http://example.com/uploads/default/logo.png" apple_touch_icon_url: "Applen laitteiden käyttämä ikoni, Suositeltu koko on 144px kertaa 144px." notification_email: "Sähköpostiosoite, josta kaikki tärkeät järjestelmän lähettämät sähköpostiviestit lähetetään. Verkkotunnuksen SPF, DKIM ja reverse PTR tietueiden täytyy olla kunnossa, jotta sähköpostit menevät perille." @@ -749,6 +763,7 @@ fi: notify_mods_when_user_blocked: "Jos käyttäjä estetään automaattisesti, lähetä viesti kaikille valvojille." flag_sockpuppets: "Jos uusi käyttäjä vastaa toisen uuden käyttäjän luomaan ketjun samasta IP osoitteesta, liputa molemmat viestit mahdolliseksi roskapostiksi." traditional_markdown_linebreaks: "Käytä perinteisiä rivinvaihtoja Markdownissa, joka vaatii kaksi perättäistä välilyöntiä rivin vaihtoon." + allow_html_tables: "Salli taulukoiden syöttäminen Markdowniin käyttäen HTML tageja, TABLE, THEAD, TD, TR, TH on valkolistattu (edellyttää kaikkien taulukoita sisältävien vanhojen viestien uudelleen rakentamisen)" post_undo_action_window_mins: "Kuinka monta minuuttia käyttäjällä on aikaa perua viestiin kohdistuva toimi (tykkäys, liputus, etc)." must_approve_users: "Henkilökunnan täytyy hyväksyä kaikki uudet tilit, ennen uusien käyttäjien päästämistä sivustolle. VAROITUS: tämän asetuksen valitseminen poistaa pääsyn kaikilta jo olemassa olevilta henkilökuntaan kuulumattomilta käyttäjiltä." ga_tracking_code: "Google analytics (ga.js) seurantakoodi, esim.: UA-12345678-9; katso http://google.com/analytics" @@ -759,6 +774,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." + use_admin_ip_whitelist: "Ylläpitäjät voivat kirjautua vain IP osoitteista, jotka on määritetty Seulottavien IP:iden listassa (Ylläpito > Lokit > Seulottavat IP:t)" 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." @@ -791,6 +807,8 @@ fi: invite_passthrough_hours: "Kuinka pitkään käyttäjä voi käyttää vastatun kutsun avainta kirjautuakseen sisään, tunneissa" invite_only: "Julkinen rekisteröityminen on otettu pois käytöstä, uuden tilin luominen vaatii kutsun muilta käyttäjiltä tai henkilökunnalta." login_required: "Vaadi kirjautumista sivuston lukemiseen, epää anonyymi pääsy." + min_username_length: "Käyttäjänimen vähimmäispituus merkeissä." + max_username_length: "Käyttäjänimen enimmäispituus merkeissä." reserved_usernames: "Käyttäjänimet, joiden rekisteröintiä ei sallita." min_password_length: "Salasanan vähimmäispituus." block_common_passwords: "Älä salli salasanoja, jotka ovat 10 000 yleisimmän salasanan joukossa." @@ -805,6 +823,7 @@ fi: sso_not_approved_url: "Uudelleenohjaa hyväksymättömät SSO-tilit tähän osoitteeseen" enable_local_logins: "Ota käyttöön käyttäjätunnus/salasana -perusteinen kirjautuminen. (Huom: tämän täytyy olla käytössä kutsujen toimimiseksi)" allow_new_registrations: "Salli uusien käyttäjien rekisteröityminen. Ota tämä asetus pois käytöstä estääksesi uusien käyttäjätilien luomisen." + enable_signup_cta: "Näytä palaaville anonyymeille käyttäjille ilmoitus, jossa kehoitetaan heitä luomaan tili." enable_yahoo_logins: "Ota käyttöön Yahoo kirjautuminen" enable_google_oauth2_logins: "Ota käyttöön Google Oauth2 tunnistautuminen. Tämä on Googlen tällä hetkellä tukeva metodi. Vaatii key ja secret." google_oauth2_client_id: "Google-applikaatiosi Client ID." @@ -820,6 +839,7 @@ fi: github_client_secret: "Client secret Github autentikaatioon, rekisteröinti osoitteessa https://github.com/settings/applications" allow_restore: "Salli palautus, joka korvaa KAIKEN sivuston datan! Jätä valitsematta, jos et aio palauttaa sivuston varmuuskopiota" maximum_backups: "Tallennettuna pidettävien varmuuskopioiden maksimimäärä. Vanhemmat varmuuskopiot poistetaan automaattisesti" + automatic_backups_enabled: "Tee automaattinen varmuuskopiointi, kuten tiheysasetus on määritelty" backup_frequency: "Kuinka usein luodaan sivuston varmuuskopio, päivissä." enable_s3_backups: "Lataa varmuuskopiot S3:een niiden valmistuttua. TÄRKEÄÄ: edellyttää, että toimivat S3 kirjautumistiedot on syötetty asetuksiin." s3_backup_bucket: "Amazon S3 bucket johon varmuuskopiot ladataan. VAROITUS: Varmista, että se on yksityinen." @@ -852,6 +872,8 @@ fi: s3_region: "Amazon S3 region, jota käytetään kuvien sijoittamisessa." s3_cdn_url: "CDN URL, jota käytetään S3:ssa sijaitseville tiedostoille (esimerkiksi https://cdn.jossain.com). VAROITUS: tämän asetuksen muuttamisen jälkeen sinun täytyy rakentaa uudelleen kaikki vanhat viestit." avatar_sizes: "Profiilikuvista automaattisesti luotavat koot." + external_system_avatars_enabled: "Käytä ulkopuolista avatarpalvelua." + external_system_avatars_url: "Ulkoisen avatarpalvelun URL. Sallitut vaihdokset ovat {username} {first_letter} {color} {size}" enable_flash_video_onebox: "Ota käyttöön swf- ja flv-linkkien (Adobe Flash) onebox-tuki. VAROITUS: saattaa lisätä tietoturvariskejä." default_invitee_trust_level: "Oletus luottamustaso (0-4) kutsutuille käyttäjille." default_trust_level: "Uusien käyttäjien oletusarvoinen luottamustaso (0-4). VAROITUS! Tämän muuttaminen altistaa roskapostille." @@ -919,6 +941,8 @@ fi: newuser_spam_host_threshold: "Kuinka monta kertaa uusi käyttäjä voi lisätä linkin samaan isäntään `newuser_spam_host_posts` viesteissään, kunnes se tulkitaan roskapostin lähettämiseksi." white_listed_spam_host_domains: "Lista verkkotunnuksista, joita ei oteta huomioon roskapostin tunnistamisessa. Uusilla käyttäjillä ei ole rajoituksia linkkaamisessa näihin tunnuksiin." staff_like_weight: "Kuinka suuri ylimääräinen arvo on henkilökunnan tykkäyksillä." + topic_view_duration_hours: "Laske uusi ketjun katselu kerran per IP/käyttäjä joka N:s tunti" + user_profile_view_duration_hours: "Laske uusi profiilin katselu kerran per IP/käyttäjä joka N:s tunti" levenshtein_distance_spammer_emails: "Verrattaessa sähköpostiosoitteita tunnettuihin roskapostittajiin, näin monen merkin ero saa vielä aikaan löydöksen." max_new_accounts_per_registration_ip: "Jos samasta IP osoitteesta on jo (n) luottamustason 0 käyttäjätiliä (eikä yhtään henkilökunnan tai vähintään LT2), lakkaa hyväksymästä uusia rekisteröitymisiä tästä IP:stä." min_ban_entries_for_roll_up: "Kun Kääri-painiketta painetaan, luodaan IP-porttikielloista aliverkon kattavia kieltoja jos kieltoja on asettu vähintään (N) määrä." @@ -1011,6 +1035,21 @@ fi: approve_post_count: "Viestien lukumäärä, joka tarkastetaan uusilta käyttäjiltä" approve_unless_trust_level: "Tätä luottamustasoa alhaisempien käyttäjien viestit tarkastetaan" notify_about_queued_posts_after: "Jos hyväksyntää odottavia viestejä on odottanut näin monta tuntia, lähetä sähköposti contact_email osoitteeseen. Aseta 0 ottaaksesi pois käytöstä." + default_email_digest_frequency: "Kuinka usein käyttäjille lähetetään tiivistelmäsähköposti oletuksena." + default_email_private_messages: "Lähetä oletuksena sähköposti, kun joku lähettää käyttäjälle viestin." + default_email_direct: "Lähetä oletuksena sähköposti, kun joku lainaa/vastaa/mainitsee tai kutsuu käyttäjän." + default_email_mailing_list_mode: "Lähetä oletuksena sähköposti jokaisesta uudesta viestistä." + default_email_always: "Lähetä oletuksena sähköposti, vaikka käyttäjä on ollut aktiivinen palstalla." + default_other_new_topic_duration_minutes: "Yleinen oletusarvo sille, koska ketju tulkitaan uudeksi." + default_other_auto_track_topics_after_msecs: "Yleinen oletusarvo sille, missä ajassa ketjua aletaan seurata." + default_other_external_links_in_new_tab: "Avaa oletuksena ulkopuoliset linkit uudessa välilehdessä." + default_other_enable_quoting: "Ota oletuksena käyttöön lainaaminen valitsemalla tekstiä." + default_other_dynamic_favicon: "Näytä oletuksena uusien/päivittyneiden ketjujen määrä selaimen ikonissa." + default_other_disable_jump_reply: "Älä hyppää oletuksena uuteen vastaukseen käyttäjän lähetettyä sen." + default_other_edit_history_public: "Tee oletuksena viestien versioista julkisia." + default_categories_watching: "Lista oletuksena tarkkailtavista alueista." + default_categories_tracking: "Lista oletuksena seurattavista alueista." + default_categories_muted: "Lista oletuksena vaimennetuista alueista." errors: invalid_email: "Sähköpostiosoite ei kelpaa." invalid_username: "Tällä nimellä ei löydy käyttäjää." @@ -1132,6 +1171,10 @@ fi: characters: "täytyy koostua vain numeroista, kirjaimista ja alaviivoista" unique: "täytyy olla uniikki" blank: "pakollinen kenttä" + must_begin_with_alphanumeric: "täytyy alkaa kirjaimella, numerolla tai alaviivalla" + must_end_with_alphanumeric: "täytyy loppua kirjaimeen, numeroon tai alaviivaan" + must_not_contain_two_special_chars_in_seq: "ei saa sisältää peräkkäin kahta tai useampaa erikoismerkkiä (.-_)" + must_not_contain_confusing_suffix: "ei saa sisältää hämäävää liitettä, kuten .json tai .png etc." email: not_allowed: "ei sallita tältä sähköpostin palvelunatarjoajalta. Ole hyvä, ja käytä toista sähköpostiosoitetta." blocked: "ei ole sallittu." @@ -1485,6 +1528,7 @@ fi: Tälle sähköpostiosoitteelle ei löydy käyttäjätiliä. Yritä lähettää sähköposti toisesta osoitteesta tai ota yhteyttä henkilökuntaan. email_reject_empty: subject_template: "[%{site_name}] Sähköpostiongelma -- Ei sisältöä" + text_body_template: "Pahoittelemme, mutta sähköpostin lähettäminen tänne %{destination} (otsikolla %{former_title}) ei onnistunut.\n\nEmme löytäneet sähköpostiviestistäsi sisältöä. \n\nJos saat tämän viestin ja viestisi _sisälsi_ sisältöä, yritä uudestaan yksinkertaisemmalla muotoilulla.\n\n" email_reject_parsing: subject_template: "[%{site_name}] Sähköpostiongelma -- Tunnistamaton sisältö" text_body_template: | @@ -1606,6 +1650,10 @@ fi: download_remote_images_disabled: subject_template: "Linkattujen kuvien lataaminen on otettu pois käytöstä" text_body_template: "Asetus `download_remote_images_to_local` on otettu pois käytöstä, koska vapaan tilan rajoitus `download_remote_images_threshold` saavutettiin." + unsubscribe_link: | + Lopettaaksesi nämä viestit, vieraile [käyttäjäasetuksissasi](%{user_preferences_url}). + + Jos et halua enää saada ilmoituksia tästä kyseisestä ketjusta, [klikkaa tähän](%{unsubscribe_url}). subject_re: "VS:" subject_pm: "[YV]" user_notifications: @@ -1792,11 +1840,14 @@ 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." + file_missing: "Pahoittelut, sinun täytyy valita tiedosto joka ladataan." 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." size_not_found: "Pahoittelut, mutta emme pystyneet selvittämään kuvan kokoa. Ehkä kuvatiedosto on vahingoittunut?" + avatar: + missing: "Pahoittelut, mutta profiilikuvaa, jonka yritit valita ei ole palvelimella. Voitko yrittää ladata sen uudestaan?" flag_reason: sockpuppet: "Uusi käyttäjä loi ketjun ja toinen uusi käyttäjä samasta IP osoitteesta vastasi siihen. Katso asetus flag_sockpuppets." spam_hosts: "Tämä uusi käyttäjä yritti luoda useita viestejä, joissa oli linkkejä samaan verkkotunnukseen. Katso asetus newuser_spam_host_threshold." @@ -1832,6 +1883,29 @@ fi: title: "Käyttöehdot" privacy_topic: title: "Rekisteriseloste" + static: + search_help: | ++
+
order:views | order:latest | order:likes | |||
status:open | status:closed | status:archived | status:noreplies | status:single_user | |
category:foo | user:foo | group:foo | badge:foo | ||
in:likes | in:posted | in:watching | in:tracking | in:private | |
in:bookmarks | in:first | ||||
posts_count:num | min_age:days | max_age:days | |||
+ sateenkaaria category:puistot status:open order:latest hakee ketjuja, joissa käytetään sanaa "sateenkaaria" alueella "puistot" ja joita ei ole suljettu tai arkistoitu järjestettynä ketjun viimeisimmän viestin päivämäärän mukaan.
or tags.
+ in_pre = false
+
+ # Here is the result stored in.
+ result = ""
+
+ # This is a cheat, used to get some context for one-character
+ # tokens that consist of just a quote char. What we do is remember
+ # the last character of the previous text token, to use as context
+ # to curl single- character quote tokens correctly.
+ prev_token_last_char = nil
+
+ tokens.each do |token|
+ if token.first == :tag
+ result << token[1]
+ if token[1] =~ %r!<(/?)(?:pre|code|kbd|script|math)[\s>]!
+ in_pre = ($1 != "/") # Opening or closing tag?
+ end
+ else
+ t = token[1]
+
+ # Remember last char of this token before processing.
+ last_char = t[-1].chr
+
+ unless in_pre
+
+ t.gsub!("'", "'")
+
+ t = process_escapes t
+
+ t.gsub!(""", '"')
+
+ if do_dashes
+ t = educate_dashes t if do_dashes == :normal
+ t = educate_dashes_oldschool t if do_dashes == :oldschool
+ t = educate_dashes_inverted t if do_dashes == :inverted
+ end
+
+ t = educate_ellipses t if do_ellipses
+
+ t = educate_fractions t
+
+ # Note: backticks need to be processed before quotes.
+ if do_backticks
+ t = educate_backticks t
+ t = educate_single_backticks t if do_backticks == :both
+ end
+
+ if do_quotes
+ if t == "'"
+ # Special case: single-character ' token
+ if prev_token_last_char =~ /\S/
+ t = entity(:single_right_quote)
+ else
+ t = entity(:single_left_quote)
+ end
+ elsif t == '"'
+ # Special case: single-character " token
+ if prev_token_last_char =~ /\S/
+ t = entity(:double_right_quote)
+ else
+ t = entity(:double_left_quote)
+ end
+ else
+ # Normal case:
+ t = educate_quotes t
+ end
+ end
+
+ t = stupefy_entities t if do_stupefy
+ end
+
+ prev_token_last_char = last_char
+ result << t
+ end
+ end
+
+ # Done
+ result
+ end
+
+ protected
+
+ # Return the string, with after processing the following backslash
+ # escape sequences. This is useful if you want to force a "dumb" quote
+ # or other character to appear.
+ #
+ # Escaped are:
+ # \\ \" \' \. \- \`
+ #
+ def process_escapes(str)
+ str = str.gsub('\\\\', '\')
+ str.gsub!('\"', '"')
+ str.gsub!("\\\'", ''')
+ str.gsub!('\.', '.')
+ str.gsub!('\-', '-')
+ str.gsub!('\`', '`')
+ str
+ end
+
+ # The string, with each instance of "--" translated to an
+ # em-dash HTML entity.
+ #
+ def educate_dashes(str)
+ str.
+ gsub(/--/, entity(:em_dash))
+ end
+
+ # The string, with each instance of "--" translated to an
+ # en-dash HTML entity, and each "---" translated to an
+ # em-dash HTML entity.
+ #
+ def educate_dashes_oldschool(str)
+ str.
+ gsub(/---/, entity(:em_dash)).
+ gsub(/--/, entity(:en_dash))
+ end
+
+ # Return the string, with each instance of "--" translated
+ # to an em-dash HTML entity, and each "---" translated to
+ # an en-dash HTML entity. Two reasons why: First, unlike the en- and
+ # em-dash syntax supported by +educate_dashes_oldschool+, it's
+ # compatible with existing entries written before SmartyPants 1.1,
+ # back when "--" was only used for em-dashes. Second,
+ # em-dashes are more common than en-dashes, and so it sort of makes
+ # sense that the shortcut should be shorter to type. (Thanks to
+ # Aaron Swartz for the idea.)
+ #
+ def educate_dashes_inverted(str)
+ str.
+ gsub(/---/, entity(:en_dash)).
+ gsub(/--/, entity(:em_dash))
+ end
+
+ # Return the string, with each instance of "..." translated
+ # to an ellipsis HTML entity. Also converts the case where there are
+ # spaces between the dots.
+ #
+ def educate_ellipses(str)
+ str.
+ gsub('...', entity(:ellipsis)).
+ gsub('. . .', entity(:ellipsis))
+ end
+
+ # Return the string, with "``backticks''"-style single quotes
+ # translated into HTML curly quote entities.
+ #
+ def educate_backticks(str)
+ str.
+ gsub("``", entity(:double_left_quote)).
+ gsub("''", entity(:double_right_quote))
+ end
+
+ # Return the string, with "`backticks'"-style single quotes
+ # translated into HTML curly quote entities.
+ #
+ def educate_single_backticks(str)
+ str.
+ gsub("`", entity(:single_left_quote)).
+ gsub("'", entity(:single_right_quote))
+ end
+
+ def educate_fractions(str)
+ str.gsub(/(\s+|^)(1\/4|1\/2|3\/4)([,.;\s]|$)/) do
+ frac =
+ if $2 == "1/2".freeze
+ entity(:frac12)
+ elsif $2 == "1/4".freeze
+ entity(:frac14)
+ elsif $2 == "3/4".freeze
+ entity(:frac34)
+ end
+ "#{$1}#{frac}#{$3}"
+ end
+ end
+
+ # Return the string, with "educated" curly quote HTML entities.
+ #
+ def educate_quotes(str)
+ punct_class = '[!"#\$\%\'()*+,\-.\/:;<=>?\@\[\\\\\]\^_`{|}~]'
+
+ # normalize html
+ str = str.dup
+ # Special case if the very first character is a quote followed by
+ # punctuation at a non-word-break. Close the quotes by brute
+ # force:
+ str.gsub!(/^'(?=#{punct_class}\B)/,
+ entity(:single_right_quote))
+ str.gsub!(/^"(?=#{punct_class}\B)/,
+ entity(:double_right_quote))
+
+ # Special case for double sets of quotes, e.g.:
+ # He said, "'Quoted' words in a larger quote."
+ str.gsub!(/"'(?=\w)/,
+ "#{entity(:double_left_quote)}#{entity(:single_left_quote)}")
+ str.gsub!(/'"(?=\w)/,
+ "#{entity(:single_left_quote)}#{entity(:double_left_quote)}")
+
+ # Special case for decade abbreviations (the '80s):
+ str.gsub!(/'(?=\d\ds)/,
+ entity(:single_right_quote))
+
+ close_class = %![^\ \t\r\n\\[\{\(\-]!
+ dec_dashes = "#{entity(:en_dash)}|#{entity(:em_dash)}"
+
+ # Get most opening single quotes:
+ str.gsub!(/(\s| |=|--|&[mn]dash;|#{dec_dashes}|ȁ[34];)'(?=\w)/,
+ '\1' + entity(:single_left_quote))
+
+ # Single closing quotes:
+ str.gsub!(/(#{close_class})'/,
+ '\1' + entity(:single_right_quote))
+ str.gsub!(/'(\s|s\b|$)/,
+ entity(:single_right_quote) + '\1')
+
+ # Any remaining single quotes should be opening ones:
+ str.gsub!(/'/,
+ entity(:single_left_quote))
+
+ # Get most opening double quotes:
+ str.gsub!(/(\s| |=|--|&[mn]dash;|#{dec_dashes}|ȁ[34];)"(?=\w)/,
+ '\1' + entity(:double_left_quote))
+
+ # Double closing quotes:
+ str.gsub!(/(#{close_class})"/,
+ '\1' + entity(:double_right_quote))
+ str.gsub!(/"(\s|s\b|$)/,
+ entity(:double_right_quote) + '\1')
+
+ # Any remaining quotes should be opening ones:
+ str.gsub!(/"/,
+ entity(:double_left_quote))
+
+ str
+ end
+
+ # Return the string, with each RubyPants HTML entity translated to
+ # its ASCII counterpart.
+ #
+ # Note: This is not reversible (but exactly the same as in SmartyPants)
+ #
+ def stupefy_entities(str)
+ new_str = str.dup
+
+ {
+ :en_dash => '-',
+ :em_dash => '--',
+ :single_left_quote => "'",
+ :single_right_quote => "'",
+ :double_left_quote => '"',
+ :double_right_quote => '"',
+ :ellipsis => '...'
+ }.each do |k,v|
+ new_str.gsub!(/#{entity(k)}/, v)
+ end
+
+ new_str
+ end
+
+ # Return an array of the tokens comprising the string. Each token is
+ # either a tag (possibly with nested, tags contained therein, such
+ # as , or a run of text between
+ # tags. Each element of the array is a two-element array; the first
+ # is either :tag or :text; the second is the actual value.
+ #
+ # Based on the _tokenize() subroutine from Brad Choate's
+ # MTRegex plugin.
+ #
+ # This is actually the easier variant using tag_soup, as used by
+ # Chad Miller in the Python port of SmartyPants.
+ #
+ def tokenize
+ tag_soup = /([^<]*)(<[^>]*>)/
+
+ tokens = []
+
+ prev_end = 0
+
+ scan(tag_soup) do
+ tokens << [:text, $1] if $1 != ""
+ tokens << [:tag, $2]
+ prev_end = $~.end(0)
+ end
+
+ if prev_end < size
+ tokens << [:text, self[prev_end..-1]]
+ end
+
+ tokens
+ end
+
+ def default_entities
+ {
+ single_left_quote: "‘",
+ double_left_quote: "“",
+ single_right_quote: "’",
+ double_right_quote: "”",
+ em_dash: "—",
+ en_dash: "–",
+ ellipsis: "…",
+ html_quote: """,
+ frac12: "½",
+ frac14: "¼",
+ frac34: "¾",
+ }
+ end
+
+ def entity(key)
+ @entities[key]
+ end
+
+end
diff --git a/lib/onebox/engine/discourse_local_onebox.rb b/lib/onebox/engine/discourse_local_onebox.rb
index db4075b43e..06d5449468 100644
--- a/lib/onebox/engine/discourse_local_onebox.rb
+++ b/lib/onebox/engine/discourse_local_onebox.rb
@@ -33,13 +33,14 @@ module Onebox
def to_html
uri = URI::parse(@url)
route = Rails.application.routes.recognize_path(uri.path)
-
+ url = @url.sub(/[&?]source_topic_id=(\d+)/, "")
+ source_topic_id = $1.to_i
# Figure out what kind of onebox to show based on the URL
case route[:controller]
when 'topics'
- linked = "#{@url}"
+ linked = "#{url}"
if route[:post_number].present? && route[:post_number].to_i > 1
# Post Link
post = Post.find_by(topic_id: route[:topic_id], post_number: route[:post_number].to_i)
@@ -56,7 +57,9 @@ module Onebox
excerpt.gsub!("[/quote]", "[quote]")
quote = "[quote=\"#{post.user.username}, topic:#{topic.id}, slug:#{slug}, post:#{post.post_number}\"]#{excerpt}[/quote]"
- cooked = PrettyText.cook(quote)
+ args = {}
+ args[:topic_id] = source_topic_id if source_topic_id > 0
+ cooked = PrettyText.cook(quote, args)
return cooked
else
@@ -77,7 +80,7 @@ module Onebox
end
quote = post.excerpt(SiteSetting.post_onebox_maxlength)
- args = { original_url: @url,
+ args = { original_url: url,
title: topic.title,
avatar: PrettyText.avatar_img(topic.user.avatar_template, 'tiny'),
posts_count: topic.posts_count,
diff --git a/lib/oneboxer.rb b/lib/oneboxer.rb
index 50aa8bc7b0..5557b8e750 100644
--- a/lib/oneboxer.rb
+++ b/lib/oneboxer.rb
@@ -76,12 +76,30 @@ module Oneboxer
doc
end
- def self.apply(string_or_doc)
+ def self.append_source_topic_id(url, topic_id)
+ # hack urls to create proper expansions
+ if url =~ Regexp.new("^#{Discourse.base_url.gsub(".","\\.")}.*$", true)
+ uri = URI.parse(url) rescue nil
+ if uri && uri.path
+ route = Rails.application.routes.recognize_path(uri.path) rescue nil
+ if route && route[:controller] == 'topics'
+ url += (url =~ /\?/ ? "&" : "?") + "source_topic_id=#{topic_id}"
+ end
+ end
+ end
+ url
+ end
+
+ def self.apply(string_or_doc, args=nil)
doc = string_or_doc
doc = Nokogiri::HTML::fragment(doc) if doc.is_a?(String)
changed = false
Oneboxer.each_onebox_link(doc) do |url, element|
+
+ if args && args[:topic_id]
+ url = append_source_topic_id(url, args[:topic_id])
+ end
onebox, _preview = yield(url,element)
if onebox
parsed_onebox = Nokogiri::HTML::fragment(onebox)
diff --git a/lib/plugin/auth_provider.rb b/lib/plugin/auth_provider.rb
index 367f9a6516..8db104f3ef 100644
--- a/lib/plugin/auth_provider.rb
+++ b/lib/plugin/auth_provider.rb
@@ -1,9 +1,25 @@
class Plugin::AuthProvider
- attr_accessor :glyph, :background_color, :title,
- :message, :frame_width, :frame_height, :authenticator
+
+ def self.auth_attributes
+ [:glyph, :background_color, :title, :message, :frame_width, :frame_height, :authenticator,
+ :title_setting, :enabled_setting]
+ end
+
+ attr_accessor(*auth_attributes)
def name
authenticator.name
end
+ def to_json
+ result = {name: name}
+ result['titleOverride'] = title if title
+ result['titleSetting'] = title_setting if title_setting
+ result['enabledSetting'] = enabled_setting if enabled_setting
+ result['messageOverride'] = message if message
+ result['frameWidth'] = frame_width if frame_width
+ result['frameHeight'] = frame_height if frame_height
+ result.to_json
+ end
+
end
diff --git a/lib/plugin/instance.rb b/lib/plugin/instance.rb
index d51adc4f13..0b0493b6e2 100644
--- a/lib/plugin/instance.rb
+++ b/lib/plugin/instance.rb
@@ -218,13 +218,8 @@ class Plugin::Instance
js = javascripts.join("\n")
auth_providers.each do |auth|
- overrides = ""
- overrides = ", titleOverride: '#{auth.title}'" if auth.title
- overrides << ", messageOverride: '#{auth.message}'" if auth.message
- overrides << ", frameWidth: '#{auth.frame_width}'" if auth.frame_width
- overrides << ", frameHeight: '#{auth.frame_height}'" if auth.frame_height
- js << "Discourse.LoginMethod.register(Discourse.LoginMethod.create({name: '#{auth.name}'#{overrides}}));\n"
+ js << "Discourse.LoginMethod.register(Discourse.LoginMethod.create(#{auth.to_json}));\n"
if auth.glyph
css << ".btn-social.#{auth.name}:before{ content: '#{auth.glyph}'; }\n"
@@ -305,7 +300,8 @@ class Plugin::Instance
def auth_provider(opts)
provider = Plugin::AuthProvider.new
- [:glyph, :background_color, :title, :message, :frame_width, :frame_height, :authenticator].each do |sym|
+
+ Plugin::AuthProvider.auth_attributes.each do |sym|
provider.send "#{sym}=", opts.delete(sym)
end
auth_providers << provider
diff --git a/lib/post_creator.rb b/lib/post_creator.rb
index 21b07963f5..22ace0dad3 100644
--- a/lib/post_creator.rb
+++ b/lib/post_creator.rb
@@ -176,7 +176,7 @@ class PostCreator
cooking_options = post.cooking_options || {}
cooking_options[:topic_id] = post.topic_id
- post.cooked ||= post.cook(post.raw, cooking_options)
+ post.cooked ||= post.cook(post.raw, cooking_options.symbolize_keys)
post.sort_order = post.post_number
post.last_version_at ||= Time.now
end
diff --git a/lib/pretty_text.rb b/lib/pretty_text.rb
index 1b43959482..0881296e8b 100644
--- a/lib/pretty_text.rb
+++ b/lib/pretty_text.rb
@@ -39,6 +39,18 @@ module PrettyText
username = username.downcase
User.exec_sql('SELECT 1 FROM users WHERE username_lower = ?', username).values.length == 1
end
+
+ def get_topic_info(topic_id)
+ return unless Fixnum === topic_id
+ # TODO this only handles public topics, secured one do not get this
+ topic = Topic.find_by(id: topic_id)
+ if topic && Guardian.new.can_see?(topic)
+ {
+ title: topic.title,
+ href: topic.url
+ }
+ end
+ end
end
@mutex = Mutex.new
@@ -184,6 +196,7 @@ module PrettyText
context.eval('opts["mentionLookup"] = function(u){return helpers.is_username_valid(u);}')
context.eval('opts["lookupAvatar"] = function(p){return Discourse.Utilities.avatarImg({size: "tiny", avatarTemplate: helpers.avatar_template(p)});}')
+ context.eval('opts["getTopicInfo"] = function(i){return helpers.get_topic_info(i)};')
baked = context.eval('Discourse.Markdown.markdownConverter(opts).makeHtml(raw)')
end
diff --git a/lib/rate_limiter.rb b/lib/rate_limiter.rb
index e8b51f0f49..df678960d7 100644
--- a/lib/rate_limiter.rb
+++ b/lib/rate_limiter.rb
@@ -27,9 +27,14 @@ class RateLimiter
$redis.delete_prefixed(RateLimiter.key_prefix)
end
- def initialize(user, key, max, secs)
+ def build_key(type)
+ "#{RateLimiter.key_prefix}:#{@user && @user.id}:#{type}"
+ end
+
+ def initialize(user, type, max, secs)
@user = user
- @key = "#{RateLimiter.key_prefix}:#{@user && @user.id}:#{key}"
+ @type = type
+ @key = build_key(type)
@max = max
@secs = secs
end
@@ -53,7 +58,7 @@ class RateLimiter
# let's ensure we expire this key at some point, otherwise we have leaks
$redis.expire(@key, @secs * 2)
else
- raise LimitExceeded.new(seconds_to_wait)
+ raise RateLimiter::LimitExceeded.new(seconds_to_wait, @type)
end
end
diff --git a/lib/rate_limiter/limit_exceeded.rb b/lib/rate_limiter/limit_exceeded.rb
index 2b85b467b0..ad7a000577 100644
--- a/lib/rate_limiter/limit_exceeded.rb
+++ b/lib/rate_limiter/limit_exceeded.rb
@@ -2,9 +2,30 @@ class RateLimiter
# A rate limit has been exceeded.
class LimitExceeded < StandardError
- attr_accessor :available_in
- def initialize(available_in)
+
+ def initialize(available_in, type=nil)
@available_in = available_in
+ @type = type
+ end
+
+ def description
+
+ time_left = ""
+ if @available_in < 1.minute.to_i
+ time_left = I18n.t("rate_limiter.seconds", count: @available_in)
+ elsif @available_in < 1.hour.to_i
+ time_left = I18n.t("rate_limiter.minutes", count: (@available_in / 1.minute.to_i))
+ else
+ time_left = I18n.t("rate_limiter.hours", count: (@available_in / 1.hour.to_i))
+ end
+
+ if @type.present?
+ type_key = @type.gsub(/-/, '_')
+ msg = I18n.t("rate_limiter.by_type.#{type_key}", time_left: time_left, default: "")
+ return msg if msg.present?
+ end
+
+ I18n.t("rate_limiter.too_many_requests", time_left: time_left)
end
end
diff --git a/lib/site_setting_extension.rb b/lib/site_setting_extension.rb
index 90be6860fc..437cc51193 100644
--- a/lib/site_setting_extension.rb
+++ b/lib/site_setting_extension.rb
@@ -373,6 +373,7 @@ module SiteSettingExtension
def clear_cache!
SiteText.text_for_cache.clear
Rails.cache.delete(SiteSettingExtension.client_settings_cache_key)
+ Site.clear_anon_cache!
end
def diff_hash(new_hash, old)
diff --git a/lib/tasks/assets.rake b/lib/tasks/assets.rake
index a6fc5d09ff..b220d322d4 100644
--- a/lib/tasks/assets.rake
+++ b/lib/tasks/assets.rake
@@ -162,7 +162,7 @@ task 'assets:precompile' => 'assets:precompile:before' do
STDERR.puts "Compressing: #{file}"
# We can specify some files to never minify
- unless to_skip.include?(info['logical_path'])
+ unless (ENV["DONT_MINIFY"] == "1") || to_skip.include?(info['logical_path'])
FileUtils.mv(path, _path)
compress(_file,file)
end
diff --git a/lib/tasks/posts.rake b/lib/tasks/posts.rake
index 5f661e5500..37fb02bfaf 100644
--- a/lib/tasks/posts.rake
+++ b/lib/tasks/posts.rake
@@ -8,6 +8,24 @@ task 'posts:refresh_oneboxes' => :environment do
ENV['RAILS_DB'] ? rebake_posts(invalidate_oneboxes: true) : rebake_posts_all_sites(invalidate_oneboxes: true)
end
+desc 'Rebake all posts with a quote using a letter_avatar'
+task 'posts:fix_letter_avatars' => :environment do
+ return unless SiteSetting.external_system_avatars_enabled
+
+ search = Post.where("user_id <> -1")
+ .where("raw LIKE '%/letter\_avatar/%' OR cooked LIKE '%/letter\_avatar/%'")
+
+ rebaked = 0
+ total = search.count
+
+ search.order(updated_at: :asc).find_each do |post|
+ rebake_post(post)
+ print_status(rebaked += 1, total)
+ end
+
+ puts "", "#{rebaked} posts done!", ""
+end
+
def rebake_posts_all_sites(opts = {})
RailsMultisite::ConnectionManagement.each_connection do |db|
rebake_posts(opts)
@@ -33,7 +51,7 @@ def rebake_posts(opts = {})
puts "", "#{rebaked} posts done!", "-" * 50
end
-def rebake_post(post, opts)
+def rebake_post(post, opts = {})
post.rebake!(opts)
rescue => e
puts "", "Failed to rebake (topic_id: #{post.topic_id}, post_id: #{post.id})", e, e.backtrace.join("\n")
diff --git a/lib/topic_creator.rb b/lib/topic_creator.rb
index cff51e7c89..d8a7bb96df 100644
--- a/lib/topic_creator.rb
+++ b/lib/topic_creator.rb
@@ -150,7 +150,7 @@ class TopicCreator
def add_users(topic, usernames)
return unless usernames
- User.where(username: usernames.split(',')).each do |user|
+ User.where(username: usernames.split(',').flatten).each do |user|
check_can_send_permission!(topic, user)
@added_users << user
topic.topic_allowed_users.build(user_id: user.id)
diff --git a/lib/topic_query.rb b/lib/topic_query.rb
index 73d47fd4ad..434fdbb0ee 100644
--- a/lib/topic_query.rb
+++ b/lib/topic_query.rb
@@ -46,6 +46,7 @@ class TopicQuery
options.assert_valid_keys(VALID_OPTIONS)
@options = options.dup
@user = user
+ @guardian = Guardian.new(@user)
end
def joined_topic_user(list=nil)
@@ -359,7 +360,7 @@ class TopicQuery
when 'unlisted'
result = result.where('NOT topics.visible')
when 'deleted'
- guardian = Guardian.new(@user)
+ guardian = @guardian
if guardian.is_staff?
result = result.where('topics.deleted_at IS NOT NULL')
require_deleted_clause = false
@@ -391,7 +392,7 @@ class TopicQuery
result = result.where('topics.posts_count <= ?', options[:max_posts]) if options[:max_posts].present?
result = result.where('topics.posts_count >= ?', options[:min_posts]) if options[:min_posts].present?
- Guardian.new(@user).filter_allowed_categories(result)
+ @guardian.filter_allowed_categories(result)
end
def remove_muted_categories(list, user, opts=nil)
diff --git a/lib/topic_view.rb b/lib/topic_view.rb
index 24a49d24cf..2a9e70cd96 100644
--- a/lib/topic_view.rb
+++ b/lib/topic_view.rb
@@ -186,7 +186,8 @@ class TopicView
result[g[0]] = g[1]
end
end
- result
+
+ @group_names = result
end
# Find the sort order for a post in the topic
diff --git a/lib/version.rb b/lib/version.rb
index f1e2c578f4..908352cc31 100644
--- a/lib/version.rb
+++ b/lib/version.rb
@@ -5,7 +5,7 @@ module Discourse
MAJOR = 1
MINOR = 5
TINY = 0
- PRE = 'beta1'
+ PRE = 'beta2'
STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
end
diff --git a/plugins/poll/config/locales/client.ar.yml b/plugins/poll/config/locales/client.ar.yml
index 4c3a9ec5e4..40918ade4f 100644
--- a/plugins/poll/config/locales/client.ar.yml
+++ b/plugins/poll/config/locales/client.ar.yml
@@ -25,9 +25,27 @@ ar:
average_rating: "متوسط التصنيف: %{average} "
multiple:
help:
- at_least_min_options: "من المفترض أن تختار على الأقل %{count} خيارات ."
- up_to_max_options: "يجب عليك إختيار على الأكثر %{count} خيارات ."
- x_options: "يجب عليك إختيار %{count} خيارات ."
+ at_least_min_options:
+ zero: "لا يجب عليك اختيار أي خيار."
+ one: "يجب عليك أن تختار خيار واحد على الأقل."
+ two: "يجب عليك أن تختار خياران على الأقل."
+ few: "يجب عليك أن تختار %{count} بعض الخيارات على الأقل."
+ many: "يجب عليك أن تختار %{count} عدة خيارات على الأقل."
+ other: "يجب عليك الاختيار على الأقل."
+ up_to_max_options:
+ zero: "يمكنك عدم إختيار أي من الخيارات."
+ one: "يمكنك إختيار مايصل إلى خيار واحد ."
+ two: "يمكنك إختيار مايصل إلى خياران."
+ few: "يمكنك إختيار مايصل إلى %{count} خيار ."
+ many: "يمكنك إختيار مايصل إلى %{count} خيارات ."
+ other: "يمكنك إختيار مايصل إلى %{count} خيار ."
+ x_options:
+ zero: "لا يجب عليك إختيار أي خيار."
+ one: "يجب عليك إختيار خيارواحدخياران فقط."
+ few: "يجب عليك إختيار %{count} بعض الخيارات."
+ many: "يجب عليك إختيار %{count} عدة خيارات."
+ other: "يجب عليك إختيار %{count} خيارات أخرى."
between_min_and_max_options: "يجب عليك إختيار بين %{min} و %{max} خيارات ."
cast-votes:
title: "إدراج تصويتك ."
diff --git a/plugins/poll/config/locales/client.da.yml b/plugins/poll/config/locales/client.da.yml
index 7f31c2d0f9..4747966e3a 100644
--- a/plugins/poll/config/locales/client.da.yml
+++ b/plugins/poll/config/locales/client.da.yml
@@ -17,9 +17,15 @@ da:
average_rating: "Gennemsnitlig rating: %{average}."
multiple:
help:
- at_least_min_options: "Du skal mindst vælge %{count} muligheder."
- up_to_max_options: "Du kan vælge op til %{count} muligheder."
- x_options: "Du skal vælge %{count} muligheder."
+ at_least_min_options:
+ one: "Du skal mindst vælge 1 mulighed."
+ other: "Du skal mindst vælge %{count} muligheder."
+ up_to_max_options:
+ one: "Du kan vælge op til 1 mulighed."
+ other: "Du kan vælge op til %{count} muligheder."
+ x_options:
+ one: "Du skal vælge 1 mulighed."
+ other: "Du skal vælge %{count} muligheder."
between_min_and_max_options: "Du kan vælge mellem %{min} og %{max} muligheder."
cast-votes:
title: "Afgiv dine stemmer"
@@ -31,7 +37,7 @@ da:
title: "Tilbage til dine stemmer"
label: "Skjul resultat"
open:
- title: "Åbn afstemning"
+ title: "Åbn afstemningen"
label: "Åbn"
confirm: "Er du sikker på, at du vil åbne denne afstemning?"
close:
diff --git a/plugins/poll/config/locales/client.de.yml b/plugins/poll/config/locales/client.de.yml
index 7833ece385..9b8ef70d00 100644
--- a/plugins/poll/config/locales/client.de.yml
+++ b/plugins/poll/config/locales/client.de.yml
@@ -17,9 +17,15 @@ de:
average_rating: "Durchschnittliche Bewertung: %{average}"
multiple:
help:
- at_least_min_options: "Du musst mindestens %{count} Optionen auswählen."
- up_to_max_options: "Du kannst bis zu %{count} Optionen auswählen."
- x_options: "Du musst %{count} Optionen auswählen."
+ at_least_min_options:
+ one: "Du musst mindestens eine Option auswählen."
+ other: "Du musst mindestens %{count} Optionen auswählen."
+ up_to_max_options:
+ one: "Du kannst genau eine Option auswählen."
+ other: "Du kannst bis zu %{count} Optionen auswählen."
+ x_options:
+ one: "Du musst eine Option auswählen."
+ other: "Du musst %{count} Optionen auswählen."
between_min_and_max_options: "Du kannst zwischen %{min} und %{max} Optionen auswählen."
cast-votes:
title: "Gib deine Stimmen ab"
diff --git a/plugins/poll/config/locales/client.en.yml b/plugins/poll/config/locales/client.en.yml
index 586a8dfaf5..59b508c885 100644
--- a/plugins/poll/config/locales/client.en.yml
+++ b/plugins/poll/config/locales/client.en.yml
@@ -29,9 +29,15 @@ en:
multiple:
help:
- at_least_min_options: "You must choose at least %{count} options."
- up_to_max_options: "You may choose up to %{count} options."
- x_options: "You must choose %{count} options."
+ at_least_min_options:
+ one: "You must choose at least 1 option."
+ other: "You must choose at least %{count} options."
+ up_to_max_options:
+ one: "You may choose up to 1 option."
+ other: "You may choose up to %{count} options."
+ x_options:
+ one: "You must choose 1 option."
+ other: "You must choose %{count} options."
between_min_and_max_options: "You may choose between %{min} and %{max} options."
cast-votes:
diff --git a/plugins/poll/config/locales/client.fi.yml b/plugins/poll/config/locales/client.fi.yml
index 1b31427f79..e686f8e6a6 100644
--- a/plugins/poll/config/locales/client.fi.yml
+++ b/plugins/poll/config/locales/client.fi.yml
@@ -17,9 +17,15 @@ fi:
average_rating: "Keskivertoarvio: %{average}."
multiple:
help:
- at_least_min_options: "Sinun täytyy valita vähintään %{count} vaihtoehtoa."
- up_to_max_options: "Voit valita enintään %{count} vaihtoehtoa."
- x_options: "Sinun täytyy valita %{count} vaihtoehtoa."
+ at_least_min_options:
+ one: "Sinun täytyy valita vähintään yksi vaihtoehto."
+ other: "Sinun täytyy valita vähintään %{count} vaihtoehtoa."
+ up_to_max_options:
+ one: "Voit valita enintään yhden vaihtoehdon."
+ other: "Voit valita enintään %{count} vaihtoehtoa."
+ x_options:
+ one: "Sinun täytyy valita yksi vaihtoehto."
+ other: "Sinun täytyy valita %{count} vaihtoehtoa."
between_min_and_max_options: "Voit valita %{min}-%{max}%{average}."
multiple:
help:
- at_least_min_options: "Deve escolher pelo menos %{count} opções."
- up_to_max_options: "Pode escolher até %{count} opções."
- x_options: "Deve escolher %{count} opções."
+ at_least_min_options:
+ one: "Deve escolher pelo menos 1 opção."
+ other: "Deve escolher pelo menos %{count} opções."
+ up_to_max_options:
+ one: "Pode escolher até 1 opção."
+ other: "Pode escolher até %{count} opções."
+ x_options:
+ one: "Deve escolher 1 opção."
+ other: "Deve escolher %{count} opções."
between_min_and_max_options: "Pode escolher entre %{min} e %{max} opções."
cast-votes:
title: "Votar"
diff --git a/plugins/poll/config/locales/client.ru.yml b/plugins/poll/config/locales/client.ru.yml
index 8f73a0a443..8dd85117e6 100644
--- a/plugins/poll/config/locales/client.ru.yml
+++ b/plugins/poll/config/locales/client.ru.yml
@@ -8,13 +8,35 @@
ru:
js:
poll:
- average_rating: "Примерный рейтинг: %{average}."
+ voters:
+ one: "голос"
+ few: "голоса"
+ many: "голосов"
+ other: "голосов"
+ total_votes:
+ one: "голос"
+ few: "голоса"
+ many: "голосов"
+ other: "голосов"
+ average_rating: "Средний рейтинг: %{average}."
multiple:
help:
- at_least_min_options: "Вы должны выбрать как минимум %{count} ответов."
- up_to_max_options: "Вы можете выбрать не более %{count} вариантов ответов."
- x_options: "Вы должны выбрать %{count} варианта ответа."
- between_min_and_max_options: "Вы можете выбрать от %{min} до %{max} ответов."
+ at_least_min_options:
+ one: "Необходимо выбрать хотя бы 1 ответ."
+ few: "Необходимо выбрать хотя бы %{count} ответа."
+ many: "Необходимо выбрать хотя бы %{count} ответов."
+ other: "Необходимо выбрать хотя бы %{count} ответов."
+ up_to_max_options:
+ one: "Можно выбрать только 1 ответ."
+ few: "Можно выбрать до %{count} ответов."
+ many: "Можно выбрать до %{count} ответов."
+ other: "Можно выбрать до %{count} ответов."
+ x_options:
+ one: "Необходимо выбрать 1 ответ."
+ few: "Необходимо выбрать %{count} ответа."
+ many: "Необходимо выбрать %{count} ответов."
+ other: "Необходимо выбрать %{count} ответов."
+ between_min_and_max_options: "Можно выбрать от %{min} до %{max} ответов."
cast-votes:
title: "Проголосуйте"
label: "Голосовать!"
@@ -22,15 +44,15 @@ ru:
title: "Показать результаты"
label: "Показать результаты"
hide-results:
- title: "Вернуться к голосованию"
+ title: "Вернуться к опросу"
label: "Скрыть результаты"
open:
- title: "Открыть голосование"
+ title: "Открыть опрос"
label: "Открыть"
- confirm: "Вы уверены, что хотите открыть это голосование?"
+ confirm: "Вы уверены, что хотите открыть этот опрос?"
close:
- title: "Закрыть голосование"
+ title: "Закрыть опрос"
label: "Закрыть"
- confirm: "Вы уверены, что хотите закрыть это голосование?"
- error_while_toggling_status: "Произошла ошибка смены статуса голосования."
- error_while_casting_votes: "Произошла ошибка в голосовании."
+ confirm: "Вы уверены, что хотите закрыть этот опрос?"
+ error_while_toggling_status: "Произошла ошибка при смене статуса опроса."
+ error_while_casting_votes: "Произошла ошибка во время обработки вашего голоса."
diff --git a/plugins/poll/config/locales/client.zh_CN.yml b/plugins/poll/config/locales/client.zh_CN.yml
index cd3958a6a3..7a7744543d 100644
--- a/plugins/poll/config/locales/client.zh_CN.yml
+++ b/plugins/poll/config/locales/client.zh_CN.yml
@@ -15,9 +15,12 @@ zh_CN:
average_rating: "平均排名:%{average}。"
multiple:
help:
- at_least_min_options: "你至少要选择 %{count} 个选项。"
- up_to_max_options: "你最多可以选择 %{count} 个选项。"
- x_options: "你必须选择 %{count} 个选项。"
+ at_least_min_options:
+ other: "你必须选择至少 %{count} 个选项。"
+ up_to_max_options:
+ other: "你可以选择最多 %{count} 个选项。"
+ x_options:
+ other: "你必须选择 %{count} 个选项。"
between_min_and_max_options: "你可以选择 %{min} 至 %{max} 个选项。"
cast-votes:
title: "投你的票"
diff --git a/plugins/poll/config/locales/server.ar.yml b/plugins/poll/config/locales/server.ar.yml
index 7fcef197a3..b9299d1b51 100644
--- a/plugins/poll/config/locales/server.ar.yml
+++ b/plugins/poll/config/locales/server.ar.yml
@@ -14,8 +14,20 @@ ar:
multiple_polls_with_same_name: "هناك عدة استطلاعات رأي متشابهة بالاسم : %{name}. استخدم خاصية 'name' لتحدي استطلاعك الفريد."
default_poll_must_have_at_least_2_options: "استطلاع الرأي يجب أن يكون على الأقل 2 من الخيارات."
named_poll_must_have_at_least_2_options: "استطلاع الرأي المسمى %{name} يجب أن يكون على الأقل 2 من الخيارات."
- default_poll_must_have_less_options: "استطلاع الرأي يجب أن يكون أقل من %{max} الخيارات."
- named_poll_must_have_less_options: "استطلاع الرأي المسمى %{name} يجب أقل من %{max} الخيارات."
+ default_poll_must_have_less_options:
+ zero: "التصويت لا يجب أن يكون %{count} بدون خيارات."
+ one: "التصويت يجب أن يحتوي على %{count} خيار واحد على الأقل."
+ two: "التصويت يجب أن يحتوي على %{count} خياران على الأقل."
+ few: "التصويت يجب أن يحتوي على %{count} بعض الخيارات على الأقل."
+ many: "التصويت يجب أن يحتوي على %{count} عدة خيارات على الأقل."
+ other: "التصويت يجب أن يحتوي على %{count} خيارت أخرى."
+ named_poll_must_have_less_options:
+ zero: "التصويت المسمى %{name} لا يجب أن يكون بدون خيارات."
+ one: "التصويت المسمى %{name} يجب أن يحتوي على خيار واحد على الأقل."
+ two: "التصويت المسمى %{name} يجب أن يحتوي على خياران على الأقل."
+ few: "التصويت المسمى %{name} يجب أن يحتوي على %{count} بعض الخيارات على الأقل."
+ many: "التصويت المسمى %{name} يجب أن يحتوي على %{count} عدة خيارات على الأقل."
+ other: "التصويت المسمى %{name} يجب أن يحتوي على %{count} خيارات أخرى."
default_poll_must_have_different_options: "استطلاع الرأي يجب أن يكون مختلف الخيارات."
named_poll_must_have_different_options: "استطلاع الرأي المسمى %{name} يجب أن يكون مختلف الخيارات."
default_poll_with_multiple_choices_has_invalid_parameters: "معلمات استطلاع الرأي ذات الخيار المتعدد غير صالحة."
diff --git a/plugins/poll/config/locales/server.da.yml b/plugins/poll/config/locales/server.da.yml
index ba7e89bf41..1e32f4ef13 100644
--- a/plugins/poll/config/locales/server.da.yml
+++ b/plugins/poll/config/locales/server.da.yml
@@ -14,8 +14,12 @@ da:
multiple_polls_with_same_name: "Der er flere afstemninger med samme navn %{name}. Brug attributten 'name' for at identificere dine afstemninger."
default_poll_must_have_at_least_2_options: "Afstemningen skal mindst have 2 muligheder."
named_poll_must_have_at_least_2_options: "Afstemningen %{name} skal mindst have 2 valgmuligheder."
- default_poll_must_have_less_options: "Afstemningen skal have mindre end %{max} muligheder."
- named_poll_must_have_less_options: "Afstemningen %{name} skal have mindre end %{max} valgmuligheder."
+ default_poll_must_have_less_options:
+ one: "Afstemningen må ikke have nogen muligheder."
+ other: "Afstemningen skal have mindre end %{max} muligheder."
+ named_poll_must_have_less_options:
+ one: "Afstemningen %{name} må ikke have nogen valgmuligheder."
+ other: "Afstemningen %{name} skal have mindre end %{max} valgmuligheder."
default_poll_must_have_different_options: "Afstemningen skal have forskellige muligheder."
named_poll_must_have_different_options: "Afstemningen %{name} skal have forskellige valgmuligheder."
default_poll_with_multiple_choices_has_invalid_parameters: "Afstemning med flere valgmuligheder har ugyldige parametre."
diff --git a/plugins/poll/config/locales/server.de.yml b/plugins/poll/config/locales/server.de.yml
index 6a7916a897..ade4a865a7 100644
--- a/plugins/poll/config/locales/server.de.yml
+++ b/plugins/poll/config/locales/server.de.yml
@@ -14,8 +14,12 @@ de:
multiple_polls_with_same_name: "Es gibt mehre Umfragen mit dem selben Namen: %{name}. Benutze das Attribute 'name', um deine Umfragen eindeutig identifizierbar zu machen."
default_poll_must_have_at_least_2_options: "Umfragen müssen mindestens 2 Optionen haben."
named_poll_must_have_at_least_2_options: "Die Umfrage mit dem Namen %{name} muss mindestens 2 Optionen haben."
- default_poll_must_have_less_options: "Die Umfrage muss weniger als %{max} Optionen haben."
- named_poll_must_have_less_options: "Die Umfrage mit dem Namen %{name} muss weniger als %{max} Optionen haben."
+ default_poll_must_have_less_options:
+ one: "Die Umfrage muss weniger als eine Option haben."
+ other: "Die Umfrage muss weniger als %{count} Optionen haben."
+ named_poll_must_have_less_options:
+ one: "Die Umfrage mit dem Namen %{name} muss weniger als eine Option haben."
+ other: "Die Umfrage mit dem Namen %{name} muss weniger als %{count} Optionen haben."
default_poll_must_have_different_options: "Die Umfrage muss unterschiedliche Optionen haben."
named_poll_must_have_different_options: "Die Umfrage mit dem Namen %{name} muss unterschiedliche Optionen haben."
default_poll_with_multiple_choices_has_invalid_parameters: "Die Mehrfachauswahl-Umfrage hat ungültige Parameter."
diff --git a/plugins/poll/config/locales/server.en.yml b/plugins/poll/config/locales/server.en.yml
index dd1e4a5da9..9417c9ba08 100644
--- a/plugins/poll/config/locales/server.en.yml
+++ b/plugins/poll/config/locales/server.en.yml
@@ -26,8 +26,12 @@ en:
default_poll_must_have_at_least_2_options: "Poll must have at least 2 options."
named_poll_must_have_at_least_2_options: "Poll named %{name} must have at least 2 options."
- default_poll_must_have_less_options: "Poll must have less than %{max} options."
- named_poll_must_have_less_options: "Poll named %{name} must have less than %{max} options."
+ default_poll_must_have_less_options:
+ one: "Poll must have less than 1 option."
+ other: "Poll must have less than %{count} options."
+ named_poll_must_have_less_options:
+ one: "Poll named %{name} must have less than 1 option."
+ other: "Poll named %{name} must have less than %{count} options."
default_poll_must_have_different_options: "Poll must have different options."
named_poll_must_have_different_options: "Poll named %{name} must have different options."
diff --git a/plugins/poll/config/locales/server.fi.yml b/plugins/poll/config/locales/server.fi.yml
index c70cc428f5..7abf82d557 100644
--- a/plugins/poll/config/locales/server.fi.yml
+++ b/plugins/poll/config/locales/server.fi.yml
@@ -14,8 +14,12 @@ fi:
multiple_polls_with_same_name: "Useamman kyselyn nimi on %{name}. Anna kaikille eri nimet 'name'-määreellä."
default_poll_must_have_at_least_2_options: "Äänestyksessä pitää olla vähintään 2 vaihtoehtoa."
named_poll_must_have_at_least_2_options: "Äänestyksessä nimeltä %{name} pitää olla vähintään 2 vaihtoehtoa."
- default_poll_must_have_less_options: "Äänestyksessä pitää olla vähemmän, kuin %{max} vaihtoehtoa."
- named_poll_must_have_less_options: "Äänestyksen nimeltä %{name} pitää sisältää vähemmän, kuin %{max} vaihtoehtoa."
+ default_poll_must_have_less_options:
+ one: "Äänestyksessä pitää olla vähemmän, kuin yksi vaihtoehto."
+ other: "Äänestyksessä pitää olla vähemmän, kuin %{count} vaihtoehtoa."
+ named_poll_must_have_less_options:
+ one: "Äänestyksessä %{name} pitää olla vähemmän kuin yksi vaihtoehto."
+ other: "Äänestyksessä %{name} pitää olla vähemmän kuin %{count} vaihtoehtoa."
default_poll_must_have_different_options: "Äänestysvaihtoehtojen on erottava toisistaan."
named_poll_must_have_different_options: "Äänestyksen nimeltä %{name} vaihtoehtojen on erottava toisistaan."
default_poll_with_multiple_choices_has_invalid_parameters: "Kysely, jossa on useita vaihtoehtoja sisältää epäkelpoja parametreja."
diff --git a/plugins/poll/config/locales/server.pt.yml b/plugins/poll/config/locales/server.pt.yml
index ed455c1b50..24704a455b 100644
--- a/plugins/poll/config/locales/server.pt.yml
+++ b/plugins/poll/config/locales/server.pt.yml
@@ -14,8 +14,12 @@ pt:
multiple_polls_with_same_name: "Há múltiplas votações com o mesmo nome: %{name}. Utilize o atributo 'nome' para identificar as suas votações de maneira única."
default_poll_must_have_at_least_2_options: "Votação deve ter pelo menos 2 opções."
named_poll_must_have_at_least_2_options: "Votação com o nome %{name} deve ter pelo menos 2 opções."
- default_poll_must_have_less_options: "Votação deve ter menos que %{max} opções."
- named_poll_must_have_less_options: "Votação com o nome %{name} deve ter menos que %{max} opções."
+ default_poll_must_have_less_options:
+ one: "Votação deve ter menos que 1 opção."
+ other: "Votação deve ter menos que %{count} opções."
+ named_poll_must_have_less_options:
+ one: "Votação com o nome %{name} deve ter menos que 1 opção."
+ other: "Votação com o nome %{name} deve ter menos que %{count} opções."
default_poll_must_have_different_options: "Votação deve ter opções diferentes."
named_poll_must_have_different_options: "Votação com o nome %{name} deve ter opções diferentes."
default_poll_with_multiple_choices_has_invalid_parameters: "Votação com escolha múltipla tem parâmetros inválidos."
diff --git a/plugins/poll/config/locales/server.ru.yml b/plugins/poll/config/locales/server.ru.yml
index 8f1059c64e..82fa09cd6a 100644
--- a/plugins/poll/config/locales/server.ru.yml
+++ b/plugins/poll/config/locales/server.ru.yml
@@ -7,27 +7,35 @@
ru:
site_settings:
- poll_enabled: "Разрешить содание опросов?"
- poll_maximum_options: "Максимальное колличество доступных вариантов в голосовании."
+ poll_enabled: "Разрешить форумчанам создавать опросы?"
+ poll_maximum_options: "Максимальное колличество вариантов ответов в одном опросе."
poll:
- multiple_polls_without_name: "Обнаружено несколько голосований без названия. Искользуйте 'name' для уникализации вашего голосования."
- multiple_polls_with_same_name: "Голосование с таким названием: %{name} уже существует. Используйте 'name' для уникализации вашего голосования."
- default_poll_must_have_at_least_2_options: "В голосовании должно быть хотябы 2 варианта ответа."
- named_poll_must_have_at_least_2_options: "В голосовании %{name} должно быть хотябы 2 варианта ответа."
- default_poll_must_have_less_options: "Голосование может содержать максимум %{max} ответов."
- named_poll_must_have_less_options: "Голосование %{name} может содержать максимум %{max} ответов."
- default_poll_must_have_different_options: "Ответы в голосовании должны быть разными."
- named_poll_must_have_different_options: "Ответы в голосовании %{name} должны быть разными."
- default_poll_with_multiple_choices_has_invalid_parameters: "Опрос c мультивыбором имеет неверные параметры."
- named_poll_with_multiple_choices_has_invalid_parameters: "Опрос с мультивыбором %{name} имеет неверные параметры."
- requires_at_least_1_valid_option: "Вы должны выбрать как минимум 1 правильный ответ."
- cannot_change_polls_after_5_minutes: "Вы не можете удалить или переименовать опрос в течении первых 5 минут."
- op_cannot_edit_options_after_5_minutes: "Вы не можете добавлять и удалять ответы голосования по истечению 5 минут после создания. Свяжитесь с модератором если вам необходимо отредактировать ответы в данном голосовании."
- staff_cannot_add_or_remove_options_after_5_minutes: "Вы не можете добавлять и удалять ответы голосования по истечению 5 минут после создания. Вы можете закрыть данную тему и создать новую. "
- no_polls_associated_with_this_post: "Нет голосований прикрепленных к данному посту"
- no_poll_with_this_name: "Нет голосований %{name} прикрепленных к данному посту."
+ multiple_polls_without_name: "Обнаружено несколько опросов в одном сообщении. Чтобы система могла их различать между собой, используйте атрибут name' для каждого опроса. Например: [poll name=1]"
+ multiple_polls_with_same_name: "Обнаружено несколько опросов с одним и тем же названием: %{name}. Чтобы система могла различать опросы между собой, придумайте разные значения для атрибута name' - для каждого опроса своё."
+ default_poll_must_have_at_least_2_options: "В опросе должно быть хотябы 2 варианта ответа."
+ named_poll_must_have_at_least_2_options: "В опросе с названием \"%{name}\" должно быть хотябы 2 варианта ответа."
+ default_poll_must_have_less_options:
+ one: "В опросе может быть не более 1-го варианта ответа."
+ few: "В опросе может быть не более %{count} вариантов ответов."
+ many: "В опросе может быть не более %{count} вариантов ответов."
+ other: "В опросе может быть не более %{count} вариантов ответов."
+ named_poll_must_have_less_options:
+ one: "В опросе под названием \"%{name}\" должно быть не более 1-го варианта ответов."
+ few: "В опросе под названием \"%{name}\" должно быть не более %{max} вариантов ответов."
+ many: "В опросе под названием \"%{name}\" должно быть не более %{max} вариантов ответов."
+ other: "В опросе под названием \"%{name}\" должно быть не более %{max} вариантов ответов."
+ default_poll_must_have_different_options: "В опросе не должно быть одинаковых вариантов ответов."
+ named_poll_must_have_different_options: "В опросе %{name} не должно быть одинаковых ответов."
+ default_poll_with_multiple_choices_has_invalid_parameters: "Опрос с множественным выбором вариантов ответов содержит неправильные параметры."
+ named_poll_with_multiple_choices_has_invalid_parameters: "Опрос под названием %{name} с множественным выбором вариантов ответов содержит неправильные параметры."
+ requires_at_least_1_valid_option: "Выберите хотя бы 1 вариант ответа."
+ cannot_change_polls_after_5_minutes: "Запрещается добавлять, удалять или переименовывать опросы через 5 минут после их создания."
+ op_cannot_edit_options_after_5_minutes: "Запрещается добавлять или удалять варианты ответов в опросах по истечении 5 минут после их создания. Если необходимо внести изменения в ответы, пожалуйста, свяжитесь с модератором."
+ staff_cannot_add_or_remove_options_after_5_minutes: "Запрещается добавлять или удалять варианты ответов в опросах по истечении 5 минут после их создания. Если нужно изменить набор ответов, следует закрыть данную тему и создать новую."
+ no_polls_associated_with_this_post: "В данном сообщении нет опросов."
+ no_poll_with_this_name: "В данном сообщении нет опроса под названием %{name}."
post_is_deleted: "Невозможно совершить действие над удаленным сообщением."
- topic_must_be_open_to_vote: "Тема должна быть открыта для голосования."
- poll_must_be_open_to_vote: "Опрос должен быть открыт для голосования."
- topic_must_be_open_to_toggle_status: "Тема должна быть открыта для изменения статуса."
- only_staff_or_op_can_toggle_status: "Только модераторы или автор поста может поменять статус голосования."
+ topic_must_be_open_to_vote: "Для возможности голосования в опросе, тема должна быть открыта."
+ poll_must_be_open_to_vote: "Опрос должен быть открыт, чтобы в нем можно было голосовать."
+ topic_must_be_open_to_toggle_status: "Чтобы изменить статус, тема должна быть открыта."
+ only_staff_or_op_can_toggle_status: "Только модераторы или сам автор могут поменять статус опроса."
diff --git a/plugins/poll/config/locales/server.zh_CN.yml b/plugins/poll/config/locales/server.zh_CN.yml
index af100e3010..07cbaae4f1 100644
--- a/plugins/poll/config/locales/server.zh_CN.yml
+++ b/plugins/poll/config/locales/server.zh_CN.yml
@@ -14,8 +14,10 @@ zh_CN:
multiple_polls_with_same_name: "有多个投票的名字相同:%{name}。使用“name”属性唯一标识投票。"
default_poll_must_have_at_least_2_options: "投票至少要有 2 个选项。"
named_poll_must_have_at_least_2_options: "投票“%{name}”必须要有 2 个选项。"
- default_poll_must_have_less_options: "投票选项必须少于 %{max} 个。"
- named_poll_must_have_less_options: "%{name}投票的选项必须少于 %{max} 个。"
+ default_poll_must_have_less_options:
+ other: "投票选项必须少于%{count}个。"
+ named_poll_must_have_less_options:
+ other: "投票“%{name}”的选项必须少于%{count}个。"
default_poll_must_have_different_options: "投票必须有不同的选项。"
named_poll_must_have_different_options: "%{name}投票的选项必须有不同的选项。"
default_poll_with_multiple_choices_has_invalid_parameters: "多选投票有无效选项。"
diff --git a/plugins/poll/plugin.rb b/plugins/poll/plugin.rb
index ca9299474d..306a6c9b13 100644
--- a/plugins/poll/plugin.rb
+++ b/plugins/poll/plugin.rb
@@ -257,8 +257,8 @@ after_initialize do
# maximum # of options
if poll["options"].size > SiteSetting.poll_maximum_options
poll["name"] == DEFAULT_POLL_NAME ?
- self.errors.add(:base, I18n.t("poll.default_poll_must_have_less_options", max: SiteSetting.poll_maximum_options)) :
- self.errors.add(:base, I18n.t("poll.named_poll_must_have_less_options", name: ERB::Util.html_escape(poll["name"]), max: SiteSetting.poll_maximum_options))
+ self.errors.add(:base, I18n.t("poll.default_poll_must_have_less_options", count: SiteSetting.poll_maximum_options)) :
+ self.errors.add(:base, I18n.t("poll.named_poll_must_have_less_options", name: poll["name"], count: SiteSetting.poll_maximum_options))
return
end
@@ -293,8 +293,10 @@ after_initialize do
# are the polls different?
if polls.keys != previous_polls.keys || current_options != previous_options
+ has_votes = previous_polls.keys.map { |p| previous_polls[p]["voters"].to_i }.sum > 0
+
# outside of the 5-minute edit window?
- if post.created_at < 5.minutes.ago
+ if post.created_at < 5.minutes.ago && has_votes
# cannot add/remove/rename polls
if polls.keys.sort != previous_polls.keys.sort
post.errors.add(:base, I18n.t("poll.cannot_change_polls_after_5_minutes"))
@@ -305,7 +307,7 @@ after_initialize do
if User.staff.pluck(:id).include?(post.last_editor_id)
# staff can only edit options
polls.each_key do |poll_name|
- if polls[poll_name]["options"].size != previous_polls[poll_name]["options"].size
+ if polls[poll_name]["options"].size != previous_polls[poll_name]["options"].size && previous_polls[poll_name]["voters"].to_i > 0
post.errors.add(:base, I18n.t("poll.staff_cannot_add_or_remove_options_after_5_minutes"))
return
end
diff --git a/plugins/poll/spec/controllers/posts_controller_spec.rb b/plugins/poll/spec/controllers/posts_controller_spec.rb
index a47d7def26..944225b60c 100644
--- a/plugins/poll/spec/controllers/posts_controller_spec.rb
+++ b/plugins/poll/spec/controllers/posts_controller_spec.rb
@@ -50,7 +50,7 @@ describe PostsController do
expect(response).not_to be_success
json = ::JSON.parse(response.body)
- expect(json["errors"][0]).to eq(I18n.t("poll.default_poll_must_have_less_options", max: SiteSetting.poll_maximum_options))
+ expect(json["errors"][0]).to eq(I18n.t("poll.default_poll_must_have_less_options", count: SiteSetting.poll_maximum_options))
end
it "should have valid parameters" do
@@ -126,26 +126,30 @@ describe PostsController do
end
end
- it "OP cannot change the options" do
- xhr :put, :update, { id: post_id, post: { raw: new_option } }
- expect(response).not_to be_success
- json = ::JSON.parse(response.body)
- expect(json["errors"][0]).to eq(I18n.t("poll.op_cannot_edit_options_after_5_minutes"))
- end
+ describe "with no vote" do
- it "staff can change the options" do
- log_in_user(Fabricate(:moderator))
- xhr :put, :update, { id: post_id, post: { raw: new_option } }
- expect(response).to be_success
- json = ::JSON.parse(response.body)
- expect(json["post"]["polls"]["poll"]["options"][1]["html"]).to eq("C")
- end
+ it "OP can change the options" do
+ xhr :put, :update, { id: post_id, post: { raw: new_option } }
+ expect(response).to be_success
+ json = ::JSON.parse(response.body)
+ expect(json["post"]["polls"]["poll"]["options"][1]["html"]).to eq("C")
+ end
+
+ it "staff can change the options" do
+ log_in_user(Fabricate(:moderator))
+ xhr :put, :update, { id: post_id, post: { raw: new_option } }
+ expect(response).to be_success
+ json = ::JSON.parse(response.body)
+ expect(json["post"]["polls"]["poll"]["options"][1]["html"]).to eq("C")
+ end
+
+ it "support changes on the post" do
+ xhr :put, :update, { id: post_id, post: { raw: updated } }
+ expect(response).to be_success
+ json = ::JSON.parse(response.body)
+ expect(json["post"]["cooked"]).to match("before")
+ end
- it "support changes on the post" do
- xhr :put, :update, { id: post_id, post: { raw: updated } }
- expect(response).to be_success
- json = ::JSON.parse(response.body)
- expect(json["post"]["cooked"]).to match("before")
end
describe "with at least one vote" do
@@ -154,6 +158,21 @@ describe PostsController do
DiscoursePoll::Poll.vote(post_id, "poll", ["5c24fc1df56d764b550ceae1b9319125"], user.id)
end
+ it "OP cannot change the options" do
+ xhr :put, :update, { id: post_id, post: { raw: new_option } }
+ expect(response).not_to be_success
+ json = ::JSON.parse(response.body)
+ expect(json["errors"][0]).to eq(I18n.t("poll.op_cannot_edit_options_after_5_minutes"))
+ end
+
+ it "staff can change the options" do
+ log_in_user(Fabricate(:moderator))
+ xhr :put, :update, { id: post_id, post: { raw: new_option } }
+ expect(response).to be_success
+ json = ::JSON.parse(response.body)
+ expect(json["post"]["polls"]["poll"]["options"][1]["html"]).to eq("C")
+ end
+
it "support changes on the post" do
xhr :put, :update, { id: post_id, post: { raw: updated } }
expect(response).to be_success
diff --git a/public/403.zh_CN.html b/public/403.zh_CN.html
index 90823fbe79..15657d1f7f 100644
--- a/public/403.zh_CN.html
+++ b/public/403.zh_CN.html
@@ -1,6 +1,6 @@
-操作行为禁止(403)
+操作行为禁止 (403)